Merge branch 'patient_module' of https://git.sentientgeeks.us/ranjit/Hospital_Management into AppointmentModule_Modified
# Conflicts: # angular/src/app/proxy/generate-proxy.json # angular/src/app/proxy/index.ts # angular/src/app/proxy/volo/abp/domain/entities/auditing/models.ts # angular/src/app/proxy/volo/abp/domain/entities/models.ts # aspnet-core/src/HospitalManagementSystem.EntityFrameworkCore/EntityFrameworkCore/HospitalManagementSystemDbContext.cs # aspnet-core/src/HospitalManagementSystem.EntityFrameworkCore/Migrations/HospitalManagementSystemDbContextModelSnapshot.cs
This commit is contained in:
commit
71dd119efe
@ -25,12 +25,38 @@ const routes: Routes = [
|
||||
loadChildren: () =>
|
||||
import('@abp/ng.setting-management').then(m => m.SettingManagementModule.forLazy()),
|
||||
},
|
||||
{ path: 'appointment/appointment-calendar',
|
||||
{
|
||||
path: 'appointment/appointment-calendar',
|
||||
loadChildren: () =>
|
||||
import('./appointment/appointment-calendar/appointment-calendar.module').then(m => m.AppointmentCalendarModule) },
|
||||
{ path: 'appointment/view-appointment', loadChildren: () => import('./appointment/view-appointment/view-appointment.module').then(m => m.ViewAppointmentModule) },
|
||||
{ path: 'appointment/book-appointment', loadChildren: () => import('./appointment/book-appointment/book-appointment.module').then(m => m.BookAppointmentModule) },
|
||||
{ path: 'appointment/edit-appointment', loadChildren: () => import('./appointment/edit-appointment/edit-appointment.module').then(m => m.EditAppointmentModule) },
|
||||
import('./appointment/appointment-calendar/appointment-calendar.module').then(
|
||||
m => m.AppointmentCalendarModule
|
||||
),
|
||||
},
|
||||
{
|
||||
path: 'appointment/view-appointment',
|
||||
loadChildren: () =>
|
||||
import('./appointment/view-appointment/view-appointment.module').then(
|
||||
m => m.ViewAppointmentModule
|
||||
),
|
||||
},
|
||||
{
|
||||
path: 'appointment/book-appointment',
|
||||
loadChildren: () =>
|
||||
import('./appointment/book-appointment/book-appointment.module').then(
|
||||
m => m.BookAppointmentModule
|
||||
),
|
||||
},
|
||||
{
|
||||
path: 'appointment/edit-appointment',
|
||||
loadChildren: () =>
|
||||
import('./appointment/edit-appointment/edit-appointment.module').then(
|
||||
m => m.EditAppointmentModule
|
||||
),
|
||||
},
|
||||
{
|
||||
path: 'patients',
|
||||
loadChildren: () => import('./patients/patients.module').then(m => m.PatientsModule),
|
||||
},
|
||||
];
|
||||
|
||||
@NgModule({
|
||||
|
@ -1,7 +1,13 @@
|
||||
<div>
|
||||
<p-table #dt2 dataKey="id" [value]="appointments" [paginator]="true" [rows]="10" [rowsPerPageOptions]="[10, 20, 50]">
|
||||
<p-table
|
||||
#dt2
|
||||
dataKey="id"
|
||||
[value]="appointments"
|
||||
[paginator]="true"
|
||||
[rows]="10"
|
||||
[rowsPerPageOptions]="[10, 20, 50]"
|
||||
>
|
||||
<ng-template pTemplate="caption">
|
||||
|
||||
<div class="flex align-items-center justify-content-between mb-3 gap-3">
|
||||
<!-- Left: Title -->
|
||||
<h2 class="m-0">Appointment List</h2>
|
||||
@ -10,21 +16,31 @@
|
||||
<div class="flex-grow-1 flex justify-content-center">
|
||||
<span class="p-input-icon-left w-50">
|
||||
<i class="pi pi-search"></i>
|
||||
<input pInputText type="text" [(ngModel)]="globalFilter" placeholder="Search Appointments"
|
||||
(input)="dt2.filterGlobal(globalFilter, 'contains')" class="w-full" />
|
||||
<input
|
||||
pInputText
|
||||
type="text"
|
||||
[(ngModel)]="globalFilter"
|
||||
placeholder="Search Appointments"
|
||||
(input)="dt2.filterGlobal(globalFilter, 'contains')"
|
||||
class="w-full"
|
||||
/>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<!-- Right: Add Button -->
|
||||
<div>
|
||||
<button *ngIf="createPermission" pButton class="p-button-rounded p-button-success"
|
||||
(click)="openNewAppointmentDialog()" pTooltip="Add Appointment" tooltipPosition="left">
|
||||
<button
|
||||
*ngIf="createPermission"
|
||||
pButton
|
||||
class="p-button-rounded p-button-success"
|
||||
(click)="openNewAppointmentDialog()"
|
||||
pTooltip="Add Appointment"
|
||||
tooltipPosition="left"
|
||||
>
|
||||
<i class="pi pi-plus-circle"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</ng-template>
|
||||
|
||||
<ng-template pTemplate="header">
|
||||
@ -32,10 +48,10 @@
|
||||
<th pSortableColumn="name">Name <p-sortIcon field="name" /></th>
|
||||
<th pSortableColumn="doctor">Doctor <p-sortIcon field="doctor" /></th>
|
||||
<th pSortableColumn="date">Date <p-sortIcon field="date" /></th>
|
||||
<th pSortableColumn="Time">Time<p-sortIcon field="Time"/></th>
|
||||
<th pSortableColumn="Mobile">Mobile No<p-sortIcon field="Mobile"/></th>
|
||||
<th pSortableColumn="Status">Appointment Status<p-sortIcon field="Status"/></th>
|
||||
<th pSortableColumn="visittype">Visit Type<p-sortIcon field="visittype"/></th>
|
||||
<th pSortableColumn="Time">Time<p-sortIcon field="Time" /></th>
|
||||
<th pSortableColumn="mobile">Mobile No<p-sortIcon field="mobile" /></th>
|
||||
<th pSortableColumn="status">Appointment Status<p-sortIcon field="status" /></th>
|
||||
<th pSortableColumn="visitType">Visit Type<p-sortIcon field="visitType" /></th>
|
||||
<th>Actions</th>
|
||||
</tr>
|
||||
</ng-template>
|
||||
@ -59,83 +75,84 @@
|
||||
</p-table>
|
||||
</div>
|
||||
|
||||
<p-dialog header="{{ isEditing ? 'Edit Appointment' : 'New Appointment' }}" [(visible)]="appointmentDialog"
|
||||
[modal]="true" [closable]="true" [style]="{ width: '80%' }">
|
||||
<p-dialog
|
||||
header="{{ isEditing ? 'Edit Appointment' : 'New Appointment' }}"
|
||||
[(visible)]="appointmentDialog"
|
||||
[modal]="true"
|
||||
[closable]="true"
|
||||
[style]="{ width: '80%' }"
|
||||
>
|
||||
<form #appointmentForm="ngForm" (ngSubmit)="saveAppointment(appointmentForm)">
|
||||
<div class="p-fluid grid justify-content-center">
|
||||
|
||||
<form #appointmentForm="ngForm" (ngSubmit)="saveAppointment()">
|
||||
<div class="p-fluid grid">
|
||||
|
||||
<!-- Name -->
|
||||
<div class="field col-12 md:col-6">
|
||||
<div class="field col-md-5">
|
||||
<label for="fname">First Name</label>
|
||||
<span class="p-input-icon-left">
|
||||
<i class="pi pi-user"></i>
|
||||
<input pInputText id="fname" name="fname" [(ngModel)]="appointment.firstname" required />
|
||||
</span>
|
||||
<small *ngIf="appointmentForm.form.controls.fname?.invalid && appointmentForm.form.controls.fname?.touched" class="p-error">
|
||||
First Name is required.
|
||||
</small>
|
||||
</div>
|
||||
<div class="field col-md-1"></div>
|
||||
|
||||
<div class="field col-12 md:col-6">
|
||||
<div class="field col-md-5">
|
||||
<label for="lname">Last Name</label>
|
||||
<span class="p-input-icon-left">
|
||||
<i class="pi pi-user"></i>
|
||||
<input pInputText id="lname" name="lname" [(ngModel)]="appointment.lastname" required />
|
||||
</span>
|
||||
<small *ngIf="appointmentForm.form.controls.lname?.invalid && appointmentForm.form.controls.lname?.touched" class="p-error">
|
||||
Last Name is required.
|
||||
</small>
|
||||
</div>
|
||||
|
||||
<div class="field col-12 md:col-6">
|
||||
<div class="field col-md-5">
|
||||
<label>Gender</label>
|
||||
<div class="flex align-items-center">
|
||||
<p-radioButton name="gender" value="Male" [(ngModel)]="appointment.gender" inputId="male"></p-radioButton>
|
||||
<p-radioButton name="gender" value="Male" [(ngModel)]="appointment.gender" inputId="male" required></p-radioButton>
|
||||
<label for="male" class="ml-2 mr-3">Male</label>
|
||||
|
||||
<p-radioButton name="gender" value="Female" [(ngModel)]="appointment.gender" inputId="female"></p-radioButton>
|
||||
<p-radioButton name="gender" value="Female" [(ngModel)]="appointment.gender" inputId="female" required></p-radioButton>
|
||||
<label for="female" class="ml-2">Female</label>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Mobile -->
|
||||
<div class="field col-12 md:col-6">
|
||||
<div class="field col-md-1"></div>
|
||||
|
||||
<div class="field col-md-5">
|
||||
<label for="mobile">Mobile No</label>
|
||||
<span class="p-input-icon-left">
|
||||
<i class="pi pi-phone"></i>
|
||||
<input pInputText id="mobile" name="mobile" [(ngModel)]="appointment.mobile" required />
|
||||
</span>
|
||||
</div>
|
||||
<!-- Email -->
|
||||
<div class="field col-12 md:col-6">
|
||||
<div class="field col-md-11">
|
||||
<label for="mobile">Address</label>
|
||||
<span class="p-input-icon-left">
|
||||
<i class="pi pi-map-marker"></i>
|
||||
<input pInputText id="Address" name="Address" [(ngModel)]="appointment.Address" required />
|
||||
</span>
|
||||
</div>
|
||||
<div class="field col-md-5">
|
||||
<label for="email">Email ID</label>
|
||||
<span class="p-input-icon-left">
|
||||
<i class="pi pi-envelope"></i>
|
||||
<input pInputText id="email" name="email" [(ngModel)]="appointment.email" required email />
|
||||
</span>
|
||||
<small *ngIf="appointmentForm.form.controls.email?.invalid && appointmentForm.form.controls.email?.touched" class="p-error">
|
||||
Valid email is required.
|
||||
</small>
|
||||
</div>
|
||||
<div class="field col-12 md:col-6">
|
||||
<!--
|
||||
<div class="field col-md-5">
|
||||
<label for="dob">Date of Birth</label>
|
||||
<p-calendar id="dob" name="dob" [(ngModel)]="appointment.dob" [showIcon]="true" required></p-calendar>
|
||||
</div>
|
||||
<!-- Doctor -->
|
||||
<div class="field col-12 md:col-6">
|
||||
</div> -->
|
||||
<div class="field col-md-1"></div>
|
||||
|
||||
<div class="field col-md-5">
|
||||
<label for="doctor">Consulting Doctor</label>
|
||||
<p-dropdown id="doctor" name="doctor" [(ngModel)]="appointment.doctor" [options]="doctorOptions" placeholder="Select Doctor" optionLabel="label"
|
||||
optionValue="value" required></p-dropdown>
|
||||
<p-dropdown id="doctor" name="doctor" [(ngModel)]="appointment.doctor" [options]="doctorOptions" placeholder="Select Doctor" optionLabel="label" optionValue="value" required></p-dropdown>
|
||||
</div>
|
||||
|
||||
<!-- Date -->
|
||||
<div class="field col-12 md:col-6">
|
||||
<div class="field col-md-5">
|
||||
<label for="date">Date of Appointment</label>
|
||||
<p-calendar id="date" name="date" [(ngModel)]="appointment.date" [showIcon]="true" required></p-calendar>
|
||||
</div>
|
||||
<div class="field col-md-1"></div>
|
||||
|
||||
<!-- Time (HH:mm format) -->
|
||||
<div class="field col-12 md:col-6">
|
||||
<div class="field col-md-5">
|
||||
<label for="time">Time Of Appointment</label>
|
||||
<span class="p-input-icon-left">
|
||||
<i class="pi pi-clock"></i>
|
||||
@ -143,60 +160,50 @@
|
||||
</span>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<!-- Injury -->
|
||||
<div class="field col-12 md:col-6">
|
||||
<label for="injury">Injury/Contion</label>
|
||||
<!-- Injury (Full Width) -->
|
||||
<div class="field col-11">
|
||||
<label for="injury">Injury/Condition</label>
|
||||
<span class="p-input-icon-left">
|
||||
<i class="pi pi-exclamation-triangle"></i>
|
||||
<input pInputText id="injury" name="injury" [(ngModel)]="appointment.injury" />
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<!-- Insurance Provider -->
|
||||
<div class="field col-12 md:col-6">
|
||||
<!--
|
||||
<div class="field col-md-5">
|
||||
<label for="insurance">Insurance Provider</label>
|
||||
<span class="p-input-icon-left">
|
||||
<i class="pi pi-credit-card"></i>
|
||||
<input pInputText id="insurance" name="insuranceProvider" [(ngModel)]="appointment.insuranceProvider" />
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<!-- Notes -->
|
||||
<div class="field col-12">
|
||||
<label for="notes">Notes</label>
|
||||
<span class="p-input-icon-left w-full">
|
||||
<textarea id="notes" name="notes" [(ngModel)]="appointment.notes"
|
||||
class="w-full bg-white text-black border p-2 rounded" rows="3"></textarea> </span>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<!-- Appointment Status -->
|
||||
<div class="field col-12 md:col-6">
|
||||
-->
|
||||
<!-- <div class="field col-md-5">
|
||||
<label for="status">Appointment Status</label>
|
||||
<p-dropdown id="status" name="status" [(ngModel)]="appointment.status" [options]="appointmentStatuses" placeholder="Select Status" required></p-dropdown>
|
||||
</div>
|
||||
|
||||
<!-- Visit Type -->
|
||||
<div class="field col-12 md:col-6">
|
||||
<div class="field col-md-5">
|
||||
<label for="visitType">Visit Type</label>
|
||||
<p-dropdown id="visitType" name="visitType" [(ngModel)]="appointment.visitType" [options]="visitTypes" placeholder="Select Visit Type" required></p-dropdown>
|
||||
</div>
|
||||
|
||||
<!-- Payment Status -->
|
||||
<div class="field col-12 md:col-6">
|
||||
<div class="field col-md-5">
|
||||
<label for="paymentStatus">Payment Status</label>
|
||||
<p-dropdown id="paymentStatus" name="paymentStatus" [(ngModel)]="appointment.paymentStatus" [options]="paymentStatuses" placeholder="Select Payment Status" required></p-dropdown>
|
||||
</div> -->
|
||||
|
||||
<!-- Notes (Full Width) -->
|
||||
<div class="field col-11">
|
||||
<label for="notes">Notes</label>
|
||||
<textarea id="notes" name="notes" [(ngModel)]="appointment.notes" rows="5"cols="30"pInputTextarea></textarea>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<!-- Action Buttons -->
|
||||
<div class="field col-12 flex justify-content-end">
|
||||
<div class="field col-11 flex justify-content-end">
|
||||
<button pButton type="submit" label="Save" class="p-button-success" [disabled]="appointmentForm.invalid"></button>
|
||||
<button pButton type="button" label="Cancel" class="p-button-secondary ml-2" (click)="closeDialog()"></button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</p-dialog>
|
||||
|
||||
|
@ -1,5 +1,7 @@
|
||||
import { Component } from '@angular/core';
|
||||
import { NgForm } from '@angular/forms';
|
||||
import { DoctorService } from '@proxy/doctors';
|
||||
import { Gender } from '@proxy/global-enum';
|
||||
|
||||
@Component({
|
||||
selector: 'app-view-appointment',
|
||||
@ -13,12 +15,14 @@ export class ViewAppointmentComponent {
|
||||
patients: [];
|
||||
isEditing = false;
|
||||
appointmentDialog = false;
|
||||
genders = Gender;
|
||||
isEditMode: boolean = false;
|
||||
|
||||
appointment = {
|
||||
firstname: '',
|
||||
lastname: '',
|
||||
email: '',
|
||||
gender: '',
|
||||
gender: Gender.Male,
|
||||
date: '',
|
||||
dob:'',
|
||||
time: '',
|
||||
@ -30,11 +34,13 @@ export class ViewAppointmentComponent {
|
||||
status: '',
|
||||
visitType: '',
|
||||
paymentStatus: '',
|
||||
Address:''
|
||||
};
|
||||
appointments = [
|
||||
{
|
||||
id: 1,
|
||||
name: 'John Doe',
|
||||
firstname: 'John',
|
||||
lastname: 'Doe',
|
||||
doctor: 'Dr. Smith',
|
||||
gender: 1,
|
||||
date: new Date(),
|
||||
@ -46,7 +52,8 @@ export class ViewAppointmentComponent {
|
||||
},
|
||||
{
|
||||
id: 2,
|
||||
name: 'Jane Smith',
|
||||
firstname: 'Jane',
|
||||
lastname: 'Smith',
|
||||
doctor: 'Dr. Johnson',
|
||||
gender: 0,
|
||||
date: new Date(),
|
||||
@ -58,7 +65,8 @@ export class ViewAppointmentComponent {
|
||||
},
|
||||
{
|
||||
id: 3,
|
||||
name: 'Mike Johnson',
|
||||
firstname: 'Mike',
|
||||
lastname: 'Johnson',
|
||||
doctor: 'Dr. Brown',
|
||||
gender: 1,
|
||||
date: new Date(),
|
||||
@ -69,24 +77,24 @@ export class ViewAppointmentComponent {
|
||||
visitType: 'Surgery',
|
||||
},
|
||||
];
|
||||
status = { 1: 'Scheduled', 2: 'Completed', 3: 'Canceled' };
|
||||
genders = [
|
||||
{ label: 'Male', value: 'Male' },
|
||||
{ label: 'Female', value: 'Female' },
|
||||
];
|
||||
// status = { 1: 'Scheduled', 2: 'Completed', 3: 'Canceled' };
|
||||
|
||||
|
||||
doctors = [];
|
||||
doctorOptions = [];
|
||||
appointmentStatuses = [
|
||||
{ label: 'Scheduled', value: 'Scheduled' },
|
||||
{ label: 'Completed', value: 'Completed' },
|
||||
{ label: 'Canceled', value: 'Canceled' },
|
||||
];
|
||||
visitTypes = [
|
||||
{ label: 'Consultation', value: 'Consultation' },
|
||||
{ label: 'New Patient', value: 'NewPatient' },
|
||||
{ label: 'Follow-up', value: 'Follow-up' },
|
||||
];
|
||||
paymentStatuses = [
|
||||
{ label: 'Pending', value: 'Pending' },
|
||||
{ label: 'Paid', value: 'Paid' },
|
||||
{ label: 'Unpaid', value: 'Unpaid' },
|
||||
];
|
||||
|
||||
createPermission = true;
|
||||
@ -105,7 +113,7 @@ export class ViewAppointmentComponent {
|
||||
firstname: '',
|
||||
lastname: '',
|
||||
email: '',
|
||||
gender: '',
|
||||
gender: Gender.Male,
|
||||
date: '',
|
||||
dob:'',
|
||||
time: '',
|
||||
@ -117,6 +125,7 @@ export class ViewAppointmentComponent {
|
||||
status: '',
|
||||
visitType: '',
|
||||
paymentStatus: '',
|
||||
Address:''
|
||||
};
|
||||
}
|
||||
|
||||
@ -131,9 +140,14 @@ export class ViewAppointmentComponent {
|
||||
deleteAppointment(id: number) {
|
||||
console.log('Deleting appointment with ID', id);
|
||||
}
|
||||
saveAppointment() {
|
||||
console.log(this.appointment);
|
||||
this.appointmentDialog = false;
|
||||
saveAppointment(form: NgForm) {
|
||||
debugger
|
||||
console.log(form.controls);
|
||||
if (form.invalid) {
|
||||
Object.values(form.controls).forEach(control => control.markAsTouched());
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
closeDialog() {
|
||||
@ -143,9 +157,8 @@ export class ViewAppointmentComponent {
|
||||
this.DoctorService.get().subscribe(result => {
|
||||
debugger;
|
||||
this.doctors = result;
|
||||
// Create a formatted array for dropdown
|
||||
this.doctorOptions = this.doctors.map(doctor => ({
|
||||
label: `${doctor.firstName} ${doctor.lastName}`, // Combine first and last name
|
||||
label: `Dr. ${doctor.firstName} ${doctor.lastName}`, // Combine first and last name
|
||||
value: doctor.id, // Use the ID as the value
|
||||
}));
|
||||
});
|
||||
|
@ -12,6 +12,7 @@ import { DropdownModule } from 'primeng/dropdown';
|
||||
import { InputTextModule } from 'primeng/inputtext';
|
||||
import { RadioButtonModule } from 'primeng/radiobutton';
|
||||
import { DoctorService } from '@proxy/doctors';
|
||||
import { InputTextareaModule } from 'primeng/inputtextarea';
|
||||
|
||||
@NgModule({
|
||||
declarations: [ViewAppointmentComponent],
|
||||
@ -28,6 +29,7 @@ import { DoctorService } from '@proxy/doctors';
|
||||
CalendarModule,
|
||||
DropdownModule,
|
||||
RadioButtonModule,
|
||||
InputTextareaModule
|
||||
|
||||
],
|
||||
providers:[DoctorService]
|
||||
|
@ -0,0 +1,238 @@
|
||||
<div>
|
||||
<p-table #dt2 dataKey="id" [value]="patients" [paginator]="true" [rows]="10" [totalRecords]="totalRecords"
|
||||
[lazy]="true" (onLazyLoad)="loadPatient($event)" [rowsPerPageOptions]="[10, 20, 50]"
|
||||
[responsiveLayout]="'scroll'" [globalFilterFields]="['id', 'name', 'status']"
|
||||
[filters]="{ global: { value: '', matchMode: 'contains' } }" class="table table-striped">
|
||||
|
||||
<ng-template pTemplate="caption">
|
||||
<div class="flex">
|
||||
<h2 class="mr-auto">Patient List</h2>
|
||||
<div>
|
||||
<button *ngIf="createpermission" pButton class="p-button-rounded p-button-success ml-2"
|
||||
(click)="openNewPatientDialog()">
|
||||
<i class="pi pi-plus-circle"></i>
|
||||
</button>
|
||||
<button pButton class="p-button-rounded p-button-warning ml-2" (click)="exportPatient()">
|
||||
<i class="pi pi-download"></i>
|
||||
</button>
|
||||
<p-iconField iconPosition="right" class="ml-2">
|
||||
<p-inputIcon>
|
||||
<i class="pi pi-search"></i>
|
||||
</p-inputIcon>
|
||||
<input pInputText type="text" (input)="dt2.filterGlobal($event.target.value, 'contains')"
|
||||
[(ngModel)]="globalFilter" placeholder="Search keyword" />
|
||||
</p-iconField>
|
||||
</div>
|
||||
</div>
|
||||
</ng-template>
|
||||
|
||||
<ng-template pTemplate="header">
|
||||
<tr>
|
||||
<th class="hidden" pSortableColumn="id">Patient ID <p-sortIcon field="id" /></th>
|
||||
<th pSortableColumn="name">Full Name <p-sortIcon field="name" /></th>
|
||||
<th pSortableColumn="gender">Gender <p-sortIcon field="gender" /></th>
|
||||
<th pSortableColumn="admissionDate">Date of Admission <p-sortIcon field="admissionDate" /></th>
|
||||
<th pSortableColumn="bloodGroup">Blood Group <p-sortIcon field="bloodGroup" /></th>
|
||||
<th>Mobile</th>
|
||||
<th>Email</th>
|
||||
<th pSortableColumn="status">Status <p-sortIcon field="status" /></th>
|
||||
<th>Actions</th>
|
||||
</tr>
|
||||
</ng-template>
|
||||
|
||||
<ng-template pTemplate="body" let-patient>
|
||||
<tr>
|
||||
<td class="hidden">{{ patient.id }}</td>
|
||||
<td>{{ patient.name }}</td>
|
||||
<td>
|
||||
<span class="badge" [ngClass]="patient.gender === 1 ? 'male' : 'female'">
|
||||
{{ gender[patient.gender] }}
|
||||
</span>
|
||||
</td>
|
||||
<td>{{ patient.admissionDate | date }}</td>
|
||||
<td>{{ patient.bloodGroup }}</td>
|
||||
<td>{{ patient.mobile }}</td>
|
||||
<td>{{ patient.email }}</td>
|
||||
<td>{{ status[patient.status] }}</td>
|
||||
<td class="d-flex">
|
||||
<button *ngIf="createpermission" pButton class="btn btn-success btn-sm"
|
||||
(click)="addnewrecord(patient.id)">
|
||||
<i class="pi pi-arrow-right"></i>
|
||||
</button>
|
||||
<button *ngIf="editpermission" class="btn btn-warning btn-sm ml-1" (click)="editPatient(patient)"><i
|
||||
class="pi pi-pencil"></i></button>
|
||||
<button *ngIf="deletepermission" class="btn btn-danger btn-sm ml-1"
|
||||
(click)="deletePatient(patient.id)"><i class="pi pi-trash"></i></button>
|
||||
</td>
|
||||
</tr>
|
||||
</ng-template>
|
||||
|
||||
<ng-template pTemplate="emptymessage">
|
||||
<tr>
|
||||
<td colspan="10">No Patients found.</td>
|
||||
</tr>
|
||||
</ng-template>
|
||||
</p-table>
|
||||
<span>Total Records: {{totalRecords}}</span>
|
||||
</div>
|
||||
<div>
|
||||
<p-dialog *ngIf="patientDialog" header="{{patientDialogTitle}}" [(visible)]="patientDialog" [modal]="true"
|
||||
[closable]="true" [style]="{width: '85%', height: '100%'}">
|
||||
<form #patientrecord="ngForm" (ngSubmit)="savePatient(patientrecord)">
|
||||
<div class="p-fluid">
|
||||
<div class="p-grid">
|
||||
<!-- Full Name -->
|
||||
<div class="p-col-6">
|
||||
<div class="field">
|
||||
<label for="name">Full Name</label>
|
||||
<input id="name" name="name" type="text" pInputText [(ngModel)]="selectedPatient.name"
|
||||
placeholder="Enter full patient name" required #name="ngModel" />
|
||||
<small *ngIf="name.invalid && name.touched" class="p-error">Full Name is required</small>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label for="image">Profile Image</label>
|
||||
<input type="file" id="image" name="image" accept=".jpg,.png"
|
||||
(change)="profileimageupload($event)" />
|
||||
</div>
|
||||
<small *ngIf="error !== ''" class="p-error">{{error}}</small>
|
||||
<small *ngIf="imgpath !== ''">{{imgpath}} <i class="pi pi-image"></i></small>
|
||||
</div>
|
||||
|
||||
<!-- Mobile -->
|
||||
<div class="p-col-6">
|
||||
<div class="field">
|
||||
<label for="mobile">Mobile</label>
|
||||
<input id="mobile" name="mobile" type="text" pInputText [(ngModel)]="selectedPatient.mobile"
|
||||
placeholder="Enter mobile number" maxlength="10" required pattern="[0-9]{10}"
|
||||
#mobile="ngModel" />
|
||||
<small *ngIf="mobile.invalid && mobile.touched" class="p-error">
|
||||
Mobile is required and must be 10 digits
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Address -->
|
||||
<div class="p-col-6">
|
||||
<div class="field">
|
||||
<label for="address">Address</label>
|
||||
<input id="address" name="address" type="text" pInputText
|
||||
[(ngModel)]="selectedPatient.address" placeholder="Enter address" required
|
||||
#address="ngModel" />
|
||||
<small *ngIf="address.invalid && address.touched" class="p-error">Address is
|
||||
required</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="p-grid">
|
||||
<!-- Gender -->
|
||||
<div class="p-col-6">
|
||||
<div class="field">
|
||||
<label for="gender">Gender</label>
|
||||
<div>
|
||||
<label class="mx-1">
|
||||
<input id="male" type="radio" name="gender" [(ngModel)]="selectedgender" [value]="1"
|
||||
required />
|
||||
Male
|
||||
</label>
|
||||
<label>
|
||||
<input id="female" type="radio" name="gender" [(ngModel)]="selectedgender"
|
||||
[value]="2" />
|
||||
Female
|
||||
</label>
|
||||
</div>
|
||||
<small *ngIf="!selectedgender" class="p-error">Gender is required</small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Admission Date -->
|
||||
<div class="p-col-6">
|
||||
<div class="field">
|
||||
<label for="admissionDate">Admission Date</label>
|
||||
<p-calendar id="admissionDate" name="admissionDate" [(ngModel)]="selectadmissionDate"
|
||||
showIcon styleClass="small-calendar" required #admissionDate="ngModel"></p-calendar>
|
||||
<small *ngIf="admissionDate.invalid && admissionDate.touched" class="p-error">
|
||||
Admission Date is required
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="p-grid">
|
||||
<!-- Doctors Note -->
|
||||
<div class="p-col-6">
|
||||
<div class="field">
|
||||
<label for="doctorAssigned">Doctor Assigned</label>
|
||||
<input id="doctorAssigned" name="doctorAssigned" type="text" pInputText
|
||||
[(ngModel)]="selectedPatient.doctorAssigned" placeholder="Enter assigned doctor" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Treatment -->
|
||||
<div class="p-col-6">
|
||||
<div class="field">
|
||||
<label for="treatment">Treatment</label>
|
||||
<input id="treatment" name="treatment" type="treatment" pInputText
|
||||
[(ngModel)]="selectedPatient.treatment" placeholder="Enter treatment" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="p-grid">
|
||||
<!-- Blood Group -->
|
||||
<div class="p-col-6">
|
||||
<div class="field">
|
||||
<label for="bloodGroup">Blood Group</label>
|
||||
<input id="bloodGroup" name="bloodGroup" type="text" pInputText
|
||||
[(ngModel)]="selectedPatient.bloodGroup" placeholder="Enter blood group" required
|
||||
#bloodGroup="ngModel" />
|
||||
<small *ngIf="bloodGroup.invalid && bloodGroup.touched" class="p-error">Blood Group is
|
||||
required</small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Email -->
|
||||
<div class="p-col-6">
|
||||
<div class="field">
|
||||
<label for="email">Email</label>
|
||||
<input id="email" name="email" type="email" pInputText [(ngModel)]="selectedPatient.email"
|
||||
placeholder="Enter email address" required email #email="ngModel" />
|
||||
<small *ngIf="email.invalid && email.touched" class="p-error">Enter a valid email
|
||||
address</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="p-grid">
|
||||
<!-- Age -->
|
||||
<div class="p-col-6">
|
||||
<div class="field">
|
||||
<label for="age">Age</label>
|
||||
<input id="age" name="age" type="number" pInputText [(ngModel)]="selectedPatient.age"
|
||||
placeholder="Enter age" required min="1" max="120" #age="ngModel" />
|
||||
<small *ngIf="age.invalid && age.touched" class="p-error">
|
||||
Age is required and must be between 1 and 90
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Status -->
|
||||
<div class="p-col-6">
|
||||
<div class="field">
|
||||
<label for="status">Status</label>
|
||||
<p-dropdown name="status" id="status" [options]="statuslist" [(ngModel)]="selectedstatus"
|
||||
optionLabel="label" optionValue="value" placeholder="Select status"
|
||||
required></p-dropdown>
|
||||
<small *ngIf="selectedstatus === 0" class="p-error">Status is required</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<button type="submit" pButton class="btn btn-primary"
|
||||
[disabled]="(patientrecord.invalid || selectedstatus === 0 || !selectedgender)">Save</button>
|
||||
<button pButton class="btn btn-secondary ml-1" (click)="closeDialog()">Close</button>
|
||||
</div>
|
||||
</form>
|
||||
</p-dialog>
|
||||
</div>
|
@ -0,0 +1,28 @@
|
||||
.table-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.badge {
|
||||
display: inline-block;
|
||||
padding: 0.2rem 0.6rem;
|
||||
border-radius: 0.5rem;
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
|
||||
.male {
|
||||
background-color: green;
|
||||
}
|
||||
|
||||
.female {
|
||||
background-color: purple;
|
||||
}
|
||||
|
||||
.pdf-icon {
|
||||
color: red;
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
275
angular/src/app/patients/all-patients/all-patients.component.ts
Normal file
275
angular/src/app/patients/all-patients/all-patients.component.ts
Normal file
@ -0,0 +1,275 @@
|
||||
import { PermissionService } from '@abp/ng.core';
|
||||
import { Confirmation, ConfirmationService, ToasterService } from '@abp/ng.theme.shared';
|
||||
import { HttpClient } from '@angular/common/http';
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { NgForm } from '@angular/forms';
|
||||
import { Router } from '@angular/router';
|
||||
import { PagingSortPatientResultDto } from '@proxy/dto';
|
||||
import { Gender, Status } from '@proxy/global-enum';
|
||||
import { PatientService } from '@proxy/patients';
|
||||
import { PatientDto, CreateUpdatePatientDto } from '@proxy/patients/dto';
|
||||
|
||||
@Component({
|
||||
selector: 'app-all-patients',
|
||||
templateUrl: './all-patients.component.html',
|
||||
styleUrl: './all-patients.component.scss',
|
||||
providers: [PatientService, ConfirmationService, ToasterService, PermissionService],
|
||||
})
|
||||
export class AllPatientsComponent implements OnInit {
|
||||
globalFilter: string = '';
|
||||
patients: PatientDto[];
|
||||
totalRecords: number = 0;
|
||||
loading: boolean = false;
|
||||
patientDialog: boolean = false;
|
||||
selectedPatient: CreateUpdatePatientDto;
|
||||
isEditMode: boolean = false;
|
||||
patientDialogTitle: string = '';
|
||||
params: PagingSortPatientResultDto;
|
||||
status: any;
|
||||
gender: any;
|
||||
statuslist: any;
|
||||
selectedstatus: any = 0;
|
||||
selectedgender: any = 0;
|
||||
selectadmissionDate: Date = new Date();
|
||||
selectdischargeDate: Date = new Date();
|
||||
createpermission: boolean;
|
||||
editpermission: boolean;
|
||||
deletepermission: boolean;
|
||||
error: string = '';
|
||||
imgpath: string = '';
|
||||
guid: string = '00000000-0000-0000-0000-000000000000';
|
||||
options: Partial<Confirmation.Options> = {
|
||||
hideCancelBtn: false,
|
||||
hideYesBtn: false,
|
||||
dismissible: false,
|
||||
cancelText: 'Close',
|
||||
// yesText: 'Confirm',
|
||||
messageLocalizationParams: ['Demo'],
|
||||
titleLocalizationParams: [],
|
||||
// You can customize icon
|
||||
// icon: 'fa fa-exclamation-triangle', // or
|
||||
// iconTemplate : '<img src="custom-image-path.jpg" alt=""/>'
|
||||
};
|
||||
|
||||
constructor(
|
||||
private patientService: PatientService,
|
||||
private http: HttpClient,
|
||||
private confirmation: ConfirmationService,
|
||||
private toaster: ToasterService,
|
||||
private permissionChecker: PermissionService,
|
||||
private router: Router
|
||||
) {}
|
||||
|
||||
ngOnInit() {
|
||||
this.createpermission = this.permissionChecker.getGrantedPolicy(
|
||||
'HospitalManagementSystem.Patient.Create'
|
||||
);
|
||||
this.editpermission = this.permissionChecker.getGrantedPolicy(
|
||||
'HospitalManagementSystem.Patient.Edit'
|
||||
);
|
||||
this.deletepermission = this.permissionChecker.getGrantedPolicy(
|
||||
'HospitalManagementSystem.Patient.Delete'
|
||||
);
|
||||
this.status = Status;
|
||||
this.gender = Gender;
|
||||
this.patientService.getStatusDropdown().subscribe(result => {
|
||||
this.statuslist = result;
|
||||
});
|
||||
|
||||
this.resetselectpatient();
|
||||
this.loadPatient({
|
||||
first: 0,
|
||||
rows: 10,
|
||||
sortField: 'id',
|
||||
sortOrder: 1,
|
||||
globalFilter: null,
|
||||
});
|
||||
}
|
||||
resetselectpatient() {
|
||||
this.selectedPatient = {
|
||||
name: '',
|
||||
gender: Gender.Male,
|
||||
mobile: '',
|
||||
email: '',
|
||||
age: 0,
|
||||
treatment: '',
|
||||
doctorAssigned: '',
|
||||
address: '',
|
||||
bloodGroup: '',
|
||||
admissionDate: '',
|
||||
dischargeDate: '',
|
||||
status: Status.InTreatment,
|
||||
};
|
||||
this.imgpath = '';
|
||||
this.selectedgender = 0;
|
||||
this.selectedstatus = 0;
|
||||
}
|
||||
|
||||
loadPatient(event: any) {
|
||||
this.loading = true;
|
||||
let order = event.sortOrder == 1 ? ' asc' : ' desc';
|
||||
event.sortField = event.sortField == undefined ? 'id' : event.sortField;
|
||||
this.params = {
|
||||
skipCount: event.first,
|
||||
maxResultCount: event.rows,
|
||||
sorting: event.sortField + order,
|
||||
search: event.globalFilter == null ? '' : event.globalFilter,
|
||||
};
|
||||
|
||||
this.patientService.getPatientList(this.params).subscribe(data => {
|
||||
this.patients = data.items;
|
||||
this.totalRecords = data.totalCount;
|
||||
this.loading = false;
|
||||
});
|
||||
}
|
||||
|
||||
exportPatient() {
|
||||
this.patientService.getExportPatientData().subscribe(result => {
|
||||
const binary = atob(result.fileContent);
|
||||
const len = binary.length;
|
||||
const bytes = new Uint8Array(len);
|
||||
|
||||
for (let i = 0; i < len; i++) {
|
||||
bytes[i] = binary.charCodeAt(i);
|
||||
}
|
||||
|
||||
const blob = new Blob([bytes], { type: 'application/xlsx' });
|
||||
|
||||
const url = window.URL.createObjectURL(blob);
|
||||
|
||||
const link = document.createElement('a');
|
||||
link.href = url;
|
||||
link.download = result.fileName;
|
||||
|
||||
document.body.appendChild(link);
|
||||
link.click();
|
||||
|
||||
document.body.removeChild(link);
|
||||
window.URL.revokeObjectURL(url);
|
||||
});
|
||||
}
|
||||
|
||||
openNewPatientDialog() {
|
||||
this.patientDialogTitle = 'New Patient';
|
||||
this.resetselectpatient();
|
||||
this.selectedgender = 0;
|
||||
this.selectedstatus = 0;
|
||||
this.patientDialog = true;
|
||||
this.isEditMode = false;
|
||||
}
|
||||
|
||||
addnewrecord(id: any) {
|
||||
this.router.navigate(['/patients/patient-record', id]);
|
||||
}
|
||||
|
||||
profileimageupload(event: Event) {
|
||||
if (this.selectedPatient.name == '') {
|
||||
this.error = 'Please Type a Name';
|
||||
return;
|
||||
}
|
||||
const input = event.target as HTMLInputElement;
|
||||
if (input.files.length > 0) {
|
||||
const tag = 'Image';
|
||||
const formdata = new FormData();
|
||||
formdata.append('file', input.files[0]);
|
||||
this.UploadFileData(tag, formdata);
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
UploadFileData(tag: string, formdata: FormData) {
|
||||
this.patientService.uploadFile(tag, formdata).subscribe(result => {
|
||||
this.selectedPatient.imageID = result;
|
||||
});
|
||||
}
|
||||
|
||||
editPatient(Patient: any) {
|
||||
this.resetselectpatient();
|
||||
this.patientDialogTitle = 'Edit Patient';
|
||||
this.patientService.getPatientById(Patient.id).subscribe(result => {
|
||||
this.selectedPatient = result;
|
||||
this.imgpath = result.imagepath != null ? result.imagepath.split('\\')[3] : '';
|
||||
this.selectadmissionDate = new Date(this.selectedPatient.admissionDate);
|
||||
this.selectedgender = this.selectedPatient.gender;
|
||||
this.selectedstatus = this.selectedPatient.status;
|
||||
});
|
||||
this.patientDialog = true;
|
||||
this.isEditMode = true;
|
||||
}
|
||||
|
||||
deletePatient(id: any) {
|
||||
this.confirmation
|
||||
.warn('Do you really want to delete this patient?', {
|
||||
key: '::AreYouSure',
|
||||
defaultValue: 'Are you sure?',
|
||||
})
|
||||
.subscribe((status: Confirmation.Status) => {
|
||||
// your code here
|
||||
if (status == 'confirm') {
|
||||
this.patientService.deletePatient(id).subscribe(() => {
|
||||
this.toaster.success('Patient deleted successfully', 'Success');
|
||||
this.loadPatient(this.params);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
savePatient(form: NgForm) {
|
||||
console.log(form.controls);
|
||||
if (form.invalid) {
|
||||
Object.values(form.controls).forEach(control => control.markAsTouched());
|
||||
return;
|
||||
}
|
||||
this.selectedPatient.gender = this.selectedgender;
|
||||
this.selectedPatient.status = this.selectedstatus;
|
||||
this.selectedPatient.admissionDate = this.selectadmissionDate.toDateString();
|
||||
this.selectedPatient.dischargeDate = this.selectdischargeDate.toDateString();
|
||||
this.selectedPatient.imageID = this.selectedPatient.imageID
|
||||
? this.selectedPatient.imageID.replace('"', '').replace('"', '')
|
||||
: this.guid;
|
||||
console.log(this.selectedPatient);
|
||||
|
||||
if (this.isEditMode) {
|
||||
this.patientService.updatePatient(this.selectedPatient.id, this.selectedPatient).subscribe(
|
||||
() => {
|
||||
this.toaster.success('Patient updated successfully', 'Success');
|
||||
this.patientDialog = false;
|
||||
this.loadPatient({
|
||||
first: 0,
|
||||
rows: 10,
|
||||
sortField: 'id',
|
||||
sortOrder: 1,
|
||||
globalFilter: null,
|
||||
});
|
||||
},
|
||||
error => {
|
||||
console.log(error);
|
||||
this.closeDialog();
|
||||
}
|
||||
);
|
||||
} else {
|
||||
this.patientService.createPatient(this.selectedPatient).subscribe(
|
||||
() => {
|
||||
this.toaster.success('Patient created successfully', 'Success');
|
||||
this.patientDialog = false;
|
||||
this.loadPatient({
|
||||
first: 0,
|
||||
rows: 10,
|
||||
sortField: 'id',
|
||||
sortOrder: 1,
|
||||
globalFilter: null,
|
||||
});
|
||||
},
|
||||
error => {
|
||||
console.log(error);
|
||||
this.closeDialog();
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
closeDialog() {
|
||||
this.patientDialog = false;
|
||||
}
|
||||
}
|
@ -0,0 +1,279 @@
|
||||
<div class="patient-container">
|
||||
<div class="patient-card">
|
||||
<!-- Patient Image -->
|
||||
<div class="patient-image">
|
||||
<img [src]="patientImageUrl || 'assets/default-profile.png'" alt="Patient Image">
|
||||
</div>
|
||||
|
||||
<!-- Patient Information -->
|
||||
<div class="patient-info">
|
||||
<h2 class="patient-name">{{ patientdto?.name }}</h2>
|
||||
<div class="patient-details">
|
||||
<div class="info-item">
|
||||
<strong>Age:</strong> {{ patientdto?.age }}
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<strong>Gender:</strong> {{ gender[patientdto?.gender] }}
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<strong>Mobile:</strong> {{ patientdto?.mobile }}
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<strong>Email:</strong> {{ patientdto?.email }}
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<strong>Blood Group:</strong> {{ patientdto?.bloodGroup }}
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<strong>Doctor:</strong> {{ patientdto?.doctorAssigned || 'N/A' }}
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<strong>Admission:</strong> {{ patientdto?.admissionDate | date }}
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<strong>Discharge:</strong> {{ patientdto?.dischargeDate | date }}
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<strong>Treatment:</strong> {{ patientdto?.treatment || 'N/A' }}
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<strong>Status:</strong>
|
||||
<span class="status">
|
||||
{{ status[patientdto?.status] }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<button class="btn btn-sm btn-primary mb-2" (click)="backtopatient()">
|
||||
<i class="pi pi-arrow-left"></i> Back
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<p-table #dt2 dataKey="id" [value]="patientrecords" [paginator]="true" [rows]="10" [totalRecords]="totalRecords"
|
||||
[lazy]="true" (onLazyLoad)="loadPatient($event,patientId)" [rowsPerPageOptions]="[10, 20, 50]"
|
||||
[responsiveLayout]="'scroll'" [globalFilterFields]="['id', 'name', 'diagnosis']"
|
||||
[filters]="{ global: { value: '', matchMode: 'contains' } }" class="table table-striped">
|
||||
|
||||
<ng-template pTemplate="caption">
|
||||
<div class="flex">
|
||||
<h2 class="mr-auto">{{'::PatientHeader' | abpLocalization}}</h2>
|
||||
<div>
|
||||
<button *ngIf="createpermission" pButton class="p-button-rounded p-button-success ml-2"
|
||||
(click)="openNewPatientDialog()">
|
||||
<i class="pi pi-plus-circle"></i>
|
||||
</button>
|
||||
<button pButton class="p-button-rounded p-button-warning ml-2" (click)="exportPatient()">
|
||||
<i class="pi pi-download"></i>
|
||||
</button>
|
||||
<p-iconField iconPosition="right" class="ml-2">
|
||||
<p-inputIcon>
|
||||
<i class="pi pi-search"></i>
|
||||
</p-inputIcon>
|
||||
<input pInputText type="text" (input)="dt2.filterGlobal($event.target.value, 'contains')"
|
||||
[(ngModel)]="globalFilter" placeholder="Search keyword" />
|
||||
</p-iconField>
|
||||
</div>
|
||||
</div>
|
||||
</ng-template>
|
||||
|
||||
<ng-template pTemplate="header">
|
||||
<tr>
|
||||
<th class="hidden" pSortableColumn="id">Patient ID <p-sortIcon field="id" /></th>
|
||||
<th pSortableColumn="fullName">Full Name <p-sortIcon field="fullName" /></th>
|
||||
<th pSortableColumn="gender">Gender <p-sortIcon field="fullName" /></th>
|
||||
<th pSortableColumn="dateOfAdmission">Date of Admission <p-sortIcon field="dateOfAdmission" /></th>
|
||||
<th pSortableColumn="diagnosis">Diagnosis <p-sortIcon field="diagnosis" /></th>
|
||||
<th>Lab Reports</th>
|
||||
<th>Medications</th>
|
||||
<th pSortableColumn="nextFollowUp">Next Follow-Up <p-sortIcon field="nextFollowUp" /></th>
|
||||
<th pSortableColumn="status">Status <p-sortIcon field="status" /></th>
|
||||
<th>Actions</th>
|
||||
</tr>
|
||||
</ng-template>
|
||||
|
||||
<ng-template pTemplate="body" let-patientrecord>
|
||||
<tr>
|
||||
<td class="hidden">{{ patientrecord.id }}</td>
|
||||
<td>{{ patientrecord.patients.name }}</td>
|
||||
<td>
|
||||
<span class="badge" [ngClass]="patientrecord.patients.gender === 1 ? 'male' : 'female'">
|
||||
{{ gender[patientrecord.patients.gender] }}
|
||||
</span>
|
||||
</td>
|
||||
<td>{{ patientrecord.dateOfAdmission | date }}</td>
|
||||
<td>{{ patientrecord.diagnosis }}</td>
|
||||
<td><i class="pi pi-file-pdf pdf-icon"></i></td>
|
||||
<td><i class="pi pi-file-pdf pdf-icon"></i></td>
|
||||
<td>{{ patientrecord.nextFollowUp | date }}</td>
|
||||
<td>{{ status[patientrecord.patients.status] }}</td>
|
||||
<td class="d-flex">
|
||||
<button *ngIf="editpermission" class="btn btn-warning btn-sm" (click)="editPatient(patientrecord)"><i
|
||||
class="pi pi-pencil"></i></button>
|
||||
<button *ngIf="deletepermission" class="btn btn-danger btn-sm ml-1"
|
||||
(click)="deletePatient(patientrecord.id)"><i class="pi pi-trash"></i></button>
|
||||
</td>
|
||||
</tr>
|
||||
</ng-template>
|
||||
<ng-template pTemplate="emptymessage">
|
||||
<tr>
|
||||
<td colspan="11">No Patients found.</td>
|
||||
</tr>
|
||||
</ng-template>
|
||||
</p-table>
|
||||
<span>Total Records: {{totalRecords}}</span>
|
||||
</div>
|
||||
<div>
|
||||
<p-dialog *ngIf="patientDialog" header="{{patientDialogTitle}}" [(visible)]="patientDialog" [modal]="true"
|
||||
[closable]="true" [style]="{width: '85%', height: '100%'}">
|
||||
<form #patientrecord="ngForm" (ngSubmit)="savePatient(patientrecord)" novalidate>
|
||||
<div class="p-fluid">
|
||||
<div class="p-grid">
|
||||
<!-- <div class="p-col-6">
|
||||
<div class="field">
|
||||
<label for="fullname">Full Name</label>
|
||||
<input id="fullname" name="fullname" type="text" autocomplete="off" pInputText
|
||||
[(ngModel)]="selectedPatient.fullName" placeholder="Enter full patient name" required
|
||||
#fullname="ngModel" />
|
||||
<small *ngIf="fullname.invalid && fullname.touched" class="p-error">
|
||||
Full Name is required.
|
||||
</small>
|
||||
</div>
|
||||
</div> -->
|
||||
<!-- <div class="p-col-6">
|
||||
<div class="field">
|
||||
<label for="mobile">Mobile</label>
|
||||
<input id="mobile" name="mobile" type="text" autocomplete="off" pInputText
|
||||
[(ngModel)]="selectedPatient.mobile" maxlength="10" pattern="^[0-9]{10}$"
|
||||
placeholder="Enter mobile number" required #mobile="ngModel" />
|
||||
<small *ngIf="mobile.invalid && mobile.touched" class="p-error">
|
||||
Mobile number is required and must be 10 digits.
|
||||
</small>
|
||||
</div>
|
||||
</div> -->
|
||||
</div>
|
||||
|
||||
<div class="p-grid">
|
||||
<div class="p-col-6">
|
||||
<!-- <div class="field">
|
||||
<label for="gender">Gender</label>
|
||||
<div>
|
||||
<label class="mx-1">
|
||||
<input style="background-color: #fff;" id="male" type="radio" name="gender"
|
||||
[(ngModel)]="selectedgender" [value]="1" required #gender="ngModel" />
|
||||
Male
|
||||
</label>
|
||||
<label>
|
||||
<input style="background-color: #fff;" id="female" type="radio" name="gender"
|
||||
[(ngModel)]="selectedgender" [value]="2" required />
|
||||
Female
|
||||
</label>
|
||||
<small *ngIf="!selectedgender" class="p-error">
|
||||
Please select a gender.
|
||||
</small>
|
||||
</div>
|
||||
</div> -->
|
||||
</div>
|
||||
<div class="p-col-6">
|
||||
<div class="field">
|
||||
<label for="admissionDate">Admission Date</label>
|
||||
<p-calendar id="admissionDate" name="admissionDate" [(ngModel)]="selectdateOfAdmission" showIcon required
|
||||
#admissionDate="ngModel"></p-calendar>
|
||||
<small *ngIf="admissionDate.invalid && admissionDate.touched" class="p-error">
|
||||
Admission Date is required.
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="p-grid">
|
||||
<div class="p-col-6">
|
||||
<div class="field">
|
||||
<label for="labReport">Lab Report</label>
|
||||
<input type="file" id="labReport" name="labReport" accept=".pdf,.doc,.docx"
|
||||
(change)="handleLabReportUpload($event)" />
|
||||
</div>
|
||||
<small *ngIf="labReportUrlpath !==''">{{labReportUrlpath}} <i class="pi pi-file-pdf pdf-icon"></i></small>
|
||||
</div>
|
||||
<div class="p-col-6">
|
||||
<div class="field">
|
||||
<label for="medications">Medications</label>
|
||||
<input type="file" id="medications" name="medications" accept=".pdf,.doc,.docx"
|
||||
(change)="handleMedicationsUpload($event)" />
|
||||
</div>
|
||||
<small *ngIf="medicationUrlpath !==''">{{medicationUrlpath}} <i class="pi pi-file-pdf pdf-icon"></i></small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="p-grid">
|
||||
<div class="p-col-6">
|
||||
<div class="field">
|
||||
<label for="medicationHistory">Medication History</label>
|
||||
<input type="file" id="medicationHistory" name="medicationHistory" accept=".pdf,.doc,.docx"
|
||||
(change)="handleMedicationHistoryUpload($event)" />
|
||||
</div>
|
||||
<small *ngIf="medicationHistoryUrlpath !==''">{{medicationHistoryUrlpath}} <i class="pi pi-file-pdf pdf-icon"></i></small>
|
||||
</div>
|
||||
<div class="p-col-6">
|
||||
<div class="field">
|
||||
<label for="nextFollowUp">Next FollowUp Date</label>
|
||||
<p-calendar id="nextFollowUp" name="nextFollowUp" [(ngModel)]="selectnextFollowUp" showIcon required
|
||||
#nextFollowUp="ngModel"></p-calendar>
|
||||
<small *ngIf="nextFollowUp.invalid && nextFollowUp.touched" class="p-error">
|
||||
Next Follow-Up Date is required.
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="p-grid">
|
||||
<div class="p-col-12">
|
||||
<div class="field">
|
||||
<div>
|
||||
<label for="diagnosis">Diagnosis</label>
|
||||
</div>
|
||||
<textarea style="width: 100%; background-color: #fff; color: black;" id="diagnosis" name="diagnosis"
|
||||
pInputTextarea rows="5" cols="30" [(ngModel)]="selectedPatient.diagnosis" required
|
||||
#diagnosis="ngModel"></textarea>
|
||||
<small *ngIf="diagnosis.invalid && diagnosis.touched" class="p-error">
|
||||
Diagnosis is required.
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="p-grid">
|
||||
<div class="p-col-6">
|
||||
<div class="field">
|
||||
<label for="insuranceProvider">Insurance Provider</label>
|
||||
<input id="insuranceProvider" name="insuranceProvider" type="text" autocomplete="off" pInputText
|
||||
[(ngModel)]="selectedPatient.insuranceProvider" required placeholder="Enter insurance provider"
|
||||
#insurance="ngModel" />
|
||||
<small *ngIf="insurance.invalid && insurance.touched" class="p-error">
|
||||
Insurance is required.
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
<div class="p-col-6">
|
||||
<!-- <div class="field">
|
||||
<label for="status">Status</label>
|
||||
<p-dropdown name="status" id="status" [options]="statuslist" [(ngModel)]="selectedstatus"
|
||||
optionLabel="label" optionValue="value" placeholder="Select status" required
|
||||
#status="ngModel"></p-dropdown>
|
||||
<small *ngIf="selectedstatus === 0" class="p-error">
|
||||
Status is required.
|
||||
</small>
|
||||
</div> -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<button type="submit" pButton class="btn btn-primary" [disabled]="patientrecord.invalid">Save</button>
|
||||
<button pButton class="btn btn-secondary ml-1" (click)="closeDialog()">Close</button>
|
||||
</div>
|
||||
</form>
|
||||
</p-dialog>
|
||||
</div>
|
@ -0,0 +1,81 @@
|
||||
.table-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.badge {
|
||||
display: inline-block;
|
||||
padding: 0.2rem 0.6rem;
|
||||
border-radius: 0.5rem;
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
|
||||
.male {
|
||||
background-color: green;
|
||||
}
|
||||
|
||||
.female {
|
||||
background-color: purple;
|
||||
}
|
||||
|
||||
.pdf-icon {
|
||||
color: red;
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
||||
|
||||
.patient-container {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.patient-card {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
max-width: 800px;
|
||||
background: #ffffff;
|
||||
border-radius: 12px;
|
||||
padding: 20px;
|
||||
box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.1);
|
||||
border-left: 5px solid #007bff;
|
||||
}
|
||||
|
||||
.patient-image img {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
border-radius: 50%;
|
||||
object-fit: cover;
|
||||
border: 3px solid #007bff;
|
||||
}
|
||||
|
||||
.patient-info {
|
||||
flex: 1;
|
||||
margin-left: 20px;
|
||||
}
|
||||
|
||||
.patient-name {
|
||||
font-size: 22px;
|
||||
font-weight: bold;
|
||||
color: #333;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.patient-details {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, minmax(150px, 1fr));
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.info-item {
|
||||
font-size: 14px;
|
||||
background: #f8f9fa;
|
||||
padding: 6px 12px;
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,319 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { NgForm } from '@angular/forms';
|
||||
import { PagingSortPatientResultDto } from '@proxy/dto';
|
||||
import { Gender, Status } from '@proxy/global-enum';
|
||||
import { PatientService } from '@proxy/patients';
|
||||
import { CreateUpdatePatientRecordDto, PatientDto, PatientRecordDto } from '@proxy/patients/dto';
|
||||
import { PermissionService } from '@abp/ng.core';
|
||||
import { ActivatedRoute, Router } from '@angular/router';
|
||||
import { environment } from 'src/environments/environment';
|
||||
import { Confirmation, ConfirmationService, ToasterService } from '@abp/ng.theme.shared';
|
||||
|
||||
@Component({
|
||||
selector: 'app-patient-record',
|
||||
templateUrl: './patient-record.component.html',
|
||||
styleUrl: './patient-record.component.scss',
|
||||
providers: [PatientService, ConfirmationService, ToasterService, PermissionService],
|
||||
})
|
||||
export class PatientRecordComponent implements OnInit {
|
||||
globalFilter: string = '';
|
||||
patientrecords: PatientRecordDto[];
|
||||
totalRecords: number = 0;
|
||||
loading: boolean = false;
|
||||
patientDialog: boolean = false;
|
||||
selectedPatient: CreateUpdatePatientRecordDto;
|
||||
patientdto: PatientDto;
|
||||
isEditMode: boolean = false;
|
||||
patientDialogTitle: string = '';
|
||||
params: PagingSortPatientResultDto;
|
||||
status: any;
|
||||
gender: any;
|
||||
statuslist: any;
|
||||
selectdateOfAdmission: Date = new Date();
|
||||
selectnextFollowUp: Date = new Date();
|
||||
createpermission: boolean;
|
||||
editpermission: boolean;
|
||||
deletepermission: boolean;
|
||||
patientId: any;
|
||||
patientImageUrl: string;
|
||||
labReportUrlpath: string;
|
||||
medicationHistoryUrlpath: string;
|
||||
medicationUrlpath: string;
|
||||
guid: string = '00000000-0000-0000-0000-000000000000';
|
||||
options: Partial<Confirmation.Options> = {
|
||||
hideCancelBtn: false,
|
||||
hideYesBtn: false,
|
||||
dismissible: false,
|
||||
cancelText: 'Close',
|
||||
yesText: 'Confirm',
|
||||
messageLocalizationParams: ['Demo'],
|
||||
titleLocalizationParams: [],
|
||||
// You can customize icon
|
||||
// icon: 'fa fa-exclamation-triangle', // or
|
||||
// iconTemplate : '<img src="custom-image-path.jpg" alt=""/>'
|
||||
};
|
||||
|
||||
constructor(
|
||||
private patientService: PatientService,
|
||||
private confirmation: ConfirmationService,
|
||||
private permissionChecker: PermissionService,
|
||||
private toaster: ToasterService,
|
||||
private route: ActivatedRoute,
|
||||
private router: Router
|
||||
) {}
|
||||
|
||||
ngOnInit() {
|
||||
this.patientId = this.route.snapshot.paramMap.get('id');
|
||||
console.log(this.patientId);
|
||||
|
||||
this.createpermission = this.permissionChecker.getGrantedPolicy(
|
||||
'HospitalManagementSystem.Patient.Create'
|
||||
);
|
||||
this.editpermission = this.permissionChecker.getGrantedPolicy(
|
||||
'HospitalManagementSystem.Patient.Edit'
|
||||
);
|
||||
this.deletepermission = this.permissionChecker.getGrantedPolicy(
|
||||
'HospitalManagementSystem.Patient.Delete'
|
||||
);
|
||||
this.status = Status;
|
||||
this.gender = Gender;
|
||||
this.patientService.getStatusDropdown().subscribe(result => {
|
||||
this.statuslist = result;
|
||||
});
|
||||
|
||||
this.resetselectpatient();
|
||||
}
|
||||
|
||||
resetselectpatient() {
|
||||
this.selectedPatient = {
|
||||
patientId: this.patientId,
|
||||
dateOfAdmission: '',
|
||||
// labReportUrl: '',
|
||||
// medicationUrl: '',
|
||||
// medicationHistoryUrl: '',
|
||||
nextFollowUp: '',
|
||||
diagnosis: '',
|
||||
treatmentPlan: '',
|
||||
doctorNotes: '',
|
||||
insuranceProvider: '',
|
||||
status: Status.InTreatment,
|
||||
};
|
||||
this.labReportUrlpath = '';
|
||||
this.medicationUrlpath = '';
|
||||
this.medicationHistoryUrlpath = '';
|
||||
this.selectdateOfAdmission = new Date();
|
||||
this.selectnextFollowUp = new Date();
|
||||
}
|
||||
|
||||
loadPatient(event: any, id: any) {
|
||||
this.selectedPatient.patientId = this.patientId;
|
||||
this.loading = true;
|
||||
let order = event.sortOrder == 1 ? ' asc' : ' desc';
|
||||
event.sortField = event.sortField == undefined ? 'id' : event.sortField;
|
||||
this.params = {
|
||||
skipCount: event.first,
|
||||
maxResultCount: event.rows,
|
||||
sorting: event.sortField + order,
|
||||
search: event.globalFilter == null ? '' : event.globalFilter,
|
||||
};
|
||||
this.patientService.getPatientById(this.patientId).subscribe(result => {
|
||||
this.patientdto = result;
|
||||
this.patientImageUrl = environment.apis.default.url + result.imagepath;
|
||||
});
|
||||
this.patientService.getPatientRecordList(this.params, id).subscribe(data => {
|
||||
this.patientrecords = data.items;
|
||||
// console.log(data.items);
|
||||
this.totalRecords = data.totalCount;
|
||||
this.loading = false;
|
||||
});
|
||||
}
|
||||
|
||||
backtopatient() {
|
||||
this.router.navigate(['/patients/all-patients']);
|
||||
}
|
||||
|
||||
exportPatient() {
|
||||
this.patientService.getExportPatientRecord().subscribe(result => {
|
||||
const binary = atob(result.fileContent);
|
||||
const len = binary.length;
|
||||
const bytes = new Uint8Array(len);
|
||||
|
||||
for (let i = 0; i < len; i++) {
|
||||
bytes[i] = binary.charCodeAt(i);
|
||||
}
|
||||
|
||||
const blob = new Blob([bytes], { type: 'application/xlsx' });
|
||||
|
||||
const url = window.URL.createObjectURL(blob);
|
||||
|
||||
const link = document.createElement('a');
|
||||
link.href = url;
|
||||
link.download = result.fileName;
|
||||
|
||||
document.body.appendChild(link);
|
||||
link.click();
|
||||
|
||||
document.body.removeChild(link);
|
||||
window.URL.revokeObjectURL(url);
|
||||
});
|
||||
}
|
||||
|
||||
openNewPatientDialog() {
|
||||
this.patientDialogTitle = 'New Patient Record';
|
||||
this.resetselectpatient();
|
||||
this.patientDialog = true;
|
||||
this.isEditMode = false;
|
||||
}
|
||||
|
||||
editPatient(Patient: any) {
|
||||
this.resetselectpatient();
|
||||
this.patientDialogTitle = 'Edit Patient';
|
||||
this.patientService.getPatientRecordById(Patient.id).subscribe(result => {
|
||||
this.selectedPatient = result;
|
||||
this.selectedPatient.patientId = this.patientId;
|
||||
this.selectdateOfAdmission = new Date(this.selectedPatient.dateOfAdmission);
|
||||
this.selectnextFollowUp = new Date(this.selectedPatient.nextFollowUp);
|
||||
this.labReportUrlpath = result.labReportUrl != null ? result.labReportUrl.split('\\')[3] : '';
|
||||
this.medicationUrlpath =
|
||||
result.medicationUrl != null ? result.medicationUrl.split('\\')[3] : '';
|
||||
this.medicationHistoryUrlpath =
|
||||
result.medicationHistoryUrl != null ? result.medicationHistoryUrl.split('\\')[3] : '';
|
||||
console.log(result);
|
||||
});
|
||||
this.patientDialog = true;
|
||||
this.isEditMode = true;
|
||||
}
|
||||
|
||||
deletePatient(id: any) {
|
||||
this.confirmation
|
||||
.warn('Do you really want to delete this record ?', {
|
||||
key: '::AreYouSure',
|
||||
defaultValue: 'Are you sure?',
|
||||
})
|
||||
.subscribe((status: Confirmation.Status) => {
|
||||
// your code here
|
||||
if (status == 'confirm') {
|
||||
this.patientService.deletePatientRecord(id).subscribe(() => {
|
||||
this.loadPatient(this.params, this.patientId);
|
||||
this.toaster.success('Patient deleted successfully', 'Success');
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
handleLabReportUpload(event: Event): void {
|
||||
const input = event.target as HTMLInputElement;
|
||||
if (input && input.files) {
|
||||
const tag = 'Lab-Report';
|
||||
const formdata = new FormData();
|
||||
formdata.append('file', input.files[0]);
|
||||
this.UploadFileData(tag, formdata);
|
||||
}
|
||||
}
|
||||
|
||||
handleMedicationsUpload(event: any): void {
|
||||
const input = event.target as HTMLInputElement;
|
||||
if (input && input.files) {
|
||||
const tag = 'Medication';
|
||||
const formdata = new FormData();
|
||||
formdata.append('file', input.files[0]);
|
||||
this.UploadFileData(tag, formdata);
|
||||
}
|
||||
}
|
||||
|
||||
handleMedicationHistoryUpload(event: any): void {
|
||||
const input = event.target as HTMLInputElement;
|
||||
if (input && input.files) {
|
||||
const tag = 'Medication-History';
|
||||
const formdata = new FormData();
|
||||
formdata.append('file', input.files[0]);
|
||||
this.UploadFileData(tag, formdata);
|
||||
}
|
||||
}
|
||||
|
||||
UploadFileData(tag: string, formdata: FormData) {
|
||||
this.patientService.uploadFile(tag, formdata).subscribe(result => {
|
||||
switch (tag) {
|
||||
case 'Lab-Report':
|
||||
this.selectedPatient.labReportUrlID = result;
|
||||
break;
|
||||
case 'Medication':
|
||||
this.selectedPatient.medicationUrlID = result;
|
||||
break;
|
||||
case 'Medication-History':
|
||||
this.selectedPatient.medicationHistoryUrlID = result;
|
||||
break;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
savePatient(form: NgForm) {
|
||||
// console.log(form);
|
||||
this.selectedPatient.patientId = this.patientId;
|
||||
this.selectedPatient.status = this.patientdto.status;
|
||||
this.selectedPatient.dateOfAdmission = this.selectdateOfAdmission.toDateString();
|
||||
this.selectedPatient.nextFollowUp = this.selectnextFollowUp.toDateString();
|
||||
this.selectedPatient.labReportUrlID = this.selectedPatient.labReportUrlID
|
||||
? this.selectedPatient.labReportUrlID.replace('"', '').replace('"', '')
|
||||
: this.guid;
|
||||
this.selectedPatient.medicationUrlID = this.selectedPatient.medicationUrlID
|
||||
? this.selectedPatient.medicationUrlID.replace('"', '').replace('"', '')
|
||||
: this.guid;
|
||||
this.selectedPatient.medicationHistoryUrlID = this.selectedPatient.medicationHistoryUrlID
|
||||
? this.selectedPatient.medicationHistoryUrlID.replace('"', '').replace('"', '')
|
||||
: this.guid;
|
||||
console.log(this.selectedPatient);
|
||||
|
||||
if (this.isEditMode) {
|
||||
this.patientService
|
||||
.updatePatientRecord(this.selectedPatient.id, this.selectedPatient)
|
||||
.subscribe(
|
||||
result => {
|
||||
this.toaster.success('Patient updated successfully', 'Success');
|
||||
this.patientDialog = false;
|
||||
console.log(result);
|
||||
|
||||
this.loadPatient(
|
||||
{
|
||||
first: 0,
|
||||
rows: 10,
|
||||
sortField: 'id',
|
||||
sortOrder: 1,
|
||||
globalFilter: null,
|
||||
},
|
||||
this.patientId
|
||||
);
|
||||
},
|
||||
error => {
|
||||
console.log(error);
|
||||
this.closeDialog();
|
||||
}
|
||||
);
|
||||
} else {
|
||||
this.patientService.createPatientRecord(this.selectedPatient).subscribe(
|
||||
() => {
|
||||
this.toaster.success('Patient created successfully', 'Success');
|
||||
this.patientDialog = false;
|
||||
this.loadPatient(
|
||||
{
|
||||
first: 0,
|
||||
rows: 10,
|
||||
sortField: 'id',
|
||||
sortOrder: 1,
|
||||
globalFilter: null,
|
||||
},
|
||||
this.patientId
|
||||
);
|
||||
},
|
||||
error => {
|
||||
console.log(error);
|
||||
this.closeDialog();
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
closeDialog() {
|
||||
this.patientDialog = false;
|
||||
}
|
||||
}
|
26
angular/src/app/patients/patients-routing.module.ts
Normal file
26
angular/src/app/patients/patients-routing.module.ts
Normal file
@ -0,0 +1,26 @@
|
||||
import { NgModule } from '@angular/core';
|
||||
import { RouterModule, Routes } from '@angular/router';
|
||||
import { AllPatientsComponent } from './all-patients/all-patients.component';
|
||||
import { PatientRecordComponent } from './patient-record/patient-record.component';
|
||||
import { authGuard, permissionGuard } from '@abp/ng.core';
|
||||
|
||||
const routes: Routes = [
|
||||
{
|
||||
path: '',
|
||||
children: [
|
||||
{
|
||||
path: 'patient-record/:id',
|
||||
component: PatientRecordComponent,
|
||||
// canActivate: [authGuard, permissionGuard],
|
||||
},
|
||||
{ path: 'all-patients', component: AllPatientsComponent },
|
||||
// { path: 'create-new/:id', component: FaqCreateComponent },
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
@NgModule({
|
||||
imports: [RouterModule.forChild(routes)],
|
||||
exports: [RouterModule],
|
||||
})
|
||||
export class PatientsRoutingModule {}
|
37
angular/src/app/patients/patients.module.ts
Normal file
37
angular/src/app/patients/patients.module.ts
Normal file
@ -0,0 +1,37 @@
|
||||
import { NgModule } from '@angular/core';
|
||||
import { CommonModule } from '@angular/common';
|
||||
|
||||
import { PatientsRoutingModule } from './patients-routing.module';
|
||||
import { AllPatientsComponent } from './all-patients/all-patients.component';
|
||||
import { PatientRecordComponent } from './patient-record/patient-record.component';
|
||||
import { TableModule } from 'primeng/table';
|
||||
import { IconFieldModule } from 'primeng/iconfield';
|
||||
import { InputIconModule } from 'primeng/inputicon';
|
||||
import { FormsModule } from '@angular/forms';
|
||||
import { InputTextModule } from 'primeng/inputtext';
|
||||
import { PaginatorModule } from 'primeng/paginator';
|
||||
import { DialogModule } from 'primeng/dialog';
|
||||
import { DropdownModule } from 'primeng/dropdown';
|
||||
import { FileUploadModule } from 'primeng/fileupload';
|
||||
import { CalendarModule } from 'primeng/calendar';
|
||||
import { SharedModule } from '../shared/shared.module';
|
||||
|
||||
@NgModule({
|
||||
declarations: [AllPatientsComponent, PatientRecordComponent],
|
||||
imports: [
|
||||
CommonModule,
|
||||
PatientsRoutingModule,
|
||||
TableModule,
|
||||
InputIconModule,
|
||||
IconFieldModule,
|
||||
FormsModule,
|
||||
InputTextModule,
|
||||
PaginatorModule,
|
||||
DialogModule,
|
||||
DropdownModule,
|
||||
FileUploadModule,
|
||||
CalendarModule,
|
||||
SharedModule
|
||||
],
|
||||
})
|
||||
export class PatientsModule {}
|
1
angular/src/app/proxy/documents/index.ts
Normal file
1
angular/src/app/proxy/documents/index.ts
Normal file
@ -0,0 +1 @@
|
||||
export * from './models';
|
11
angular/src/app/proxy/documents/models.ts
Normal file
11
angular/src/app/proxy/documents/models.ts
Normal file
@ -0,0 +1,11 @@
|
||||
import type { AuditedAggregateRoot } from '../volo/abp/domain/entities/auditing/models';
|
||||
|
||||
export interface EntityDocument extends AuditedAggregateRoot<string> {
|
||||
originalFileName?: string;
|
||||
generatedFileName?: string;
|
||||
fileSize?: string;
|
||||
filePath?: string;
|
||||
fileType?: string;
|
||||
tagName?: string;
|
||||
uploadDate?: string;
|
||||
}
|
1
angular/src/app/proxy/dto/index.ts
Normal file
1
angular/src/app/proxy/dto/index.ts
Normal file
@ -0,0 +1 @@
|
||||
export * from './models';
|
15
angular/src/app/proxy/dto/models.ts
Normal file
15
angular/src/app/proxy/dto/models.ts
Normal file
@ -0,0 +1,15 @@
|
||||
import type { PagedAndSortedResultRequestDto } from '@abp/ng.core';
|
||||
|
||||
export interface DropDownItems {
|
||||
label?: string;
|
||||
value: number;
|
||||
}
|
||||
|
||||
export interface FileDownloadDto {
|
||||
fileName?: string;
|
||||
fileContent?: string;
|
||||
}
|
||||
|
||||
export interface PagingSortPatientResultDto extends PagedAndSortedResultRequestDto {
|
||||
search?: string;
|
||||
}
|
File diff suppressed because it is too large
Load Diff
8
angular/src/app/proxy/global-enum/gender.enum.ts
Normal file
8
angular/src/app/proxy/global-enum/gender.enum.ts
Normal file
@ -0,0 +1,8 @@
|
||||
import { mapEnumToOptions } from '@abp/ng.core';
|
||||
|
||||
export enum Gender {
|
||||
Male = 1,
|
||||
Female = 2,
|
||||
}
|
||||
|
||||
export const genderOptions = mapEnumToOptions(Gender);
|
2
angular/src/app/proxy/global-enum/index.ts
Normal file
2
angular/src/app/proxy/global-enum/index.ts
Normal file
@ -0,0 +1,2 @@
|
||||
export * from './gender.enum';
|
||||
export * from './status.enum';
|
9
angular/src/app/proxy/global-enum/status.enum.ts
Normal file
9
angular/src/app/proxy/global-enum/status.enum.ts
Normal file
@ -0,0 +1,9 @@
|
||||
import { mapEnumToOptions } from '@abp/ng.core';
|
||||
|
||||
export enum Status {
|
||||
Recovered = 1,
|
||||
Observation = 2,
|
||||
InTreatment = 3,
|
||||
}
|
||||
|
||||
export const statusOptions = mapEnumToOptions(Status);
|
@ -1,6 +1,10 @@
|
||||
import * as Appointments from './appointments';
|
||||
import * as Departments from './departments';
|
||||
import * as Doctors from './doctors';
|
||||
import * as Documents from './documents';
|
||||
import * as Dto from './dto';
|
||||
import * as Dtos from './dtos';
|
||||
import * as GlobalEnum from './global-enum';
|
||||
import * as Patients from './patients';
|
||||
import * as Volo from './volo';
|
||||
export { Appointments, Departments, Doctors, Dtos, Volo };
|
||||
export { Appointments, Departments, Doctors, Documents, Dto, Dtos, GlobalEnum, Patients, Volo };
|
||||
|
1
angular/src/app/proxy/patients/dto/index.ts
Normal file
1
angular/src/app/proxy/patients/dto/index.ts
Normal file
@ -0,0 +1 @@
|
||||
export * from './models';
|
67
angular/src/app/proxy/patients/dto/models.ts
Normal file
67
angular/src/app/proxy/patients/dto/models.ts
Normal file
@ -0,0 +1,67 @@
|
||||
import type { Gender } from '../../global-enum/gender.enum';
|
||||
import type { Status } from '../../global-enum/status.enum';
|
||||
|
||||
export interface CreateUpdatePatientDto {
|
||||
id?: string;
|
||||
name?: string;
|
||||
gender: Gender;
|
||||
mobile?: string;
|
||||
email?: string;
|
||||
age: number;
|
||||
treatment?: string;
|
||||
doctorAssigned?: string;
|
||||
address?: string;
|
||||
bloodGroup?: string;
|
||||
admissionDate?: string;
|
||||
dischargeDate?: string;
|
||||
status: Status;
|
||||
imageID?: string;
|
||||
}
|
||||
|
||||
export interface CreateUpdatePatientRecordDto {
|
||||
id?: string;
|
||||
patientId?: string;
|
||||
dateOfAdmission?: string;
|
||||
labReportUrlID?: string;
|
||||
medicationUrlID?: string;
|
||||
medicationHistoryUrlID?: string;
|
||||
nextFollowUp?: string;
|
||||
diagnosis?: string;
|
||||
treatmentPlan?: string;
|
||||
doctorNotes?: string;
|
||||
insuranceProvider?: string;
|
||||
status: Status;
|
||||
}
|
||||
|
||||
export interface PatientDto {
|
||||
id?: string;
|
||||
name?: string;
|
||||
gender: Gender;
|
||||
mobile?: string;
|
||||
email?: string;
|
||||
age: number;
|
||||
treatment?: string;
|
||||
doctorAssigned?: string;
|
||||
address?: string;
|
||||
bloodGroup?: string;
|
||||
admissionDate?: string;
|
||||
dischargeDate?: string;
|
||||
status: Status;
|
||||
imagepath?: string;
|
||||
}
|
||||
|
||||
export interface PatientRecordDto {
|
||||
id?: string;
|
||||
patientId?: string;
|
||||
patients: PatientDto;
|
||||
dateOfAdmission?: string;
|
||||
diagnosis?: string;
|
||||
treatmentPlan?: string;
|
||||
doctorNotes?: string;
|
||||
labReportUrl?: string;
|
||||
medicationUrl?: string;
|
||||
medicationHistoryUrl?: string;
|
||||
nextFollowUp?: string;
|
||||
insuranceProvider?: string;
|
||||
status: Status;
|
||||
}
|
4
angular/src/app/proxy/patients/index.ts
Normal file
4
angular/src/app/proxy/patients/index.ts
Normal file
@ -0,0 +1,4 @@
|
||||
import * as Dto from './dto';
|
||||
export * from './models';
|
||||
export * from './patient.service';
|
||||
export { Dto };
|
20
angular/src/app/proxy/patients/models.ts
Normal file
20
angular/src/app/proxy/patients/models.ts
Normal file
@ -0,0 +1,20 @@
|
||||
import type { AuditedAggregateRoot } from '../volo/abp/domain/entities/auditing/models';
|
||||
import type { Gender } from '../global-enum/gender.enum';
|
||||
import type { Status } from '../global-enum/status.enum';
|
||||
import type { EntityDocument } from '../documents/models';
|
||||
|
||||
export interface Patient extends AuditedAggregateRoot<string> {
|
||||
name: string;
|
||||
gender: Gender;
|
||||
mobile: string;
|
||||
email: string;
|
||||
age: number;
|
||||
treatment?: string;
|
||||
doctorAssigned?: string;
|
||||
address: string;
|
||||
bloodGroup: string;
|
||||
admissionDate?: string;
|
||||
dischargeDate?: string;
|
||||
status: Status;
|
||||
images: EntityDocument;
|
||||
}
|
147
angular/src/app/proxy/patients/patient.service.ts
Normal file
147
angular/src/app/proxy/patients/patient.service.ts
Normal file
@ -0,0 +1,147 @@
|
||||
import type { CreateUpdatePatientDto, CreateUpdatePatientRecordDto, PatientDto, PatientRecordDto } from './dto/models';
|
||||
import type { Patient } from './models';
|
||||
import { RestService, Rest } from '@abp/ng.core';
|
||||
import type { PagedResultDto } from '@abp/ng.core';
|
||||
import { Injectable } from '@angular/core';
|
||||
import type { EntityDocument } from '../documents/models';
|
||||
import type { DropDownItems, FileDownloadDto, PagingSortPatientResultDto } from '../dto/models';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
export class PatientService {
|
||||
apiName = 'Default';
|
||||
|
||||
|
||||
createPatient = (input: CreateUpdatePatientDto, config?: Partial<Rest.Config>) =>
|
||||
this.restService.request<any, PatientDto>({
|
||||
method: 'POST',
|
||||
url: '/api/app/patient/patient',
|
||||
body: input,
|
||||
},
|
||||
{ apiName: this.apiName,...config });
|
||||
|
||||
|
||||
createPatientRecord = (input: CreateUpdatePatientRecordDto, config?: Partial<Rest.Config>) =>
|
||||
this.restService.request<any, PatientRecordDto>({
|
||||
method: 'POST',
|
||||
url: '/api/app/patient/patient-record',
|
||||
body: input,
|
||||
},
|
||||
{ apiName: this.apiName,...config });
|
||||
|
||||
|
||||
deletePatient = (id: string, config?: Partial<Rest.Config>) =>
|
||||
this.restService.request<any, void>({
|
||||
method: 'DELETE',
|
||||
url: `/api/app/patient/${id}/patient`,
|
||||
},
|
||||
{ apiName: this.apiName,...config });
|
||||
|
||||
|
||||
deletePatientRecord = (id: string, config?: Partial<Rest.Config>) =>
|
||||
this.restService.request<any, void>({
|
||||
method: 'DELETE',
|
||||
url: `/api/app/patient/${id}/patient-record`,
|
||||
},
|
||||
{ apiName: this.apiName,...config });
|
||||
|
||||
|
||||
getExportPatientData = (config?: Partial<Rest.Config>) =>
|
||||
this.restService.request<any, FileDownloadDto>({
|
||||
method: 'GET',
|
||||
url: '/api/app/patient/export-patient-data',
|
||||
},
|
||||
{ apiName: this.apiName,...config });
|
||||
|
||||
|
||||
getExportPatientRecord = (config?: Partial<Rest.Config>) =>
|
||||
this.restService.request<any, FileDownloadDto>({
|
||||
method: 'GET',
|
||||
url: '/api/app/patient/export-patient-record',
|
||||
},
|
||||
{ apiName: this.apiName,...config });
|
||||
|
||||
|
||||
getPatientById = (id: string, config?: Partial<Rest.Config>) =>
|
||||
this.restService.request<any, PatientDto>({
|
||||
method: 'GET',
|
||||
url: `/api/app/patient/${id}/patient-by-id`,
|
||||
},
|
||||
{ apiName: this.apiName,...config });
|
||||
|
||||
|
||||
getPatientList = (input: PagingSortPatientResultDto, config?: Partial<Rest.Config>) =>
|
||||
this.restService.request<any, PagedResultDto<PatientDto>>({
|
||||
method: 'GET',
|
||||
url: '/api/app/patient/patient-list',
|
||||
params: { search: input.search, sorting: input.sorting, skipCount: input.skipCount, maxResultCount: input.maxResultCount },
|
||||
},
|
||||
{ apiName: this.apiName,...config });
|
||||
|
||||
|
||||
getPatientRecordById = (id: string, config?: Partial<Rest.Config>) =>
|
||||
this.restService.request<any, PatientRecordDto>({
|
||||
method: 'GET',
|
||||
url: `/api/app/patient/${id}/patient-record-by-id`,
|
||||
},
|
||||
{ apiName: this.apiName,...config });
|
||||
|
||||
|
||||
getPatientRecordList = (input: PagingSortPatientResultDto, Id: string, config?: Partial<Rest.Config>) =>
|
||||
this.restService.request<any, PagedResultDto<PatientRecordDto>>({
|
||||
method: 'GET',
|
||||
url: `/api/app/patient/patient-record-list/${Id}`,
|
||||
params: { search: input.search, sorting: input.sorting, skipCount: input.skipCount, maxResultCount: input.maxResultCount },
|
||||
},
|
||||
{ apiName: this.apiName,...config });
|
||||
|
||||
|
||||
getStatusDropdown = (config?: Partial<Rest.Config>) =>
|
||||
this.restService.request<any, DropDownItems[]>({
|
||||
method: 'GET',
|
||||
url: '/api/app/patient/status-dropdown',
|
||||
},
|
||||
{ apiName: this.apiName,...config });
|
||||
|
||||
|
||||
saveFileToDocumentByPatientAndUniqueIdsAndIsNew = (patient: Patient, uniqueIds: string[], isNew?: boolean, config?: Partial<Rest.Config>) =>
|
||||
this.restService.request<any, EntityDocument[]>({
|
||||
method: 'POST',
|
||||
url: '/api/app/patient/save-file-to-document',
|
||||
params: { isNew },
|
||||
body: uniqueIds,
|
||||
},
|
||||
{ apiName: this.apiName,...config });
|
||||
|
||||
|
||||
updatePatient = (id: string, input: CreateUpdatePatientDto, config?: Partial<Rest.Config>) =>
|
||||
this.restService.request<any, PatientDto>({
|
||||
method: 'PUT',
|
||||
url: `/api/app/patient/${id}/patient`,
|
||||
body: input,
|
||||
},
|
||||
{ apiName: this.apiName,...config });
|
||||
|
||||
|
||||
updatePatientRecord = (id: string, input: CreateUpdatePatientRecordDto, config?: Partial<Rest.Config>) =>
|
||||
this.restService.request<any, PatientRecordDto>({
|
||||
method: 'PUT',
|
||||
url: `/api/app/patient/${id}/patient-record`,
|
||||
body: input,
|
||||
},
|
||||
{ apiName: this.apiName,...config });
|
||||
|
||||
|
||||
uploadFile = (TagName: string, file: FormData, config?: Partial<Rest.Config>) =>
|
||||
this.restService.request<any, string>({
|
||||
method: 'POST',
|
||||
responseType: 'text',
|
||||
url: '/api/app/patient/upload-file',
|
||||
params: { tagName: TagName },
|
||||
body: file,
|
||||
},
|
||||
{ apiName: this.apiName,...config });
|
||||
|
||||
constructor(private restService: RestService) {}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
import type { Entity } from '../models';
|
||||
import type { AggregateRoot, Entity } from '../models';
|
||||
|
||||
export interface AuditedEntity<TKey> extends CreationAuditedEntity<TKey> {
|
||||
lastModificationTime?: string;
|
||||
@ -15,3 +15,13 @@ export interface FullAuditedEntity<TKey> extends AuditedEntity<TKey> {
|
||||
deleterId?: string;
|
||||
deletionTime?: string;
|
||||
}
|
||||
|
||||
export interface AuditedAggregateRoot<TKey> extends CreationAuditedAggregateRoot<TKey> {
|
||||
lastModificationTime?: string;
|
||||
lastModifierId?: string;
|
||||
}
|
||||
|
||||
export interface CreationAuditedAggregateRoot<TKey> extends AggregateRoot<TKey> {
|
||||
creationTime?: string;
|
||||
creatorId?: string;
|
||||
}
|
||||
|
@ -1,3 +1,11 @@
|
||||
|
||||
export interface Entity<TKey> {
|
||||
}
|
||||
|
||||
export interface AggregateRoot<TKey> extends BasicAggregateRoot<TKey> {
|
||||
extraProperties: Record<string, object>;
|
||||
concurrencyStamp?: string;
|
||||
}
|
||||
|
||||
export interface BasicAggregateRoot<TKey> extends Entity<TKey> {
|
||||
}
|
||||
|
@ -49,7 +49,31 @@ function configureRoutes(routesService: RoutesService) {
|
||||
parentName: 'Appointments',
|
||||
iconClass: 'fas fa-clock',
|
||||
order: 105,
|
||||
}
|
||||
},
|
||||
{
|
||||
path: '/patients',
|
||||
name: 'Patients',
|
||||
iconClass: 'fas fa-notes-medical',
|
||||
order: 201,
|
||||
layout: eLayoutType.application,
|
||||
requiredPolicy:'HospitalManagementSystem.Patient'
|
||||
},
|
||||
{
|
||||
path: '/patients/all-patients',
|
||||
name: 'All Patients',
|
||||
parentName: 'Patients',
|
||||
iconClass: 'fas fa-clock',
|
||||
order: 202,
|
||||
requiredPolicy:'HospitalManagementSystem.Patient'
|
||||
},
|
||||
// {
|
||||
// path: '/patients/patient-record',
|
||||
// name: 'Patient Record',
|
||||
// parentName: 'Patients',
|
||||
// iconClass: 'fas fa-clock',
|
||||
// order: 203,
|
||||
// requiredPolicy:'HospitalManagementSystem.Patient'
|
||||
// },
|
||||
]);
|
||||
};
|
||||
}
|
||||
|
BIN
angular/src/assets/default-profile.png
Normal file
BIN
angular/src/assets/default-profile.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 6.9 KiB |
@ -1,7 +1,7 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 16
|
||||
VisualStudioVersion = 16.0.29020.237
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.9.34902.65
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HospitalManagementSystem.Domain", "src\HospitalManagementSystem.Domain\HospitalManagementSystem.Domain.csproj", "{554AD327-6DBA-4F8F-96F8-81CE7A0C863F}"
|
||||
EndProject
|
||||
@ -35,16 +35,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HospitalManagementSystem.Db
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HospitalManagementSystem.HttpApi.Host", "src\HospitalManagementSystem.HttpApi.Host\HospitalManagementSystem.HttpApi.Host.csproj", "{748584B1-BA69-4F6A-81AA-F4BDE6BCE29D}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HospitalManagementSystem.Blazor.Client", "src\HospitalManagementSystem.Blazor.Client\HospitalManagementSystem.Blazor.Client.csproj", "{188A64AD-A1A7-4F95-85D1-C935594611B7}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HospitalManagementSystem.Blazor.WebApp", "src\HospitalManagementSystem.Blazor.WebApp\HospitalManagementSystem.Blazor.WebApp.csproj", "{14882ABF-1EEF-430C-8E72-812B3EE810C4}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HospitalManagementSystem.Blazor.WebApp.Client", "src\HospitalManagementSystem.Blazor.WebApp.Client\HospitalManagementSystem.Blazor.WebApp.Client.csproj", "{648460F4-3ECC-4751-9D87-EE25D0B8B2BF}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HospitalManagementSystem.Blazor.WebApp.Tiered", "src\HospitalManagementSystem.Blazor.WebApp.Tiered\HospitalManagementSystem.Blazor.WebApp.Tiered.csproj", "{8A3E5E20-F162-4321-8AD5-23DD7B2B0E74}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HospitalManagementSystem.Blazor.WebApp.Tiered.Client", "src\HospitalManagementSystem.Blazor.WebApp.Tiered.Client\HospitalManagementSystem.Blazor.WebApp.Tiered.Client.csproj", "{834C6A10-7562-427C-8771-B0588C35873D}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
@ -107,26 +97,6 @@ Global
|
||||
{748584B1-BA69-4F6A-81AA-F4BDE6BCE29D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{748584B1-BA69-4F6A-81AA-F4BDE6BCE29D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{748584B1-BA69-4F6A-81AA-F4BDE6BCE29D}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{188A64AD-A1A7-4F95-85D1-C935594611B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{188A64AD-A1A7-4F95-85D1-C935594611B7}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{188A64AD-A1A7-4F95-85D1-C935594611B7}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{188A64AD-A1A7-4F95-85D1-C935594611B7}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{14882ABF-1EEF-430C-8E72-812B3EE810C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{14882ABF-1EEF-430C-8E72-812B3EE810C4}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{14882ABF-1EEF-430C-8E72-812B3EE810C4}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{14882ABF-1EEF-430C-8E72-812B3EE810C4}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{648460F4-3ECC-4751-9D87-EE25D0B8B2BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{648460F4-3ECC-4751-9D87-EE25D0B8B2BF}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{648460F4-3ECC-4751-9D87-EE25D0B8B2BF}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{648460F4-3ECC-4751-9D87-EE25D0B8B2BF}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{8A3E5E20-F162-4321-8AD5-23DD7B2B0E74}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{8A3E5E20-F162-4321-8AD5-23DD7B2B0E74}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{8A3E5E20-F162-4321-8AD5-23DD7B2B0E74}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{8A3E5E20-F162-4321-8AD5-23DD7B2B0E74}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{834C6A10-7562-427C-8771-B0588C35873D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{834C6A10-7562-427C-8771-B0588C35873D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{834C6A10-7562-427C-8771-B0588C35873D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{834C6A10-7562-427C-8771-B0588C35873D}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
@ -146,11 +116,6 @@ Global
|
||||
{EF480016-9127-4916-8735-D2466BDBC582} = {04DBDB01-70F4-4E06-B468-8F87850B22BE}
|
||||
{AA94D832-1CCC-4715-95A9-A483F23A1A5D} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0}
|
||||
{748584B1-BA69-4F6A-81AA-F4BDE6BCE29D} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0}
|
||||
{188A64AD-A1A7-4F95-85D1-C935594611B7} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0}
|
||||
{14882ABF-1EEF-430C-8E72-812B3EE810C4} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0}
|
||||
{648460F4-3ECC-4751-9D87-EE25D0B8B2BF} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0}
|
||||
{8A3E5E20-F162-4321-8AD5-23DD7B2B0E74} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0}
|
||||
{834C6A10-7562-427C-8771-B0588C35873D} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0}
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {28315BFD-90E7-4E14-A2EA-F3D23AF4126F}
|
||||
|
@ -13,6 +13,7 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.AspNetCore.Http.Features" Version="5.0.17" />
|
||||
<PackageReference Include="Volo.Abp.ObjectExtending" Version="9.0.2" />
|
||||
<PackageReference Include="Volo.Abp.Account.Application.Contracts" Version="9.0.2" />
|
||||
<PackageReference Include="Volo.Abp.Identity.Application.Contracts" Version="9.0.2" />
|
||||
|
@ -0,0 +1,28 @@
|
||||
using HospitalManagementSystem.GlobalEnum;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace HospitalManagementSystem.Patients.Dto
|
||||
{
|
||||
public class CreateUpdatePatientDto
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
public string Name { get; set; }
|
||||
public Gender Gender { get; set; }
|
||||
public string Mobile { get; set; }
|
||||
public string Email { get; set; }
|
||||
public int Age { get; set; }
|
||||
public string Treatment { get; set; }
|
||||
public string DoctorAssigned { get; set; }
|
||||
public string Address { get; set; }
|
||||
public string BloodGroup { get; set; }
|
||||
public DateTime AdmissionDate { get; set; }
|
||||
public DateTime? DischargeDate { get; set; }
|
||||
public Status Status { get; set; }
|
||||
public Guid ImageID { get; set; }
|
||||
}
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
using HospitalManagementSystem.GlobalEnum;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace HospitalManagementSystem.Patients.Dto
|
||||
{
|
||||
public class CreateUpdatePatientRecordDto
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
|
||||
public Guid PatientId { get; set; }
|
||||
|
||||
public DateTime DateOfAdmission { get; set; }
|
||||
|
||||
public Guid? LabReportUrlID { get; set; }
|
||||
|
||||
public Guid? MedicationUrlID { get; set; }
|
||||
|
||||
public Guid? MedicationHistoryUrlID { get; set; }
|
||||
|
||||
public DateTime? NextFollowUp { get; set; }
|
||||
|
||||
public string Diagnosis { get; set; }
|
||||
|
||||
public string TreatmentPlan { get; set; }
|
||||
|
||||
public string DoctorNotes { get; set; }
|
||||
|
||||
public string InsuranceProvider { get; set; }
|
||||
|
||||
public Status Status { get; set; }
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
using HospitalManagementSystem.GlobalEnum;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace HospitalManagementSystem.Patients.Dto
|
||||
{
|
||||
public class PatientDto
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
public string Name { get; set; }
|
||||
public Gender Gender { get; set; }
|
||||
public string Mobile { get; set; }
|
||||
public string Email { get; set; }
|
||||
public int Age { get; set; }
|
||||
public string Treatment { get; set; }
|
||||
public string DoctorAssigned { get; set; }
|
||||
public string Address { get; set; }
|
||||
public string BloodGroup { get; set; }
|
||||
public DateTime AdmissionDate { get; set; }
|
||||
public DateTime? DischargeDate { get; set; }
|
||||
public Status Status { get; set; }
|
||||
public string? Imagepath { get; set; }
|
||||
}
|
||||
}
|
@ -0,0 +1,42 @@
|
||||
using HospitalManagementSystem.GlobalEnum;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using static HospitalManagementSystem.Permissions.HospitalManagementSystemPermissions;
|
||||
using HospitalManagementSystem.Patients;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
|
||||
namespace HospitalManagementSystem.Patients.Dto
|
||||
{
|
||||
public class PatientRecordDto
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
|
||||
public Guid PatientId { get; set; }
|
||||
|
||||
public PatientDto Patients { get; set; }
|
||||
|
||||
public DateTime DateOfAdmission { get; set; }
|
||||
|
||||
public string Diagnosis { get; set; }
|
||||
|
||||
public string TreatmentPlan { get; set; }
|
||||
|
||||
public string DoctorNotes { get; set; }
|
||||
|
||||
public string LabReportUrl { get; set; }
|
||||
|
||||
public string MedicationUrl { get; set; }
|
||||
|
||||
public string MedicationHistoryUrl { get; set; }
|
||||
|
||||
public DateTime? NextFollowUp { get; set; }
|
||||
|
||||
public string InsuranceProvider { get; set; }
|
||||
|
||||
public Status Status { get; set; }
|
||||
}
|
||||
|
||||
}
|
@ -8,7 +8,12 @@ public class HospitalManagementSystemPermissionDefinitionProvider : PermissionDe
|
||||
{
|
||||
public override void Define(IPermissionDefinitionContext context)
|
||||
{
|
||||
var myGroup = context.AddGroup(HospitalManagementSystemPermissions.GroupName);
|
||||
var HostipalManagementGroup = context.AddGroup(HospitalManagementSystemPermissions.GroupName);
|
||||
|
||||
var PatientPermission = HostipalManagementGroup.AddPermission(HospitalManagementSystemPermissions.Patient.Default);
|
||||
PatientPermission.AddChild(HospitalManagementSystemPermissions.Patient.Create);
|
||||
PatientPermission.AddChild(HospitalManagementSystemPermissions.Patient.Edit);
|
||||
PatientPermission.AddChild(HospitalManagementSystemPermissions.Patient.Delete);
|
||||
//Define your own permissions here. Example:
|
||||
//myGroup.AddPermission(HospitalManagementSystemPermissions.MyPermission1, L("Permission:MyPermission1"));
|
||||
}
|
||||
|
@ -6,4 +6,11 @@ public static class HospitalManagementSystemPermissions
|
||||
|
||||
//Add your own permission names. Example:
|
||||
//public const string MyPermission1 = GroupName + ".MyPermission1";
|
||||
public static class Patient
|
||||
{
|
||||
public const string Default = GroupName + ".Patient";
|
||||
public const string Create = Default + ".Create";
|
||||
public const string Edit = Default + ".Edit";
|
||||
public const string Delete = Default + ".Delete";
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<Import Project="..\..\common.props" />
|
||||
|
||||
@ -11,9 +11,13 @@
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\HospitalManagementSystem.Domain\HospitalManagementSystem.Domain.csproj" />
|
||||
<ProjectReference Include="..\HospitalManagementSystem.Application.Contracts\HospitalManagementSystem.Application.Contracts.csproj" />
|
||||
<ProjectReference Include="..\HospitalManagementSystem.HttpApi\HospitalManagementSystem.HttpApi.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Abp" Version="10.0.0" />
|
||||
<PackageReference Include="ClosedXML" Version="0.104.2" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.1" />
|
||||
<PackageReference Include="Volo.Abp.Account.Application" Version="9.0.2" />
|
||||
<PackageReference Include="Volo.Abp.Identity.Application" Version="9.0.2" />
|
||||
<PackageReference Include="Volo.Abp.PermissionManagement.Application" Version="9.0.2" />
|
||||
|
@ -0,0 +1,31 @@
|
||||
using AutoMapper;
|
||||
using HospitalManagementSystem.Patients;
|
||||
using HospitalManagementSystem.Patients.Dto;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace HospitalManagementSystem
|
||||
{
|
||||
public class PatientAutoMapperProfile : Profile
|
||||
{
|
||||
public PatientAutoMapperProfile()
|
||||
{
|
||||
// Entity to DTO mappings
|
||||
CreateMap<PatientRecord, PatientRecordDto>();
|
||||
CreateMap<PatientRecord, CreateUpdatePatientRecordDto>();
|
||||
|
||||
// DTO to Entity mappings
|
||||
CreateMap<CreateUpdatePatientRecordDto, PatientRecord>();
|
||||
|
||||
// Entity to DTO mappings
|
||||
CreateMap<Patient, PatientDto>();
|
||||
CreateMap<Patient, CreateUpdatePatientDto>();
|
||||
|
||||
// DTO to Entity mappings
|
||||
CreateMap<CreateUpdatePatientDto, Patient>();
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,663 @@
|
||||
using ClosedXML.Excel;
|
||||
using HospitalManagementSystem.Documents;
|
||||
using HospitalManagementSystem.Dto;
|
||||
using HospitalManagementSystem.GlobalEnum;
|
||||
using HospitalManagementSystem.Patients.Dto;
|
||||
using HospitalManagementSystem.Permissions;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Hosting;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Linq.Dynamic.Core;
|
||||
using System.Text.Json;
|
||||
using System.Threading.Tasks;
|
||||
using Volo.Abp.Application.Dtos;
|
||||
using Volo.Abp.Application.Services;
|
||||
using Volo.Abp.Content;
|
||||
using Volo.Abp.Domain.Repositories;
|
||||
using static HospitalManagementSystem.Permissions.HospitalManagementSystemPermissions;
|
||||
|
||||
|
||||
namespace HospitalManagementSystem.Patients
|
||||
{
|
||||
public class PatientAppService : ApplicationService
|
||||
{
|
||||
private IRepository<PatientRecord, Guid> _patientrecordRepository;
|
||||
private IRepository<Patient, Guid> _patientRepository;
|
||||
private IRepository<EntityDocument, Guid> _entityDocumentRepository;
|
||||
private IRepository<PatientDocument, Guid> _patientDocumentRepository;
|
||||
private readonly IWebHostEnvironment _env;
|
||||
List<Guid> uniqueid = new List<Guid>();
|
||||
|
||||
public PatientAppService(IRepository<PatientRecord, Guid> patientrecordRepository, IRepository<Patient, Guid> patientRepository, IWebHostEnvironment env, IRepository<EntityDocument, Guid> entityDocumentRepository, IRepository<PatientDocument, Guid> patientDocumentRepository)
|
||||
{
|
||||
_patientrecordRepository = patientrecordRepository;
|
||||
_patientRepository = patientRepository;
|
||||
_env = env;
|
||||
_entityDocumentRepository = entityDocumentRepository;
|
||||
_patientDocumentRepository = patientDocumentRepository;
|
||||
}
|
||||
|
||||
#region PatientRecord
|
||||
|
||||
#region Get Patient List with Paging and Searching
|
||||
[Authorize(HospitalManagementSystemPermissions.Patient.Default)]
|
||||
public async Task<PagedResultDto<PatientRecordDto>> GetPatientRecordListAsync(PagingSortPatientResultDto input, Guid Id)
|
||||
{
|
||||
var queryable = await _patientrecordRepository.GetQueryableAsync();
|
||||
|
||||
var filteredQuery = queryable
|
||||
.Include(x => x.Patients)
|
||||
.Include(x => x.LabReportUrl)
|
||||
.Include(x => x.MedicationUrl)
|
||||
.Include(x => x.MedicationHistoryUrl)
|
||||
.WhereIf(!string.IsNullOrEmpty(input.Search), x => x.Patients.Name.ToLower().Contains(input.Search.ToLower()))
|
||||
.Where(x => x.Patients.Id == Id);
|
||||
|
||||
var totalCount = await filteredQuery.CountAsync();
|
||||
|
||||
filteredQuery = !string.IsNullOrEmpty(input.Sorting)
|
||||
? filteredQuery.OrderBy(input.Sorting)
|
||||
: filteredQuery.OrderBy(x => x.Id);
|
||||
|
||||
var pagedQuery = await filteredQuery
|
||||
.Skip(input.SkipCount)
|
||||
.Take(input.MaxResultCount)
|
||||
.ToListAsync();
|
||||
var patientrecorddto = ObjectMapper.Map<List<PatientRecord>, List<PatientRecordDto>>(pagedQuery);
|
||||
foreach (var pr in patientrecorddto)
|
||||
{
|
||||
pr.LabReportUrl = filteredQuery.Where(x => x.Id == pr.Id).Select(x => x.LabReportUrl.FilePath).FirstOrDefault();
|
||||
pr.MedicationUrl = filteredQuery.Where(x => x.Id == pr.Id).Select(x => x.MedicationUrl.FilePath).FirstOrDefault();
|
||||
pr.MedicationHistoryUrl = filteredQuery.Where(x => x.Id == pr.Id).Select(x => x.MedicationHistoryUrl.FilePath).FirstOrDefault();
|
||||
}
|
||||
return new PagedResultDto<PatientRecordDto>(
|
||||
totalCount,
|
||||
patientrecorddto
|
||||
);
|
||||
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Get Single Patient by Id
|
||||
[Authorize(HospitalManagementSystemPermissions.Patient.Default)]
|
||||
public async Task<PatientRecordDto> GetPatientRecordByIdAsync(Guid id)
|
||||
{
|
||||
var patient = await _patientrecordRepository.GetQueryableAsync().Result
|
||||
.Include(x => x.LabReportUrl)
|
||||
.Include(x => x.MedicationUrl)
|
||||
.Include(x => x.MedicationHistoryUrl)
|
||||
.Where(x => x.Id == id).FirstOrDefaultAsync();
|
||||
var patientdto = ObjectMapper.Map<PatientRecord, PatientRecordDto>(patient);
|
||||
|
||||
patientdto.LabReportUrl = patient.LabReportUrl != null ? patient.LabReportUrl.FilePath : null;
|
||||
patientdto.MedicationUrl = patient.MedicationUrl != null ? patient.MedicationUrl.FilePath : null;
|
||||
patientdto.MedicationHistoryUrl = patient.MedicationHistoryUrl != null ? patient.MedicationHistoryUrl.FilePath : null;
|
||||
return patientdto;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Export Patient Data to Excel
|
||||
public async Task<FileDownloadDto> GetExportPatientRecordAsync()
|
||||
{
|
||||
var patientrecord = await _patientrecordRepository.GetQueryableAsync().Result.Include(x => x.Patients).ToListAsync();
|
||||
|
||||
var folderPath = Path.Combine(_env.WebRootPath, "temp");
|
||||
if (!Directory.Exists(folderPath))
|
||||
{
|
||||
Directory.CreateDirectory(folderPath); // Ensure the folder exists
|
||||
}
|
||||
|
||||
var filename = "Patients_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".xlsx";
|
||||
var filePath = Path.Combine(folderPath, filename);
|
||||
|
||||
// Create a workbook and worksheet
|
||||
using (var workbook = new XLWorkbook())
|
||||
{
|
||||
var worksheet = workbook.Worksheets.Add("Patients");
|
||||
|
||||
// Add headers
|
||||
worksheet.Cell(1, 1).Value = "Full Name";
|
||||
worksheet.Cell(1, 2).Value = "Gender";
|
||||
worksheet.Cell(1, 3).Value = "Date of Admission";
|
||||
worksheet.Cell(1, 4).Value = "Diagnosis";
|
||||
worksheet.Cell(1, 5).Value = "Next Follow-Up";
|
||||
worksheet.Cell(1, 6).Value = "InsuranceProvider";
|
||||
worksheet.Cell(1, 7).Value = "InsuranceProvider";
|
||||
worksheet.Cell(1, 8).Value = "InsuranceProvider";
|
||||
worksheet.Cell(1, 9).Value = "Status";
|
||||
|
||||
for (int i = 0; i < patientrecord.Count; i++)
|
||||
{
|
||||
worksheet.Cell(i + 2, 1).Value = patientrecord[i].Patients.Name;
|
||||
worksheet.Cell(i + 2, 2).Value = patientrecord[i].Patients.Gender.ToString();
|
||||
worksheet.Cell(i + 2, 3).Value = patientrecord[i].DateOfAdmission.ToShortDateString();
|
||||
worksheet.Cell(i + 2, 4).Value = patientrecord[i].Diagnosis;
|
||||
worksheet.Cell(i + 2, 5).Value = patientrecord[i].NextFollowUp?.ToShortDateString();
|
||||
worksheet.Cell(i + 2, 6).Value = patientrecord[i].InsuranceProvider;
|
||||
worksheet.Cell(i + 2, 7).Value = patientrecord[i].InsuranceProvider;
|
||||
worksheet.Cell(i + 2, 8).Value = patientrecord[i].InsuranceProvider;
|
||||
worksheet.Cell(i + 2, 9).Value = patientrecord[i].Status.ToString();
|
||||
}
|
||||
|
||||
worksheet.Columns().AdjustToContents();
|
||||
workbook.SaveAs(filePath);
|
||||
}
|
||||
|
||||
byte[] fileBytes = await File.ReadAllBytesAsync(filePath);
|
||||
File.Delete(filePath);
|
||||
|
||||
return new FileDownloadDto
|
||||
{
|
||||
FileName = filename,
|
||||
FileContent = Convert.ToBase64String(fileBytes) // Use Base64 encoding for file content
|
||||
};
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Create Patient
|
||||
[Authorize(HospitalManagementSystemPermissions.Patient.Create)]
|
||||
public async Task<PatientRecordDto> CreatePatientRecordAsync(CreateUpdatePatientRecordDto input)
|
||||
{
|
||||
var patientEntity = await _patientRepository.GetAsync(input.PatientId); // Get Patient from DB
|
||||
var patientRecord = ObjectMapper.Map<CreateUpdatePatientRecordDto, PatientRecord>(input);
|
||||
patientRecord.Patients = patientEntity;
|
||||
List<EntityDocument> entitydocument = new List<EntityDocument>();
|
||||
|
||||
if (input.LabReportUrlID != Guid.Empty)
|
||||
uniqueid.Add(input.LabReportUrlID.Value);
|
||||
if (input.MedicationUrlID != Guid.Empty)
|
||||
uniqueid.Add(input.MedicationUrlID.Value);
|
||||
if (input.MedicationHistoryUrlID != Guid.Empty)
|
||||
uniqueid.Add(input.MedicationHistoryUrlID.Value);
|
||||
if (uniqueid.Count > 0)
|
||||
{
|
||||
entitydocument = await SaveFileToDocument(patientEntity, uniqueid);
|
||||
foreach (var entity in entitydocument)
|
||||
{
|
||||
switch (entity.TagName)
|
||||
{
|
||||
case "Lab-Report":
|
||||
patientRecord.LabReportUrl = entity;
|
||||
break;
|
||||
case "Medication":
|
||||
patientRecord.MedicationUrl = entity;
|
||||
break;
|
||||
case "Medication-History":
|
||||
patientRecord.MedicationHistoryUrl = entity;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
patientRecord = await _patientrecordRepository.InsertAsync(patientRecord);
|
||||
|
||||
return ObjectMapper.Map<PatientRecord, PatientRecordDto>(patientRecord);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Update Patient
|
||||
[Authorize(HospitalManagementSystemPermissions.Patient.Edit)]
|
||||
public async Task<PatientRecordDto> UpdatePatientRecordAsync(Guid id, CreateUpdatePatientRecordDto input)
|
||||
{
|
||||
try
|
||||
{
|
||||
var patientRecord = await _patientrecordRepository.GetQueryableAsync().Result.Include(x => x.Patients).Where(x => x.Id == id).FirstOrDefaultAsync();
|
||||
List<EntityDocument> entitydocument = new List<EntityDocument>();
|
||||
if (patientRecord.Patients.Id != input.PatientId) // If PatientId is updated, fetch new Patient
|
||||
{
|
||||
var newPatient = await _patientRepository.GetAsync(input.PatientId);
|
||||
patientRecord.Patients = newPatient;
|
||||
}
|
||||
ObjectMapper.Map(input, patientRecord);
|
||||
if (input.LabReportUrlID != Guid.Empty)
|
||||
uniqueid.Add(input.LabReportUrlID.Value);
|
||||
if (input.MedicationUrlID != Guid.Empty)
|
||||
uniqueid.Add(input.MedicationUrlID.Value);
|
||||
if (input.MedicationHistoryUrlID != Guid.Empty)
|
||||
uniqueid.Add(input.MedicationHistoryUrlID.Value);
|
||||
if (uniqueid.Count > 0)
|
||||
{
|
||||
entitydocument = await SaveFileToDocument(patientRecord.Patients, uniqueid);
|
||||
foreach (var entity in entitydocument)
|
||||
{
|
||||
switch (entity.TagName)
|
||||
{
|
||||
case "Lab-Report":
|
||||
patientRecord.LabReportUrl = entity;
|
||||
break;
|
||||
case "Medication":
|
||||
patientRecord.MedicationUrl = entity;
|
||||
break;
|
||||
case "Medication-History":
|
||||
patientRecord.MedicationHistoryUrl = entity;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
patientRecord = await _patientrecordRepository.UpdateAsync(patientRecord);
|
||||
|
||||
return ObjectMapper.Map<PatientRecord, PatientRecordDto>(patientRecord);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception(ex.Message);
|
||||
}
|
||||
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Delete Patient
|
||||
[Authorize(HospitalManagementSystemPermissions.Patient.Delete)]
|
||||
public async Task DeletePatientRecordAsync(Guid id)
|
||||
{
|
||||
await _patientrecordRepository.DeleteAsync(id);
|
||||
}
|
||||
#endregion
|
||||
#endregion
|
||||
|
||||
#region Patient
|
||||
|
||||
#region Get Patient List with Paging and Searching
|
||||
[Authorize(HospitalManagementSystemPermissions.Patient.Default)]
|
||||
public async Task<PagedResultDto<PatientDto>> GetPatientListAsync(PagingSortPatientResultDto input)
|
||||
{
|
||||
List<Patient> query;
|
||||
|
||||
if (!string.IsNullOrEmpty(input.Search))
|
||||
{
|
||||
query = _patientRepository.GetQueryableAsync().Result
|
||||
.Where(x => x.Name.ToLower().Contains(input.Search.ToLower()))
|
||||
.OrderBy(input.Sorting ?? (nameof(Patient.Id) + " asc"))
|
||||
.Skip(input.SkipCount)
|
||||
.Take(input.MaxResultCount)
|
||||
.ToList();
|
||||
}
|
||||
else
|
||||
{
|
||||
query = await _patientRepository.GetPagedListAsync(
|
||||
input.SkipCount,
|
||||
input.MaxResultCount,
|
||||
input.Sorting ?? nameof(Patient.Name)
|
||||
);
|
||||
}
|
||||
|
||||
var totalCount = await _patientRepository.CountAsync();
|
||||
return new PagedResultDto<PatientDto>(
|
||||
totalCount,
|
||||
ObjectMapper.Map<List<Patient>, List<PatientDto>>(query)
|
||||
);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Get Single Patient by Id
|
||||
[Authorize(HospitalManagementSystemPermissions.Patient.Default)]
|
||||
public async Task<PatientDto> GetPatientByIdAsync(Guid id)
|
||||
{
|
||||
var patient = await _patientRepository.GetQueryableAsync().Result.Include(x => x.Images).Where(x => x.Id == id).FirstOrDefaultAsync();
|
||||
var patientdto = ObjectMapper.Map<Patient, PatientDto>(patient);
|
||||
patientdto.Imagepath = patient.Images != null ? patient.Images.FilePath : null;
|
||||
return patientdto;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Export Patient Data to Excel
|
||||
public async Task<FileDownloadDto> GetExportPatientDataAsync()
|
||||
{
|
||||
var patients = await _patientRepository.GetListAsync();
|
||||
|
||||
var folderPath = Path.Combine(_env.WebRootPath, "temp");
|
||||
if (!Directory.Exists(folderPath))
|
||||
{
|
||||
Directory.CreateDirectory(folderPath);
|
||||
}
|
||||
|
||||
var filename = "Patients_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".xlsx";
|
||||
var filePath = Path.Combine(folderPath, filename);
|
||||
|
||||
using (var workbook = new XLWorkbook())
|
||||
{
|
||||
var worksheet = workbook.Worksheets.Add("Patients");
|
||||
|
||||
// Add headers
|
||||
worksheet.Cell(1, 1).Value = "Name";
|
||||
worksheet.Cell(1, 2).Value = "Gender";
|
||||
worksheet.Cell(1, 3).Value = "Age";
|
||||
worksheet.Cell(1, 4).Value = "BloodGroup";
|
||||
worksheet.Cell(1, 5).Value = "Treatment";
|
||||
worksheet.Cell(1, 6).Value = "Doctor Assigned";
|
||||
worksheet.Cell(1, 7).Value = "Admission Date";
|
||||
worksheet.Cell(1, 8).Value = "Discharge Date";
|
||||
worksheet.Cell(1, 9).Value = "Status";
|
||||
|
||||
// Add data rows
|
||||
for (int i = 0; i < patients.Count; i++)
|
||||
{
|
||||
worksheet.Cell(i + 2, 1).Value = patients[i].Name;
|
||||
worksheet.Cell(i + 2, 2).Value = patients[i].Gender.ToString();
|
||||
worksheet.Cell(i + 2, 3).Value = patients[i].Age;
|
||||
worksheet.Cell(i + 2, 4).Value = patients[i].BloodGroup;
|
||||
worksheet.Cell(i + 2, 5).Value = patients[i].Treatment;
|
||||
worksheet.Cell(i + 2, 6).Value = patients[i].DoctorAssigned;
|
||||
worksheet.Cell(i + 2, 7).Value = patients[i].AdmissionDate.ToShortDateString();
|
||||
worksheet.Cell(i + 2, 8).Value = patients[i].DischargeDate?.ToShortDateString();
|
||||
worksheet.Cell(i + 2, 9).Value = patients[i].Status.ToString();
|
||||
}
|
||||
|
||||
worksheet.Columns().AdjustToContents();
|
||||
workbook.SaveAs(filePath);
|
||||
}
|
||||
|
||||
byte[] fileBytes = await File.ReadAllBytesAsync(filePath);
|
||||
File.Delete(filePath);
|
||||
|
||||
return new FileDownloadDto
|
||||
{
|
||||
FileName = filename,
|
||||
FileContent = Convert.ToBase64String(fileBytes)
|
||||
};
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Create Patient
|
||||
[Authorize(HospitalManagementSystemPermissions.Patient.Create)]
|
||||
public async Task<PatientDto> CreatePatientAsync(CreateUpdatePatientDto input)
|
||||
{
|
||||
var patient = ObjectMapper.Map<CreateUpdatePatientDto, Patient>(input);
|
||||
|
||||
patient = await _patientRepository.InsertAsync(patient);
|
||||
if (input.ImageID != Guid.Empty)
|
||||
{
|
||||
uniqueid.Add(input.ImageID);
|
||||
var entitydocument = await SaveFileToDocument(patient, uniqueid, true);
|
||||
foreach (var entity in entitydocument)
|
||||
{
|
||||
if (entity.TagName == "Image")
|
||||
{
|
||||
patient.Images = entity;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ObjectMapper.Map<Patient, PatientDto>(patient);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Update Patient
|
||||
[Authorize(HospitalManagementSystemPermissions.Patient.Edit)]
|
||||
public async Task<PatientDto> UpdatePatientAsync(Guid id, CreateUpdatePatientDto input)
|
||||
{
|
||||
var patient = await _patientRepository.GetQueryableAsync().Result.Include(x => x.Images).Where(x => x.Id == id).FirstOrDefaultAsync();
|
||||
List<EntityDocument> entitydocument = new List<EntityDocument>();
|
||||
ObjectMapper.Map(input, patient);
|
||||
if (input.ImageID != Guid.Empty)
|
||||
{
|
||||
uniqueid.Add(input.ImageID);
|
||||
entitydocument = await SaveFileToDocument(patient, uniqueid);
|
||||
foreach (var entity in entitydocument)
|
||||
{
|
||||
if (entity.TagName == "Image")
|
||||
{
|
||||
patient.Images = entity;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
patient = await _patientRepository.UpdateAsync(patient);
|
||||
return ObjectMapper.Map<Patient, PatientDto>(patient);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Delete Patient
|
||||
[Authorize(HospitalManagementSystemPermissions.Patient.Delete)]
|
||||
public async Task DeletePatientAsync(Guid id)
|
||||
{
|
||||
await _patientRepository.DeleteAsync(id);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
|
||||
#region Get Status Dropdown
|
||||
public async Task<List<DropDownItems>> GetStatusDropdownAsync()
|
||||
{
|
||||
List<DropDownItems> statuslist = new List<DropDownItems>();
|
||||
|
||||
statuslist = Enum.GetValues(typeof(Status))
|
||||
.Cast<Status>()
|
||||
.Select(e => new DropDownItems
|
||||
{
|
||||
Label = e.ToString(),
|
||||
Value = (int)e
|
||||
})
|
||||
.ToList();
|
||||
statuslist.Add(new DropDownItems
|
||||
{
|
||||
Label = "Select a Status",
|
||||
Value = 0
|
||||
});
|
||||
statuslist = statuslist.OrderBy(x => x.Value).ToList();
|
||||
|
||||
return await Task.FromResult(statuslist);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region UploadFile
|
||||
public async Task<Guid> UploadFileAsync(string TagName, IRemoteStreamContent file)
|
||||
{
|
||||
if (file == null)
|
||||
{
|
||||
throw new Exception("File cannot be null");
|
||||
}
|
||||
string patientFolder = Path.Combine(_env.WebRootPath, "temp");
|
||||
Guid uniqueId = Guid.NewGuid();
|
||||
if (!Directory.Exists(patientFolder))
|
||||
{
|
||||
Directory.CreateDirectory(patientFolder);
|
||||
}
|
||||
|
||||
string fileExtension = Path.GetExtension(file.FileName);
|
||||
string fileName = $"{uniqueId}({TagName}){fileExtension}";
|
||||
string filePath = Path.Combine(patientFolder, fileName);
|
||||
|
||||
using (var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write))
|
||||
{
|
||||
await file.GetStream().CopyToAsync(fileStream);
|
||||
}
|
||||
|
||||
var metadata = new
|
||||
{
|
||||
OriginalFileName = file.FileName,
|
||||
FileName = fileName,
|
||||
FileSize = new FileInfo(filePath).Length.ToString(),
|
||||
FilePath = filePath,
|
||||
UploadDate = DateTime.UtcNow,
|
||||
FileType = fileExtension,
|
||||
TagName = TagName,
|
||||
};
|
||||
|
||||
string jsonFileName = $"{uniqueId}({TagName}).json";
|
||||
string jsonFilePath = Path.Combine(patientFolder, jsonFileName);
|
||||
await File.WriteAllTextAsync(jsonFilePath, JsonSerializer.Serialize(metadata, new JsonSerializerOptions { WriteIndented = true }));
|
||||
|
||||
return uniqueId;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region SaveFileToDocument
|
||||
//public async Task<List<EntityDocument>> SaveFileToDocument(Patient Patients, Guid ImageId, bool IsNew = false)
|
||||
//{
|
||||
// try
|
||||
// {
|
||||
// //string patientFolder = Path.Combine(_env.WebRootPath, "uploads", PatientId.ToString());
|
||||
// string patientFolder = Path.Combine(_env.WebRootPath, "uploads", $"{Patients.Id}({Patients.Name})");
|
||||
// string ImageFolder = Path.Combine(_env.WebRootPath, "uploads", $"{ImageId}({Patients.Name})");
|
||||
// List<string>? jsonFiles;
|
||||
|
||||
// if (IsNew)
|
||||
// {
|
||||
// jsonFiles = Directory.EnumerateFiles(ImageFolder, "*.json").Where(x => Path.GetFileName(x).StartsWith(ImageId.ToString())).ToList();
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// jsonFiles = Directory.EnumerateFiles(patientFolder, "*.json").Where(x => Path.GetFileName(x).StartsWith(Patients.Id.ToString())).ToList();
|
||||
// }
|
||||
|
||||
// List<EntityDocument> savedDocuments = new List<EntityDocument>();
|
||||
|
||||
// // Iterate over all matching JSON files and save data to the database
|
||||
// foreach (var jsonFilePath in jsonFiles)
|
||||
// {
|
||||
// string jsonContent = await File.ReadAllTextAsync(jsonFilePath);
|
||||
// var metadata = JsonSerializer.Deserialize<dynamic>(jsonContent);
|
||||
|
||||
// var document = new EntityDocument
|
||||
// {
|
||||
// OriginalFileName = metadata.GetProperty("OriginalFileName").GetString(),
|
||||
// GeneratedFileName = metadata.GetProperty("FileName").GetString(),
|
||||
// FileSize = metadata.GetProperty("FileSize").GetString(),
|
||||
// FilePath = metadata.GetProperty("FilePath").GetString(),
|
||||
// FileType = metadata.GetProperty("FileType").GetString(),
|
||||
// TagName = metadata.GetProperty("TagName").GetString(),
|
||||
// UploadDate = metadata.GetProperty("UploadDate").GetDateTime() // Use GetDateTime()
|
||||
// };
|
||||
|
||||
// // Save document record to the database
|
||||
// await _entityDocumentRepository.InsertAsync(document);
|
||||
// savedDocuments.Add(document);
|
||||
// var patientidexist = await _patientDocumentRepository.GetQueryableAsync().Result.Include(x => x.Patients).Include(x => x.EntityDocuments)
|
||||
// .Where(x => x.Patients.Id == Patients.Id && x.TagName == document.TagName).FirstOrDefaultAsync();
|
||||
// var patientDocument = new PatientDocument
|
||||
// {
|
||||
// Patients = Patients,
|
||||
// EntityDocuments = document,
|
||||
// TagName = metadata.GetProperty("TagName").GetString()
|
||||
// };
|
||||
// if (patientidexist != null)
|
||||
// {
|
||||
// await _patientDocumentRepository.UpdateAsync(patientDocument);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// await _patientDocumentRepository.InsertAsync(patientDocument);
|
||||
// }
|
||||
// File.Delete(jsonFilePath);
|
||||
// }
|
||||
// return savedDocuments;
|
||||
// }
|
||||
// catch (Exception ex)
|
||||
// {
|
||||
// throw new Exception(ex.Message);
|
||||
// }
|
||||
//}
|
||||
public async Task<List<EntityDocument>> SaveFileToDocument(Patient patient, List<Guid> uniqueIds, bool isNew = false)
|
||||
{
|
||||
try
|
||||
{
|
||||
string tempFolder = Path.Combine(_env.WebRootPath, "temp");
|
||||
string patientFolder = Path.Combine(_env.WebRootPath, "uploads", $"{patient.Id}({patient.Name})");
|
||||
|
||||
if (!Directory.Exists(patientFolder))
|
||||
{
|
||||
Directory.CreateDirectory(patientFolder);
|
||||
}
|
||||
|
||||
List<EntityDocument> savedDocuments = new List<EntityDocument>();
|
||||
|
||||
foreach (var uniqueId in uniqueIds)
|
||||
{
|
||||
// Fetch all matching JSON metadata files for the current uniqueId
|
||||
foreach (var jsonFilePath in Directory.EnumerateFiles(tempFolder, $"{uniqueId}(*).json"))
|
||||
{
|
||||
string jsonContent = await File.ReadAllTextAsync(jsonFilePath);
|
||||
var metadata = JsonSerializer.Deserialize<JsonElement>(jsonContent);
|
||||
|
||||
string originalFileName = metadata.GetProperty("OriginalFileName").GetString();
|
||||
string generatedFileName = metadata.GetProperty("FileName").GetString();
|
||||
string fileSize = metadata.GetProperty("FileSize").GetString();
|
||||
string filePath = metadata.GetProperty("FilePath").GetString();
|
||||
string fileType = metadata.GetProperty("FileType").GetString();
|
||||
string tagName = metadata.GetProperty("TagName").GetString();
|
||||
DateTime uploadDate = metadata.GetProperty("UploadDate").GetDateTime();
|
||||
|
||||
// Move the file from temp folder to patient folder
|
||||
string newFilePath = Path.Combine(patientFolder, generatedFileName);
|
||||
if (File.Exists(filePath))
|
||||
{
|
||||
File.Move(filePath, newFilePath, true);
|
||||
}
|
||||
newFilePath = newFilePath.Split("wwwroot")[1];
|
||||
var document = new EntityDocument
|
||||
{
|
||||
OriginalFileName = originalFileName,
|
||||
GeneratedFileName = generatedFileName,
|
||||
FileSize = fileSize,
|
||||
FilePath = newFilePath,
|
||||
FileType = fileType,
|
||||
TagName = tagName,
|
||||
UploadDate = uploadDate
|
||||
};
|
||||
savedDocuments.Add(document);
|
||||
|
||||
// Delete JSON file after processing
|
||||
File.Delete(jsonFilePath);
|
||||
}
|
||||
}
|
||||
|
||||
// Batch insert entity documents
|
||||
if (savedDocuments.Any())
|
||||
{
|
||||
await _entityDocumentRepository.InsertManyAsync(savedDocuments);
|
||||
}
|
||||
|
||||
// Fetch existing patient documents in one query
|
||||
var existingPatientDocs = await _patientDocumentRepository.GetQueryableAsync()
|
||||
.Result.Where(x => x.Patients.Id == patient.Id)
|
||||
.ToListAsync();
|
||||
|
||||
List<PatientDocument> patientDocuments = new List<PatientDocument>();
|
||||
|
||||
foreach (var document in savedDocuments)
|
||||
{
|
||||
var existingDoc = existingPatientDocs.FirstOrDefault(x => x.TagName == document.TagName);
|
||||
|
||||
var patientDocument = new PatientDocument
|
||||
{
|
||||
Patients = patient,
|
||||
EntityDocuments = document,
|
||||
TagName = document.TagName
|
||||
};
|
||||
|
||||
if (existingDoc != null)
|
||||
{
|
||||
existingDoc.EntityDocuments = document; // Update reference
|
||||
await _patientDocumentRepository.UpdateAsync(existingDoc);
|
||||
}
|
||||
else
|
||||
{
|
||||
patientDocuments.Add(patientDocument);
|
||||
}
|
||||
}
|
||||
|
||||
// Batch insert new patient documents
|
||||
if (patientDocuments.Any())
|
||||
{
|
||||
await _patientDocumentRepository.InsertManyAsync(patientDocuments);
|
||||
}
|
||||
uniqueid.Clear();
|
||||
return savedDocuments;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
uniqueid.Clear();
|
||||
throw new Exception($"Error saving files for patient {patient.Id}: {ex.Message}", ex);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace HospitalManagementSystem.Dto
|
||||
{
|
||||
public class DropDownItems
|
||||
{
|
||||
public string Label { get; set; }
|
||||
public int Value { get; set; }
|
||||
}
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace HospitalManagementSystem.Dto
|
||||
{
|
||||
public class FileDownloadDto
|
||||
{
|
||||
public string FileName { get; set; }
|
||||
|
||||
public string FileContent { get; set; }
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Volo.Abp.Application.Dtos;
|
||||
|
||||
namespace HospitalManagementSystem.Dto
|
||||
{
|
||||
public class PagingSortPatientResultDto : PagedAndSortedResultRequestDto
|
||||
{
|
||||
public string? Search { get; set; }
|
||||
}
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace HospitalManagementSystem.Dto
|
||||
{
|
||||
using System.Linq.Dynamic.Core;
|
||||
|
||||
public static class QueryableExtensions
|
||||
{
|
||||
public static IEnumerable<T> OrderByDynamic<T>(this IEnumerable<T> source, string orderBy)
|
||||
{
|
||||
return source.AsQueryable().OrderBy(orderBy);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Volo.Abp.Content;
|
||||
|
||||
namespace HospitalManagementSystem.Dto
|
||||
{
|
||||
public class UploadFileDto
|
||||
{
|
||||
public Guid PatientId { get; set; } // Patient GUID ID
|
||||
public string PatientName { get; set; } // Patient Name
|
||||
public string TagName { get; set; } // Tag name for the file
|
||||
public IRemoteStreamContent File { get; set; } // File content
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,39 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace HospitalManagementSystem.GlobalEnum
|
||||
{
|
||||
public enum Gender
|
||||
{
|
||||
Male = 1,
|
||||
Female = 2
|
||||
}
|
||||
|
||||
public enum Status
|
||||
{
|
||||
Recovered = 1,
|
||||
Observation = 2,
|
||||
InTreatment = 3
|
||||
}
|
||||
public enum appointmentStatus
|
||||
{
|
||||
Scheduled = 1,
|
||||
Completed = 2,
|
||||
Canceled = 3
|
||||
}
|
||||
public enum visitType
|
||||
{
|
||||
NewPatient = 1,
|
||||
Followup = 2,
|
||||
}
|
||||
public enum paymentStatus
|
||||
{
|
||||
Paid = 1,
|
||||
Pending = 2,
|
||||
Unpaid = 3,
|
||||
}
|
||||
|
||||
}
|
@ -10,6 +10,7 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Volo.Abp.Ddd.Application.Contracts" Version="9.0.2" />
|
||||
<PackageReference Include="Volo.Abp.Identity.Domain.Shared" Version="9.0.2" />
|
||||
<PackageReference Include="Volo.Abp.BackgroundJobs.Domain.Shared" Version="9.0.2" />
|
||||
<PackageReference Include="Volo.Abp.AuditLogging.Domain.Shared" Version="9.0.2" />
|
||||
|
@ -4,6 +4,7 @@
|
||||
"AppName": "HospitalManagementSystem",
|
||||
"Menu:Home": "Home",
|
||||
"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"
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,21 @@
|
||||
using HospitalManagementSystem.Patients;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Volo.Abp.Domain.Entities.Auditing;
|
||||
|
||||
namespace HospitalManagementSystem.Documents
|
||||
{
|
||||
public class EntityDocument : AuditedAggregateRoot<Guid>
|
||||
{
|
||||
public string OriginalFileName { get; set; }
|
||||
public string GeneratedFileName { get; set; }
|
||||
public string FileSize { get; set; }
|
||||
public string FilePath { get; set; }
|
||||
public string FileType { get; set; }
|
||||
public string TagName { get; set; }
|
||||
public DateTime UploadDate { get; set; }
|
||||
}
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
using HospitalManagementSystem.Patients;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Volo.Abp.Domain.Entities.Auditing;
|
||||
|
||||
namespace HospitalManagementSystem.Documents
|
||||
{
|
||||
public class PatientDocument : AuditedAggregateRoot<Guid>
|
||||
{
|
||||
[Required]
|
||||
public Patient Patients { get; set; }
|
||||
[Required]
|
||||
public EntityDocument EntityDocuments { get; set; }
|
||||
[Required]
|
||||
public string TagName { get; set; }
|
||||
}
|
||||
}
|
@ -13,6 +13,7 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.AspNetCore.Http.Features" Version="5.0.17" />
|
||||
<PackageReference Include="Volo.Abp.Emailing" Version="9.0.2" />
|
||||
<PackageReference Include="Volo.Abp.Identity.Domain" Version="9.0.2" />
|
||||
<PackageReference Include="Volo.Abp.PermissionManagement.Domain.Identity" Version="9.0.2" />
|
||||
|
@ -0,0 +1,38 @@
|
||||
using HospitalManagementSystem.Documents;
|
||||
using HospitalManagementSystem.GlobalEnum;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Volo.Abp.Domain.Entities.Auditing;
|
||||
|
||||
namespace HospitalManagementSystem.Patients
|
||||
{
|
||||
public class Patient : AuditedAggregateRoot<Guid>
|
||||
{
|
||||
[Required]
|
||||
public string Name { get; set; }
|
||||
[Required]
|
||||
public Gender Gender { get; set; }
|
||||
[Required]
|
||||
public string Mobile { get; set; }
|
||||
[Required]
|
||||
public string Email { get; set; }
|
||||
[Required]
|
||||
public int Age { get; set; }
|
||||
public string Treatment { get; set; }
|
||||
public string DoctorAssigned { get; set; }
|
||||
[Required]
|
||||
public string Address { get; set; }
|
||||
[Required]
|
||||
public string BloodGroup { get; set; }
|
||||
public DateTime AdmissionDate { get; set; }
|
||||
public DateTime? DischargeDate { get; set; }
|
||||
[Required]
|
||||
public Status Status { get; set; }
|
||||
public EntityDocument? Images { get; set; }
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,49 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Volo.Abp.Domain.Entities.Auditing;
|
||||
using System.Threading.Tasks;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using HospitalManagementSystem.GlobalEnum;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using HospitalManagementSystem.Documents;
|
||||
|
||||
namespace HospitalManagementSystem.Patients
|
||||
{
|
||||
public class PatientRecord : AuditedAggregateRoot<Guid>
|
||||
{
|
||||
//[Required]
|
||||
//public string FullName { get; set; }
|
||||
|
||||
//[Required]
|
||||
//public string Mobile { get; set; }
|
||||
|
||||
//[Required]
|
||||
//public Gender Gender { get; set; }
|
||||
public virtual Patient Patients { get; set; }
|
||||
|
||||
[Required]
|
||||
public DateTime DateOfAdmission { get; set; }
|
||||
|
||||
public string Diagnosis { get; set; }
|
||||
|
||||
public string TreatmentPlan { get; set; }
|
||||
|
||||
public string DoctorNotes { get; set; }
|
||||
|
||||
public virtual EntityDocument? LabReportUrl { get; set; }
|
||||
|
||||
public virtual EntityDocument? MedicationUrl { get; set; }
|
||||
|
||||
public virtual EntityDocument? MedicationHistoryUrl { get; set; }
|
||||
|
||||
public DateTime? NextFollowUp { get; set; }
|
||||
|
||||
public string InsuranceProvider { get; set; }
|
||||
|
||||
[Required]
|
||||
public Status Status { get; set; }
|
||||
}
|
||||
|
||||
}
|
@ -1,12 +1,13 @@
|
||||
using HospitalManagementSystem.Appointments;
|
||||
using HospitalManagementSystem.Documents;
|
||||
using HospitalManagementSystem.Patients;using HospitalManagementSystem.Appointments;
|
||||
using HospitalManagementSystem.Departments;
|
||||
using HospitalManagementSystem.Doctors;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using HospitalManagementSystem.Doctors;using Microsoft.EntityFrameworkCore;
|
||||
using Volo.Abp.AuditLogging.EntityFrameworkCore;
|
||||
using Volo.Abp.BackgroundJobs.EntityFrameworkCore;
|
||||
using Volo.Abp.Data;
|
||||
using Volo.Abp.DependencyInjection;
|
||||
using Volo.Abp.EntityFrameworkCore;
|
||||
using Volo.Abp.EntityFrameworkCore.Modeling;
|
||||
using Volo.Abp.FeatureManagement.EntityFrameworkCore;
|
||||
using Volo.Abp.Identity;
|
||||
using Volo.Abp.Identity.EntityFrameworkCore;
|
||||
@ -27,6 +28,10 @@ public class HospitalManagementSystemDbContext :
|
||||
ITenantManagementDbContext
|
||||
{
|
||||
/* Add DbSet properties for your Aggregate Roots / Entities here. */
|
||||
public DbSet<PatientRecord> PatientRecords { get; set; }
|
||||
public DbSet<Patient> Patients { get; set; }
|
||||
public DbSet<EntityDocument> EntityDocuments { get; set; }
|
||||
public DbSet<PatientDocument> PatientDocuments { get; set; }
|
||||
|
||||
#region Entities from the modules
|
||||
|
||||
@ -82,6 +87,29 @@ public class HospitalManagementSystemDbContext :
|
||||
builder.ConfigureTenantManagement();
|
||||
|
||||
/* Configure your own tables/entities inside here */
|
||||
builder.Entity<PatientRecord>(b =>
|
||||
{
|
||||
b.ToTable("PatientRecords");
|
||||
b.ConfigureByConvention();//auto configure for the base class props
|
||||
});
|
||||
|
||||
builder.Entity<Patient>(b =>
|
||||
{
|
||||
b.ToTable("Patient");
|
||||
b.ConfigureByConvention(); //auto configure for the base class props
|
||||
});
|
||||
|
||||
builder.Entity<EntityDocument>(b =>
|
||||
{
|
||||
b.ToTable("EntityDocuments");
|
||||
b.ConfigureByConvention(); //auto configure for the base class props
|
||||
});
|
||||
|
||||
builder.Entity<PatientDocument>(b =>
|
||||
{
|
||||
b.ToTable("PatientDocuments");
|
||||
b.ConfigureByConvention(); //auto configure for the base class props
|
||||
});
|
||||
|
||||
//builder.Entity<YourEntity>(b =>
|
||||
//{
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,93 @@
|
||||
using System;
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace HospitalManagementSystem.Migrations
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class added_patientinpatientrecord : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.CreateTable(
|
||||
name: "Patient",
|
||||
columns: table => new
|
||||
{
|
||||
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
|
||||
Name = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
||||
Gender = table.Column<int>(type: "int", nullable: false),
|
||||
Mobile = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
||||
Email = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
||||
Age = table.Column<int>(type: "int", nullable: false),
|
||||
Treatment = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
||||
DoctorAssigned = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
||||
Address = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
||||
BloodGroup = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
||||
AdmissionDate = table.Column<DateTime>(type: "datetime2", nullable: false),
|
||||
DischargeDate = table.Column<DateTime>(type: "datetime2", nullable: true),
|
||||
Status = table.Column<int>(type: "int", nullable: false),
|
||||
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
||||
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: false),
|
||||
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
|
||||
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
|
||||
LastModificationTime = table.Column<DateTime>(type: "datetime2", nullable: true),
|
||||
LastModifierId = table.Column<Guid>(type: "uniqueidentifier", nullable: true)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_Patient", x => x.Id);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "PatientRecords",
|
||||
columns: table => new
|
||||
{
|
||||
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
|
||||
PatientsId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
|
||||
DateOfAdmission = table.Column<DateTime>(type: "datetime2", nullable: false),
|
||||
Diagnosis = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
||||
TreatmentPlan = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
||||
DoctorNotes = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
||||
LabReportUrl = table.Column<string>(type: "nvarchar(max)", nullable: true),
|
||||
MedicationUrl = table.Column<string>(type: "nvarchar(max)", nullable: true),
|
||||
MedicationHistoryUrl = table.Column<string>(type: "nvarchar(max)", nullable: true),
|
||||
NextFollowUp = table.Column<DateTime>(type: "datetime2", nullable: true),
|
||||
InsuranceProvider = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
||||
Status = table.Column<int>(type: "int", nullable: false),
|
||||
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
||||
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: false),
|
||||
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
|
||||
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
|
||||
LastModificationTime = table.Column<DateTime>(type: "datetime2", nullable: true),
|
||||
LastModifierId = table.Column<Guid>(type: "uniqueidentifier", nullable: true)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_PatientRecords", x => x.Id);
|
||||
table.ForeignKey(
|
||||
name: "FK_PatientRecords_Patient_PatientsId",
|
||||
column: x => x.PatientsId,
|
||||
principalTable: "Patient",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_PatientRecords_PatientsId",
|
||||
table: "PatientRecords",
|
||||
column: "PatientsId");
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropTable(
|
||||
name: "PatientRecords");
|
||||
|
||||
migrationBuilder.DropTable(
|
||||
name: "Patient");
|
||||
}
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,241 @@
|
||||
using System;
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace HospitalManagementSystem.Migrations
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class patientdocument_entitydocument : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropColumn(
|
||||
name: "LabReportUrl",
|
||||
table: "PatientRecords");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "MedicationHistoryUrl",
|
||||
table: "PatientRecords");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "MedicationUrl",
|
||||
table: "PatientRecords");
|
||||
|
||||
migrationBuilder.AddColumn<Guid>(
|
||||
name: "LabReportUrlId",
|
||||
table: "PatientRecords",
|
||||
type: "uniqueidentifier",
|
||||
nullable: true);
|
||||
|
||||
migrationBuilder.AddColumn<Guid>(
|
||||
name: "MedicationHistoryUrlId",
|
||||
table: "PatientRecords",
|
||||
type: "uniqueidentifier",
|
||||
nullable: true);
|
||||
|
||||
migrationBuilder.AddColumn<Guid>(
|
||||
name: "MedicationUrlId",
|
||||
table: "PatientRecords",
|
||||
type: "uniqueidentifier",
|
||||
nullable: true);
|
||||
|
||||
migrationBuilder.AddColumn<Guid>(
|
||||
name: "ImagesId",
|
||||
table: "Patient",
|
||||
type: "uniqueidentifier",
|
||||
nullable: true);
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "EntityDocuments",
|
||||
columns: table => new
|
||||
{
|
||||
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
|
||||
OriginalFileName = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
||||
GeneratedFileName = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
||||
FileSize = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
||||
FilePath = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
||||
FileType = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
||||
TagName = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
||||
UploadDate = table.Column<DateTime>(type: "datetime2", nullable: false),
|
||||
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
||||
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: false),
|
||||
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
|
||||
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
|
||||
LastModificationTime = table.Column<DateTime>(type: "datetime2", nullable: true),
|
||||
LastModifierId = table.Column<Guid>(type: "uniqueidentifier", nullable: true)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_EntityDocuments", x => x.Id);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "PatientDocuments",
|
||||
columns: table => new
|
||||
{
|
||||
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
|
||||
PatientsId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
|
||||
EntityDocumentsId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
|
||||
TagName = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
||||
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
||||
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: false),
|
||||
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
|
||||
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
|
||||
LastModificationTime = table.Column<DateTime>(type: "datetime2", nullable: true),
|
||||
LastModifierId = table.Column<Guid>(type: "uniqueidentifier", nullable: true)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_PatientDocuments", x => x.Id);
|
||||
table.ForeignKey(
|
||||
name: "FK_PatientDocuments_EntityDocuments_EntityDocumentsId",
|
||||
column: x => x.EntityDocumentsId,
|
||||
principalTable: "EntityDocuments",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
table.ForeignKey(
|
||||
name: "FK_PatientDocuments_Patient_PatientsId",
|
||||
column: x => x.PatientsId,
|
||||
principalTable: "Patient",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_PatientRecords_LabReportUrlId",
|
||||
table: "PatientRecords",
|
||||
column: "LabReportUrlId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_PatientRecords_MedicationHistoryUrlId",
|
||||
table: "PatientRecords",
|
||||
column: "MedicationHistoryUrlId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_PatientRecords_MedicationUrlId",
|
||||
table: "PatientRecords",
|
||||
column: "MedicationUrlId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_Patient_ImagesId",
|
||||
table: "Patient",
|
||||
column: "ImagesId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_PatientDocuments_EntityDocumentsId",
|
||||
table: "PatientDocuments",
|
||||
column: "EntityDocumentsId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_PatientDocuments_PatientsId",
|
||||
table: "PatientDocuments",
|
||||
column: "PatientsId");
|
||||
|
||||
migrationBuilder.AddForeignKey(
|
||||
name: "FK_Patient_EntityDocuments_ImagesId",
|
||||
table: "Patient",
|
||||
column: "ImagesId",
|
||||
principalTable: "EntityDocuments",
|
||||
principalColumn: "Id");
|
||||
|
||||
migrationBuilder.AddForeignKey(
|
||||
name: "FK_PatientRecords_EntityDocuments_LabReportUrlId",
|
||||
table: "PatientRecords",
|
||||
column: "LabReportUrlId",
|
||||
principalTable: "EntityDocuments",
|
||||
principalColumn: "Id");
|
||||
|
||||
migrationBuilder.AddForeignKey(
|
||||
name: "FK_PatientRecords_EntityDocuments_MedicationHistoryUrlId",
|
||||
table: "PatientRecords",
|
||||
column: "MedicationHistoryUrlId",
|
||||
principalTable: "EntityDocuments",
|
||||
principalColumn: "Id");
|
||||
|
||||
migrationBuilder.AddForeignKey(
|
||||
name: "FK_PatientRecords_EntityDocuments_MedicationUrlId",
|
||||
table: "PatientRecords",
|
||||
column: "MedicationUrlId",
|
||||
principalTable: "EntityDocuments",
|
||||
principalColumn: "Id");
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropForeignKey(
|
||||
name: "FK_Patient_EntityDocuments_ImagesId",
|
||||
table: "Patient");
|
||||
|
||||
migrationBuilder.DropForeignKey(
|
||||
name: "FK_PatientRecords_EntityDocuments_LabReportUrlId",
|
||||
table: "PatientRecords");
|
||||
|
||||
migrationBuilder.DropForeignKey(
|
||||
name: "FK_PatientRecords_EntityDocuments_MedicationHistoryUrlId",
|
||||
table: "PatientRecords");
|
||||
|
||||
migrationBuilder.DropForeignKey(
|
||||
name: "FK_PatientRecords_EntityDocuments_MedicationUrlId",
|
||||
table: "PatientRecords");
|
||||
|
||||
migrationBuilder.DropTable(
|
||||
name: "PatientDocuments");
|
||||
|
||||
migrationBuilder.DropTable(
|
||||
name: "EntityDocuments");
|
||||
|
||||
migrationBuilder.DropIndex(
|
||||
name: "IX_PatientRecords_LabReportUrlId",
|
||||
table: "PatientRecords");
|
||||
|
||||
migrationBuilder.DropIndex(
|
||||
name: "IX_PatientRecords_MedicationHistoryUrlId",
|
||||
table: "PatientRecords");
|
||||
|
||||
migrationBuilder.DropIndex(
|
||||
name: "IX_PatientRecords_MedicationUrlId",
|
||||
table: "PatientRecords");
|
||||
|
||||
migrationBuilder.DropIndex(
|
||||
name: "IX_Patient_ImagesId",
|
||||
table: "Patient");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "LabReportUrlId",
|
||||
table: "PatientRecords");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "MedicationHistoryUrlId",
|
||||
table: "PatientRecords");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "MedicationUrlId",
|
||||
table: "PatientRecords");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "ImagesId",
|
||||
table: "Patient");
|
||||
|
||||
migrationBuilder.AddColumn<string>(
|
||||
name: "LabReportUrl",
|
||||
table: "PatientRecords",
|
||||
type: "nvarchar(max)",
|
||||
nullable: true);
|
||||
|
||||
migrationBuilder.AddColumn<string>(
|
||||
name: "MedicationHistoryUrl",
|
||||
table: "PatientRecords",
|
||||
type: "nvarchar(max)",
|
||||
nullable: true);
|
||||
|
||||
migrationBuilder.AddColumn<string>(
|
||||
name: "MedicationUrl",
|
||||
table: "PatientRecords",
|
||||
type: "nvarchar(max)",
|
||||
nullable: true);
|
||||
}
|
||||
}
|
||||
}
|
@ -19,7 +19,7 @@ namespace HospitalManagementSystem.Migrations
|
||||
#pragma warning disable 612, 618
|
||||
modelBuilder
|
||||
.HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer)
|
||||
.HasAnnotation("ProductVersion", "9.0.0")
|
||||
.HasAnnotation("ProductVersion", "9.0.1")
|
||||
.HasAnnotation("Relational:MaxIdentifierLength", 128);
|
||||
|
||||
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
|
||||
@ -235,6 +235,291 @@ namespace HospitalManagementSystem.Migrations
|
||||
b.ToTable("Doctors");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("HospitalManagementSystem.Documents.EntityDocument", b =>
|
||||
{
|
||||
b.Property<Guid>("Id")
|
||||
.HasColumnType("uniqueidentifier");
|
||||
|
||||
b.Property<string>("ConcurrencyStamp")
|
||||
.IsConcurrencyToken()
|
||||
.IsRequired()
|
||||
.HasMaxLength(40)
|
||||
.HasColumnType("nvarchar(40)")
|
||||
.HasColumnName("ConcurrencyStamp");
|
||||
|
||||
b.Property<DateTime>("CreationTime")
|
||||
.HasColumnType("datetime2")
|
||||
.HasColumnName("CreationTime");
|
||||
|
||||
b.Property<Guid?>("CreatorId")
|
||||
.HasColumnType("uniqueidentifier")
|
||||
.HasColumnName("CreatorId");
|
||||
|
||||
b.Property<string>("ExtraProperties")
|
||||
.IsRequired()
|
||||
.HasColumnType("nvarchar(max)")
|
||||
.HasColumnName("ExtraProperties");
|
||||
|
||||
b.Property<string>("FilePath")
|
||||
.IsRequired()
|
||||
.HasColumnType("nvarchar(max)");
|
||||
|
||||
b.Property<string>("FileSize")
|
||||
.IsRequired()
|
||||
.HasColumnType("nvarchar(max)");
|
||||
|
||||
b.Property<string>("FileType")
|
||||
.IsRequired()
|
||||
.HasColumnType("nvarchar(max)");
|
||||
|
||||
b.Property<string>("GeneratedFileName")
|
||||
.IsRequired()
|
||||
.HasColumnType("nvarchar(max)");
|
||||
|
||||
b.Property<DateTime?>("LastModificationTime")
|
||||
.HasColumnType("datetime2")
|
||||
.HasColumnName("LastModificationTime");
|
||||
|
||||
b.Property<Guid?>("LastModifierId")
|
||||
.HasColumnType("uniqueidentifier")
|
||||
.HasColumnName("LastModifierId");
|
||||
|
||||
b.Property<string>("OriginalFileName")
|
||||
.IsRequired()
|
||||
.HasColumnType("nvarchar(max)");
|
||||
|
||||
b.Property<string>("TagName")
|
||||
.IsRequired()
|
||||
.HasColumnType("nvarchar(max)");
|
||||
|
||||
b.Property<DateTime>("UploadDate")
|
||||
.HasColumnType("datetime2");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.ToTable("EntityDocuments", (string)null);
|
||||
});
|
||||
|
||||
modelBuilder.Entity("HospitalManagementSystem.Documents.PatientDocument", b =>
|
||||
{
|
||||
b.Property<Guid>("Id")
|
||||
.HasColumnType("uniqueidentifier");
|
||||
|
||||
b.Property<string>("ConcurrencyStamp")
|
||||
.IsConcurrencyToken()
|
||||
.IsRequired()
|
||||
.HasMaxLength(40)
|
||||
.HasColumnType("nvarchar(40)")
|
||||
.HasColumnName("ConcurrencyStamp");
|
||||
|
||||
b.Property<DateTime>("CreationTime")
|
||||
.HasColumnType("datetime2")
|
||||
.HasColumnName("CreationTime");
|
||||
|
||||
b.Property<Guid?>("CreatorId")
|
||||
.HasColumnType("uniqueidentifier")
|
||||
.HasColumnName("CreatorId");
|
||||
|
||||
b.Property<Guid>("EntityDocumentsId")
|
||||
.HasColumnType("uniqueidentifier");
|
||||
|
||||
b.Property<string>("ExtraProperties")
|
||||
.IsRequired()
|
||||
.HasColumnType("nvarchar(max)")
|
||||
.HasColumnName("ExtraProperties");
|
||||
|
||||
b.Property<DateTime?>("LastModificationTime")
|
||||
.HasColumnType("datetime2")
|
||||
.HasColumnName("LastModificationTime");
|
||||
|
||||
b.Property<Guid?>("LastModifierId")
|
||||
.HasColumnType("uniqueidentifier")
|
||||
.HasColumnName("LastModifierId");
|
||||
|
||||
b.Property<Guid>("PatientsId")
|
||||
.HasColumnType("uniqueidentifier");
|
||||
|
||||
b.Property<string>("TagName")
|
||||
.IsRequired()
|
||||
.HasColumnType("nvarchar(max)");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("EntityDocumentsId");
|
||||
|
||||
b.HasIndex("PatientsId");
|
||||
|
||||
b.ToTable("PatientDocuments", (string)null);
|
||||
});
|
||||
|
||||
modelBuilder.Entity("HospitalManagementSystem.Patients.Patient", b =>
|
||||
{
|
||||
b.Property<Guid>("Id")
|
||||
.HasColumnType("uniqueidentifier");
|
||||
|
||||
b.Property<string>("Address")
|
||||
.IsRequired()
|
||||
.HasColumnType("nvarchar(max)");
|
||||
|
||||
b.Property<DateTime>("AdmissionDate")
|
||||
.HasColumnType("datetime2");
|
||||
|
||||
b.Property<int>("Age")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<string>("BloodGroup")
|
||||
.IsRequired()
|
||||
.HasColumnType("nvarchar(max)");
|
||||
|
||||
b.Property<string>("ConcurrencyStamp")
|
||||
.IsConcurrencyToken()
|
||||
.IsRequired()
|
||||
.HasMaxLength(40)
|
||||
.HasColumnType("nvarchar(40)")
|
||||
.HasColumnName("ConcurrencyStamp");
|
||||
|
||||
b.Property<DateTime>("CreationTime")
|
||||
.HasColumnType("datetime2")
|
||||
.HasColumnName("CreationTime");
|
||||
|
||||
b.Property<Guid?>("CreatorId")
|
||||
.HasColumnType("uniqueidentifier")
|
||||
.HasColumnName("CreatorId");
|
||||
|
||||
b.Property<DateTime?>("DischargeDate")
|
||||
.HasColumnType("datetime2");
|
||||
|
||||
b.Property<string>("DoctorAssigned")
|
||||
.IsRequired()
|
||||
.HasColumnType("nvarchar(max)");
|
||||
|
||||
b.Property<string>("Email")
|
||||
.IsRequired()
|
||||
.HasColumnType("nvarchar(max)");
|
||||
|
||||
b.Property<string>("ExtraProperties")
|
||||
.IsRequired()
|
||||
.HasColumnType("nvarchar(max)")
|
||||
.HasColumnName("ExtraProperties");
|
||||
|
||||
b.Property<int>("Gender")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<Guid?>("ImagesId")
|
||||
.HasColumnType("uniqueidentifier");
|
||||
|
||||
b.Property<DateTime?>("LastModificationTime")
|
||||
.HasColumnType("datetime2")
|
||||
.HasColumnName("LastModificationTime");
|
||||
|
||||
b.Property<Guid?>("LastModifierId")
|
||||
.HasColumnType("uniqueidentifier")
|
||||
.HasColumnName("LastModifierId");
|
||||
|
||||
b.Property<string>("Mobile")
|
||||
.IsRequired()
|
||||
.HasColumnType("nvarchar(max)");
|
||||
|
||||
b.Property<string>("Name")
|
||||
.IsRequired()
|
||||
.HasColumnType("nvarchar(max)");
|
||||
|
||||
b.Property<int>("Status")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<string>("Treatment")
|
||||
.IsRequired()
|
||||
.HasColumnType("nvarchar(max)");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("ImagesId");
|
||||
|
||||
b.ToTable("Patient", (string)null);
|
||||
});
|
||||
|
||||
modelBuilder.Entity("HospitalManagementSystem.Patients.PatientRecord", b =>
|
||||
{
|
||||
b.Property<Guid>("Id")
|
||||
.HasColumnType("uniqueidentifier");
|
||||
|
||||
b.Property<string>("ConcurrencyStamp")
|
||||
.IsConcurrencyToken()
|
||||
.IsRequired()
|
||||
.HasMaxLength(40)
|
||||
.HasColumnType("nvarchar(40)")
|
||||
.HasColumnName("ConcurrencyStamp");
|
||||
|
||||
b.Property<DateTime>("CreationTime")
|
||||
.HasColumnType("datetime2")
|
||||
.HasColumnName("CreationTime");
|
||||
|
||||
b.Property<Guid?>("CreatorId")
|
||||
.HasColumnType("uniqueidentifier")
|
||||
.HasColumnName("CreatorId");
|
||||
|
||||
b.Property<DateTime>("DateOfAdmission")
|
||||
.HasColumnType("datetime2");
|
||||
|
||||
b.Property<string>("Diagnosis")
|
||||
.IsRequired()
|
||||
.HasColumnType("nvarchar(max)");
|
||||
|
||||
b.Property<string>("DoctorNotes")
|
||||
.IsRequired()
|
||||
.HasColumnType("nvarchar(max)");
|
||||
|
||||
b.Property<string>("ExtraProperties")
|
||||
.IsRequired()
|
||||
.HasColumnType("nvarchar(max)")
|
||||
.HasColumnName("ExtraProperties");
|
||||
|
||||
b.Property<string>("InsuranceProvider")
|
||||
.IsRequired()
|
||||
.HasColumnType("nvarchar(max)");
|
||||
|
||||
b.Property<Guid?>("LabReportUrlId")
|
||||
.HasColumnType("uniqueidentifier");
|
||||
|
||||
b.Property<DateTime?>("LastModificationTime")
|
||||
.HasColumnType("datetime2")
|
||||
.HasColumnName("LastModificationTime");
|
||||
|
||||
b.Property<Guid?>("LastModifierId")
|
||||
.HasColumnType("uniqueidentifier")
|
||||
.HasColumnName("LastModifierId");
|
||||
|
||||
b.Property<Guid?>("MedicationHistoryUrlId")
|
||||
.HasColumnType("uniqueidentifier");
|
||||
|
||||
b.Property<Guid?>("MedicationUrlId")
|
||||
.HasColumnType("uniqueidentifier");
|
||||
|
||||
b.Property<DateTime?>("NextFollowUp")
|
||||
.HasColumnType("datetime2");
|
||||
|
||||
b.Property<Guid>("PatientsId")
|
||||
.HasColumnType("uniqueidentifier");
|
||||
|
||||
b.Property<int>("Status")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<string>("TreatmentPlan")
|
||||
.IsRequired()
|
||||
.HasColumnType("nvarchar(max)");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("LabReportUrlId");
|
||||
|
||||
b.HasIndex("MedicationHistoryUrlId");
|
||||
|
||||
b.HasIndex("MedicationUrlId");
|
||||
|
||||
b.HasIndex("PatientsId");
|
||||
|
||||
b.ToTable("PatientRecords", (string)null);
|
||||
});
|
||||
modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b =>
|
||||
{
|
||||
b.Property<Guid>("Id")
|
||||
@ -1993,6 +2278,62 @@ namespace HospitalManagementSystem.Migrations
|
||||
b.Navigation("Department");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("HospitalManagementSystem.Documents.PatientDocument", b =>
|
||||
{
|
||||
b.HasOne("HospitalManagementSystem.Documents.EntityDocument", "EntityDocuments")
|
||||
.WithMany()
|
||||
.HasForeignKey("EntityDocumentsId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("HospitalManagementSystem.Patients.Patient", "Patients")
|
||||
.WithMany()
|
||||
.HasForeignKey("PatientsId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("EntityDocuments");
|
||||
|
||||
b.Navigation("Patients");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("HospitalManagementSystem.Patients.Patient", b =>
|
||||
{
|
||||
b.HasOne("HospitalManagementSystem.Documents.EntityDocument", "Images")
|
||||
.WithMany()
|
||||
.HasForeignKey("ImagesId");
|
||||
|
||||
b.Navigation("Images");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("HospitalManagementSystem.Patients.PatientRecord", b =>
|
||||
{
|
||||
b.HasOne("HospitalManagementSystem.Documents.EntityDocument", "LabReportUrl")
|
||||
.WithMany()
|
||||
.HasForeignKey("LabReportUrlId");
|
||||
|
||||
b.HasOne("HospitalManagementSystem.Documents.EntityDocument", "MedicationHistoryUrl")
|
||||
.WithMany()
|
||||
.HasForeignKey("MedicationHistoryUrlId");
|
||||
|
||||
b.HasOne("HospitalManagementSystem.Documents.EntityDocument", "MedicationUrl")
|
||||
.WithMany()
|
||||
.HasForeignKey("MedicationUrlId");
|
||||
|
||||
b.HasOne("HospitalManagementSystem.Patients.Patient", "Patients")
|
||||
.WithMany()
|
||||
.HasForeignKey("PatientsId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("LabReportUrl");
|
||||
|
||||
b.Navigation("MedicationHistoryUrl");
|
||||
|
||||
b.Navigation("MedicationUrl");
|
||||
|
||||
b.Navigation("Patients");
|
||||
});
|
||||
modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b =>
|
||||
{
|
||||
b.HasOne("Volo.Abp.AuditLogging.AuditLog", null)
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
56
aspnet-core/src/HospitalManagementSystem.HttpApi.Host/wwwroot/libs/abp/core/abp.css
vendored
Normal file
56
aspnet-core/src/HospitalManagementSystem.HttpApi.Host/wwwroot/libs/abp/core/abp.css
vendored
Normal file
@ -0,0 +1,56 @@
|
||||
@keyframes spin {
|
||||
0% {
|
||||
transform: translateZ(0) rotate(0deg);
|
||||
}
|
||||
|
||||
100% {
|
||||
transform: translateZ(0) rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
.abp-block-area {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
z-index: 102;
|
||||
background-color: #fff;
|
||||
opacity: .8;
|
||||
transition: opacity .25s;
|
||||
}
|
||||
|
||||
.abp-block-area.abp-block-area-disappearing {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.abp-block-area.abp-block-area-busy:after {
|
||||
content: attr(data-text);
|
||||
display: block;
|
||||
max-width: 125px;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
font-size: 20px;
|
||||
font-family: sans-serif;
|
||||
color: #343a40;
|
||||
text-align: center;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.abp-block-area.abp-block-area-busy:before {
|
||||
content: "";
|
||||
display: block;
|
||||
width: 150px;
|
||||
height: 150px;
|
||||
border-radius: 50%;
|
||||
border-width: 2px;
|
||||
border-style: solid;
|
||||
border-color: transparent #228ae6 #228ae6 #228ae6;
|
||||
position: absolute;
|
||||
top: calc(50% - 75px);
|
||||
left: calc(50% - 75px);
|
||||
will-change: transform;
|
||||
animation: spin .75s infinite ease-in-out;
|
||||
}
|
827
aspnet-core/src/HospitalManagementSystem.HttpApi.Host/wwwroot/libs/abp/core/abp.js
vendored
Normal file
827
aspnet-core/src/HospitalManagementSystem.HttpApi.Host/wwwroot/libs/abp/core/abp.js
vendored
Normal file
@ -0,0 +1,827 @@
|
||||
var abp = abp || {};
|
||||
(function () {
|
||||
|
||||
/* Application paths *****************************************/
|
||||
|
||||
//Current application root path (including virtual directory if exists).
|
||||
abp.appPath = abp.appPath || '/';
|
||||
|
||||
abp.pageLoadTime = new Date();
|
||||
|
||||
//Converts given path to absolute path using abp.appPath variable.
|
||||
abp.toAbsAppPath = function (path) {
|
||||
if (path.indexOf('/') == 0) {
|
||||
path = path.substring(1);
|
||||
}
|
||||
|
||||
return abp.appPath + path;
|
||||
};
|
||||
|
||||
/* LOGGING ***************************************************/
|
||||
//Implements Logging API that provides secure & controlled usage of console.log
|
||||
|
||||
abp.log = abp.log || {};
|
||||
|
||||
abp.log.levels = {
|
||||
DEBUG: 1,
|
||||
INFO: 2,
|
||||
WARN: 3,
|
||||
ERROR: 4,
|
||||
FATAL: 5
|
||||
};
|
||||
|
||||
abp.log.level = abp.log.levels.DEBUG;
|
||||
|
||||
abp.log.log = function (logObject, logLevel) {
|
||||
if (!window.console || !window.console.log) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (logLevel != undefined && logLevel < abp.log.level) {
|
||||
return;
|
||||
}
|
||||
|
||||
console.log(logObject);
|
||||
};
|
||||
|
||||
abp.log.debug = function (logObject) {
|
||||
abp.log.log("DEBUG: ", abp.log.levels.DEBUG);
|
||||
abp.log.log(logObject, abp.log.levels.DEBUG);
|
||||
};
|
||||
|
||||
abp.log.info = function (logObject) {
|
||||
abp.log.log("INFO: ", abp.log.levels.INFO);
|
||||
abp.log.log(logObject, abp.log.levels.INFO);
|
||||
};
|
||||
|
||||
abp.log.warn = function (logObject) {
|
||||
abp.log.log("WARN: ", abp.log.levels.WARN);
|
||||
abp.log.log(logObject, abp.log.levels.WARN);
|
||||
};
|
||||
|
||||
abp.log.error = function (logObject) {
|
||||
abp.log.log("ERROR: ", abp.log.levels.ERROR);
|
||||
abp.log.log(logObject, abp.log.levels.ERROR);
|
||||
};
|
||||
|
||||
abp.log.fatal = function (logObject) {
|
||||
abp.log.log("FATAL: ", abp.log.levels.FATAL);
|
||||
abp.log.log(logObject, abp.log.levels.FATAL);
|
||||
};
|
||||
|
||||
/* LOCALIZATION ***********************************************/
|
||||
|
||||
abp.localization = abp.localization || {};
|
||||
abp.localization.internal = abp.localization.internal || {};
|
||||
abp.localization.values = abp.localization.values || {};
|
||||
abp.localization.resources = abp.localization.resources || {};
|
||||
|
||||
abp.localization.internal.getResource = function (resourceName) {
|
||||
var resource = abp.localization.resources[resourceName];
|
||||
if (resource) {
|
||||
return resource;
|
||||
}
|
||||
|
||||
var legacySource = abp.localization.values[resourceName];
|
||||
if (legacySource) {
|
||||
return {
|
||||
texts: abp.localization.values[resourceName],
|
||||
baseResources: []
|
||||
};
|
||||
}
|
||||
|
||||
abp.log.warn('Could not find localization source: ' + resourceName);
|
||||
return null;
|
||||
};
|
||||
|
||||
abp.localization.internal.localize = function (key, sourceName) {
|
||||
var resource = abp.localization.internal.getResource(sourceName);
|
||||
if (!resource){
|
||||
return {
|
||||
value: key,
|
||||
found: false
|
||||
};
|
||||
}
|
||||
|
||||
var value = resource.texts[key];
|
||||
if (value === undefined) {
|
||||
for (var i = 0; i < resource.baseResources.length; i++){
|
||||
var basedArguments = Array.prototype.slice.call(arguments, 0);
|
||||
basedArguments[1] = resource.baseResources[i];
|
||||
|
||||
var result = abp.localization.internal.localize.apply(this, basedArguments);
|
||||
if (result.found){
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
value: key,
|
||||
found: false
|
||||
};
|
||||
}
|
||||
|
||||
var copiedArguments = Array.prototype.slice.call(arguments, 0);
|
||||
copiedArguments.splice(1, 1);
|
||||
copiedArguments[0] = value;
|
||||
|
||||
return {
|
||||
value: abp.utils.formatString.apply(this, copiedArguments),
|
||||
found: true
|
||||
};
|
||||
};
|
||||
|
||||
abp.localization.localize = function (key, sourceName) {
|
||||
if (sourceName === '_') { //A convention to suppress the localization
|
||||
return key;
|
||||
}
|
||||
|
||||
if (sourceName) {
|
||||
return abp.localization.internal.localize.apply(this, arguments).value;
|
||||
}
|
||||
|
||||
if (!abp.localization.defaultResourceName) {
|
||||
abp.log.warn('Localization source name is not specified and the defaultResourceName was not defined!');
|
||||
return key;
|
||||
}
|
||||
|
||||
var copiedArguments = Array.prototype.slice.call(arguments, 0);
|
||||
copiedArguments.splice(1, 1, abp.localization.defaultResourceName);
|
||||
|
||||
return abp.localization.internal.localize.apply(this, copiedArguments).value;
|
||||
};
|
||||
|
||||
abp.localization.isLocalized = function (key, sourceName) {
|
||||
if (sourceName === '_') { //A convention to suppress the localization
|
||||
return true;
|
||||
}
|
||||
|
||||
sourceName = sourceName || abp.localization.defaultResourceName;
|
||||
if (!sourceName) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return abp.localization.internal.localize(key, sourceName).found;
|
||||
};
|
||||
|
||||
abp.localization.getResource = function (name) {
|
||||
return function () {
|
||||
var copiedArguments = Array.prototype.slice.call(arguments, 0);
|
||||
copiedArguments.splice(1, 0, name);
|
||||
return abp.localization.localize.apply(this, copiedArguments);
|
||||
};
|
||||
};
|
||||
|
||||
abp.localization.defaultResourceName = undefined;
|
||||
abp.localization.currentCulture = {
|
||||
cultureName: undefined
|
||||
};
|
||||
|
||||
var getMapValue = function (packageMaps, packageName, language) {
|
||||
language = language || abp.localization.currentCulture.name;
|
||||
if (!packageMaps || !packageName || !language) {
|
||||
return language;
|
||||
}
|
||||
|
||||
var packageMap = packageMaps[packageName];
|
||||
if (!packageMap) {
|
||||
return language;
|
||||
}
|
||||
|
||||
for (var i = 0; i < packageMap.length; i++) {
|
||||
var map = packageMap[i];
|
||||
if (map.name === language){
|
||||
return map.value;
|
||||
}
|
||||
}
|
||||
|
||||
return language;
|
||||
};
|
||||
|
||||
abp.localization.getLanguagesMap = function (packageName, language) {
|
||||
return getMapValue(abp.localization.languagesMap, packageName, language);
|
||||
};
|
||||
|
||||
abp.localization.getLanguageFilesMap = function (packageName, language) {
|
||||
return getMapValue(abp.localization.languageFilesMap, packageName, language);
|
||||
};
|
||||
|
||||
/* AUTHORIZATION **********************************************/
|
||||
|
||||
abp.auth = abp.auth || {};
|
||||
|
||||
abp.auth.grantedPolicies = abp.auth.grantedPolicies || {};
|
||||
|
||||
abp.auth.isGranted = function (policyName) {
|
||||
return abp.auth.grantedPolicies[policyName] != undefined;
|
||||
};
|
||||
|
||||
abp.auth.isAnyGranted = function () {
|
||||
if (!arguments || arguments.length <= 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
for (var i = 0; i < arguments.length; i++) {
|
||||
if (abp.auth.isGranted(arguments[i])) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
abp.auth.areAllGranted = function () {
|
||||
if (!arguments || arguments.length <= 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
for (var i = 0; i < arguments.length; i++) {
|
||||
if (!abp.auth.isGranted(arguments[i])) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
abp.auth.tokenCookieName = 'Abp.AuthToken';
|
||||
|
||||
abp.auth.setToken = function (authToken, expireDate) {
|
||||
abp.utils.setCookieValue(abp.auth.tokenCookieName, authToken, expireDate, abp.appPath, abp.domain);
|
||||
};
|
||||
|
||||
abp.auth.getToken = function () {
|
||||
return abp.utils.getCookieValue(abp.auth.tokenCookieName);
|
||||
}
|
||||
|
||||
abp.auth.clearToken = function () {
|
||||
abp.auth.setToken();
|
||||
}
|
||||
|
||||
/* SETTINGS *************************************************/
|
||||
|
||||
abp.setting = abp.setting || {};
|
||||
|
||||
abp.setting.values = abp.setting.values || {};
|
||||
|
||||
abp.setting.get = function (name) {
|
||||
return abp.setting.values[name];
|
||||
};
|
||||
|
||||
abp.setting.getBoolean = function (name) {
|
||||
var value = abp.setting.get(name);
|
||||
return value == 'true' || value == 'True';
|
||||
};
|
||||
|
||||
abp.setting.getInt = function (name) {
|
||||
return parseInt(abp.setting.values[name]);
|
||||
};
|
||||
|
||||
/* NOTIFICATION *********************************************/
|
||||
//Defines Notification API, not implements it
|
||||
|
||||
abp.notify = abp.notify || {};
|
||||
|
||||
abp.notify.success = function (message, title, options) {
|
||||
abp.log.warn('abp.notify.success is not implemented!');
|
||||
};
|
||||
|
||||
abp.notify.info = function (message, title, options) {
|
||||
abp.log.warn('abp.notify.info is not implemented!');
|
||||
};
|
||||
|
||||
abp.notify.warn = function (message, title, options) {
|
||||
abp.log.warn('abp.notify.warn is not implemented!');
|
||||
};
|
||||
|
||||
abp.notify.error = function (message, title, options) {
|
||||
abp.log.warn('abp.notify.error is not implemented!');
|
||||
};
|
||||
|
||||
/* MESSAGE **************************************************/
|
||||
//Defines Message API, not implements it
|
||||
|
||||
abp.message = abp.message || {};
|
||||
|
||||
abp.message._showMessage = function (message, title) {
|
||||
alert((title || '') + ' ' + message);
|
||||
};
|
||||
|
||||
abp.message.info = function (message, title) {
|
||||
abp.log.warn('abp.message.info is not implemented!');
|
||||
return abp.message._showMessage(message, title);
|
||||
};
|
||||
|
||||
abp.message.success = function (message, title) {
|
||||
abp.log.warn('abp.message.success is not implemented!');
|
||||
return abp.message._showMessage(message, title);
|
||||
};
|
||||
|
||||
abp.message.warn = function (message, title) {
|
||||
abp.log.warn('abp.message.warn is not implemented!');
|
||||
return abp.message._showMessage(message, title);
|
||||
};
|
||||
|
||||
abp.message.error = function (message, title) {
|
||||
abp.log.warn('abp.message.error is not implemented!');
|
||||
return abp.message._showMessage(message, title);
|
||||
};
|
||||
|
||||
abp.message.confirm = function (message, titleOrCallback, callback) {
|
||||
abp.log.warn('abp.message.confirm is not properly implemented!');
|
||||
|
||||
if (titleOrCallback && !(typeof titleOrCallback == 'string')) {
|
||||
callback = titleOrCallback;
|
||||
}
|
||||
|
||||
var result = confirm(message);
|
||||
callback && callback(result);
|
||||
};
|
||||
|
||||
/* UI *******************************************************/
|
||||
|
||||
abp.ui = abp.ui || {};
|
||||
|
||||
/* UI BLOCK */
|
||||
//Defines UI Block API and implements basically
|
||||
|
||||
var $abpBlockArea = document.createElement('div');
|
||||
$abpBlockArea.classList.add('abp-block-area');
|
||||
|
||||
/* opts: { //Can be an object with options or a string for query a selector
|
||||
* elm: a query selector (optional - default: document.body)
|
||||
* busy: boolean (optional - default: false)
|
||||
* promise: A promise with always or finally handler (optional - auto unblocks the ui if provided)
|
||||
* }
|
||||
*/
|
||||
abp.ui.block = function (opts) {
|
||||
if (!opts) {
|
||||
opts = {};
|
||||
} else if (typeof opts == 'string') {
|
||||
opts = {
|
||||
elm: opts
|
||||
};
|
||||
}
|
||||
|
||||
var $elm = document.querySelector(opts.elm) || document.body;
|
||||
|
||||
if (opts.busy) {
|
||||
$abpBlockArea.classList.add('abp-block-area-busy');
|
||||
} else {
|
||||
$abpBlockArea.classList.remove('abp-block-area-busy');
|
||||
}
|
||||
|
||||
if (document.querySelector(opts.elm)) {
|
||||
$abpBlockArea.style.position = 'absolute';
|
||||
} else {
|
||||
$abpBlockArea.style.position = 'fixed';
|
||||
}
|
||||
|
||||
$elm.appendChild($abpBlockArea);
|
||||
|
||||
if (opts.promise) {
|
||||
if (opts.promise.always) { //jQuery.Deferred style
|
||||
opts.promise.always(function () {
|
||||
abp.ui.unblock({
|
||||
$elm: opts.elm
|
||||
});
|
||||
});
|
||||
} else if (opts.promise['finally']) { //Q style
|
||||
opts.promise['finally'](function () {
|
||||
abp.ui.unblock({
|
||||
$elm: opts.elm
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/* opts: {
|
||||
*
|
||||
* }
|
||||
*/
|
||||
abp.ui.unblock = function (opts) {
|
||||
var element = document.querySelector('.abp-block-area');
|
||||
if (element) {
|
||||
element.classList.add('abp-block-area-disappearing');
|
||||
setTimeout(function () {
|
||||
if (element) {
|
||||
element.classList.remove('abp-block-area-disappearing');
|
||||
if (element.parentElement) {
|
||||
element.parentElement.removeChild(element);
|
||||
}
|
||||
}
|
||||
}, 250);
|
||||
}
|
||||
};
|
||||
|
||||
/* UI BUSY */
|
||||
//Defines UI Busy API, not implements it
|
||||
|
||||
abp.ui.setBusy = function (opts) {
|
||||
if (!opts) {
|
||||
opts = {
|
||||
busy: true
|
||||
};
|
||||
} else if (typeof opts == 'string') {
|
||||
opts = {
|
||||
elm: opts,
|
||||
busy: true
|
||||
};
|
||||
}
|
||||
|
||||
abp.ui.block(opts);
|
||||
};
|
||||
|
||||
abp.ui.clearBusy = function (opts) {
|
||||
abp.ui.unblock(opts);
|
||||
};
|
||||
|
||||
/* SIMPLE EVENT BUS *****************************************/
|
||||
|
||||
abp.event = (function () {
|
||||
|
||||
var _callbacks = {};
|
||||
|
||||
var on = function (eventName, callback) {
|
||||
if (!_callbacks[eventName]) {
|
||||
_callbacks[eventName] = [];
|
||||
}
|
||||
|
||||
_callbacks[eventName].push(callback);
|
||||
};
|
||||
|
||||
var off = function (eventName, callback) {
|
||||
var callbacks = _callbacks[eventName];
|
||||
if (!callbacks) {
|
||||
return;
|
||||
}
|
||||
|
||||
var index = -1;
|
||||
for (var i = 0; i < callbacks.length; i++) {
|
||||
if (callbacks[i] === callback) {
|
||||
index = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (index < 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
_callbacks[eventName].splice(index, 1);
|
||||
};
|
||||
|
||||
var trigger = function (eventName) {
|
||||
var callbacks = _callbacks[eventName];
|
||||
if (!callbacks || !callbacks.length) {
|
||||
return;
|
||||
}
|
||||
|
||||
var args = Array.prototype.slice.call(arguments, 1);
|
||||
for (var i = 0; i < callbacks.length; i++) {
|
||||
try {
|
||||
callbacks[i].apply(this, args);
|
||||
} catch(e) {
|
||||
console.error(e);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Public interface ///////////////////////////////////////////////////
|
||||
|
||||
return {
|
||||
on: on,
|
||||
off: off,
|
||||
trigger: trigger
|
||||
};
|
||||
})();
|
||||
|
||||
|
||||
/* UTILS ***************************************************/
|
||||
|
||||
abp.utils = abp.utils || {};
|
||||
|
||||
/* Creates a name namespace.
|
||||
* Example:
|
||||
* var taskService = abp.utils.createNamespace(abp, 'services.task');
|
||||
* taskService will be equal to abp.services.task
|
||||
* first argument (root) must be defined first
|
||||
************************************************************/
|
||||
abp.utils.createNamespace = function (root, ns) {
|
||||
var parts = ns.split('.');
|
||||
for (var i = 0; i < parts.length; i++) {
|
||||
if (typeof root[parts[i]] == 'undefined') {
|
||||
root[parts[i]] = {};
|
||||
}
|
||||
|
||||
root = root[parts[i]];
|
||||
}
|
||||
|
||||
return root;
|
||||
};
|
||||
|
||||
/* Find and replaces a string (search) to another string (replacement) in
|
||||
* given string (str).
|
||||
* Example:
|
||||
* abp.utils.replaceAll('This is a test string', 'is', 'X') = 'ThX X a test string'
|
||||
************************************************************/
|
||||
abp.utils.replaceAll = function (str, search, replacement) {
|
||||
var fix = search.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
||||
return str.replace(new RegExp(fix, 'g'), replacement);
|
||||
};
|
||||
|
||||
/* Formats a string just like string.format in C#.
|
||||
* Example:
|
||||
* abp.utils.formatString('Hello {0}','Tuana') = 'Hello Tuana'
|
||||
************************************************************/
|
||||
abp.utils.formatString = function () {
|
||||
if (arguments.length < 1) {
|
||||
return null;
|
||||
}
|
||||
|
||||
var str = arguments[0];
|
||||
|
||||
for (var i = 1; i < arguments.length; i++) {
|
||||
var placeHolder = '{' + (i - 1) + '}';
|
||||
str = abp.utils.replaceAll(str, placeHolder, arguments[i]);
|
||||
}
|
||||
|
||||
return str;
|
||||
};
|
||||
|
||||
abp.utils.toPascalCase = function (str) {
|
||||
if (!str || !str.length) {
|
||||
return str;
|
||||
}
|
||||
|
||||
if (str.length === 1) {
|
||||
return str.charAt(0).toUpperCase();
|
||||
}
|
||||
|
||||
return str.charAt(0).toUpperCase() + str.substr(1);
|
||||
}
|
||||
|
||||
abp.utils.toCamelCase = function (str) {
|
||||
if (!str || !str.length) {
|
||||
return str;
|
||||
}
|
||||
|
||||
if (str.length === 1) {
|
||||
return str.charAt(0).toLowerCase();
|
||||
}
|
||||
|
||||
return str.charAt(0).toLowerCase() + str.substr(1);
|
||||
}
|
||||
|
||||
abp.utils.truncateString = function (str, maxLength) {
|
||||
if (!str || !str.length || str.length <= maxLength) {
|
||||
return str;
|
||||
}
|
||||
|
||||
return str.substr(0, maxLength);
|
||||
};
|
||||
|
||||
abp.utils.truncateStringWithPostfix = function (str, maxLength, postfix) {
|
||||
postfix = postfix || '...';
|
||||
|
||||
if (!str || !str.length || str.length <= maxLength) {
|
||||
return str;
|
||||
}
|
||||
|
||||
if (maxLength <= postfix.length) {
|
||||
return postfix.substr(0, maxLength);
|
||||
}
|
||||
|
||||
return str.substr(0, maxLength - postfix.length) + postfix;
|
||||
};
|
||||
|
||||
abp.utils.isFunction = function (obj) {
|
||||
return !!(obj && obj.constructor && obj.call && obj.apply);
|
||||
};
|
||||
|
||||
/**
|
||||
* parameterInfos should be an array of { name, value } objects
|
||||
* where name is query string parameter name and value is it's value.
|
||||
* includeQuestionMark is true by default.
|
||||
*/
|
||||
abp.utils.buildQueryString = function (parameterInfos, includeQuestionMark) {
|
||||
if (includeQuestionMark === undefined) {
|
||||
includeQuestionMark = true;
|
||||
}
|
||||
|
||||
var qs = '';
|
||||
|
||||
function addSeperator() {
|
||||
if (!qs.length) {
|
||||
if (includeQuestionMark) {
|
||||
qs = qs + '?';
|
||||
}
|
||||
} else {
|
||||
qs = qs + '&';
|
||||
}
|
||||
}
|
||||
|
||||
for (var i = 0; i < parameterInfos.length; ++i) {
|
||||
var parameterInfo = parameterInfos[i];
|
||||
if (parameterInfo.value === undefined) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (parameterInfo.value === null) {
|
||||
parameterInfo.value = '';
|
||||
}
|
||||
|
||||
addSeperator();
|
||||
|
||||
if (parameterInfo.value.toJSON && typeof parameterInfo.value.toJSON === "function") {
|
||||
qs = qs + parameterInfo.name + '=' + encodeURIComponent(parameterInfo.value.toJSON());
|
||||
} else if (Array.isArray(parameterInfo.value) && parameterInfo.value.length) {
|
||||
for (var j = 0; j < parameterInfo.value.length; j++) {
|
||||
if (j > 0) {
|
||||
addSeperator();
|
||||
}
|
||||
|
||||
qs = qs + parameterInfo.name + '[' + j + ']=' + encodeURIComponent(parameterInfo.value[j]);
|
||||
}
|
||||
} else {
|
||||
qs = qs + parameterInfo.name + '=' + encodeURIComponent(parameterInfo.value);
|
||||
}
|
||||
}
|
||||
|
||||
return qs;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a cookie value for given key.
|
||||
* This is a simple implementation created to be used by ABP.
|
||||
* Please use a complete cookie library if you need.
|
||||
* @param {string} key
|
||||
* @param {string} value
|
||||
* @param {Date} expireDate (optional). If not specified the cookie will expire at the end of session.
|
||||
* @param {string} path (optional)
|
||||
*/
|
||||
abp.utils.setCookieValue = function (key, value, expireDate, path) {
|
||||
var cookieValue = encodeURIComponent(key) + '=';
|
||||
|
||||
if (value) {
|
||||
cookieValue = cookieValue + encodeURIComponent(value);
|
||||
}
|
||||
|
||||
if (expireDate) {
|
||||
cookieValue = cookieValue + "; expires=" + expireDate.toUTCString();
|
||||
}
|
||||
|
||||
if (path) {
|
||||
cookieValue = cookieValue + "; path=" + path;
|
||||
}
|
||||
|
||||
document.cookie = cookieValue;
|
||||
};
|
||||
|
||||
/**
|
||||
* Gets a cookie with given key.
|
||||
* This is a simple implementation created to be used by ABP.
|
||||
* Please use a complete cookie library if you need.
|
||||
* @param {string} key
|
||||
* @returns {string} Cookie value or null
|
||||
*/
|
||||
abp.utils.getCookieValue = function (key) {
|
||||
var equalities = document.cookie.split('; ');
|
||||
for (var i = 0; i < equalities.length; i++) {
|
||||
if (!equalities[i]) {
|
||||
continue;
|
||||
}
|
||||
|
||||
var splitted = equalities[i].split('=');
|
||||
if (splitted.length != 2) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (decodeURIComponent(splitted[0]) === key) {
|
||||
return decodeURIComponent(splitted[1] || '');
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
};
|
||||
|
||||
/**
|
||||
* Deletes cookie for given key.
|
||||
* This is a simple implementation created to be used by ABP.
|
||||
* Please use a complete cookie library if you need.
|
||||
* @param {string} key
|
||||
* @param {string} path (optional)
|
||||
*/
|
||||
abp.utils.deleteCookie = function (key, path) {
|
||||
var cookieValue = encodeURIComponent(key) + '=';
|
||||
|
||||
cookieValue = cookieValue + "; expires=" + (new Date(new Date().getTime() - 86400000)).toUTCString();
|
||||
|
||||
if (path) {
|
||||
cookieValue = cookieValue + "; path=" + path;
|
||||
}
|
||||
|
||||
document.cookie = cookieValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Escape HTML to help prevent XSS attacks.
|
||||
*/
|
||||
abp.utils.htmlEscape = function (html) {
|
||||
return typeof html === 'string' ? html.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"') : html;
|
||||
}
|
||||
|
||||
/* SECURITY ***************************************/
|
||||
abp.security = abp.security || {};
|
||||
abp.security.antiForgery = abp.security.antiForgery || {};
|
||||
|
||||
abp.security.antiForgery.tokenCookieName = 'XSRF-TOKEN';
|
||||
abp.security.antiForgery.tokenHeaderName = 'RequestVerificationToken';
|
||||
|
||||
abp.security.antiForgery.getToken = function () {
|
||||
return abp.utils.getCookieValue(abp.security.antiForgery.tokenCookieName);
|
||||
};
|
||||
|
||||
/* CLOCK *****************************************/
|
||||
abp.clock = abp.clock || {};
|
||||
|
||||
abp.clock.kind = 'Unspecified';
|
||||
|
||||
abp.clock.supportsMultipleTimezone = function () {
|
||||
return abp.clock.kind === 'Utc';
|
||||
};
|
||||
|
||||
var toLocal = function (date) {
|
||||
return new Date(
|
||||
date.getFullYear(),
|
||||
date.getMonth(),
|
||||
date.getDate(),
|
||||
date.getHours(),
|
||||
date.getMinutes(),
|
||||
date.getSeconds(),
|
||||
date.getMilliseconds()
|
||||
);
|
||||
};
|
||||
|
||||
var toUtc = function (date) {
|
||||
return Date.UTC(
|
||||
date.getUTCFullYear(),
|
||||
date.getUTCMonth(),
|
||||
date.getUTCDate(),
|
||||
date.getUTCHours(),
|
||||
date.getUTCMinutes(),
|
||||
date.getUTCSeconds(),
|
||||
date.getUTCMilliseconds()
|
||||
);
|
||||
};
|
||||
|
||||
abp.clock.now = function () {
|
||||
if (abp.clock.kind === 'Utc') {
|
||||
return toUtc(new Date());
|
||||
}
|
||||
return new Date();
|
||||
};
|
||||
|
||||
abp.clock.normalize = function (date) {
|
||||
var kind = abp.clock.kind;
|
||||
|
||||
if (kind === 'Unspecified') {
|
||||
return date;
|
||||
}
|
||||
|
||||
if (kind === 'Local') {
|
||||
return toLocal(date);
|
||||
}
|
||||
|
||||
if (kind === 'Utc') {
|
||||
return toUtc(date);
|
||||
}
|
||||
};
|
||||
|
||||
/* FEATURES *************************************************/
|
||||
|
||||
abp.features = abp.features || {};
|
||||
|
||||
abp.features.values = abp.features.values || {};
|
||||
|
||||
abp.features.isEnabled = function(name){
|
||||
var value = abp.features.get(name);
|
||||
return value == 'true' || value == 'True';
|
||||
}
|
||||
|
||||
abp.features.get = function (name) {
|
||||
return abp.features.values[name];
|
||||
};
|
||||
|
||||
/* GLOBAL FEATURES *************************************************/
|
||||
|
||||
abp.globalFeatures = abp.globalFeatures || {};
|
||||
|
||||
abp.globalFeatures.enabledFeatures = abp.globalFeatures.enabledFeatures || [];
|
||||
|
||||
abp.globalFeatures.isEnabled = function(name){
|
||||
return abp.globalFeatures.enabledFeatures.indexOf(name) != -1;
|
||||
}
|
||||
|
||||
})();
|
411
aspnet-core/src/HospitalManagementSystem.HttpApi.Host/wwwroot/libs/abp/jquery/abp.jquery.js
vendored
Normal file
411
aspnet-core/src/HospitalManagementSystem.HttpApi.Host/wwwroot/libs/abp/jquery/abp.jquery.js
vendored
Normal file
@ -0,0 +1,411 @@
|
||||
var abp = abp || {};
|
||||
(function($) {
|
||||
|
||||
if (!$) {
|
||||
throw "abp/jquery library requires the jquery library included to the page!";
|
||||
}
|
||||
|
||||
// ABP CORE OVERRIDES /////////////////////////////////////////////////////
|
||||
|
||||
abp.message._showMessage = function (message, title) {
|
||||
alert((title || '') + ' ' + message);
|
||||
|
||||
return $.Deferred(function ($dfd) {
|
||||
$dfd.resolve();
|
||||
});
|
||||
};
|
||||
|
||||
abp.message.confirm = function (message, titleOrCallback, callback) {
|
||||
if (titleOrCallback && !(typeof titleOrCallback == 'string')) {
|
||||
callback = titleOrCallback;
|
||||
}
|
||||
|
||||
var result = confirm(message);
|
||||
callback && callback(result);
|
||||
|
||||
return $.Deferred(function ($dfd) {
|
||||
$dfd.resolve(result);
|
||||
});
|
||||
};
|
||||
|
||||
abp.utils.isFunction = function (obj) {
|
||||
return $.isFunction(obj);
|
||||
};
|
||||
|
||||
// JQUERY EXTENSIONS //////////////////////////////////////////////////////
|
||||
|
||||
$.fn.findWithSelf = function (selector) {
|
||||
return this.filter(selector).add(this.find(selector));
|
||||
};
|
||||
|
||||
// DOM ////////////////////////////////////////////////////////////////////
|
||||
|
||||
abp.dom = abp.dom || {};
|
||||
|
||||
abp.dom.onNodeAdded = function (callback) {
|
||||
abp.event.on('abp.dom.nodeAdded', callback);
|
||||
};
|
||||
|
||||
abp.dom.onNodeRemoved = function (callback) {
|
||||
abp.event.on('abp.dom.nodeRemoved', callback);
|
||||
};
|
||||
|
||||
var mutationObserverCallback = function (mutationsList) {
|
||||
for (var i = 0; i < mutationsList.length; i++) {
|
||||
var mutation = mutationsList[i];
|
||||
if (mutation.type === 'childList') {
|
||||
if (mutation.addedNodes && mutation.removedNodes.length) {
|
||||
for (var k = 0; k < mutation.removedNodes.length; k++) {
|
||||
abp.event.trigger(
|
||||
'abp.dom.nodeRemoved',
|
||||
{
|
||||
$el: $(mutation.removedNodes[k])
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (mutation.addedNodes && mutation.addedNodes.length) {
|
||||
for (var j = 0; j < mutation.addedNodes.length; j++) {
|
||||
abp.event.trigger(
|
||||
'abp.dom.nodeAdded',
|
||||
{
|
||||
$el: $(mutation.addedNodes[j])
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
$(function(){
|
||||
new MutationObserver(mutationObserverCallback).observe(
|
||||
$('body')[0],
|
||||
{
|
||||
subtree: true,
|
||||
childList: true
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
// AJAX ///////////////////////////////////////////////////////////////////
|
||||
|
||||
abp.ajax = function (userOptions) {
|
||||
userOptions = userOptions || {};
|
||||
|
||||
var options = $.extend(true, {}, abp.ajax.defaultOpts, userOptions);
|
||||
|
||||
options.success = undefined;
|
||||
options.error = undefined;
|
||||
|
||||
var xhr = null;
|
||||
var promise = $.Deferred(function ($dfd) {
|
||||
xhr = $.ajax(options)
|
||||
.done(function (data, textStatus, jqXHR) {
|
||||
$dfd.resolve(data);
|
||||
userOptions.success && userOptions.success(data);
|
||||
}).fail(function (jqXHR) {
|
||||
if(jqXHR.statusText === 'abort') {
|
||||
//ajax request is abort, ignore error handle.
|
||||
return;
|
||||
}
|
||||
if (jqXHR.getResponseHeader('_AbpErrorFormat') === 'true') {
|
||||
abp.ajax.handleAbpErrorResponse(jqXHR, userOptions, $dfd);
|
||||
} else {
|
||||
abp.ajax.handleNonAbpErrorResponse(jqXHR, userOptions, $dfd);
|
||||
}
|
||||
});
|
||||
}).promise();
|
||||
|
||||
promise['jqXHR'] = xhr;
|
||||
|
||||
return promise;
|
||||
};
|
||||
|
||||
$.extend(abp.ajax, {
|
||||
defaultOpts: {
|
||||
dataType: 'json',
|
||||
type: 'POST',
|
||||
contentType: 'application/json',
|
||||
headers: {
|
||||
'X-Requested-With': 'XMLHttpRequest'
|
||||
}
|
||||
},
|
||||
|
||||
defaultError: {
|
||||
message: 'An error has occurred!',
|
||||
details: 'Error detail not sent by server.'
|
||||
},
|
||||
|
||||
defaultError401: {
|
||||
message: 'You are not authenticated!',
|
||||
details: 'You should be authenticated (sign in) in order to perform this operation.'
|
||||
},
|
||||
|
||||
defaultError403: {
|
||||
message: 'You are not authorized!',
|
||||
details: 'You are not allowed to perform this operation.'
|
||||
},
|
||||
|
||||
defaultError404: {
|
||||
message: 'Resource not found!',
|
||||
details: 'The resource requested could not found on the server.'
|
||||
},
|
||||
|
||||
logError: function (error) {
|
||||
abp.log.error(error);
|
||||
},
|
||||
|
||||
showError: function (error) {
|
||||
if (error.details) {
|
||||
return abp.message.error(error.details, error.message);
|
||||
} else {
|
||||
return abp.message.error(error.message || abp.ajax.defaultError.message);
|
||||
}
|
||||
},
|
||||
|
||||
handleTargetUrl: function (targetUrl) {
|
||||
if (!targetUrl) {
|
||||
location.href = abp.appPath;
|
||||
} else {
|
||||
location.href = targetUrl;
|
||||
}
|
||||
},
|
||||
|
||||
handleErrorStatusCode: function (status) {
|
||||
switch (status) {
|
||||
case 401:
|
||||
abp.ajax.handleUnAuthorizedRequest(
|
||||
abp.ajax.showError(abp.ajax.defaultError401),
|
||||
abp.appPath
|
||||
);
|
||||
break;
|
||||
case 403:
|
||||
abp.ajax.showError(abp.ajax.defaultError403);
|
||||
break;
|
||||
case 404:
|
||||
abp.ajax.showError(abp.ajax.defaultError404);
|
||||
break;
|
||||
default:
|
||||
abp.ajax.showError(abp.ajax.defaultError);
|
||||
break;
|
||||
}
|
||||
},
|
||||
|
||||
handleNonAbpErrorResponse: function (jqXHR, userOptions, $dfd) {
|
||||
if (userOptions.abpHandleError !== false) {
|
||||
abp.ajax.handleErrorStatusCode(jqXHR.status);
|
||||
}
|
||||
|
||||
$dfd.reject.apply(this, arguments);
|
||||
userOptions.error && userOptions.error.apply(this, arguments);
|
||||
},
|
||||
|
||||
handleAbpErrorResponse: function (jqXHR, userOptions, $dfd) {
|
||||
var messagePromise = null;
|
||||
|
||||
var responseJSON = jqXHR.responseJSON ? jqXHR.responseJSON : JSON.parse(jqXHR.responseText);
|
||||
|
||||
if (userOptions.abpHandleError !== false) {
|
||||
messagePromise = abp.ajax.showError(responseJSON.error);
|
||||
}
|
||||
|
||||
abp.ajax.logError(responseJSON.error);
|
||||
|
||||
$dfd && $dfd.reject(responseJSON.error, jqXHR);
|
||||
userOptions.error && userOptions.error(responseJSON.error, jqXHR);
|
||||
|
||||
if (jqXHR.status === 401 && userOptions.abpHandleError !== false) {
|
||||
abp.ajax.handleUnAuthorizedRequest(messagePromise);
|
||||
}
|
||||
},
|
||||
|
||||
handleUnAuthorizedRequest: function (messagePromise, targetUrl) {
|
||||
if (messagePromise) {
|
||||
messagePromise.done(function () {
|
||||
abp.ajax.handleTargetUrl(targetUrl);
|
||||
});
|
||||
} else {
|
||||
abp.ajax.handleTargetUrl(targetUrl);
|
||||
}
|
||||
},
|
||||
|
||||
blockUI: function (options) {
|
||||
if (options.blockUI) {
|
||||
if (options.blockUI === true) { //block whole page
|
||||
abp.ui.setBusy();
|
||||
} else { //block an element
|
||||
abp.ui.setBusy(options.blockUI);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
unblockUI: function (options) {
|
||||
if (options.blockUI) {
|
||||
if (options.blockUI === true) { //unblock whole page
|
||||
abp.ui.clearBusy();
|
||||
} else { //unblock an element
|
||||
abp.ui.clearBusy(options.blockUI);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
ajaxSendHandler: function (event, request, settings) {
|
||||
var token = abp.security.antiForgery.getToken();
|
||||
if (!token) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!settings.headers || settings.headers[abp.security.antiForgery.tokenHeaderName] === undefined) {
|
||||
request.setRequestHeader(abp.security.antiForgery.tokenHeaderName, token);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
$(document).ajaxSend(function (event, request, settings) {
|
||||
return abp.ajax.ajaxSendHandler(event, request, settings);
|
||||
});
|
||||
|
||||
abp.event.on('abp.configurationInitialized', function () {
|
||||
var l = abp.localization.getResource('AbpUi');
|
||||
|
||||
abp.ajax.defaultError.message = l('DefaultErrorMessage');
|
||||
abp.ajax.defaultError.details = l('DefaultErrorMessageDetail');
|
||||
abp.ajax.defaultError401.message = l('DefaultErrorMessage401');
|
||||
abp.ajax.defaultError401.details = l('DefaultErrorMessage401Detail');
|
||||
abp.ajax.defaultError403.message = l('DefaultErrorMessage403');
|
||||
abp.ajax.defaultError403.details = l('DefaultErrorMessage403Detail');
|
||||
abp.ajax.defaultError404.message = l('DefaultErrorMessage404');
|
||||
abp.ajax.defaultError404.details = l('DefaultErrorMessage404Detail');
|
||||
});
|
||||
|
||||
// RESOURCE LOADER ////////////////////////////////////////////////////////
|
||||
|
||||
/* UrlStates enum */
|
||||
var UrlStates = {
|
||||
LOADING: 'LOADING',
|
||||
LOADED: 'LOADED',
|
||||
FAILED: 'FAILED'
|
||||
};
|
||||
|
||||
/* UrlInfo class */
|
||||
function UrlInfo(url) {
|
||||
this.url = url;
|
||||
this.state = UrlStates.LOADING;
|
||||
this.loadCallbacks = [];
|
||||
this.failCallbacks = [];
|
||||
}
|
||||
|
||||
UrlInfo.prototype.succeed = function () {
|
||||
this.state = UrlStates.LOADED;
|
||||
for (var i = 0; i < this.loadCallbacks.length; i++) {
|
||||
this.loadCallbacks[i]();
|
||||
}
|
||||
};
|
||||
|
||||
UrlInfo.prototype.failed = function () {
|
||||
this.state = UrlStates.FAILED;
|
||||
for (var i = 0; i < this.failCallbacks.length; i++) {
|
||||
this.failCallbacks[i]();
|
||||
}
|
||||
};
|
||||
|
||||
UrlInfo.prototype.handleCallbacks = function (loadCallback, failCallback) {
|
||||
switch (this.state) {
|
||||
case UrlStates.LOADED:
|
||||
loadCallback && loadCallback();
|
||||
break;
|
||||
case UrlStates.FAILED:
|
||||
failCallback && failCallback();
|
||||
break;
|
||||
case UrlStates.LOADING:
|
||||
this.addCallbacks(loadCallback, failCallback);
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
UrlInfo.prototype.addCallbacks = function (loadCallback, failCallback) {
|
||||
loadCallback && this.loadCallbacks.push(loadCallback);
|
||||
failCallback && this.failCallbacks.push(failCallback);
|
||||
};
|
||||
|
||||
/* ResourceLoader API */
|
||||
|
||||
abp.ResourceLoader = (function () {
|
||||
|
||||
var _urlInfos = {};
|
||||
|
||||
function getCacheKey(url) {
|
||||
return url;
|
||||
}
|
||||
|
||||
function appendTimeToUrl(url) {
|
||||
|
||||
if (url.indexOf('?') < 0) {
|
||||
url += '?';
|
||||
} else {
|
||||
url += '&';
|
||||
}
|
||||
|
||||
url += '_=' + new Date().getTime();
|
||||
|
||||
return url;
|
||||
}
|
||||
|
||||
var _loadFromUrl = function (url, loadCallback, failCallback, serverLoader) {
|
||||
|
||||
var cacheKey = getCacheKey(url);
|
||||
|
||||
var urlInfo = _urlInfos[cacheKey];
|
||||
|
||||
if (urlInfo) {
|
||||
urlInfo.handleCallbacks(loadCallback, failCallback);
|
||||
return;
|
||||
}
|
||||
|
||||
_urlInfos[cacheKey] = urlInfo = new UrlInfo(url);
|
||||
urlInfo.addCallbacks(loadCallback, failCallback);
|
||||
|
||||
serverLoader(urlInfo);
|
||||
};
|
||||
|
||||
var _loadScript = function (url, loadCallback, failCallback) {
|
||||
var nonce = document.body.nonce || document.body.getAttribute('nonce');
|
||||
_loadFromUrl(url, loadCallback, failCallback, function (urlInfo) {
|
||||
$.get({
|
||||
url: url,
|
||||
dataType: 'text'
|
||||
})
|
||||
.done(function (script) {
|
||||
if(nonce){
|
||||
$.globalEval(script, { nonce: nonce});
|
||||
}else{
|
||||
$.globalEval(script);
|
||||
}
|
||||
urlInfo.succeed();
|
||||
})
|
||||
.fail(function () {
|
||||
urlInfo.failed();
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
var _loadStyle = function (url) {
|
||||
_loadFromUrl(url, undefined, undefined, function (urlInfo) {
|
||||
|
||||
$('<link/>', {
|
||||
rel: 'stylesheet',
|
||||
type: 'text/css',
|
||||
href: appendTimeToUrl(url)
|
||||
}).appendTo('head');
|
||||
});
|
||||
};
|
||||
|
||||
return {
|
||||
loadScript: _loadScript,
|
||||
loadStyle: _loadStyle
|
||||
}
|
||||
})();
|
||||
|
||||
})(jQuery);
|
46
aspnet-core/src/HospitalManagementSystem.HttpApi.Host/wwwroot/libs/abp/luxon/abp.luxon.js
vendored
Normal file
46
aspnet-core/src/HospitalManagementSystem.HttpApi.Host/wwwroot/libs/abp/luxon/abp.luxon.js
vendored
Normal file
@ -0,0 +1,46 @@
|
||||
var abp = abp || {};
|
||||
(function () {
|
||||
|
||||
if (!luxon) {
|
||||
throw "abp/luxon library requires the luxon library included to the page!";
|
||||
}
|
||||
|
||||
/* TIMING *************************************************/
|
||||
|
||||
abp.timing = abp.timing || {};
|
||||
|
||||
var setObjectValue = function (obj, property, value) {
|
||||
if (typeof property === "string") {
|
||||
property = property.split('.');
|
||||
}
|
||||
|
||||
if (property.length > 1) {
|
||||
var p = property.shift();
|
||||
setObjectValue(obj[p], property, value);
|
||||
} else {
|
||||
obj[property[0]] = value;
|
||||
}
|
||||
}
|
||||
|
||||
var getObjectValue = function (obj, property) {
|
||||
return property.split('.').reduce((a, v) => a[v], obj)
|
||||
}
|
||||
|
||||
abp.timing.convertFieldsToIsoDate = function (form, fields) {
|
||||
for (var field of fields) {
|
||||
var dateTime = luxon.DateTime
|
||||
.fromFormat(
|
||||
getObjectValue(form, field),
|
||||
abp.localization.currentCulture.dateTimeFormat.shortDatePattern,
|
||||
{locale: abp.localization.currentCulture.cultureName}
|
||||
);
|
||||
|
||||
if (!dateTime.invalid) {
|
||||
setObjectValue(form, field, dateTime.toFormat("yyyy-MM-dd HH:mm:ss"))
|
||||
}
|
||||
}
|
||||
|
||||
return form;
|
||||
}
|
||||
|
||||
})(jQuery);
|
694
aspnet-core/src/HospitalManagementSystem.HttpApi.Host/wwwroot/libs/abp/utils/abp-utils.umd.js
vendored
Normal file
694
aspnet-core/src/HospitalManagementSystem.HttpApi.Host/wwwroot/libs/abp/utils/abp-utils.umd.js
vendored
Normal file
@ -0,0 +1,694 @@
|
||||
(function (global, factory) {
|
||||
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('just-compare')) :
|
||||
typeof define === 'function' && define.amd ? define('@abp/utils', ['exports', 'just-compare'], factory) :
|
||||
(global = global || self, factory((global.abp = global.abp || {}, global.abp.utils = global.abp.utils || {}, global.abp.utils.common = {}), global.compare));
|
||||
}(this, (function (exports, compare) { 'use strict';
|
||||
|
||||
compare = compare && Object.prototype.hasOwnProperty.call(compare, 'default') ? compare['default'] : compare;
|
||||
|
||||
/*! *****************************************************************************
|
||||
Copyright (c) Microsoft Corporation.
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for any
|
||||
purpose with or without fee is hereby granted.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
||||
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
||||
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
||||
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
PERFORMANCE OF THIS SOFTWARE.
|
||||
***************************************************************************** */
|
||||
/* global Reflect, Promise */
|
||||
var extendStatics = function (d, b) {
|
||||
extendStatics = Object.setPrototypeOf ||
|
||||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
||||
function (d, b) { for (var p in b)
|
||||
if (b.hasOwnProperty(p))
|
||||
d[p] = b[p]; };
|
||||
return extendStatics(d, b);
|
||||
};
|
||||
function __extends(d, b) {
|
||||
extendStatics(d, b);
|
||||
function __() { this.constructor = d; }
|
||||
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
||||
}
|
||||
var __assign = function () {
|
||||
__assign = Object.assign || function __assign(t) {
|
||||
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
||||
s = arguments[i];
|
||||
for (var p in s)
|
||||
if (Object.prototype.hasOwnProperty.call(s, p))
|
||||
t[p] = s[p];
|
||||
}
|
||||
return t;
|
||||
};
|
||||
return __assign.apply(this, arguments);
|
||||
};
|
||||
function __rest(s, e) {
|
||||
var t = {};
|
||||
for (var p in s)
|
||||
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
||||
t[p] = s[p];
|
||||
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
||||
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
||||
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
||||
t[p[i]] = s[p[i]];
|
||||
}
|
||||
return t;
|
||||
}
|
||||
function __decorate(decorators, target, key, desc) {
|
||||
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
||||
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
|
||||
r = Reflect.decorate(decorators, target, key, desc);
|
||||
else
|
||||
for (var i = decorators.length - 1; i >= 0; i--)
|
||||
if (d = decorators[i])
|
||||
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
||||
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
||||
}
|
||||
function __param(paramIndex, decorator) {
|
||||
return function (target, key) { decorator(target, key, paramIndex); };
|
||||
}
|
||||
function __metadata(metadataKey, metadataValue) {
|
||||
if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
|
||||
return Reflect.metadata(metadataKey, metadataValue);
|
||||
}
|
||||
function __awaiter(thisArg, _arguments, P, generator) {
|
||||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try {
|
||||
step(generator.next(value));
|
||||
}
|
||||
catch (e) {
|
||||
reject(e);
|
||||
} }
|
||||
function rejected(value) { try {
|
||||
step(generator["throw"](value));
|
||||
}
|
||||
catch (e) {
|
||||
reject(e);
|
||||
} }
|
||||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
}
|
||||
function __generator(thisArg, body) {
|
||||
var _ = { label: 0, sent: function () { if (t[0] & 1)
|
||||
throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
||||
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function () { return this; }), g;
|
||||
function verb(n) { return function (v) { return step([n, v]); }; }
|
||||
function step(op) {
|
||||
if (f)
|
||||
throw new TypeError("Generator is already executing.");
|
||||
while (_)
|
||||
try {
|
||||
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)
|
||||
return t;
|
||||
if (y = 0, t)
|
||||
op = [op[0] & 2, t.value];
|
||||
switch (op[0]) {
|
||||
case 0:
|
||||
case 1:
|
||||
t = op;
|
||||
break;
|
||||
case 4:
|
||||
_.label++;
|
||||
return { value: op[1], done: false };
|
||||
case 5:
|
||||
_.label++;
|
||||
y = op[1];
|
||||
op = [0];
|
||||
continue;
|
||||
case 7:
|
||||
op = _.ops.pop();
|
||||
_.trys.pop();
|
||||
continue;
|
||||
default:
|
||||
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
|
||||
_ = 0;
|
||||
continue;
|
||||
}
|
||||
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) {
|
||||
_.label = op[1];
|
||||
break;
|
||||
}
|
||||
if (op[0] === 6 && _.label < t[1]) {
|
||||
_.label = t[1];
|
||||
t = op;
|
||||
break;
|
||||
}
|
||||
if (t && _.label < t[2]) {
|
||||
_.label = t[2];
|
||||
_.ops.push(op);
|
||||
break;
|
||||
}
|
||||
if (t[2])
|
||||
_.ops.pop();
|
||||
_.trys.pop();
|
||||
continue;
|
||||
}
|
||||
op = body.call(thisArg, _);
|
||||
}
|
||||
catch (e) {
|
||||
op = [6, e];
|
||||
y = 0;
|
||||
}
|
||||
finally {
|
||||
f = t = 0;
|
||||
}
|
||||
if (op[0] & 5)
|
||||
throw op[1];
|
||||
return { value: op[0] ? op[1] : void 0, done: true };
|
||||
}
|
||||
}
|
||||
var __createBinding = Object.create ? (function (o, m, k, k2) {
|
||||
if (k2 === undefined)
|
||||
k2 = k;
|
||||
Object.defineProperty(o, k2, { enumerable: true, get: function () { return m[k]; } });
|
||||
}) : (function (o, m, k, k2) {
|
||||
if (k2 === undefined)
|
||||
k2 = k;
|
||||
o[k2] = m[k];
|
||||
});
|
||||
function __exportStar(m, exports) {
|
||||
for (var p in m)
|
||||
if (p !== "default" && !exports.hasOwnProperty(p))
|
||||
__createBinding(exports, m, p);
|
||||
}
|
||||
function __values(o) {
|
||||
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
||||
if (m)
|
||||
return m.call(o);
|
||||
if (o && typeof o.length === "number")
|
||||
return {
|
||||
next: function () {
|
||||
if (o && i >= o.length)
|
||||
o = void 0;
|
||||
return { value: o && o[i++], done: !o };
|
||||
}
|
||||
};
|
||||
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
||||
}
|
||||
function __read(o, n) {
|
||||
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
||||
if (!m)
|
||||
return o;
|
||||
var i = m.call(o), r, ar = [], e;
|
||||
try {
|
||||
while ((n === void 0 || n-- > 0) && !(r = i.next()).done)
|
||||
ar.push(r.value);
|
||||
}
|
||||
catch (error) {
|
||||
e = { error: error };
|
||||
}
|
||||
finally {
|
||||
try {
|
||||
if (r && !r.done && (m = i["return"]))
|
||||
m.call(i);
|
||||
}
|
||||
finally {
|
||||
if (e)
|
||||
throw e.error;
|
||||
}
|
||||
}
|
||||
return ar;
|
||||
}
|
||||
function __spread() {
|
||||
for (var ar = [], i = 0; i < arguments.length; i++)
|
||||
ar = ar.concat(__read(arguments[i]));
|
||||
return ar;
|
||||
}
|
||||
function __spreadArrays() {
|
||||
for (var s = 0, i = 0, il = arguments.length; i < il; i++)
|
||||
s += arguments[i].length;
|
||||
for (var r = Array(s), k = 0, i = 0; i < il; i++)
|
||||
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
|
||||
r[k] = a[j];
|
||||
return r;
|
||||
}
|
||||
;
|
||||
function __await(v) {
|
||||
return this instanceof __await ? (this.v = v, this) : new __await(v);
|
||||
}
|
||||
function __asyncGenerator(thisArg, _arguments, generator) {
|
||||
if (!Symbol.asyncIterator)
|
||||
throw new TypeError("Symbol.asyncIterator is not defined.");
|
||||
var g = generator.apply(thisArg, _arguments || []), i, q = [];
|
||||
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
|
||||
function verb(n) { if (g[n])
|
||||
i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
|
||||
function resume(n, v) { try {
|
||||
step(g[n](v));
|
||||
}
|
||||
catch (e) {
|
||||
settle(q[0][3], e);
|
||||
} }
|
||||
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
|
||||
function fulfill(value) { resume("next", value); }
|
||||
function reject(value) { resume("throw", value); }
|
||||
function settle(f, v) { if (f(v), q.shift(), q.length)
|
||||
resume(q[0][0], q[0][1]); }
|
||||
}
|
||||
function __asyncDelegator(o) {
|
||||
var i, p;
|
||||
return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
|
||||
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
|
||||
}
|
||||
function __asyncValues(o) {
|
||||
if (!Symbol.asyncIterator)
|
||||
throw new TypeError("Symbol.asyncIterator is not defined.");
|
||||
var m = o[Symbol.asyncIterator], i;
|
||||
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
|
||||
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
|
||||
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function (v) { resolve({ value: v, done: d }); }, reject); }
|
||||
}
|
||||
function __makeTemplateObject(cooked, raw) {
|
||||
if (Object.defineProperty) {
|
||||
Object.defineProperty(cooked, "raw", { value: raw });
|
||||
}
|
||||
else {
|
||||
cooked.raw = raw;
|
||||
}
|
||||
return cooked;
|
||||
}
|
||||
;
|
||||
var __setModuleDefault = Object.create ? (function (o, v) {
|
||||
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||||
}) : function (o, v) {
|
||||
o["default"] = v;
|
||||
};
|
||||
function __importStar(mod) {
|
||||
if (mod && mod.__esModule)
|
||||
return mod;
|
||||
var result = {};
|
||||
if (mod != null)
|
||||
for (var k in mod)
|
||||
if (Object.hasOwnProperty.call(mod, k))
|
||||
__createBinding(result, mod, k);
|
||||
__setModuleDefault(result, mod);
|
||||
return result;
|
||||
}
|
||||
function __importDefault(mod) {
|
||||
return (mod && mod.__esModule) ? mod : { default: mod };
|
||||
}
|
||||
function __classPrivateFieldGet(receiver, privateMap) {
|
||||
if (!privateMap.has(receiver)) {
|
||||
throw new TypeError("attempted to get private field on non-instance");
|
||||
}
|
||||
return privateMap.get(receiver);
|
||||
}
|
||||
function __classPrivateFieldSet(receiver, privateMap, value) {
|
||||
if (!privateMap.has(receiver)) {
|
||||
throw new TypeError("attempted to set private field on non-instance");
|
||||
}
|
||||
privateMap.set(receiver, value);
|
||||
return value;
|
||||
}
|
||||
|
||||
var ListNode = /** @class */ (function () {
|
||||
function ListNode(value) {
|
||||
this.value = value;
|
||||
}
|
||||
return ListNode;
|
||||
}());
|
||||
var LinkedList = /** @class */ (function () {
|
||||
function LinkedList() {
|
||||
this.size = 0;
|
||||
}
|
||||
Object.defineProperty(LinkedList.prototype, "head", {
|
||||
get: function () {
|
||||
return this.first;
|
||||
},
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
Object.defineProperty(LinkedList.prototype, "tail", {
|
||||
get: function () {
|
||||
return this.last;
|
||||
},
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
Object.defineProperty(LinkedList.prototype, "length", {
|
||||
get: function () {
|
||||
return this.size;
|
||||
},
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
LinkedList.prototype.attach = function (value, previousNode, nextNode) {
|
||||
if (!previousNode)
|
||||
return this.addHead(value);
|
||||
if (!nextNode)
|
||||
return this.addTail(value);
|
||||
var node = new ListNode(value);
|
||||
node.previous = previousNode;
|
||||
previousNode.next = node;
|
||||
node.next = nextNode;
|
||||
nextNode.previous = node;
|
||||
this.size++;
|
||||
return node;
|
||||
};
|
||||
LinkedList.prototype.attachMany = function (values, previousNode, nextNode) {
|
||||
if (!values.length)
|
||||
return [];
|
||||
if (!previousNode)
|
||||
return this.addManyHead(values);
|
||||
if (!nextNode)
|
||||
return this.addManyTail(values);
|
||||
var list = new LinkedList();
|
||||
list.addManyTail(values);
|
||||
list.first.previous = previousNode;
|
||||
previousNode.next = list.first;
|
||||
list.last.next = nextNode;
|
||||
nextNode.previous = list.last;
|
||||
this.size += values.length;
|
||||
return list.toNodeArray();
|
||||
};
|
||||
LinkedList.prototype.detach = function (node) {
|
||||
if (!node.previous)
|
||||
return this.dropHead();
|
||||
if (!node.next)
|
||||
return this.dropTail();
|
||||
node.previous.next = node.next;
|
||||
node.next.previous = node.previous;
|
||||
this.size--;
|
||||
return node;
|
||||
};
|
||||
LinkedList.prototype.add = function (value) {
|
||||
var _this = this;
|
||||
return {
|
||||
after: function () {
|
||||
var _a;
|
||||
var params = [];
|
||||
for (var _i = 0; _i < arguments.length; _i++) {
|
||||
params[_i] = arguments[_i];
|
||||
}
|
||||
return (_a = _this.addAfter).call.apply(_a, __spread([_this, value], params));
|
||||
},
|
||||
before: function () {
|
||||
var _a;
|
||||
var params = [];
|
||||
for (var _i = 0; _i < arguments.length; _i++) {
|
||||
params[_i] = arguments[_i];
|
||||
}
|
||||
return (_a = _this.addBefore).call.apply(_a, __spread([_this, value], params));
|
||||
},
|
||||
byIndex: function (position) { return _this.addByIndex(value, position); },
|
||||
head: function () { return _this.addHead(value); },
|
||||
tail: function () { return _this.addTail(value); },
|
||||
};
|
||||
};
|
||||
LinkedList.prototype.addMany = function (values) {
|
||||
var _this = this;
|
||||
return {
|
||||
after: function () {
|
||||
var _a;
|
||||
var params = [];
|
||||
for (var _i = 0; _i < arguments.length; _i++) {
|
||||
params[_i] = arguments[_i];
|
||||
}
|
||||
return (_a = _this.addManyAfter).call.apply(_a, __spread([_this, values], params));
|
||||
},
|
||||
before: function () {
|
||||
var _a;
|
||||
var params = [];
|
||||
for (var _i = 0; _i < arguments.length; _i++) {
|
||||
params[_i] = arguments[_i];
|
||||
}
|
||||
return (_a = _this.addManyBefore).call.apply(_a, __spread([_this, values], params));
|
||||
},
|
||||
byIndex: function (position) { return _this.addManyByIndex(values, position); },
|
||||
head: function () { return _this.addManyHead(values); },
|
||||
tail: function () { return _this.addManyTail(values); },
|
||||
};
|
||||
};
|
||||
LinkedList.prototype.addAfter = function (value, previousValue, compareFn) {
|
||||
if (compareFn === void 0) { compareFn = compare; }
|
||||
var previous = this.find(function (node) { return compareFn(node.value, previousValue); });
|
||||
return previous ? this.attach(value, previous, previous.next) : this.addTail(value);
|
||||
};
|
||||
LinkedList.prototype.addBefore = function (value, nextValue, compareFn) {
|
||||
if (compareFn === void 0) { compareFn = compare; }
|
||||
var next = this.find(function (node) { return compareFn(node.value, nextValue); });
|
||||
return next ? this.attach(value, next.previous, next) : this.addHead(value);
|
||||
};
|
||||
LinkedList.prototype.addByIndex = function (value, position) {
|
||||
if (position < 0)
|
||||
position += this.size;
|
||||
else if (position >= this.size)
|
||||
return this.addTail(value);
|
||||
if (position <= 0)
|
||||
return this.addHead(value);
|
||||
var next = this.get(position);
|
||||
return this.attach(value, next.previous, next);
|
||||
};
|
||||
LinkedList.prototype.addHead = function (value) {
|
||||
var node = new ListNode(value);
|
||||
node.next = this.first;
|
||||
if (this.first)
|
||||
this.first.previous = node;
|
||||
else
|
||||
this.last = node;
|
||||
this.first = node;
|
||||
this.size++;
|
||||
return node;
|
||||
};
|
||||
LinkedList.prototype.addTail = function (value) {
|
||||
var node = new ListNode(value);
|
||||
if (this.first) {
|
||||
node.previous = this.last;
|
||||
this.last.next = node;
|
||||
this.last = node;
|
||||
}
|
||||
else {
|
||||
this.first = node;
|
||||
this.last = node;
|
||||
}
|
||||
this.size++;
|
||||
return node;
|
||||
};
|
||||
LinkedList.prototype.addManyAfter = function (values, previousValue, compareFn) {
|
||||
if (compareFn === void 0) { compareFn = compare; }
|
||||
var previous = this.find(function (node) { return compareFn(node.value, previousValue); });
|
||||
return previous ? this.attachMany(values, previous, previous.next) : this.addManyTail(values);
|
||||
};
|
||||
LinkedList.prototype.addManyBefore = function (values, nextValue, compareFn) {
|
||||
if (compareFn === void 0) { compareFn = compare; }
|
||||
var next = this.find(function (node) { return compareFn(node.value, nextValue); });
|
||||
return next ? this.attachMany(values, next.previous, next) : this.addManyHead(values);
|
||||
};
|
||||
LinkedList.prototype.addManyByIndex = function (values, position) {
|
||||
if (position < 0)
|
||||
position += this.size;
|
||||
if (position <= 0)
|
||||
return this.addManyHead(values);
|
||||
if (position >= this.size)
|
||||
return this.addManyTail(values);
|
||||
var next = this.get(position);
|
||||
return this.attachMany(values, next.previous, next);
|
||||
};
|
||||
LinkedList.prototype.addManyHead = function (values) {
|
||||
var _this = this;
|
||||
return values.reduceRight(function (nodes, value) {
|
||||
nodes.unshift(_this.addHead(value));
|
||||
return nodes;
|
||||
}, []);
|
||||
};
|
||||
LinkedList.prototype.addManyTail = function (values) {
|
||||
var _this = this;
|
||||
return values.map(function (value) { return _this.addTail(value); });
|
||||
};
|
||||
LinkedList.prototype.drop = function () {
|
||||
var _this = this;
|
||||
return {
|
||||
byIndex: function (position) { return _this.dropByIndex(position); },
|
||||
byValue: function () {
|
||||
var params = [];
|
||||
for (var _i = 0; _i < arguments.length; _i++) {
|
||||
params[_i] = arguments[_i];
|
||||
}
|
||||
return _this.dropByValue.apply(_this, params);
|
||||
},
|
||||
byValueAll: function () {
|
||||
var params = [];
|
||||
for (var _i = 0; _i < arguments.length; _i++) {
|
||||
params[_i] = arguments[_i];
|
||||
}
|
||||
return _this.dropByValueAll.apply(_this, params);
|
||||
},
|
||||
head: function () { return _this.dropHead(); },
|
||||
tail: function () { return _this.dropTail(); },
|
||||
};
|
||||
};
|
||||
LinkedList.prototype.dropMany = function (count) {
|
||||
var _this = this;
|
||||
return {
|
||||
byIndex: function (position) { return _this.dropManyByIndex(count, position); },
|
||||
head: function () { return _this.dropManyHead(count); },
|
||||
tail: function () { return _this.dropManyTail(count); },
|
||||
};
|
||||
};
|
||||
LinkedList.prototype.dropByIndex = function (position) {
|
||||
if (position < 0)
|
||||
position += this.size;
|
||||
var current = this.get(position);
|
||||
return current ? this.detach(current) : undefined;
|
||||
};
|
||||
LinkedList.prototype.dropByValue = function (value, compareFn) {
|
||||
if (compareFn === void 0) { compareFn = compare; }
|
||||
var position = this.findIndex(function (node) { return compareFn(node.value, value); });
|
||||
return position < 0 ? undefined : this.dropByIndex(position);
|
||||
};
|
||||
LinkedList.prototype.dropByValueAll = function (value, compareFn) {
|
||||
if (compareFn === void 0) { compareFn = compare; }
|
||||
var dropped = [];
|
||||
for (var current = this.first, position = 0; current; position++, current = current.next) {
|
||||
if (compareFn(current.value, value)) {
|
||||
dropped.push(this.dropByIndex(position - dropped.length));
|
||||
}
|
||||
}
|
||||
return dropped;
|
||||
};
|
||||
LinkedList.prototype.dropHead = function () {
|
||||
var head = this.first;
|
||||
if (head) {
|
||||
this.first = head.next;
|
||||
if (this.first)
|
||||
this.first.previous = undefined;
|
||||
else
|
||||
this.last = undefined;
|
||||
this.size--;
|
||||
return head;
|
||||
}
|
||||
return undefined;
|
||||
};
|
||||
LinkedList.prototype.dropTail = function () {
|
||||
var tail = this.last;
|
||||
if (tail) {
|
||||
this.last = tail.previous;
|
||||
if (this.last)
|
||||
this.last.next = undefined;
|
||||
else
|
||||
this.first = undefined;
|
||||
this.size--;
|
||||
return tail;
|
||||
}
|
||||
return undefined;
|
||||
};
|
||||
LinkedList.prototype.dropManyByIndex = function (count, position) {
|
||||
if (count <= 0)
|
||||
return [];
|
||||
if (position < 0)
|
||||
position = Math.max(position + this.size, 0);
|
||||
else if (position >= this.size)
|
||||
return [];
|
||||
count = Math.min(count, this.size - position);
|
||||
var dropped = [];
|
||||
while (count--) {
|
||||
var current = this.get(position);
|
||||
dropped.push(this.detach(current));
|
||||
}
|
||||
return dropped;
|
||||
};
|
||||
LinkedList.prototype.dropManyHead = function (count) {
|
||||
if (count <= 0)
|
||||
return [];
|
||||
count = Math.min(count, this.size);
|
||||
var dropped = [];
|
||||
while (count--)
|
||||
dropped.unshift(this.dropHead());
|
||||
return dropped;
|
||||
};
|
||||
LinkedList.prototype.dropManyTail = function (count) {
|
||||
if (count <= 0)
|
||||
return [];
|
||||
count = Math.min(count, this.size);
|
||||
var dropped = [];
|
||||
while (count--)
|
||||
dropped.push(this.dropTail());
|
||||
return dropped;
|
||||
};
|
||||
LinkedList.prototype.find = function (predicate) {
|
||||
for (var current = this.first, position = 0; current; position++, current = current.next) {
|
||||
if (predicate(current, position, this))
|
||||
return current;
|
||||
}
|
||||
return undefined;
|
||||
};
|
||||
LinkedList.prototype.findIndex = function (predicate) {
|
||||
for (var current = this.first, position = 0; current; position++, current = current.next) {
|
||||
if (predicate(current, position, this))
|
||||
return position;
|
||||
}
|
||||
return -1;
|
||||
};
|
||||
LinkedList.prototype.forEach = function (iteratorFn) {
|
||||
for (var node = this.first, position = 0; node; position++, node = node.next) {
|
||||
iteratorFn(node, position, this);
|
||||
}
|
||||
};
|
||||
LinkedList.prototype.get = function (position) {
|
||||
return this.find(function (_, index) { return position === index; });
|
||||
};
|
||||
LinkedList.prototype.indexOf = function (value, compareFn) {
|
||||
if (compareFn === void 0) { compareFn = compare; }
|
||||
return this.findIndex(function (node) { return compareFn(node.value, value); });
|
||||
};
|
||||
LinkedList.prototype.toArray = function () {
|
||||
var array = new Array(this.size);
|
||||
this.forEach(function (node, index) { return (array[index] = node.value); });
|
||||
return array;
|
||||
};
|
||||
LinkedList.prototype.toNodeArray = function () {
|
||||
var array = new Array(this.size);
|
||||
this.forEach(function (node, index) { return (array[index] = node); });
|
||||
return array;
|
||||
};
|
||||
LinkedList.prototype.toString = function (mapperFn) {
|
||||
if (mapperFn === void 0) { mapperFn = JSON.stringify; }
|
||||
return this.toArray()
|
||||
.map(function (value) { return mapperFn(value); })
|
||||
.join(' <-> ');
|
||||
};
|
||||
// Cannot use Generator type because of ng-packagr
|
||||
LinkedList.prototype[Symbol.iterator] = function () {
|
||||
var node, position;
|
||||
return __generator(this, function (_a) {
|
||||
switch (_a.label) {
|
||||
case 0:
|
||||
node = this.first, position = 0;
|
||||
_a.label = 1;
|
||||
case 1:
|
||||
if (!node) return [3 /*break*/, 4];
|
||||
return [4 /*yield*/, node.value];
|
||||
case 2:
|
||||
_a.sent();
|
||||
_a.label = 3;
|
||||
case 3:
|
||||
position++, node = node.next;
|
||||
return [3 /*break*/, 1];
|
||||
case 4: return [2 /*return*/];
|
||||
}
|
||||
});
|
||||
};
|
||||
return LinkedList;
|
||||
}());
|
||||
|
||||
/*
|
||||
* Public API Surface of utils
|
||||
*/
|
||||
|
||||
/**
|
||||
* Generated bundle index. Do not edit.
|
||||
*/
|
||||
|
||||
exports.LinkedList = LinkedList;
|
||||
exports.ListNode = ListNode;
|
||||
|
||||
Object.defineProperty(exports, '__esModule', { value: true });
|
||||
|
||||
})));
|
||||
//# sourceMappingURL=abp-utils.umd.js.map
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -0,0 +1 @@
|
||||
!function(a){a.fn.datepicker.dates["en-CA"]={days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],today:"Today",monthsTitle:"Months",clear:"Clear",weekStart:0,format:"yyyy-mm-dd"},a.fn.datepicker.deprecated("This filename doesn't follow the convention, use bootstrap-datepicker.en-CA.js instead.")}(jQuery);
|
@ -0,0 +1 @@
|
||||
!function(a){a.fn.datepicker.dates["ar-DZ"]={days:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت","الأحد"],daysShort:["أحد","اثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت","أحد"],daysMin:["ح","ن","ث","ع","خ","ج","س","ح"],months:["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويليه","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],monthsShort:["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويليه","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],today:"هذا اليوم",rtl:!0,monthsTitle:"أشهر",clear:"إزالة",format:"yyyy/mm/dd",weekStart:0}}(jQuery);
|
@ -0,0 +1 @@
|
||||
!function(a){a.fn.datepicker.dates["ar-tn"]={days:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت","الأحد"],daysShort:["أحد","اثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت","أحد"],daysMin:["ح","ن","ث","ع","خ","ج","س","ح"],months:["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويليه","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],monthsShort:["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويليه","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],today:"هذا اليوم",rtl:!0}}(jQuery);
|
@ -0,0 +1 @@
|
||||
!function(a){a.fn.datepicker.dates.ar={days:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت","الأحد"],daysShort:["أحد","اثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت","أحد"],daysMin:["ح","ن","ث","ع","خ","ج","س","ح"],months:["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],monthsShort:["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],today:"هذا اليوم",rtl:!0}}(jQuery);
|
@ -0,0 +1 @@
|
||||
!function(a){a.fn.datepicker.dates.az={days:["Bazar","Bazar ertəsi","Çərşənbə axşamı","Çərşənbə","Cümə axşamı","Cümə","Şənbə"],daysShort:["B.","B.e","Ç.a","Ç.","C.a","C.","Ş."],daysMin:["B.","B.e","Ç.a","Ç.","C.a","C.","Ş."],months:["Yanvar","Fevral","Mart","Aprel","May","İyun","İyul","Avqust","Sentyabr","Oktyabr","Noyabr","Dekabr"],monthsShort:["Yan","Fev","Mar","Apr","May","İyun","İyul","Avq","Sen","Okt","Noy","Dek"],today:"Bu gün",weekStart:1,clear:"Təmizlə",monthsTitle:"Aylar"}}(jQuery);
|
@ -0,0 +1 @@
|
||||
!function(a){a.fn.datepicker.dates.bg={days:["Неделя","Понеделник","Вторник","Сряда","Четвъртък","Петък","Събота"],daysShort:["Нед","Пон","Вто","Сря","Чет","Пет","Съб"],daysMin:["Н","П","В","С","Ч","П","С"],months:["Януари","Февруари","Март","Април","Май","Юни","Юли","Август","Септември","Октомври","Ноември","Декември"],monthsShort:["Ян","Фев","Мар","Апр","Май","Юни","Юли","Авг","Сеп","Окт","Ное","Дек"],today:"днес"}}(jQuery);
|
@ -0,0 +1 @@
|
||||
!function(a){a.fn.datepicker.dates.bm={days:["Kari","Ntɛnɛn","Tarata","Araba","Alamisa","Juma","Sibiri"],daysShort:["Kar","Ntɛ","Tar","Ara","Ala","Jum","Sib"],daysMin:["Ka","Nt","Ta","Ar","Al","Ju","Si"],months:["Zanwuyekalo","Fewuruyekalo","Marisikalo","Awirilikalo","Mɛkalo","Zuwɛnkalo","Zuluyekalo","Utikalo","Sɛtanburukalo","ɔkutɔburukalo","Nowanburukalo","Desanburukalo"],monthsShort:["Zan","Few","Mar","Awi","Mɛ","Zuw","Zul","Uti","Sɛt","ɔku","Now","Des"],today:"Bi",monthsTitle:"Kalo",clear:"Ka jɔsi",weekStart:1,format:"dd/mm/yyyy"}}(jQuery);
|
@ -0,0 +1 @@
|
||||
!function(a){a.fn.datepicker.dates.bn={days:["রবিবার","সোমবার","মঙ্গলবার","বুধবার","বৃহস্পতিবার","শুক্রবার","শনিবার"],daysShort:["রবিবার","সোমবার","মঙ্গলবার","বুধবার","বৃহস্পতিবার","শুক্রবার","শনিবার"],daysMin:["রবি","সোম","মঙ্গল","বুধ","বৃহস্পতি","শুক্র","শনি"],months:["জানুয়ারী","ফেব্রুয়ারি","মার্চ","এপ্রিল","মে","জুন","জুলাই","অগাস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"],monthsShort:["জানুয়ারী","ফেব্রুয়ারি","মার্চ","এপ্রিল","মে","জুন","জুলাই","অগাস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"],today:"আজ",monthsTitle:"মাস",clear:"পরিষ্কার",weekStart:0,format:"mm/dd/yyyy"}}(jQuery);
|
@ -0,0 +1 @@
|
||||
!function(a){a.fn.datepicker.dates.br={days:["Sul","Lun","Meurzh","Merc'her","Yaou","Gwener","Sadorn"],daysShort:["Sul","Lun","Meu.","Mer.","Yao.","Gwe.","Sad."],daysMin:["Su","L","Meu","Mer","Y","G","Sa"],months:["Genver","C'hwevrer","Meurzh","Ebrel","Mae","Mezheven","Gouere","Eost","Gwengolo","Here","Du","Kerzu"],monthsShort:["Genv.","C'hw.","Meur.","Ebre.","Mae","Mezh.","Goue.","Eost","Gwen.","Here","Du","Kerz."],today:"Hiziv",monthsTitle:"Miz",clear:"Dilemel",weekStart:1,format:"dd/mm/yyyy"}}(jQuery);
|
@ -0,0 +1 @@
|
||||
!function(a){a.fn.datepicker.dates.bs={days:["Nedjelja","Ponedjeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"],daysShort:["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],daysMin:["N","Po","U","Sr","Č","Pe","Su"],months:["Januar","Februar","Mart","April","Maj","Juni","Juli","August","Septembar","Oktobar","Novembar","Decembar"],monthsShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],today:"Danas",weekStart:1,format:"dd.mm.yyyy"}}(jQuery);
|
@ -0,0 +1 @@
|
||||
!function(a){a.fn.datepicker.dates.ca={days:["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],daysShort:["dg.","dl.","dt.","dc.","dj.","dv.","ds."],daysMin:["dg","dl","dt","dc","dj","dv","ds"],months:["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre"],monthsShort:["gen.","febr.","març","abr.","maig","juny","jul.","ag.","set.","oct.","nov.","des."],today:"Avui",monthsTitle:"Mesos",clear:"Esborra",weekStart:1,format:"dd/mm/yyyy"}}(jQuery);
|
@ -0,0 +1 @@
|
||||
!function(a){a.fn.datepicker.dates.cs={days:["Neděle","Pondělí","Úterý","Středa","Čtvrtek","Pátek","Sobota"],daysShort:["Ned","Pon","Úte","Stř","Čtv","Pát","Sob"],daysMin:["Ne","Po","Út","St","Čt","Pá","So"],months:["Leden","Únor","Březen","Duben","Květen","Červen","Červenec","Srpen","Září","Říjen","Listopad","Prosinec"],monthsShort:["Led","Úno","Bře","Dub","Kvě","Čer","Čnc","Srp","Zář","Říj","Lis","Pro"],today:"Dnes",clear:"Vymazat",monthsTitle:"Měsíc",weekStart:1,format:"dd.mm.yyyy"}}(jQuery);
|
@ -0,0 +1 @@
|
||||
!function(a){a.fn.datepicker.dates.cy={days:["Sul","Llun","Mawrth","Mercher","Iau","Gwener","Sadwrn"],daysShort:["Sul","Llu","Maw","Mer","Iau","Gwe","Sad"],daysMin:["Su","Ll","Ma","Me","Ia","Gwe","Sa"],months:["Ionawr","Chewfror","Mawrth","Ebrill","Mai","Mehefin","Gorfennaf","Awst","Medi","Hydref","Tachwedd","Rhagfyr"],monthsShort:["Ion","Chw","Maw","Ebr","Mai","Meh","Gor","Aws","Med","Hyd","Tach","Rha"],today:"Heddiw"}}(jQuery);
|
@ -0,0 +1 @@
|
||||
!function(a){a.fn.datepicker.dates.da={days:["Søndag","Mandag","Tirsdag","Onsdag","Torsdag","Fredag","Lørdag"],daysShort:["Søn","Man","Tir","Ons","Tor","Fre","Lør"],daysMin:["Sø","Ma","Ti","On","To","Fr","Lø"],months:["Januar","Februar","Marts","April","Maj","Juni","Juli","August","September","Oktober","November","December"],monthsShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],today:"I Dag",weekStart:1,clear:"Nulstil",format:"dd/mm/yyyy",monthsTitle:"Måneder"}}(jQuery);
|
@ -0,0 +1 @@
|
||||
!function(a){a.fn.datepicker.dates.de={days:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],daysShort:["So","Mo","Di","Mi","Do","Fr","Sa"],daysMin:["So","Mo","Di","Mi","Do","Fr","Sa"],months:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],monthsShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],today:"Heute",monthsTitle:"Monate",clear:"Löschen",weekStart:1,format:"dd.mm.yyyy"}}(jQuery);
|
@ -0,0 +1 @@
|
||||
!function(a){a.fn.datepicker.dates.el={days:["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],daysShort:["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],daysMin:["Κυ","Δε","Τρ","Τε","Πε","Πα","Σα"],months:["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος"],monthsShort:["Ιαν","Φεβ","Μαρ","Απρ","Μάι","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ"],today:"Σήμερα",clear:"Καθαρισμός",weekStart:1,format:"d/m/yyyy"}}(jQuery);
|
@ -0,0 +1 @@
|
||||
!function(a){a.fn.datepicker.dates["en-AU"]={days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],today:"Today",monthsTitle:"Months",clear:"Clear",weekStart:1,format:"d/mm/yyyy"}}(jQuery);
|
@ -0,0 +1 @@
|
||||
!function(a){a.fn.datepicker.dates["en-CA"]={days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],today:"Today",monthsTitle:"Months",clear:"Clear",weekStart:0,format:"yyyy-mm-dd"}}(jQuery);
|
@ -0,0 +1 @@
|
||||
!function(a){a.fn.datepicker.dates["en-GB"]={days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],today:"Today",monthsTitle:"Months",clear:"Clear",weekStart:1,format:"dd/mm/yyyy"}}(jQuery);
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user