Added Localization
This commit is contained in:
parent
62a1030bd4
commit
666d66a339
@ -1,6 +1,5 @@
|
|||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
import { RouterOutlet } from '@angular/router';
|
|
||||||
import { FullCalendarModule } from '@fullcalendar/angular';
|
|
||||||
import { CalendarOptions } from '@fullcalendar/core'; // useful for typechecking
|
import { CalendarOptions } from '@fullcalendar/core'; // useful for typechecking
|
||||||
import dayGridPlugin from '@fullcalendar/daygrid';
|
import dayGridPlugin from '@fullcalendar/daygrid';
|
||||||
import interactionPlugin from '@fullcalendar/interaction';
|
import interactionPlugin from '@fullcalendar/interaction';
|
||||||
|
@ -2,8 +2,7 @@ import { NgModule } from '@angular/core';
|
|||||||
import { CommonModule } from '@angular/common';
|
import { CommonModule } from '@angular/common';
|
||||||
import { RouterOutlet } from '@angular/router';
|
import { RouterOutlet } from '@angular/router';
|
||||||
import { FullCalendarModule } from '@fullcalendar/angular';
|
import { FullCalendarModule } from '@fullcalendar/angular';
|
||||||
import { CalendarOptions } from '@fullcalendar/core'; // useful for typechecking
|
|
||||||
import dayGridPlugin from '@fullcalendar/daygrid';
|
|
||||||
import { AppointmentCalendarRoutingModule } from './appointment-calendar-routing.module';
|
import { AppointmentCalendarRoutingModule } from './appointment-calendar-routing.module';
|
||||||
import { AppointmentCalendarComponent } from './appointment-calendar.component';
|
import { AppointmentCalendarComponent } from './appointment-calendar.component';
|
||||||
import { AppointmentDialogComponent } from '../appointment-dialog/appointment-dialog.component';
|
import { AppointmentDialogComponent } from '../appointment-dialog/appointment-dialog.component';
|
||||||
|
@ -10,9 +10,10 @@
|
|||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
<div class="modal-header py-4">
|
<div class="modal-header py-4">
|
||||||
<h4 class="text-success mb-0 fs-3 fw-normal">
|
<h4 class="text-success mb-0 fs-3 fw-normal">
|
||||||
{{ isEditMode ? 'Edit ' : 'Create ' }}{{name}}
|
{{ isEditMode ? ('::edit' | abpLocalization) : ('::create' | abpLocalization) }}
|
||||||
|
{{ '::appointmentStatus' | abpLocalization }}
|
||||||
</h4>
|
</h4>
|
||||||
<button
|
<button
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
type="button"
|
type="button"
|
||||||
(click)="onClose()"
|
(click)="onClose()"
|
||||||
@ -23,11 +24,13 @@
|
|||||||
<form #appointmentForm="ngForm" (ngSubmit)="saveAppointment(appointmentForm)">
|
<form #appointmentForm="ngForm" (ngSubmit)="saveAppointment(appointmentForm)">
|
||||||
<div class="p-fluid grid justify-content-center">
|
<div class="p-fluid grid justify-content-center">
|
||||||
<div class="field col-md-5">
|
<div class="field col-md-5">
|
||||||
<label for="fname">First Name <span class="text-danger">*</span></label>
|
<label for="fname"
|
||||||
|
>{{ '::firstName' | abpLocalization }}<span class="text-danger">*</span></label
|
||||||
|
>
|
||||||
<span class="p-input-icon-left p-input-icon-right">
|
<span class="p-input-icon-left p-input-icon-right">
|
||||||
<i class="pi pi-user"></i>
|
<i class="pi pi-user"></i>
|
||||||
<input
|
<input
|
||||||
autofocus
|
autofocus
|
||||||
pInputText
|
pInputText
|
||||||
id="fname"
|
id="fname"
|
||||||
name="fname"
|
name="fname"
|
||||||
@ -44,17 +47,30 @@
|
|||||||
<i *ngIf="fnameCtrl.valid && fnameCtrl.touched" class="pi pi-check text-success"></i>
|
<i *ngIf="fnameCtrl.valid && fnameCtrl.touched" class="pi pi-check text-success"></i>
|
||||||
<i *ngIf="fnameCtrl.invalid && fnameCtrl.touched" class="pi pi-times text-danger"></i>
|
<i *ngIf="fnameCtrl.invalid && fnameCtrl.touched" class="pi pi-times text-danger"></i>
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<small class="text-danger" *ngIf="fnameCtrl.invalid && fnameCtrl.touched">
|
<small class="text-danger" *ngIf="fnameCtrl.invalid && fnameCtrl.touched">
|
||||||
<span *ngIf="fnameCtrl.errors?.required">First Name is required.</span>
|
<span *ngIf="fnameCtrl.errors?.required">{{
|
||||||
<span *ngIf="fnameCtrl.errors?.minlength">Minimum 2 characters required.</span>
|
'::firstNameRequired' | abpLocalization
|
||||||
<span *ngIf="fnameCtrl.errors?.maxlength">Maximum 30 characters allowed.</span>
|
}}</span>
|
||||||
|
<span *ngIf="fnameCtrl.errors?.minlength">
|
||||||
|
{{
|
||||||
|
'::minLength'
|
||||||
|
| abpLocalization : { length: fnameCtrl.errors?.minlength.requiredLength }
|
||||||
|
}}
|
||||||
|
</span>
|
||||||
|
<span *ngIf="fnameCtrl.errors?.maxlength">{{
|
||||||
|
'::maxLength'
|
||||||
|
| abpLocalization : { length: fnameCtrl.errors?.maxlength.requiredLength }
|
||||||
|
}}</span>
|
||||||
</small>
|
</small>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="field col-md-1"></div>
|
<div class="field col-md-1"></div>
|
||||||
|
|
||||||
<div class="field col-md-5">
|
<div class="field col-md-5">
|
||||||
<label for="lname">Last Name <span class="text-danger">*</span></label>
|
<label for="lname"
|
||||||
|
>{{ '::lastName' | abpLocalization }}<span class="text-danger">*</span></label
|
||||||
|
>
|
||||||
<span class="p-input-icon-left p-input-icon-right">
|
<span class="p-input-icon-left p-input-icon-right">
|
||||||
<i class="pi pi-user"></i>
|
<i class="pi pi-user"></i>
|
||||||
<input
|
<input
|
||||||
@ -75,14 +91,26 @@
|
|||||||
<i *ngIf="lnameCtrl.invalid && lnameCtrl.touched" class="pi pi-times text-danger"></i>
|
<i *ngIf="lnameCtrl.invalid && lnameCtrl.touched" class="pi pi-times text-danger"></i>
|
||||||
</span>
|
</span>
|
||||||
<small class="text-danger" *ngIf="lnameCtrl.invalid && lnameCtrl.touched">
|
<small class="text-danger" *ngIf="lnameCtrl.invalid && lnameCtrl.touched">
|
||||||
<span *ngIf="lnameCtrl.errors?.required">Last Name is required.</span>
|
<span *ngIf="lnameCtrl.errors?.required">{{
|
||||||
<span *ngIf="lnameCtrl.errors?.minlength">Minimum 2 characters required.</span>
|
'::lastNameRequired' | abpLocalization
|
||||||
<span *ngIf="lnameCtrl.errors?.maxlength">Maximum 30 characters allowed.</span>
|
}}</span>
|
||||||
|
<span *ngIf="lnameCtrl.errors?.minlength">
|
||||||
|
{{
|
||||||
|
'::minLength'
|
||||||
|
| abpLocalization : { length: lnameCtrl.errors?.minlength.requiredLength }
|
||||||
|
}}
|
||||||
|
</span>
|
||||||
|
<span *ngIf="lnameCtrl.errors?.maxlength">
|
||||||
|
{{
|
||||||
|
'::maxLength'
|
||||||
|
| abpLocalization : { length: lnameCtrl.errors?.maxlength.requiredLength }
|
||||||
|
}}
|
||||||
|
</span>
|
||||||
</small>
|
</small>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="field col-md-5">
|
<div class="field col-md-5">
|
||||||
<label>Gender <span class="text-danger">*</span></label>
|
<label>{{ '::gender' | abpLocalization }} <span class="text-danger">*</span></label>
|
||||||
<div class="flex align-items-center p-input-icon-right">
|
<div class="flex align-items-center p-input-icon-right">
|
||||||
<p-radioButton
|
<p-radioButton
|
||||||
name="gender"
|
name="gender"
|
||||||
@ -92,7 +120,7 @@
|
|||||||
#genderCtrl="ngModel"
|
#genderCtrl="ngModel"
|
||||||
required
|
required
|
||||||
></p-radioButton>
|
></p-radioButton>
|
||||||
<label for="male" class="ml-2 mr-3">Male</label>
|
<label for="male" class="ml-2 mr-3">{{ '::male' | abpLocalization }}</label>
|
||||||
|
|
||||||
<p-radioButton
|
<p-radioButton
|
||||||
name="gender"
|
name="gender"
|
||||||
@ -101,7 +129,7 @@
|
|||||||
inputId="female"
|
inputId="female"
|
||||||
required
|
required
|
||||||
></p-radioButton>
|
></p-radioButton>
|
||||||
<label for="female" class="ml-2">Female</label>
|
<label for="female" class="ml-2">{{ '::female' | abpLocalization }}</label>
|
||||||
|
|
||||||
<i
|
<i
|
||||||
*ngIf="genderCtrl.valid && genderCtrl.touched"
|
*ngIf="genderCtrl.valid && genderCtrl.touched"
|
||||||
@ -113,14 +141,16 @@
|
|||||||
></i>
|
></i>
|
||||||
</div>
|
</div>
|
||||||
<small class="text-danger d-block" *ngIf="genderCtrl.invalid && genderCtrl.touched">
|
<small class="text-danger d-block" *ngIf="genderCtrl.invalid && genderCtrl.touched">
|
||||||
Please select a gender.
|
{{ '::genderRequired' | abpLocalization }}
|
||||||
</small>
|
</small>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="field col-md-1"></div>
|
<div class="field col-md-1"></div>
|
||||||
|
|
||||||
<div class="field col-md-5">
|
<div class="field col-md-5">
|
||||||
<label for="mobile">Mobile No <span class="text-danger">*</span></label>
|
<label for="mobile"
|
||||||
|
>{{ '::mobileNo' | abpLocalization }} <span class="text-danger">*</span></label
|
||||||
|
>
|
||||||
<span class="p-input-icon-left p-input-icon-right">
|
<span class="p-input-icon-left p-input-icon-right">
|
||||||
<i class="pi pi-phone"></i>
|
<i class="pi pi-phone"></i>
|
||||||
<input
|
<input
|
||||||
@ -146,13 +176,17 @@
|
|||||||
></i>
|
></i>
|
||||||
</span>
|
</span>
|
||||||
<small class="text-danger d-block" *ngIf="mobileCtrl.invalid && mobileCtrl.touched">
|
<small class="text-danger d-block" *ngIf="mobileCtrl.invalid && mobileCtrl.touched">
|
||||||
<span *ngIf="mobileCtrl.errors?.required">Mobile number is required.</span>
|
<span *ngIf="mobileCtrl.errors?.required">{{
|
||||||
<span *ngIf="mobileCtrl.errors?.pattern">Enter a valid 10-digit mobile number.</span>
|
'::mobileNoRequired' | abpLocalization
|
||||||
|
}}</span>
|
||||||
|
<span *ngIf="mobileCtrl.errors?.pattern">{{
|
||||||
|
'::mobileNoInvalid' | abpLocalization
|
||||||
|
}}</span>
|
||||||
</small>
|
</small>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="field col-md-11">
|
<div class="field col-md-11">
|
||||||
<label for="address">Address <span class="text-danger">*</span></label>
|
{{ '::address' | abpLocalization }} <span class="text-danger">*</span>
|
||||||
<span class="p-input-icon-left p-input-icon-right">
|
<span class="p-input-icon-left p-input-icon-right">
|
||||||
<i class="pi pi-map-marker"></i>
|
<i class="pi pi-map-marker"></i>
|
||||||
<input
|
<input
|
||||||
@ -179,14 +213,28 @@
|
|||||||
></i>
|
></i>
|
||||||
</span>
|
</span>
|
||||||
<small class="text-danger d-block" *ngIf="addressCtrl.invalid && addressCtrl.touched">
|
<small class="text-danger d-block" *ngIf="addressCtrl.invalid && addressCtrl.touched">
|
||||||
<span *ngIf="addressCtrl.errors?.required">Address is required.</span>
|
<span *ngIf="addressCtrl.errors?.required">{{
|
||||||
<span *ngIf="addressCtrl.errors?.minlength">Minimum 5 characters required.</span>
|
'::addressRequired' | abpLocalization
|
||||||
<span *ngIf="addressCtrl.errors?.maxlength">Maximum 100 characters allowed.</span>
|
}}</span>
|
||||||
|
<span *ngIf="addressCtrl.errors?.minlength">
|
||||||
|
{{
|
||||||
|
'::minLength'
|
||||||
|
| abpLocalization : { length: addressCtrl.errors?.minlength.requiredLength }
|
||||||
|
}}
|
||||||
|
</span>
|
||||||
|
<span *ngIf="addressCtrl.errors?.maxlength">
|
||||||
|
{{
|
||||||
|
'::maxLength'
|
||||||
|
| abpLocalization : { length: addressCtrl.errors?.maxlength.requiredLength }
|
||||||
|
}}
|
||||||
|
</span>
|
||||||
</small>
|
</small>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="field col-md-5">
|
<div class="field col-md-5">
|
||||||
<label for="email">Email ID <span class="text-danger">*</span></label>
|
<label for="email"
|
||||||
|
>{{ '::emailId' | abpLocalization }} <span class="text-danger">*</span></label
|
||||||
|
>
|
||||||
<span class="p-input-icon-left p-input-icon-right">
|
<span class="p-input-icon-left p-input-icon-right">
|
||||||
<i class="pi pi-envelope"></i>
|
<i class="pi pi-envelope"></i>
|
||||||
<input
|
<input
|
||||||
@ -206,15 +254,19 @@
|
|||||||
<i *ngIf="emailCtrl.invalid && emailCtrl.touched" class="pi pi-times text-danger"></i>
|
<i *ngIf="emailCtrl.invalid && emailCtrl.touched" class="pi pi-times text-danger"></i>
|
||||||
</span>
|
</span>
|
||||||
<small class="text-danger d-block" *ngIf="emailCtrl.invalid && emailCtrl.touched">
|
<small class="text-danger d-block" *ngIf="emailCtrl.invalid && emailCtrl.touched">
|
||||||
<span *ngIf="emailCtrl.errors?.required">Email address is required.</span>
|
<span *ngIf="emailCtrl.errors?.required">{{
|
||||||
<span *ngIf="emailCtrl.errors?.email">Enter a valid email address.</span>
|
'::emailRequired' | abpLocalization
|
||||||
|
}}</span>
|
||||||
|
<span *ngIf="emailCtrl.errors?.email">{{ '::emailInvalid' | abpLocalization }}</span>
|
||||||
</small>
|
</small>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="field col-md-1"></div>
|
<div class="field col-md-1"></div>
|
||||||
|
|
||||||
<div class="field col-md-5">
|
<div class="field col-md-5">
|
||||||
<label for="dob">Date of Birth <span class="text-danger">*</span></label>
|
<label for="dob"
|
||||||
|
>{{ '::dateOfBirth' | abpLocalization }} <span class="text-danger">*</span></label
|
||||||
|
>
|
||||||
<p-calendar
|
<p-calendar
|
||||||
id="dob"
|
id="dob"
|
||||||
required
|
required
|
||||||
@ -226,12 +278,16 @@
|
|||||||
<small
|
<small
|
||||||
class="p-error"
|
class="p-error"
|
||||||
*ngIf="appointmentForm.controls.dob?.invalid && appointmentForm.controls.dob?.touched"
|
*ngIf="appointmentForm.controls.dob?.invalid && appointmentForm.controls.dob?.touched"
|
||||||
>DOB Required</small
|
|
||||||
>
|
>
|
||||||
|
{{ '::dobRequired' | abpLocalization }}
|
||||||
|
</small>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="field col-md-5">
|
<div class="field col-md-5">
|
||||||
<label for="doctor">Consulting Doctor <span class="text-danger">*</span></label>
|
<label for="doctor"
|
||||||
|
>{{ '::consultingDoctor' | abpLocalization }}
|
||||||
|
<span class="text-danger">*</span></label
|
||||||
|
>
|
||||||
<p-dropdown
|
<p-dropdown
|
||||||
id="doctor"
|
id="doctor"
|
||||||
name="doctor"
|
name="doctor"
|
||||||
@ -246,7 +302,10 @@
|
|||||||
<div class="field col-md-1"></div>
|
<div class="field col-md-1"></div>
|
||||||
|
|
||||||
<div class="field col-md-5">
|
<div class="field col-md-5">
|
||||||
<label for="date">Date of Appointment <span class="text-danger">*</span></label>
|
<label for="date"
|
||||||
|
>{{ '::dateOfAppointment' | abpLocalization }}
|
||||||
|
<span class="text-danger">*</span></label
|
||||||
|
>
|
||||||
<p-calendar
|
<p-calendar
|
||||||
id="date"
|
id="date"
|
||||||
name="date"
|
name="date"
|
||||||
@ -257,7 +316,10 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="field col-md-5">
|
<div class="field col-md-5">
|
||||||
<label for="time">Time Of Appointment <span class="text-danger">*</span></label>
|
<label for="time"
|
||||||
|
>{{ '::timeOfAppointment' | abpLocalization }}
|
||||||
|
<span class="text-danger">*</span></label
|
||||||
|
>
|
||||||
<span class="p-input-icon-left">
|
<span class="p-input-icon-left">
|
||||||
<i class="pi pi-clock"></i>
|
<i class="pi pi-clock"></i>
|
||||||
<input
|
<input
|
||||||
@ -273,7 +335,7 @@
|
|||||||
<div class="field col-md-1"></div>
|
<div class="field col-md-1"></div>
|
||||||
|
|
||||||
<div class="field col-md-5">
|
<div class="field col-md-5">
|
||||||
<label for="injury">Injury/Condition</label>
|
<label for="injury">{{ '::injuryCondition' | abpLocalization }}</label>
|
||||||
<span class="p-input-icon-left">
|
<span class="p-input-icon-left">
|
||||||
<i class="pi pi-exclamation-triangle"></i>
|
<i class="pi pi-exclamation-triangle"></i>
|
||||||
<input
|
<input
|
||||||
@ -286,7 +348,9 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="field col-md-5">
|
<div class="field col-md-5">
|
||||||
<label for="insurance">Insurance Provider</label>
|
<label for="insurance">
|
||||||
|
{{ '::insuranceProvider' | abpLocalization }}
|
||||||
|
</label>
|
||||||
<span class="p-input-icon-left">
|
<span class="p-input-icon-left">
|
||||||
<i class="pi pi-credit-card"></i>
|
<i class="pi pi-credit-card"></i>
|
||||||
<input
|
<input
|
||||||
@ -300,7 +364,9 @@
|
|||||||
<div class="field col-md-1"></div>
|
<div class="field col-md-1"></div>
|
||||||
|
|
||||||
<div class="field col-md-5">
|
<div class="field col-md-5">
|
||||||
<label for="status">Appointment Status</label>
|
<label for="status">
|
||||||
|
{{ '::appointmentStatus' | abpLocalization }}
|
||||||
|
</label>
|
||||||
<p-dropdown
|
<p-dropdown
|
||||||
id="status"
|
id="status"
|
||||||
name="status"
|
name="status"
|
||||||
@ -313,7 +379,9 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="field col-md-5">
|
<div class="field col-md-5">
|
||||||
<label for="visitType">Visit Type</label>
|
<label for="visitType">
|
||||||
|
{{ '::visitType' | abpLocalization }}
|
||||||
|
</label>
|
||||||
<p-dropdown
|
<p-dropdown
|
||||||
id="visitType"
|
id="visitType"
|
||||||
name="visitType"
|
name="visitType"
|
||||||
@ -327,7 +395,9 @@
|
|||||||
<div class="field col-md-1"></div>
|
<div class="field col-md-1"></div>
|
||||||
|
|
||||||
<div class="field col-md-5">
|
<div class="field col-md-5">
|
||||||
<label for="paymentStatus">Payment Status</label>
|
<label for="paymentStatus">
|
||||||
|
{{ '::paymentStatus' | abpLocalization }}
|
||||||
|
</label>
|
||||||
<p-dropdown
|
<p-dropdown
|
||||||
id="paymentStatus"
|
id="paymentStatus"
|
||||||
name="paymentStatus"
|
name="paymentStatus"
|
||||||
@ -340,7 +410,9 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="field col-11">
|
<div class="field col-11">
|
||||||
<label for="notes">Notes</label>
|
<label for="notes">
|
||||||
|
{{ '::notes' | abpLocalization }}
|
||||||
|
</label>
|
||||||
<textarea
|
<textarea
|
||||||
id="notes"
|
id="notes"
|
||||||
name="notes"
|
name="notes"
|
||||||
@ -355,14 +427,14 @@
|
|||||||
<button
|
<button
|
||||||
pButton
|
pButton
|
||||||
type="submit"
|
type="submit"
|
||||||
label="Save"
|
[label]="'::save' | abpLocalization"
|
||||||
class="p-button-success"
|
class="p-button-success"
|
||||||
[disabled]="appointmentForm.invalid"
|
[disabled]="appointmentForm.invalid"
|
||||||
></button>
|
></button>
|
||||||
<button
|
<button
|
||||||
pButton
|
pButton
|
||||||
type="button"
|
type="button"
|
||||||
label="Cancel"
|
[label]="'::cancel' | abpLocalization"
|
||||||
class="p-button-secondary ml-2"
|
class="p-button-secondary ml-2"
|
||||||
(click)="onClose()"
|
(click)="onClose()"
|
||||||
></button>
|
></button>
|
||||||
|
@ -11,13 +11,11 @@
|
|||||||
border-color: red !important;
|
border-color: red !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Adjust the z-index of the calendar dropdown */
|
|
||||||
.p-calendar .p-datepicker {
|
.p-calendar .p-datepicker {
|
||||||
z-index: 1050 !important; /* Make sure it's above other elements */
|
z-index: 1050 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* You can also adjust modal z-index if necessary */
|
|
||||||
.modal {
|
.modal {
|
||||||
z-index: 1040; /* Set lower z-index to ensure modal is behind the calendar */
|
z-index: 1040;
|
||||||
}
|
}
|
||||||
|
|
@ -1,15 +1,5 @@
|
|||||||
import { ConfirmationService, ToasterService } from '@abp/ng.theme.shared';
|
import {ToasterService } from '@abp/ng.theme.shared';
|
||||||
import { HttpClient } from '@angular/common/http';
|
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
|
||||||
import {
|
|
||||||
Component,
|
|
||||||
EventEmitter,
|
|
||||||
Input,
|
|
||||||
OnChanges,
|
|
||||||
OnInit,
|
|
||||||
Output,
|
|
||||||
SimpleChanges,
|
|
||||||
ViewChild,
|
|
||||||
} from '@angular/core';
|
|
||||||
import { FormsModule, NgForm } from '@angular/forms';
|
import { FormsModule, NgForm } from '@angular/forms';
|
||||||
import { CreateOrUpdateAppointmentDto } from '@proxy/appoinments/dto';
|
import { CreateOrUpdateAppointmentDto } from '@proxy/appoinments/dto';
|
||||||
import { Gender, appointmentStatus, visitType, paymentStatus } from '@proxy/global-enum';
|
import { Gender, appointmentStatus, visitType, paymentStatus } from '@proxy/global-enum';
|
||||||
@ -26,6 +16,7 @@ import { RadioButtonModule } from 'primeng/radiobutton';
|
|||||||
import { TableModule } from 'primeng/table';
|
import { TableModule } from 'primeng/table';
|
||||||
import { ViewAppointmentRoutingModule } from '../view-appointment/view-appointment-routing.module';
|
import { ViewAppointmentRoutingModule } from '../view-appointment/view-appointment-routing.module';
|
||||||
import { CommonModule } from '@angular/common';
|
import { CommonModule } from '@angular/common';
|
||||||
|
import { SharedModule } from 'src/app/shared/shared.module';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-appointment-dialog',
|
selector: 'app-appointment-dialog',
|
||||||
@ -45,17 +36,18 @@ import { CommonModule } from '@angular/common';
|
|||||||
InputTextareaModule,
|
InputTextareaModule,
|
||||||
ChipModule,
|
ChipModule,
|
||||||
CommonModule,
|
CommonModule,
|
||||||
|
SharedModule,
|
||||||
],
|
],
|
||||||
templateUrl: './appointment-dialog.component.html',
|
templateUrl: './appointment-dialog.component.html',
|
||||||
styleUrl: './appointment-dialog.component.scss',
|
styleUrl: './appointment-dialog.component.scss',
|
||||||
})
|
})
|
||||||
export class AppointmentDialogComponent implements OnInit {
|
export class AppointmentDialogComponent implements OnInit {
|
||||||
@Input() visible: boolean = false; // Control modal visibility
|
@Input() visible: boolean = false;
|
||||||
@Input() name: string;
|
@Input() name: string;
|
||||||
@Input() isEditMode: boolean = false; // Determine if it's for edit or create
|
@Input() isEditMode: boolean = false;
|
||||||
@Output() save = new EventEmitter<any>(); // Event emitter for saving appointment
|
@Output() save = new EventEmitter<any>();
|
||||||
@Output() close = new EventEmitter<void>(); // Event emitter for closing the modal
|
@Output() close = new EventEmitter<void>();
|
||||||
@Input() appointmentId: string; // To accept the appointment ID from the parent
|
@Input() appointmentId: string;
|
||||||
@Input() selectedDate: string;
|
@Input() selectedDate: string;
|
||||||
appointmentsForDate: any[] = [];
|
appointmentsForDate: any[] = [];
|
||||||
|
|
||||||
@ -96,13 +88,11 @@ export class AppointmentDialogComponent implements OnInit {
|
|||||||
paymentStatus: null,
|
paymentStatus: null,
|
||||||
insuranceProvider: '',
|
insuranceProvider: '',
|
||||||
};
|
};
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
this.fetchAppointmentData();
|
this.fetchAppointmentData();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fetchAppointmentData() {
|
fetchAppointmentData() {
|
||||||
this.AppointmentService.getAppointmentById(this.appointmentId).subscribe(result => {
|
this.AppointmentService.getAppointmentById(this.appointmentId).subscribe(result => {
|
||||||
this.appointment = result;
|
this.appointment = result;
|
||||||
|
@ -3,12 +3,14 @@ import { CommonModule } from '@angular/common';
|
|||||||
|
|
||||||
import { AppointmentRoutingModule } from './appointment-routing.module';
|
import { AppointmentRoutingModule } from './appointment-routing.module';
|
||||||
import { AppointmentDialogComponent } from './appointment-dialog/appointment-dialog.component';
|
import { AppointmentDialogComponent } from './appointment-dialog/appointment-dialog.component';
|
||||||
|
import { SharedModule } from '../shared/shared.module';
|
||||||
|
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
declarations: [],
|
declarations: [],
|
||||||
imports: [
|
imports: [
|
||||||
CommonModule,
|
CommonModule,
|
||||||
|
SharedModule,
|
||||||
AppointmentRoutingModule,
|
AppointmentRoutingModule,
|
||||||
AppointmentDialogComponent
|
AppointmentDialogComponent
|
||||||
]
|
]
|
||||||
|
@ -16,10 +16,8 @@
|
|||||||
>
|
>
|
||||||
<ng-template pTemplate="caption">
|
<ng-template pTemplate="caption">
|
||||||
<div class="flex align-items-center justify-content-between mb-3 gap-3">
|
<div class="flex align-items-center justify-content-between mb-3 gap-3">
|
||||||
<!-- Left: Title -->
|
<h4 class="m-0">{{ '::appointmentList' | abpLocalization }}</h4>
|
||||||
<h4 class="m-0">Appointment List</h4>
|
|
||||||
|
|
||||||
<!-- Center: Search Bar with Icon Inside -->
|
|
||||||
<div class="flex-grow-1 flex justify-content-center">
|
<div class="flex-grow-1 flex justify-content-center">
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<span class="input-group-text"><i class="pi pi-search"></i></span>
|
<span class="input-group-text"><i class="pi pi-search"></i></span>
|
||||||
@ -29,7 +27,7 @@
|
|||||||
class="form-control"
|
class="form-control"
|
||||||
(input)="dt2.filterGlobal($event.target.value, 'contains')"
|
(input)="dt2.filterGlobal($event.target.value, 'contains')"
|
||||||
[(ngModel)]="globalFilter"
|
[(ngModel)]="globalFilter"
|
||||||
placeholder="Search keyword"
|
placeholder="{{ '::searchKeyword' | abpLocalization }}"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -38,6 +36,8 @@
|
|||||||
pButton
|
pButton
|
||||||
class="p-button-rounded p-button-secondary ml-2"
|
class="p-button-rounded p-button-secondary ml-2"
|
||||||
(click)="loadappointments($event)"
|
(click)="loadappointments($event)"
|
||||||
|
[title]="'::refresh' | abpLocalization"
|
||||||
|
|
||||||
>
|
>
|
||||||
<i class="pi pi-refresh"></i>
|
<i class="pi pi-refresh"></i>
|
||||||
</button>
|
</button>
|
||||||
@ -46,7 +46,7 @@
|
|||||||
pButton
|
pButton
|
||||||
class="p-button-rounded p-button-success ml-2"
|
class="p-button-rounded p-button-success ml-2"
|
||||||
(click)="openNewAppointmentDialog()"
|
(click)="openNewAppointmentDialog()"
|
||||||
pTooltip="Add Appointment"
|
pTooltip="{{ '::addAppointment' | abpLocalization }}"
|
||||||
tooltipPosition="left"
|
tooltipPosition="left"
|
||||||
>
|
>
|
||||||
<i class="pi pi-plus-circle"></i>
|
<i class="pi pi-plus-circle"></i>
|
||||||
@ -55,6 +55,8 @@
|
|||||||
pButton
|
pButton
|
||||||
class="p-button-rounded p-button-warning ml-2"
|
class="p-button-rounded p-button-warning ml-2"
|
||||||
(click)="exportAppointments()"
|
(click)="exportAppointments()"
|
||||||
|
[title]="'::export' | abpLocalization"
|
||||||
|
|
||||||
>
|
>
|
||||||
<i class="pi pi-download"></i>
|
<i class="pi pi-download"></i>
|
||||||
</button>
|
</button>
|
||||||
@ -64,25 +66,37 @@
|
|||||||
|
|
||||||
<ng-template pTemplate="header">
|
<ng-template pTemplate="header">
|
||||||
<tr>
|
<tr>
|
||||||
<th pSortableColumn="firstName">Name <p-sortIcon field="firstName" /></th>
|
<th pSortableColumn="firstName">
|
||||||
<th pSortableColumn="doctor">Doctor <p-sortIcon field="doctor" /></th>
|
{{ '::name' | abpLocalization }} <p-sortIcon field="firstName" />
|
||||||
<th pSortableColumn="gender">gender <p-sortIcon field="gender" /></th>
|
|
||||||
<th pSortableColumn="dateOfAppointment">Date <p-sortIcon field="dateOfAppointment" /></th>
|
|
||||||
<th pSortableColumn="timeOfAppointment">Time<p-sortIcon field="timeOfAppointment" /></th>
|
|
||||||
<th>Mobile No</th>
|
|
||||||
<th>Email</th>
|
|
||||||
<th pSortableColumn="appointmentStatus">
|
|
||||||
Appointment Status<p-sortIcon field="appointmentStatus" />
|
|
||||||
</th>
|
</th>
|
||||||
<th pSortableColumn="visitType">Visit Type<p-sortIcon field="visitType" /></th>
|
<th pSortableColumn="doctor">
|
||||||
<th>Actions</th>
|
{{ '::doctor' | abpLocalization }} <p-sortIcon field="doctor" />
|
||||||
|
</th>
|
||||||
|
<th pSortableColumn="gender">
|
||||||
|
{{ '::gender' | abpLocalization }} <p-sortIcon field="gender" />
|
||||||
|
</th>
|
||||||
|
<th pSortableColumn="dateOfAppointment">
|
||||||
|
{{ '::date' | abpLocalization }} <p-sortIcon field="dateOfAppointment" />
|
||||||
|
</th>
|
||||||
|
<th pSortableColumn="timeOfAppointment">
|
||||||
|
{{ '::time' | abpLocalization }} <p-sortIcon field="timeOfAppointment" />
|
||||||
|
</th>
|
||||||
|
<th>{{ '::mobileNo' | abpLocalization }}</th>
|
||||||
|
<th>{{ '::email' | abpLocalization }}</th>
|
||||||
|
<th pSortableColumn="appointmentStatus">
|
||||||
|
{{ '::appointmentStatus' | abpLocalization }} <p-sortIcon field="appointmentStatus" />
|
||||||
|
</th>
|
||||||
|
<th pSortableColumn="visitType">
|
||||||
|
{{ '::visitType' | abpLocalization }} <p-sortIcon field="visitType" />
|
||||||
|
</th>
|
||||||
|
<th>{{ '::actions' | abpLocalization }}</th>
|
||||||
</tr>
|
</tr>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
|
|
||||||
<ng-template pTemplate="body" let-appointment>
|
<ng-template pTemplate="body" let-appointment>
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{ appointment.firstName }} {{ appointment.lastName }}</td>
|
<td>{{ appointment.firstName }} {{ appointment.lastName }}</td>
|
||||||
<td>Dr. {{ appointment.doctor.firstName }} {{ appointment.doctor.lastName }}</td>
|
<td>{{ '::doctorPrefix' | abpLocalization }} {{ appointment.doctor.firstName }} {{ appointment.doctor.lastName }}</td>
|
||||||
<td>
|
<td>
|
||||||
<span class="badge" [ngClass]="appointment.gender === 1 ? 'bg-primary' : 'bg-pink'">
|
<span class="badge" [ngClass]="appointment.gender === 1 ? 'bg-primary' : 'bg-pink'">
|
||||||
{{ getGenderLabel(appointment.gender) }}
|
{{ getGenderLabel(appointment.gender) }}
|
||||||
@ -125,4 +139,6 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<app-appointment-dialog [appointmentId]="appointmentIdToEdit"[isEditMode]="isEditMode"
|
<app-appointment-dialog [appointmentId]="appointmentIdToEdit"[isEditMode]="isEditMode"
|
||||||
[visible]="isModalVisible"*ngIf="isModalVisible" [name]="'Appointment'" (close)="closeDialog()"></app-appointment-dialog>
|
[visible]="isModalVisible"*ngIf="isModalVisible"
|
||||||
|
[name]="'::appointment' | abpLocalization"
|
||||||
|
(close)="closeDialog()"></app-appointment-dialog>
|
||||||
|
@ -1,8 +1,7 @@
|
|||||||
import { Confirmation, ConfirmationService, ToasterService } from '@abp/ng.theme.shared';
|
import { Confirmation, ConfirmationService, ToasterService } from '@abp/ng.theme.shared';
|
||||||
import { HttpClient } from '@angular/common/http';
|
import { HttpClient } from '@angular/common/http';
|
||||||
import { Component } from '@angular/core';
|
import { Component } from '@angular/core';
|
||||||
import { NgForm } from '@angular/forms';
|
import { CreateOrUpdateAppointmentDto } from '@proxy/appoinments/dto';
|
||||||
import { AppointmentDto, CreateOrUpdateAppointmentDto } from '@proxy/appoinments/dto';
|
|
||||||
import { AppointmentService } from '@proxy/appointments';
|
import { AppointmentService } from '@proxy/appointments';
|
||||||
import { DoctorService } from '@proxy/doctors';
|
import { DoctorService } from '@proxy/doctors';
|
||||||
import { PagingSortResultDto } from '@proxy/dto';
|
import { PagingSortResultDto } from '@proxy/dto';
|
||||||
@ -66,7 +65,6 @@ export class ViewAppointmentComponent {
|
|||||||
};
|
};
|
||||||
|
|
||||||
appointments = [];
|
appointments = [];
|
||||||
// status = { 1: 'Scheduled', 2: 'Completed', 3: 'Canceled' };
|
|
||||||
|
|
||||||
doctors = [];
|
doctors = [];
|
||||||
doctorOptions = [];
|
doctorOptions = [];
|
||||||
@ -76,7 +74,6 @@ export class ViewAppointmentComponent {
|
|||||||
constructor(
|
constructor(
|
||||||
private DoctorService: DoctorService,
|
private DoctorService: DoctorService,
|
||||||
private AppointmentService: AppointmentService,
|
private AppointmentService: AppointmentService,
|
||||||
private http: HttpClient,
|
|
||||||
private confirmation: ConfirmationService,
|
private confirmation: ConfirmationService,
|
||||||
private toaster: ToasterService
|
private toaster: ToasterService
|
||||||
) {}
|
) {}
|
||||||
@ -136,9 +133,7 @@ export class ViewAppointmentComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const blob = new Blob([bytes], { type: 'application/xlsx' });
|
const blob = new Blob([bytes], { type: 'application/xlsx' });
|
||||||
|
|
||||||
const url = window.URL.createObjectURL(blob);
|
const url = window.URL.createObjectURL(blob);
|
||||||
|
|
||||||
const link = document.createElement('a');
|
const link = document.createElement('a');
|
||||||
link.href = url;
|
link.href = url;
|
||||||
link.download = result.fileName;
|
link.download = result.fileName;
|
||||||
@ -186,7 +181,7 @@ export class ViewAppointmentComponent {
|
|||||||
this.DoctorService.get().subscribe(result => {
|
this.DoctorService.get().subscribe(result => {
|
||||||
this.doctors = result;
|
this.doctors = result;
|
||||||
this.doctorOptions = this.doctors.map(doctor => ({
|
this.doctorOptions = this.doctors.map(doctor => ({
|
||||||
label: `Dr. ${doctor.firstName} ${doctor.lastName}`, // Combine first and last name
|
label: `Dr. ${doctor.firstName} ${doctor.lastName}`,
|
||||||
value: doctor.id,
|
value: doctor.id,
|
||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
|
@ -15,6 +15,7 @@ import { DoctorService } from '@proxy/doctors';
|
|||||||
import { InputTextareaModule } from 'primeng/inputtextarea';
|
import { InputTextareaModule } from 'primeng/inputtextarea';
|
||||||
import { ChipModule } from 'primeng/chip';
|
import { ChipModule } from 'primeng/chip';
|
||||||
import { AppointmentDialogComponent } from "../appointment-dialog/appointment-dialog.component";
|
import { AppointmentDialogComponent } from "../appointment-dialog/appointment-dialog.component";
|
||||||
|
import { SharedModule } from 'src/app/shared/shared.module';
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
declarations: [ViewAppointmentComponent],
|
declarations: [ViewAppointmentComponent],
|
||||||
@ -33,6 +34,7 @@ import { AppointmentDialogComponent } from "../appointment-dialog/appointment-di
|
|||||||
RadioButtonModule,
|
RadioButtonModule,
|
||||||
InputTextareaModule,
|
InputTextareaModule,
|
||||||
ChipModule,
|
ChipModule,
|
||||||
|
SharedModule,
|
||||||
AppointmentDialogComponent
|
AppointmentDialogComponent
|
||||||
],
|
],
|
||||||
providers:[DoctorService]
|
providers:[DoctorService]
|
||||||
|
@ -4,70 +4,170 @@
|
|||||||
role="dialog"
|
role="dialog"
|
||||||
style="background: rgba(0, 0, 0, 0.5)"
|
style="background: rgba(0, 0, 0, 0.5)"
|
||||||
*ngIf="visible"
|
*ngIf="visible"
|
||||||
aria-label="l('Doctor')"
|
aria-label="{{ '::department' | abpLocalization }}"
|
||||||
>
|
>
|
||||||
<div class="modal-dialog modal-lg">
|
<div class="modal-dialog modal-lg">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
<div class="modal-header py-4">
|
<div class="modal-header py-4">
|
||||||
<h4 class="text-success mb-0 fs-3 fw-normal">
|
<h4 class="text-success mb-0 fs-3 fw-normal">
|
||||||
{{ isEditMode ? 'Edit ' : 'Create ' }} Doctor
|
{{ isEditMode ? ('::edit' | abpLocalization) : ('::create' | abpLocalization) }}
|
||||||
|
{{ '::department' | abpLocalization }}
|
||||||
</h4>
|
</h4>
|
||||||
<button
|
<button
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
type="button"
|
type="button"
|
||||||
(click)="onClose()"
|
(click)="onClose()"
|
||||||
class="btn-close"
|
class="btn-close"
|
||||||
aria-label="Close"
|
aria-label="{{ '::close' | abpLocalization }}"
|
||||||
></button>
|
></button>
|
||||||
</div>
|
</div>
|
||||||
<form #doctorForm="ngForm" (ngSubmit)="saveDoctor(doctorForm)">
|
<form #departmentForm="ngForm" (ngSubmit)="saveDepartment(departmentForm)">
|
||||||
<div class="p-fluid grid justify-content-center">
|
<div class="p-fluid grid justify-content-center">
|
||||||
<div class="field col-md-5" *ngFor="let field of ['firstName', 'lastName', 'mobile', 'email']; let i = index">
|
<div class="field col-md-5">
|
||||||
<label [for]="field">{{ field | titlecase }} <span class="text-danger">*</span></label>
|
<label for="departmentNo">
|
||||||
|
{{ '::departmentNo' | abpLocalization }} <span class="text-danger">*</span>
|
||||||
|
</label>
|
||||||
<span class="p-input-icon-left p-input-icon-right">
|
<span class="p-input-icon-left p-input-icon-right">
|
||||||
<i class="pi" [ngClass]="{'pi-user': i < 2, 'pi-phone': field === 'mobile', 'pi-envelope': field === 'email'}"></i>
|
<i class="pi pi-hashtag"></i>
|
||||||
<input pInputText [id]="field" [name]="field" [(ngModel)]="doctor[field]" required #ctrl="ngModel"
|
<input
|
||||||
[ngClass]="{'is-valid': ctrl.valid && ctrl.touched, 'is-invalid': ctrl.invalid && ctrl.touched}" />
|
pInputText
|
||||||
<i *ngIf="ctrl.valid && ctrl.touched" class="pi pi-check text-success"></i>
|
id="departmentNo"
|
||||||
<i *ngIf="ctrl.invalid && ctrl.touched" class="pi pi-times text-danger"></i>
|
name="departmentNo"
|
||||||
|
[(ngModel)]="department.departmentNo"
|
||||||
|
#departmentNoCtrl="ngModel"
|
||||||
|
required
|
||||||
|
[ngClass]="{
|
||||||
|
'is-valid': departmentNoCtrl.valid && departmentNoCtrl.touched,
|
||||||
|
'is-invalid': departmentNoCtrl.invalid && departmentNoCtrl.touched
|
||||||
|
}"
|
||||||
|
/>
|
||||||
|
<i
|
||||||
|
*ngIf="departmentNoCtrl.valid && departmentNoCtrl.touched"
|
||||||
|
class="pi pi-check text-success"
|
||||||
|
></i>
|
||||||
|
<i
|
||||||
|
*ngIf="departmentNoCtrl.invalid && departmentNoCtrl.touched"
|
||||||
|
class="pi pi-times text-danger"
|
||||||
|
></i>
|
||||||
|
</span>
|
||||||
|
<small class="text-danger" *ngIf="departmentNoCtrl.invalid && departmentNoCtrl.touched">
|
||||||
|
<span *ngIf="departmentNoCtrl.errors?.required">
|
||||||
|
{{ '::departmentNoRequired' | abpLocalization }}
|
||||||
|
</span>
|
||||||
|
</small>
|
||||||
|
</div>
|
||||||
|
<div class="field col-md-1"></div>
|
||||||
|
|
||||||
|
<div class="field col-md-5">
|
||||||
|
<label for="departmentName">
|
||||||
|
{{ '::departmentName' | abpLocalization }} <span class="text-danger">*</span>
|
||||||
|
</label>
|
||||||
|
<span class="p-input-icon-left p-input-icon-right">
|
||||||
|
<i class="pi pi-building"></i>
|
||||||
|
<input
|
||||||
|
pInputText
|
||||||
|
id="departmentName"
|
||||||
|
name="departmentName"
|
||||||
|
[(ngModel)]="department.departmentName"
|
||||||
|
#departmentNameCtrl="ngModel"
|
||||||
|
required
|
||||||
|
/>
|
||||||
|
</span>
|
||||||
|
<small
|
||||||
|
class="text-danger"
|
||||||
|
*ngIf="departmentNameCtrl.invalid && departmentNameCtrl.touched"
|
||||||
|
>
|
||||||
|
<span *ngIf="departmentNameCtrl.errors?.required">
|
||||||
|
{{ '::departmentNameRequired' | abpLocalization }}
|
||||||
|
</span>
|
||||||
|
</small>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="field col-md-5">
|
||||||
|
<label for="departmentDate">
|
||||||
|
{{ '::departmentDate' | abpLocalization }}
|
||||||
|
</label>
|
||||||
|
<p-calendar
|
||||||
|
id="departmentDate"
|
||||||
|
name="departmentDate"
|
||||||
|
[(ngModel)]="Departmentdate"
|
||||||
|
[showIcon]="true"
|
||||||
|
>
|
||||||
|
</p-calendar>
|
||||||
|
</div>
|
||||||
|
<div class="field col-md-1"></div>
|
||||||
|
|
||||||
|
<div class="field col-md-5">
|
||||||
|
<label for="departmentHead">
|
||||||
|
{{ '::departmentHead' | abpLocalization }}
|
||||||
|
</label>
|
||||||
|
<span class="p-input-icon-left">
|
||||||
|
<i class="pi pi-user"></i>
|
||||||
|
<input
|
||||||
|
pInputText
|
||||||
|
id="departmentHead"
|
||||||
|
name="departmentHead"
|
||||||
|
[(ngModel)]="department.departmentHead"
|
||||||
|
/>
|
||||||
</span>
|
</span>
|
||||||
<small class="text-danger" *ngIf="ctrl.invalid && ctrl.touched">{{ field | titlecase }} is required.</small>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="field col-md-5">
|
<div class="field col-md-5">
|
||||||
<label for="specialization">Specialization</label>
|
<label>
|
||||||
<input pInputText id="specialization" name="specialization" [(ngModel)]="doctor.specialization" />
|
{{ '::status' | abpLocalization }}
|
||||||
</div>
|
</label>
|
||||||
<div class="field col-md-5">
|
<div class="flex align-items-center p-input-icon-right">
|
||||||
<label for="degree">Degree</label>
|
<p-radioButton
|
||||||
<input pInputText id="degree" name="degree" [(ngModel)]="doctor.degree" />
|
name="status"
|
||||||
</div>
|
value="Active"
|
||||||
<div class="field col-md-5">
|
[(ngModel)]="department.status"
|
||||||
<label for="experience">Experience (Years)</label>
|
inputId="active"
|
||||||
<input type="number" pInputText id="experience" name="experience" [(ngModel)]="doctor.experience" min="0" />
|
></p-radioButton>
|
||||||
</div>
|
<label for="active" class="ml-2 mr-3">
|
||||||
<div class="field col-md-5">
|
{{ '::active' | abpLocalization }}
|
||||||
<label for="consultationFee">Consultation Fee</label>
|
</label>
|
||||||
<input type="number" pInputText id="consultationFee" name="consultationFee" [(ngModel)]="doctor.consultationFee" min="0" />
|
<p-radioButton
|
||||||
</div>
|
name="status"
|
||||||
<div class="field col-md-5">
|
value="Inactive"
|
||||||
<label for="clinicLocation">Clinic Location</label>
|
[(ngModel)]="department.status"
|
||||||
<input pInputText id="clinicLocation" name="clinicLocation" [(ngModel)]="doctor.clinicLocation" />
|
inputId="inactive"
|
||||||
</div>
|
></p-radioButton>
|
||||||
<div class="field col-md-5">
|
<label for="inactive" class="ml-2">
|
||||||
<label for="rating">Rating</label>
|
{{ '::inactive' | abpLocalization }}
|
||||||
<p-rating [(ngModel)]="doctor.rating" [stars]="4" [cancel]="false" name="rating"></p-rating>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="field col-md-5">
|
|
||||||
<label for="availability">Availability</label>
|
|
||||||
<p-dropdown [options]="workScheduleOptions" [(ngModel)]="doctor.availability" name="availability" placeholder="Select Availability"></p-dropdown>
|
|
||||||
</div>
|
</div>
|
||||||
|
<div class="field col-md-6"></div>
|
||||||
|
|
||||||
<div class="field col-11">
|
<div class="field col-11">
|
||||||
<label for="description">Description</label>
|
<label for="description">
|
||||||
<textarea id="description" name="description" [(ngModel)]="doctor.description" rows="5" cols="30" pInputTextarea></textarea>
|
{{ '::description' | abpLocalization }}
|
||||||
|
</label>
|
||||||
|
<textarea
|
||||||
|
id="description"
|
||||||
|
name="description"
|
||||||
|
[(ngModel)]="department.description"
|
||||||
|
rows="5"
|
||||||
|
cols="30"
|
||||||
|
pInputTextarea
|
||||||
|
>
|
||||||
|
</textarea>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="field col-11 flex justify-content-end">
|
<div class="field col-11 flex justify-content-end">
|
||||||
<button pButton type="submit" label="Save" class="p-button-success" [disabled]="doctorForm.invalid"></button>
|
<button
|
||||||
<button pButton type="button" label="Cancel" class="p-button-secondary ml-2" (click)="onClose()"></button>
|
pButton
|
||||||
|
type="submit"
|
||||||
|
[label]="'::save' | abpLocalization"
|
||||||
|
class="p-button-success"
|
||||||
|
[disabled]="departmentForm.invalid"
|
||||||
|
></button>
|
||||||
|
<button
|
||||||
|
pButton
|
||||||
|
type="button"
|
||||||
|
[label]="'::cancel' | abpLocalization"
|
||||||
|
class="p-button-secondary ml-2"
|
||||||
|
(click)="onClose()"
|
||||||
|
></button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
@ -11,13 +11,11 @@
|
|||||||
border-color: red !important;
|
border-color: red !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Adjust the z-index of the calendar dropdown */
|
|
||||||
.p-calendar .p-datepicker {
|
.p-calendar .p-datepicker {
|
||||||
z-index: 1050 !important; /* Make sure it's above other elements */
|
z-index: 1050 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* You can also adjust modal z-index if necessary */
|
|
||||||
.modal {
|
.modal {
|
||||||
z-index: 1040; /* Set lower z-index to ensure modal is behind the calendar */
|
z-index: 1040;
|
||||||
}
|
}
|
||||||
|
|
@ -1,5 +1,4 @@
|
|||||||
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
|
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
|
||||||
import { DepartmentsRoutingModule } from './departments-routing.module';
|
|
||||||
import { CommonModule } from '@angular/common';
|
import { CommonModule } from '@angular/common';
|
||||||
import { FormsModule, NgForm } from '@angular/forms';
|
import { FormsModule, NgForm } from '@angular/forms';
|
||||||
import { ButtonModule } from 'primeng/button';
|
import { ButtonModule } from 'primeng/button';
|
||||||
@ -13,7 +12,8 @@ import { RadioButtonModule } from 'primeng/radiobutton';
|
|||||||
import { TableModule } from 'primeng/table';
|
import { TableModule } from 'primeng/table';
|
||||||
import { CreateDepartmentDto } from '@proxy/dtos';
|
import { CreateDepartmentDto } from '@proxy/dtos';
|
||||||
import { DepartmentService } from '@proxy/departments';
|
import { DepartmentService } from '@proxy/departments';
|
||||||
import { ConfirmationService, ToasterService } from '@abp/ng.theme.shared';
|
import { ToasterService } from '@abp/ng.theme.shared';
|
||||||
|
import { SharedModule } from '../shared/shared.module';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-department-dialog',
|
selector: 'app-department-dialog',
|
||||||
@ -32,6 +32,7 @@ import { ConfirmationService, ToasterService } from '@abp/ng.theme.shared';
|
|||||||
InputTextareaModule,
|
InputTextareaModule,
|
||||||
ChipModule,
|
ChipModule,
|
||||||
CommonModule,
|
CommonModule,
|
||||||
|
SharedModule
|
||||||
],
|
],
|
||||||
templateUrl: './department-dialog.component.html',
|
templateUrl: './department-dialog.component.html',
|
||||||
styleUrl: './department-dialog.component.scss',
|
styleUrl: './department-dialog.component.scss',
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
>
|
>
|
||||||
<ng-template pTemplate="caption">
|
<ng-template pTemplate="caption">
|
||||||
<div class="flex align-items-center justify-content-between mb-3 gap-3">
|
<div class="flex align-items-center justify-content-between mb-3 gap-3">
|
||||||
<h4 class="m-0">Department List</h4>
|
<h4 class="m-0">{{ '::departmentList' | abpLocalization }}</h4>
|
||||||
<div class="flex-grow-1 flex justify-content-center">
|
<div class="flex-grow-1 flex justify-content-center">
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<span class="input-group-text"><i class="pi pi-search"></i></span>
|
<span class="input-group-text"><i class="pi pi-search"></i></span>
|
||||||
@ -26,8 +26,8 @@
|
|||||||
class="form-control"
|
class="form-control"
|
||||||
(input)="dt2.filterGlobal($event.target.value, 'contains')"
|
(input)="dt2.filterGlobal($event.target.value, 'contains')"
|
||||||
[(ngModel)]="globalFilter"
|
[(ngModel)]="globalFilter"
|
||||||
placeholder="Search keyword"
|
placeholder="{{ '::searchKeyword' | abpLocalization }}"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
@ -35,6 +35,8 @@
|
|||||||
pButton
|
pButton
|
||||||
class="p-button-rounded p-button-secondary ml-2"
|
class="p-button-rounded p-button-secondary ml-2"
|
||||||
(click)="loaddepartments($event)"
|
(click)="loaddepartments($event)"
|
||||||
|
[title]="'::refresh' | abpLocalization"
|
||||||
|
|
||||||
>
|
>
|
||||||
<i class="pi pi-refresh"></i>
|
<i class="pi pi-refresh"></i>
|
||||||
</button>
|
</button>
|
||||||
@ -42,7 +44,8 @@
|
|||||||
pButton
|
pButton
|
||||||
class="p-button-rounded p-button-success ml-2"
|
class="p-button-rounded p-button-success ml-2"
|
||||||
(click)="openNewDepartmentDialog()"
|
(click)="openNewDepartmentDialog()"
|
||||||
pTooltip="Add Department"
|
pTooltip="{{ '::addDepartment' | abpLocalization }}"
|
||||||
|
|
||||||
tooltipPosition="left"
|
tooltipPosition="left"
|
||||||
>
|
>
|
||||||
<i class="pi pi-plus-circle"></i>
|
<i class="pi pi-plus-circle"></i>
|
||||||
@ -51,6 +54,8 @@
|
|||||||
pButton
|
pButton
|
||||||
class="p-button-rounded p-button-warning ml-2"
|
class="p-button-rounded p-button-warning ml-2"
|
||||||
(click)="exportDepartments()"
|
(click)="exportDepartments()"
|
||||||
|
[title]="'::export' | abpLocalization"
|
||||||
|
|
||||||
>
|
>
|
||||||
<i class="pi pi-download"></i>
|
<i class="pi pi-download"></i>
|
||||||
</button>
|
</button>
|
||||||
@ -59,13 +64,31 @@
|
|||||||
</ng-template>
|
</ng-template>
|
||||||
<ng-template pTemplate="header">
|
<ng-template pTemplate="header">
|
||||||
<tr>
|
<tr>
|
||||||
<th pSortableColumn="departmentNo">Department Number <p-sortIcon field="departmentNo" /></th>
|
<th pSortableColumn="departmentNo">
|
||||||
<th pSortableColumn="departmentName">Department Name <p-sortIcon field="departmentName" /></th>
|
{{ '::departmentNumber' | abpLocalization }}
|
||||||
<th pSortableColumn="description">Description <p-sortIcon field="description" /></th>
|
<p-sortIcon field="departmentNo" />
|
||||||
<th pSortableColumn="departmentDate">Date <p-sortIcon field="departmentDate" /></th>
|
</th>
|
||||||
<th pSortableColumn="departmentHead">Department Head<p-sortIcon field="departmentHead" /></th>
|
<th pSortableColumn="departmentName">
|
||||||
<th pSortableColumn="status">Status <p-sortIcon field="status" /></th>
|
{{ '::departmentName' | abpLocalization }}
|
||||||
<th>Actions</th>
|
<p-sortIcon field="departmentName" />
|
||||||
|
</th>
|
||||||
|
<th pSortableColumn="description">
|
||||||
|
{{ '::description' | abpLocalization }}
|
||||||
|
<p-sortIcon field="description" />
|
||||||
|
</th>
|
||||||
|
<th pSortableColumn="departmentDate">
|
||||||
|
{{ '::date' | abpLocalization }}
|
||||||
|
<p-sortIcon field="departmentDate" />
|
||||||
|
</th>
|
||||||
|
<th pSortableColumn="departmentHead">
|
||||||
|
{{ '::departmentHead' | abpLocalization }}
|
||||||
|
<p-sortIcon field="departmentHead" />
|
||||||
|
</th>
|
||||||
|
<th pSortableColumn="status">
|
||||||
|
{{ '::status' | abpLocalization }}
|
||||||
|
<p-sortIcon field="status" />
|
||||||
|
</th>
|
||||||
|
<th>{{ '::actions' | abpLocalization }}</th>
|
||||||
</tr>
|
</tr>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
<ng-template pTemplate="body" let-department>
|
<ng-template pTemplate="body" let-department>
|
||||||
@ -94,4 +117,6 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<app-department-dialog [Id]="DepartmentIdToEdit"[isEditMode]="isEditMode"
|
<app-department-dialog [Id]="DepartmentIdToEdit"[isEditMode]="isEditMode"
|
||||||
[visible]="isModalVisible"*ngIf="isModalVisible" [name]="'Department'" (close)="closeDialog()"></app-department-dialog >
|
[visible]="isModalVisible"*ngIf="isModalVisible"
|
||||||
|
[name]="'::department' | abpLocalization"
|
||||||
|
(close)="closeDialog()"></app-department-dialog >
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
import { Confirmation, ConfirmationService, ToasterService } from '@abp/ng.theme.shared';
|
import { Confirmation, ConfirmationService, ToasterService } from '@abp/ng.theme.shared';
|
||||||
import { HttpClient } from '@angular/common/http';
|
|
||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
import { DepartmentService } from '@proxy/departments';
|
import { DepartmentService } from '@proxy/departments';
|
||||||
import { PagingSortResultDto } from '@proxy/dto';
|
import { PagingSortResultDto } from '@proxy/dto';
|
||||||
@ -29,7 +28,6 @@ export class DepartmentsComponent implements OnInit {
|
|||||||
}
|
}
|
||||||
constructor(
|
constructor(
|
||||||
private DepartmentService: DepartmentService,
|
private DepartmentService: DepartmentService,
|
||||||
private http: HttpClient,
|
|
||||||
private confirmation: ConfirmationService,
|
private confirmation: ConfirmationService,
|
||||||
private toaster: ToasterService
|
private toaster: ToasterService
|
||||||
|
|
||||||
|
@ -14,12 +14,14 @@ import { InputTextareaModule } from 'primeng/inputtextarea';
|
|||||||
import { RadioButtonModule } from 'primeng/radiobutton';
|
import { RadioButtonModule } from 'primeng/radiobutton';
|
||||||
import { TableModule } from 'primeng/table';
|
import { TableModule } from 'primeng/table';
|
||||||
import { DepartmentDialogComponent } from "./department-dialog.component";
|
import { DepartmentDialogComponent } from "./department-dialog.component";
|
||||||
|
import { SharedModule } from '../shared/shared.module';
|
||||||
|
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
declarations: [DepartmentsComponent],
|
declarations: [DepartmentsComponent],
|
||||||
imports: [
|
imports: [
|
||||||
CommonModule,
|
CommonModule,
|
||||||
|
SharedModule,
|
||||||
DepartmentsRoutingModule,
|
DepartmentsRoutingModule,
|
||||||
TableModule,
|
TableModule,
|
||||||
DialogModule,
|
DialogModule,
|
||||||
|
@ -269,7 +269,6 @@
|
|||||||
<span *ngIf="joiningDateCtrl.errors?.required">Joining Date is required.</span>
|
<span *ngIf="joiningDateCtrl.errors?.required">Joining Date is required.</span>
|
||||||
</small>
|
</small>
|
||||||
</div>
|
</div>
|
||||||
<!-- Rating -->
|
|
||||||
<div class="field col-md-5">
|
<div class="field col-md-5">
|
||||||
<label for="rating">Rating</label><br />
|
<label for="rating">Rating</label><br />
|
||||||
<p-rating
|
<p-rating
|
||||||
@ -280,19 +279,24 @@
|
|||||||
></p-rating>
|
></p-rating>
|
||||||
</div>
|
</div>
|
||||||
<div class="field col-md-1"></div>
|
<div class="field col-md-1"></div>
|
||||||
|
|
||||||
<!-- Button to open the popup -->
|
<!-- Button to open the popup -->
|
||||||
<div class="button-container">
|
<div class="col-md-5">
|
||||||
<button
|
<div class="button-container">
|
||||||
pButton
|
<button
|
||||||
type="button"
|
pButton
|
||||||
label="Select Availability"
|
type="button"
|
||||||
icon="pi pi-calendar"
|
label="Select Availability"
|
||||||
(click)="openDialog()"
|
icon="pi pi-calendar"
|
||||||
class="p-mr-2"
|
(click)="openDialog()"
|
||||||
></button>
|
class="p-mr-2"
|
||||||
|
></button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Popup Dialog -->
|
|
||||||
|
<!-- #incomplete -->
|
||||||
|
<!-- Need to Be Worked on the popup for schedule the time -->
|
||||||
<p-dialog
|
<p-dialog
|
||||||
header="Select Days and Times"
|
header="Select Days and Times"
|
||||||
[(visible)]="displayDialog"
|
[(visible)]="displayDialog"
|
||||||
@ -353,8 +357,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</p-footer>
|
</p-footer>
|
||||||
</p-dialog>
|
</p-dialog>
|
||||||
|
<!-- end -->
|
||||||
<!-- Description -->
|
|
||||||
<div class="field col-11">
|
<div class="field col-11">
|
||||||
<label for="description">Description</label>
|
<label for="description">Description</label>
|
||||||
<textarea
|
<textarea
|
||||||
@ -367,7 +370,6 @@
|
|||||||
></textarea>
|
></textarea>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Buttons -->
|
|
||||||
<div class="field col-11 flex justify-content-end">
|
<div class="field col-11 flex justify-content-end">
|
||||||
<button
|
<button
|
||||||
pButton
|
pButton
|
||||||
|
@ -15,14 +15,8 @@ import { RadioButtonModule } from 'primeng/radiobutton';
|
|||||||
import { TableModule } from 'primeng/table';
|
import { TableModule } from 'primeng/table';
|
||||||
import { RatingModule } from 'primeng/rating';
|
import { RatingModule } from 'primeng/rating';
|
||||||
import { MultiSelectModule } from 'primeng/multiselect';
|
import { MultiSelectModule } from 'primeng/multiselect';
|
||||||
import { TimeSlot, timeSlotOptions, WorkSchedule, workScheduleOptions } from '@proxy/global-enum';
|
import { TimeSlot, WorkSchedule, } from '@proxy/global-enum';
|
||||||
// Define Type for Availability
|
|
||||||
|
|
||||||
interface ScheduleOption {
|
|
||||||
label: string;
|
|
||||||
value: string;
|
|
||||||
items?: ScheduleOption[];
|
|
||||||
}
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-doctor-dialog',
|
selector: 'app-doctor-dialog',
|
||||||
standalone: true,
|
standalone: true,
|
||||||
@ -59,12 +53,10 @@ export class DoctorDialogComponent implements OnInit {
|
|||||||
isSchedulePopupVisible = false;
|
isSchedulePopupVisible = false;
|
||||||
selectedDays: { label: string; value: string }[] = [];
|
selectedDays: { label: string; value: string }[] = [];
|
||||||
selectedTimeSlots: { [key: number]: number | null } = {};
|
selectedTimeSlots: { [key: number]: number | null } = {};
|
||||||
|
|
||||||
displayDialog: boolean = false;
|
displayDialog: boolean = false;
|
||||||
selectedDay: any = null;
|
selectedDay: any = null;
|
||||||
selectedTime: any = null;
|
selectedTime: any = null;
|
||||||
selectedTimes: { [key: number]: number } = {};
|
selectedTimes: { [key: number]: number } = {};
|
||||||
|
|
||||||
workScheduleOptions: { label: string; value: number }[] = [];
|
workScheduleOptions: { label: string; value: number }[] = [];
|
||||||
timeSlotOptions: { label: string; value: number }[] = [];
|
timeSlotOptions: { label: string; value: number }[] = [];
|
||||||
|
|
||||||
|
@ -1,82 +1,119 @@
|
|||||||
<div>
|
<div>
|
||||||
<p-table
|
<p-table
|
||||||
#dt
|
#dt
|
||||||
dataKey="id"
|
dataKey="id"
|
||||||
[value]="doctors"
|
[value]="doctors"
|
||||||
[paginator]="true"
|
[paginator]="true"
|
||||||
[rows]="10"
|
[rows]="10"
|
||||||
[totalRecords]="totalRecords"
|
[totalRecords]="totalRecords"
|
||||||
[lazy]="true"
|
[lazy]="true"
|
||||||
(onLazyLoad)="loadDoctors($event)"
|
(onLazyLoad)="loadDoctors($event)"
|
||||||
[rowsPerPageOptions]="[10, 20, 50]"
|
[rowsPerPageOptions]="[10, 20, 50]"
|
||||||
[responsiveLayout]="'scroll'"
|
[responsiveLayout]="'scroll'"
|
||||||
[globalFilterFields]="['id', 'firstName', 'lastName', 'mobile', 'email', 'specialization']"
|
[globalFilterFields]="['id', 'firstName', 'lastName', 'mobile', 'email', 'specialization']"
|
||||||
[filters]="{ global: { value: '', matchMode: 'contains' } }"
|
[filters]="{ global: { value: '', matchMode: 'contains' } }"
|
||||||
class="table table-striped"
|
class="table table-striped"
|
||||||
>
|
>
|
||||||
<ng-template pTemplate="caption">
|
<ng-template pTemplate="caption">
|
||||||
<div class="flex align-items-center justify-content-between mb-3 gap-3">
|
<div class="flex align-items-center justify-content-between mb-3 gap-3">
|
||||||
<h4 class="m-0">Doctor List</h4>
|
<h4 class="m-0">{{ '::doctorList' | abpLocalization }}</h4>
|
||||||
<div class="flex-grow-1 flex justify-content-center">
|
<div class="flex-grow-1 flex justify-content-center">
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<span class="input-group-text"><i class="pi pi-search"></i></span>
|
<span class="input-group-text"><i class="pi pi-search"></i></span>
|
||||||
<input
|
<input
|
||||||
pInputText
|
pInputText
|
||||||
type="text"
|
type="text"
|
||||||
class="form-control"
|
class="form-control"
|
||||||
(input)="dt.filterGlobal($event.target.value, 'contains')"
|
(input)="dt.filterGlobal($event.target.value, 'contains')"
|
||||||
[(ngModel)]="globalFilter"
|
[(ngModel)]="globalFilter"
|
||||||
placeholder="Search keyword"
|
placeholder="{{ '::searchKeyword' | abpLocalization }}"
|
||||||
/>
|
/>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<button pButton class="p-button-rounded p-button-secondary ml-2" (click)="loadDoctors($event)">
|
|
||||||
<i class="pi pi-refresh"></i>
|
|
||||||
</button>
|
|
||||||
<button pButton class="p-button-rounded p-button-success ml-2" (click)="openNewDoctorDialog()" pTooltip="Add Doctor" tooltipPosition="left">
|
|
||||||
<i class="pi pi-plus-circle"></i>
|
|
||||||
</button>
|
|
||||||
<button pButton class="p-button-rounded p-button-warning ml-2" (click)="exportDoctors()">
|
|
||||||
<i class="pi pi-download"></i>
|
|
||||||
</button>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</ng-template>
|
<div>
|
||||||
<ng-template pTemplate="header">
|
<button
|
||||||
<tr>
|
pButton
|
||||||
<th pSortableColumn="firstName">Name <p-sortIcon field="firstName" /></th>
|
class="p-button-rounded p-button-secondary ml-2"
|
||||||
<th pSortableColumn="mobile">Mobile <p-sortIcon field="mobile" /></th>
|
(click)="loadDoctors($event)"
|
||||||
<th pSortableColumn="email">Email <p-sortIcon field="email" /></th>
|
[title]="'::refresh' | abpLocalization"
|
||||||
<th pSortableColumn="specialization">Specialization <p-sortIcon field="specialization" /></th>
|
>
|
||||||
<th pSortableColumn="experience">Experience <p-sortIcon field="experience" /></th>
|
<i class="pi pi-refresh"></i>
|
||||||
<th pSortableColumn="rating">Rating <p-sortIcon field="rating" /></th>
|
</button>
|
||||||
<th>Actions</th>
|
<button
|
||||||
</tr>
|
pButton
|
||||||
</ng-template>
|
class="p-button-rounded p-button-success ml-2"
|
||||||
<ng-template pTemplate="body" let-doctor>
|
(click)="openNewDoctorDialog()"
|
||||||
<tr>
|
pTooltip="{{ '::addDoctor' | abpLocalization }}"
|
||||||
<td>Dr. {{ doctor.firstName }} {{ doctor.lastName }}</td>
|
tooltipPosition="left"
|
||||||
<td>{{ doctor.mobile }}</td>
|
>
|
||||||
<td>{{ doctor.email }}</td>
|
<i class="pi pi-plus-circle"></i>
|
||||||
<td>{{ doctor.specialization }}</td>
|
</button>
|
||||||
<td>{{ doctor.experience }} years</td>
|
<button pButton class="p-button-rounded p-button-warning ml-2" (click)="exportDoctors()"
|
||||||
<td>{{ doctor.rating }}</td>
|
[title]="'::export' | abpLocalization"
|
||||||
<td class="d-flex">
|
>
|
||||||
<button class="btn btn-warning btn-sm ml-1" (click)="editDoctor(doctor)">
|
<i class="pi pi-download"></i>
|
||||||
<i class="pi pi-pencil"></i>
|
</button>
|
||||||
</button>
|
</div>
|
||||||
<button class="btn btn-danger btn-sm ml-1" (click)="deleteDoctor(doctor.id)">
|
</div>
|
||||||
<i class="pi pi-trash"></i>
|
</ng-template>
|
||||||
</button>
|
<ng-template pTemplate="header">
|
||||||
<button class="btn btn-warning btn-sm ml-1" (click)="GotoShiftManagement(doctor.id)">
|
<tr>
|
||||||
<i class="pi pi-arrow-right"></i>
|
<th pSortableColumn="firstName">
|
||||||
</button>
|
{{ '::name' | abpLocalization }}
|
||||||
</td>
|
<p-sortIcon field="firstName" />
|
||||||
</tr>
|
</th>
|
||||||
</ng-template>
|
<th pSortableColumn="mobile">
|
||||||
</p-table>
|
{{ '::mobile' | abpLocalization }}
|
||||||
|
<p-sortIcon field="mobile" />
|
||||||
|
</th>
|
||||||
|
<th pSortableColumn="email">
|
||||||
|
{{ '::email' | abpLocalization }}
|
||||||
|
<p-sortIcon field="email" />
|
||||||
|
</th>
|
||||||
|
<th pSortableColumn="specialization">
|
||||||
|
{{ '::specialization' | abpLocalization }}
|
||||||
|
<p-sortIcon field="specialization" />
|
||||||
|
</th>
|
||||||
|
<th pSortableColumn="experience">
|
||||||
|
{{ '::experience' | abpLocalization }}
|
||||||
|
<p-sortIcon field="experience" />
|
||||||
|
</th>
|
||||||
|
<th pSortableColumn="rating">
|
||||||
|
{{ '::rating' | abpLocalization }}
|
||||||
|
<p-sortIcon field="rating" />
|
||||||
|
</th>
|
||||||
|
<th>{{ '::actions' | abpLocalization }}</th>
|
||||||
|
</tr>
|
||||||
|
</ng-template>
|
||||||
|
<ng-template pTemplate="body" let-doctor>
|
||||||
|
<tr>
|
||||||
|
<td>{{ '::doctorPrefix' | abpLocalization }} {{ doctor.firstName }} {{ doctor.lastName }}</td>
|
||||||
|
<td>{{ doctor.mobile }}</td>
|
||||||
|
<td>{{ doctor.email }}</td>
|
||||||
|
<td>{{ doctor.specialization }}</td>
|
||||||
|
<td>{{ doctor.experience }} {{ '::years' | abpLocalization }}</td>
|
||||||
|
<td>{{ doctor.rating }}</td>
|
||||||
|
<td class="d-flex">
|
||||||
|
<button class="btn btn-warning btn-sm ml-1" (click)="editDoctor(doctor)">
|
||||||
|
<i class="pi pi-pencil"></i>
|
||||||
|
</button>
|
||||||
|
<button class="btn btn-danger btn-sm ml-1" (click)="deleteDoctor(doctor.id)">
|
||||||
|
<i class="pi pi-trash"></i>
|
||||||
|
</button>
|
||||||
|
<button class="btn btn-warning btn-sm ml-1" (click)="GotoShiftManagement(doctor.id)">
|
||||||
|
<i class="pi pi-arrow-right"></i>
|
||||||
|
</button>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</ng-template>
|
||||||
|
</p-table>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<app-doctor-dialog [Id]="DoctorIdToEdit"[isEditMode]="isEditMode"
|
<app-doctor-dialog
|
||||||
[visible]="isModalVisible"*ngIf="isModalVisible" [name]="'Doctor'" (close)="closeDialog()"></app-doctor-dialog>
|
[Id]="DoctorIdToEdit"
|
||||||
|
[isEditMode]="isEditMode"
|
||||||
|
[visible]="isModalVisible"
|
||||||
|
*ngIf="isModalVisible"
|
||||||
|
[name]="'::doctor' | abpLocalization"
|
||||||
|
(close)="closeDialog()"
|
||||||
|
></app-doctor-dialog>
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
import { ConfirmationService, ToasterService } from '@abp/ng.theme.shared';
|
|
||||||
import { HttpClient } from '@angular/common/http';
|
|
||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
import { Router } from '@angular/router';
|
import { Router } from '@angular/router';
|
||||||
import { DoctorService } from '@proxy/doctors';
|
import { DoctorService } from '@proxy/doctors';
|
||||||
@ -31,9 +30,7 @@ export class DoctorsComponent implements OnInit {
|
|||||||
}
|
}
|
||||||
constructor(
|
constructor(
|
||||||
private DoctorService: DoctorService,
|
private DoctorService: DoctorService,
|
||||||
private http: HttpClient,
|
|
||||||
private confirmation: ConfirmationService,
|
|
||||||
private toaster: ToasterService,
|
|
||||||
private router: Router
|
private router: Router
|
||||||
) {}
|
) {}
|
||||||
workSchedule = Object.keys(workScheduleOptions)
|
workSchedule = Object.keys(workScheduleOptions)
|
||||||
|
@ -15,6 +15,7 @@ import { RadioButtonModule } from 'primeng/radiobutton';
|
|||||||
import { TableModule } from 'primeng/table';
|
import { TableModule } from 'primeng/table';
|
||||||
import { DoctorDialogComponent } from './doctor-dialog.component';
|
import { DoctorDialogComponent } from './doctor-dialog.component';
|
||||||
import { ShiftManagementComponent } from './shift-management/shift-management.component';
|
import { ShiftManagementComponent } from './shift-management/shift-management.component';
|
||||||
|
import { SharedModule } from '../shared/shared.module';
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
declarations: [DoctorsComponent,ShiftManagementComponent],
|
declarations: [DoctorsComponent,ShiftManagementComponent],
|
||||||
@ -34,6 +35,7 @@ import { ShiftManagementComponent } from './shift-management/shift-management.co
|
|||||||
InputTextareaModule,
|
InputTextareaModule,
|
||||||
ChipModule,
|
ChipModule,
|
||||||
DoctorDialogComponent,
|
DoctorDialogComponent,
|
||||||
|
SharedModule
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,111 +1,141 @@
|
|||||||
<abp-page [title]="'AbpIdentity::Roles' | abpLocalization" [toolbar]="data.items">
|
<abp-page [title]="'AbpIdentity::Roles' | abpLocalization" [toolbar]="data.items">
|
||||||
<div id="identity-roles-wrapper" class="card">
|
<div id="identity-roles-wrapper" class="card">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<!-- <abp-extensible-table
|
<!-- <abp-extensible-table
|
||||||
[data]="data.items"
|
[data]="data.items"
|
||||||
[recordsTotal]="data.totalCount"
|
[recordsTotal]="data.totalCount"
|
||||||
[list]="list"
|
[list]="list"
|
||||||
></abp-extensible-table> -->
|
></abp-extensible-table> -->
|
||||||
<div class="flex justify-content-between align-items-center mb-3">
|
<div class="flex justify-content-between align-items-center mb-3">
|
||||||
<button pButton icon="pi pi-plus" label="Add Roles" class="p-button-success" (click)="add()"></button>
|
<button
|
||||||
</div>
|
pButton
|
||||||
<p-table [value]="data.items" [paginator]="true" [rows]="5" responsiveLayout="scroll">
|
icon="pi pi-plus"
|
||||||
<ng-template pTemplate="header">
|
label="{{ '::addRoles' | abpLocalization }}"
|
||||||
<tr>
|
class="p-button-success"
|
||||||
<th pSortableColumn="name">Role name <p-sortIcon field="name"></p-sortIcon></th>
|
(click)="add()"
|
||||||
|
></button>
|
||||||
<th>Actions</th>
|
|
||||||
</tr>
|
|
||||||
</ng-template>
|
|
||||||
|
|
||||||
<ng-template pTemplate="body" let-role>
|
|
||||||
<tr>
|
|
||||||
<td>{{ role.name }}</td>
|
|
||||||
|
|
||||||
|
|
||||||
<td>
|
|
||||||
<button pButton icon="pi pi-pencil" class="p-button-text p-button-primary" (click)="edit(role.id)"></button>
|
|
||||||
<button pButton icon="pi pi-trash" class="p-button-text p-button-danger" (click)="delete(role.id,role.name)"></button>
|
|
||||||
<button pButton icon="pi pi-lock" class="p-button-text p-button-success" (click)="openPermissionsModal(role.name)"></button>
|
|
||||||
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</ng-template>
|
|
||||||
</p-table>
|
|
||||||
</div>
|
</div>
|
||||||
|
<p-table [value]="data.items" [paginator]="true" [rows]="5" responsiveLayout="scroll">
|
||||||
|
<ng-template pTemplate="header">
|
||||||
|
<tr>
|
||||||
|
<th pSortableColumn="name">
|
||||||
|
{{ 'AbpIdentity::RoleName' | abpLocalization }}
|
||||||
|
<p-sortIcon field="name"></p-sortIcon>
|
||||||
|
</th>
|
||||||
|
<th>{{ 'AbpIdentity::Actions' | abpLocalization }}</th>
|
||||||
|
</tr>
|
||||||
|
</ng-template>
|
||||||
|
|
||||||
|
<ng-template pTemplate="body" let-role>
|
||||||
|
<tr>
|
||||||
|
<td>{{ role.name }}</td>
|
||||||
|
|
||||||
|
<td>
|
||||||
|
<button
|
||||||
|
pButton
|
||||||
|
icon="pi pi-pencil"
|
||||||
|
class="p-button-text p-button-primary"
|
||||||
|
(click)="edit(role.id)"
|
||||||
|
title="{{ 'AbpIdentity::Edit' | abpLocalization }}"
|
||||||
|
></button>
|
||||||
|
<button
|
||||||
|
pButton
|
||||||
|
icon="pi pi-trash"
|
||||||
|
class="p-button-text p-button-danger"
|
||||||
|
(click)="delete(role.id, role.name)"
|
||||||
|
title="{{ 'AbpIdentity::Delete' | abpLocalization }}"
|
||||||
|
></button>
|
||||||
|
<button
|
||||||
|
pButton
|
||||||
|
icon="pi pi-lock"
|
||||||
|
class="p-button-text p-button-success"
|
||||||
|
(click)="openPermissionsModal(role.name)"
|
||||||
|
title="{{ 'AbpIdentity::Permissions' | abpLocalization }}"
|
||||||
|
></button>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</ng-template>
|
||||||
|
</p-table>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<abp-modal [(visible)]="isModalVisible" [busy]="modalBusy">
|
<abp-modal [(visible)]="isModalVisible" [busy]="modalBusy">
|
||||||
<ng-template #abpHeader>
|
<ng-template #abpHeader>
|
||||||
<h3>{{ (selected?.id ? 'AbpIdentity::Edit' : 'AbpIdentity::NewRole') | abpLocalization }}</h3>
|
<h3>{{ (selected?.id ? 'AbpIdentity::Edit' : 'AbpIdentity::NewRole') | abpLocalization }}</h3>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
|
|
||||||
<!-- <ng-template #abpBody>
|
<!-- <ng-template #abpBody>
|
||||||
<form [formGroup]="form" (ngSubmit)="save()" validateOnSubmit>
|
<form [formGroup]="form" (ngSubmit)="save()" validateOnSubmit>
|
||||||
<abp-extensible-form [selectedRecord]="selected"></abp-extensible-form>
|
<abp-extensible-form [selectedRecord]="selected"></abp-extensible-form>
|
||||||
</form>
|
</form>
|
||||||
</ng-template> -->
|
</ng-template> -->
|
||||||
|
|
||||||
<ng-template #abpBody>
|
<ng-template #abpBody>
|
||||||
<form #roleForm="ngForm" (ngSubmit)="save()" validateOnSubmit>
|
<form #roleForm="ngForm" (ngSubmit)="save()" validateOnSubmit>
|
||||||
<!-- Name Field -->
|
<!-- Name Field -->
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="name">Name</label>
|
<label for="name">{{ 'AbpIdentity::Name' | abpLocalization }}</label>
|
||||||
<input
|
<input
|
||||||
id="name"
|
id="name"
|
||||||
type="text"
|
type="text"
|
||||||
class="form-control"
|
class="form-control"
|
||||||
[(ngModel)]="selected.name"
|
[(ngModel)]="selected.name"
|
||||||
name="name"
|
name="name"
|
||||||
required
|
required
|
||||||
#nameCtrl="ngModel"
|
#nameCtrl="ngModel"
|
||||||
/>
|
/>
|
||||||
<small class="text-danger" *ngIf="nameCtrl.invalid && nameCtrl.touched">Name is required</small>
|
<small class="text-danger" *ngIf="nameCtrl.invalid && nameCtrl.touched">
|
||||||
</div>
|
{{ 'AbpIdentity::NameIsRequired' | abpLocalization }}
|
||||||
|
</small>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- Is Default Checkbox -->
|
<!-- Is Default Checkbox -->
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input
|
<input
|
||||||
id="isDefault"
|
id="isDefault"
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
class="form-check-input"
|
class="form-check-input"
|
||||||
[(ngModel)]="selected.isDefault"
|
[(ngModel)]="selected.isDefault"
|
||||||
name="isDefault"
|
name="isDefault"
|
||||||
/>
|
/>
|
||||||
<label for="isDefault" class="form-check-label">Default</label>
|
<label for="isDefault" class="form-check-label">
|
||||||
</div>
|
{{ 'AbpIdentity::Default' | abpLocalization }}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- Is Public Checkbox -->
|
<!-- Is Public Checkbox -->
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input
|
<input
|
||||||
id="isPublic"
|
id="isPublic"
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
class="form-check-input"
|
class="form-check-input"
|
||||||
[(ngModel)]="selected.isPublic"
|
[(ngModel)]="selected.isPublic"
|
||||||
name="isPublic"
|
name="isPublic"
|
||||||
/>
|
/>
|
||||||
<label for="isPublic" class="form-check-label">Public</label>
|
<label for="isPublic" class="form-check-label">
|
||||||
</div>
|
{{ 'AbpIdentity::Public' | abpLocalization }}
|
||||||
<br>
|
</label>
|
||||||
<abp-button iconClass="fa fa-check" [disabled]="roleForm.invalid" (click)="save()">{{
|
</div>
|
||||||
'AbpIdentity::Save' | abpLocalization
|
<br />
|
||||||
}}</abp-button>
|
<abp-button iconClass="fa fa-check" [disabled]="roleForm.invalid" (click)="save()">{{
|
||||||
</form>
|
'AbpIdentity::Save' | abpLocalization
|
||||||
</ng-template>
|
}}</abp-button>
|
||||||
|
</form>
|
||||||
|
</ng-template>
|
||||||
|
|
||||||
<ng-template #abpFooter>
|
<ng-template #abpFooter>
|
||||||
<button type="button" class="btn btn-outline-primary" abpClose>
|
<button type="button" class="btn btn-outline-primary" abpClose>
|
||||||
{{ 'AbpIdentity::Cancel' | abpLocalization }}
|
{{ 'AbpIdentity::Cancel' | abpLocalization }}
|
||||||
</button>
|
</button>
|
||||||
<!-- <abp-button iconClass="fa fa-check" [disabled]="roleForm?.invalid" (click)="save()">{{
|
<!-- <abp-button iconClass="fa fa-check" [disabled]="roleForm?.invalid" (click)="save()">{{
|
||||||
'AbpIdentity::Save' | abpLocalization
|
'AbpIdentity::Save' | abpLocalization
|
||||||
}}</abp-button> -->
|
}}</abp-button> -->
|
||||||
</ng-template>
|
</ng-template>
|
||||||
</abp-modal>
|
</abp-modal>
|
||||||
|
|
||||||
<abp-permission-management
|
<abp-permission-management
|
||||||
#abpPermissionManagement="abpPermissionManagement"
|
#abpPermissionManagement="abpPermissionManagement"
|
||||||
*abpReplaceableTemplate="
|
*abpReplaceableTemplate="
|
||||||
{
|
{
|
||||||
inputs: {
|
inputs: {
|
||||||
providerName: { value: 'R' },
|
providerName: { value: 'R' },
|
||||||
@ -118,8 +148,7 @@
|
|||||||
};
|
};
|
||||||
let init = initTemplate
|
let init = initTemplate
|
||||||
"
|
"
|
||||||
(abpInit)="init(abpPermissionManagement)"
|
(abpInit)="init(abpPermissionManagement)"
|
||||||
>
|
>
|
||||||
</abp-permission-management>
|
</abp-permission-management>
|
||||||
</abp-page>
|
</abp-page>
|
||||||
|
|
||||||
|
@ -33,6 +33,7 @@ import { PermissionManagementModule } from '@abp/ng.permission-management';
|
|||||||
import { NgbNavModule } from '@ng-bootstrap/ng-bootstrap';
|
import { NgbNavModule } from '@ng-bootstrap/ng-bootstrap';
|
||||||
import { MenuItem } from 'primeng/api';
|
import { MenuItem } from 'primeng/api';
|
||||||
import { Dropdown, DropdownModule } from 'primeng/dropdown';
|
import { Dropdown, DropdownModule } from 'primeng/dropdown';
|
||||||
|
import { SharedModule } from 'src/app/shared/shared.module';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-custom-roles',
|
selector: 'app-custom-roles',
|
||||||
@ -50,7 +51,8 @@ import { Dropdown, DropdownModule } from 'primeng/dropdown';
|
|||||||
PermissionManagementModule,
|
PermissionManagementModule,
|
||||||
CoreModule,
|
CoreModule,
|
||||||
NgbNavModule,
|
NgbNavModule,
|
||||||
DropdownModule
|
DropdownModule,
|
||||||
|
SharedModule
|
||||||
],
|
],
|
||||||
templateUrl: './custom-roles.component.html',
|
templateUrl: './custom-roles.component.html',
|
||||||
providers: [
|
providers: [
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
<button
|
<button
|
||||||
pButton
|
pButton
|
||||||
icon="pi pi-plus"
|
icon="pi pi-plus"
|
||||||
label="Add User"
|
label="{{ '::addUser' | abpLocalization }}"
|
||||||
class="p-button-success"
|
class="p-button-success"
|
||||||
(click)="add()"
|
(click)="add()"
|
||||||
></button>
|
></button>
|
||||||
@ -47,13 +47,28 @@
|
|||||||
>
|
>
|
||||||
<ng-template pTemplate="header">
|
<ng-template pTemplate="header">
|
||||||
<tr>
|
<tr>
|
||||||
<th pSortableColumn="userName">Username <p-sortIcon field="userName"></p-sortIcon></th>
|
<th pSortableColumn="userName">
|
||||||
<th pSortableColumn="name">First Name <p-sortIcon field="name"></p-sortIcon></th>
|
{{ '::username' | abpLocalization }}
|
||||||
<th pSortableColumn="surname">Last Name <p-sortIcon field="surname"></p-sortIcon></th>
|
<p-sortIcon field="userName"></p-sortIcon>
|
||||||
<th pSortableColumn="email">Email <p-sortIcon field="email"></p-sortIcon></th>
|
</th>
|
||||||
<th pSortableColumn="Phone">Phone No <p-sortIcon field="Phone"></p-sortIcon></th>
|
<th pSortableColumn="name">
|
||||||
<th>Status</th>
|
{{ '::firstName' | abpLocalization }}
|
||||||
<th>Actions</th>
|
<p-sortIcon field="name"></p-sortIcon>
|
||||||
|
</th>
|
||||||
|
<th pSortableColumn="surname">
|
||||||
|
{{ '::lastName' | abpLocalization }}
|
||||||
|
<p-sortIcon field="surname"></p-sortIcon>
|
||||||
|
</th>
|
||||||
|
<th pSortableColumn="email">
|
||||||
|
{{ '::email' | abpLocalization }}
|
||||||
|
<p-sortIcon field="email"></p-sortIcon>
|
||||||
|
</th>
|
||||||
|
<th pSortableColumn="phoneNumber">
|
||||||
|
{{ '::phoneNumber' | abpLocalization }}
|
||||||
|
<p-sortIcon field="phoneNumber"></p-sortIcon>
|
||||||
|
</th>
|
||||||
|
<th>{{ '::status' | abpLocalization }}</th>
|
||||||
|
<th>{{ '::actions' | abpLocalization }}</th>
|
||||||
</tr>
|
</tr>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
|
|
||||||
@ -73,7 +88,7 @@
|
|||||||
<td>
|
<td>
|
||||||
<div class="btn-group" dropdown placement="bottom left" container="body">
|
<div class="btn-group" dropdown placement="bottom left" container="body">
|
||||||
<p-splitButton
|
<p-splitButton
|
||||||
label="Actions"
|
label="{{ '::actions' | abpLocalization }}"
|
||||||
icon="pi pi-cog"
|
icon="pi pi-cog"
|
||||||
class="p-button-sm p-button-primary"
|
class="p-button-sm p-button-primary"
|
||||||
[model]="actionItems"
|
[model]="actionItems"
|
||||||
@ -155,7 +170,9 @@
|
|||||||
<a ngbNavLink>{{ 'AbpIdentity::UserInformations' | abpLocalization }}</a>
|
<a ngbNavLink>{{ 'AbpIdentity::UserInformations' | abpLocalization }}</a>
|
||||||
<ng-template ngbNavContent>
|
<ng-template ngbNavContent>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="userName">{{ 'User Name' | abpLocalization }}</label>
|
<label for="userName">
|
||||||
|
{{ '::userName' | abpLocalization }}
|
||||||
|
</label>
|
||||||
<input
|
<input
|
||||||
id="userName"
|
id="userName"
|
||||||
type="text"
|
type="text"
|
||||||
@ -166,13 +183,14 @@
|
|||||||
#userName="ngModel"
|
#userName="ngModel"
|
||||||
/>
|
/>
|
||||||
<div *ngIf="userName.invalid && userName.touched" class="text-danger">
|
<div *ngIf="userName.invalid && userName.touched" class="text-danger">
|
||||||
User Name is required
|
{{ '::userNameIsRequired' | abpLocalization }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Password -->
|
|
||||||
<div class="form-group" *ngIf="!selected.id">
|
<div class="form-group" *ngIf="!selected.id">
|
||||||
<label for="password">Password</label>
|
<label for="password">
|
||||||
|
{{ '::password' | abpLocalization }}
|
||||||
|
</label>
|
||||||
<input
|
<input
|
||||||
id="password"
|
id="password"
|
||||||
type="password"
|
type="password"
|
||||||
@ -183,13 +201,14 @@
|
|||||||
#passwordField="ngModel"
|
#passwordField="ngModel"
|
||||||
/>
|
/>
|
||||||
<div *ngIf="passwordField.invalid && passwordField.touched" class="text-danger">
|
<div *ngIf="passwordField.invalid && passwordField.touched" class="text-danger">
|
||||||
Password is required
|
{{ '::passwordIsRequired' | abpLocalization }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Name -->
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="name">{{ 'Name' | abpLocalization }}</label>
|
<label for="name">
|
||||||
|
{{ '::firstName' | abpLocalization }}
|
||||||
|
</label>
|
||||||
<input
|
<input
|
||||||
id="name"
|
id="name"
|
||||||
type="text"
|
type="text"
|
||||||
@ -200,9 +219,10 @@
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Surname -->
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="surname">{{ 'Surname' | abpLocalization }}</label>
|
<label for="surname">
|
||||||
|
{{ '::lastName' | abpLocalization }}
|
||||||
|
</label>
|
||||||
<input
|
<input
|
||||||
id="surname"
|
id="surname"
|
||||||
type="text"
|
type="text"
|
||||||
@ -215,7 +235,9 @@
|
|||||||
|
|
||||||
<!-- Email -->
|
<!-- Email -->
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="email">{{ 'Email' | abpLocalization }}</label>
|
<label for="email">
|
||||||
|
{{ '::email' | abpLocalization }}
|
||||||
|
</label>
|
||||||
<input
|
<input
|
||||||
id="email"
|
id="email"
|
||||||
type="email"
|
type="email"
|
||||||
@ -226,13 +248,14 @@
|
|||||||
#email="ngModel"
|
#email="ngModel"
|
||||||
/>
|
/>
|
||||||
<div *ngIf="email.invalid && email.touched" class="text-danger">
|
<div *ngIf="email.invalid && email.touched" class="text-danger">
|
||||||
Valid Email is required
|
{{ '::validEmailIsRequired' | abpLocalization }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Phone Number -->
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="phoneNumber">{{ 'Phone Number' | abpLocalization }}</label>
|
<label for="phoneNumber">
|
||||||
|
{{ '::phoneNumber' | abpLocalization }}
|
||||||
|
</label>
|
||||||
<input
|
<input
|
||||||
id="phoneNumber"
|
id="phoneNumber"
|
||||||
type="text"
|
type="text"
|
||||||
@ -243,7 +266,6 @@
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Active Account (Checkbox) -->
|
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input
|
<input
|
||||||
id="isActive"
|
id="isActive"
|
||||||
@ -252,12 +274,11 @@
|
|||||||
[(ngModel)]="selected.isActive"
|
[(ngModel)]="selected.isActive"
|
||||||
name="isActive"
|
name="isActive"
|
||||||
/>
|
/>
|
||||||
<label for="isActive" class="form-check-label">{{
|
<label for="isActive" class="form-check-label">
|
||||||
'Active' | abpLocalization
|
{{ '::active' | abpLocalization }}
|
||||||
}}</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Lockout Enabled (Checkbox) -->
|
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input
|
<input
|
||||||
id="lockoutEnabled"
|
id="lockoutEnabled"
|
||||||
@ -266,14 +287,13 @@
|
|||||||
[(ngModel)]="selected.lockoutEnabled"
|
[(ngModel)]="selected.lockoutEnabled"
|
||||||
name="lockoutEnabled"
|
name="lockoutEnabled"
|
||||||
/>
|
/>
|
||||||
<label for="lockoutEnabled" class="form-check-label">{{
|
<label for="lockoutEnabled" class="form-check-label">
|
||||||
'Lockout Enabled' | abpLocalization
|
{{ '::lockoutEnabled' | abpLocalization }}
|
||||||
}}</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<!-- Roles Tab -->
|
|
||||||
<li ngbNavItem>
|
<li ngbNavItem>
|
||||||
<a ngbNavLink>{{ 'AbpIdentity::Roles' | abpLocalization }}</a>
|
<a ngbNavLink>{{ 'AbpIdentity::Roles' | abpLocalization }}</a>
|
||||||
<ng-template ngbNavContent>
|
<ng-template ngbNavContent>
|
||||||
@ -296,14 +316,17 @@
|
|||||||
<div class="mt-2 fade-in-top" [ngbNavOutlet]="nav"></div>
|
<div class="mt-2 fade-in-top" [ngbNavOutlet]="nav"></div>
|
||||||
|
|
||||||
<div class="mt-3">
|
<div class="mt-3">
|
||||||
<button type="submit" class="btn btn-primary" [disabled]="userForm.invalid">Save</button>
|
<button type="submit" class="btn btn-primary" [disabled]="userForm.invalid">
|
||||||
|
{{ '::save' | abpLocalization }}
|
||||||
|
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
|
|
||||||
<ng-template #abpFooter>
|
<ng-template #abpFooter>
|
||||||
<button type="button" class="btn btn-outline-primary" abpClose>
|
<button type="button" class="btn btn-outline-primary" abpClose>
|
||||||
{{ 'AbpIdentity::Cancel' | abpLocalization }}
|
{{ '::cancel' | abpLocalization }}
|
||||||
</button>
|
</button>
|
||||||
<!-- <abp-button iconClass="fa fa-check" [disabled]="form?.invalid" (click)="save()">{{
|
<!-- <abp-button iconClass="fa fa-check" [disabled]="form?.invalid" (click)="save()">{{
|
||||||
'AbpIdentity::Save' | abpLocalization
|
'AbpIdentity::Save' | abpLocalization
|
||||||
|
@ -59,6 +59,7 @@ import { NgbNavModule } from '@ng-bootstrap/ng-bootstrap';
|
|||||||
import { PaginatorModule } from 'primeng/paginator';
|
import { PaginatorModule } from 'primeng/paginator';
|
||||||
import { TagModule } from 'primeng/tag'; // For active/inactive status
|
import { TagModule } from 'primeng/tag'; // For active/inactive status
|
||||||
import { SplitButtonModule } from 'primeng/splitbutton';
|
import { SplitButtonModule } from 'primeng/splitbutton';
|
||||||
|
import { SharedModule } from 'src/app/shared/shared.module';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-custom-users',
|
selector: 'app-custom-users',
|
||||||
@ -77,7 +78,7 @@ import { SplitButtonModule } from 'primeng/splitbutton';
|
|||||||
CoreModule,
|
CoreModule,
|
||||||
NgbNavModule,
|
NgbNavModule,
|
||||||
PaginatorModule,
|
PaginatorModule,
|
||||||
TagModule,SplitButtonModule
|
TagModule,SplitButtonModule,SharedModule
|
||||||
],
|
],
|
||||||
templateUrl: './custom-users.component.html',
|
templateUrl: './custom-users.component.html',
|
||||||
providers: [
|
providers: [
|
||||||
|
@ -20,3 +20,4 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
@ -5,6 +5,126 @@
|
|||||||
"Menu:Home": "Home",
|
"Menu:Home": "Home",
|
||||||
"Welcome": "Welcome",
|
"Welcome": "Welcome",
|
||||||
"LongWelcomeMessage": "Welcome to the application. This is a startup project based on the ABP framework. For more information, visit abp.io.",
|
"LongWelcomeMessage": "Welcome to the application. This is a startup project based on the ABP framework. For more information, visit abp.io.",
|
||||||
"PatientHeader": "Patient Records"
|
"PatientHeader": "Patient Records",
|
||||||
|
|
||||||
|
"AbpIdentity::Roles": "Roles",
|
||||||
|
"addRoles": "Add Roles",
|
||||||
|
"AbpIdentity::RoleName": "Role Name",
|
||||||
|
"AbpIdentity::Actions": "Actions",
|
||||||
|
"AbpIdentity::Edit": "Edit",
|
||||||
|
"AbpIdentity::Delete": "Delete",
|
||||||
|
"AbpIdentity::Permissions": "Permissions",
|
||||||
|
"AbpIdentity::NewRole": "New Role",
|
||||||
|
"AbpIdentity::Name": "Name",
|
||||||
|
"AbpIdentity::NameIsRequired": "Name is required",
|
||||||
|
"AbpIdentity::Default": "Default",
|
||||||
|
"AbpIdentity::Public": "Public",
|
||||||
|
"AbpIdentity::Save": "Save",
|
||||||
|
"AbpIdentity::Cancel": "Cancel",
|
||||||
|
|
||||||
|
"users": "Users",
|
||||||
|
"addUser": "Add User",
|
||||||
|
"pagerSearch": "Search...",
|
||||||
|
"username": "Username",
|
||||||
|
"firstName": "First Name",
|
||||||
|
"lastName": "Last Name",
|
||||||
|
"email": "Email",
|
||||||
|
"phoneNumber": "Phone Number",
|
||||||
|
"status": "Status",
|
||||||
|
"actions": "Actions",
|
||||||
|
"active": "Active",
|
||||||
|
"inactive": "Inactive",
|
||||||
|
"editUser": "Edit User",
|
||||||
|
"newUser": "New User",
|
||||||
|
"userInformations": "User Informations",
|
||||||
|
"userName": "User Name",
|
||||||
|
"userNameIsRequired": "User Name is required",
|
||||||
|
"password": "Password",
|
||||||
|
"passwordIsRequired": "Password is required",
|
||||||
|
"validEmailIsRequired": "Valid Email is required",
|
||||||
|
"lockoutEnabled": "Lockout Enabled",
|
||||||
|
"save": "Save",
|
||||||
|
"cancel": "Cancel",
|
||||||
|
"roles": "Roles",
|
||||||
|
|
||||||
|
|
||||||
|
"edit": "Edit",
|
||||||
|
"create": "Create",
|
||||||
|
"gender": "Gender",
|
||||||
|
"male": "Male",
|
||||||
|
"female": "Female",
|
||||||
|
"mobileNo": "Mobile No",
|
||||||
|
"address": "Address",
|
||||||
|
"emailId": "Email ID",
|
||||||
|
"dateOfBirth": "Date of Birth",
|
||||||
|
"consultingDoctor": "Consulting Doctor",
|
||||||
|
"dateOfAppointment": "Date of Appointment",
|
||||||
|
"timeOfAppointment": "Time Of Appointment",
|
||||||
|
"injuryCondition": "Injury/Condition",
|
||||||
|
"insuranceProvider": "Insurance Provider",
|
||||||
|
"appointmentStatus": "Appointment Status",
|
||||||
|
"visitType": "Visit Type",
|
||||||
|
"paymentStatus": "Payment Status",
|
||||||
|
"notes": "Notes",
|
||||||
|
|
||||||
|
"selectDoctor": "Select Doctor",
|
||||||
|
"firstNameRequired": "First Name is required.",
|
||||||
|
"lastNameRequired": "Last Name is required.",
|
||||||
|
"genderRequired": "Please select a gender.",
|
||||||
|
"mobileNoRequired": "Mobile number is required.",
|
||||||
|
"addressRequired": "Address is required.",
|
||||||
|
"dobRequired": "DOB is required.",
|
||||||
|
"mobileNoInvalid": "Enter a valid 10-digit mobile number.",
|
||||||
|
"minLength": "Minimum {length} characters required.",
|
||||||
|
"maxLength": "Maximum {length} characters allowed.",
|
||||||
|
"emailRequired": "Email address is required.",
|
||||||
|
"emailInvalid": "Enter a valid email address.",
|
||||||
|
|
||||||
|
"appointmentList": "Appointment List",
|
||||||
|
"searchKeyword": "Search keyword",
|
||||||
|
"refresh": "Refresh",
|
||||||
|
"addAppointment": "Add Appointment",
|
||||||
|
"export": "Export",
|
||||||
|
"name": "Name",
|
||||||
|
"doctor": "Doctor",
|
||||||
|
"doctorPrefix": "Dr.",
|
||||||
|
"date": "Date",
|
||||||
|
"time": "Time",
|
||||||
|
|
||||||
|
"appointment": "Appointment",
|
||||||
|
|
||||||
|
"mobile": "Mobile",
|
||||||
|
"mobileRequired": "Mobile is required.",
|
||||||
|
"specialization": "Specialization",
|
||||||
|
"degree": "Degree",
|
||||||
|
"experience": "Experience",
|
||||||
|
"years": "Years",
|
||||||
|
"consultationFee": "Consultation Fee",
|
||||||
|
"clinicLocation": "Clinic Location",
|
||||||
|
"rating": "Rating",
|
||||||
|
"availability": "Availability",
|
||||||
|
"selectAvailability": "Select Availability",
|
||||||
|
"description": "Description",
|
||||||
|
"departmentList": "Department List",
|
||||||
|
"addDepartment": "Add Department",
|
||||||
|
"departmentNumber": "Department Number",
|
||||||
|
"departmentName": "Department Name",
|
||||||
|
"departmentHead": "Department Head",
|
||||||
|
|
||||||
|
"department": "Department",
|
||||||
|
|
||||||
|
"close": "Close",
|
||||||
|
"departmentNo": "Department No",
|
||||||
|
"departmentNoRequired": "Department No is required.",
|
||||||
|
"departmentNameRequired": "Department Name is required.",
|
||||||
|
"departmentDate": "Department Date",
|
||||||
|
|
||||||
|
"doctorList": "Doctor List"
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user