Author | SHA1 | Message | Date |
---|---|---|---|
Sandipan Mitra | e65b1f5870 | Patient module added with patient record | 4 days ago |
ranjit | 69a0b38b41 | added libs , and removed blazor | 3 weeks ago |
@ -0,0 +1,212 @@ | |||||
<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-plus-circle"></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> | |||||
<!-- 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"> | |||||
<!-- 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,46 @@ | |||||
/* Adjusting the calendar popup */ | |||||
.small-calendar .p-datepicker { | |||||
width: 200px !important; /* Adjust the width as per your needs */ | |||||
font-size: 12px !important; /* Adjust the font size */ | |||||
} | |||||
.small-calendar .p-datepicker-header { | |||||
padding: 2px !important; /* Adjust the header padding */ | |||||
} | |||||
.small-calendar .p-datepicker-calendar th { | |||||
font-size: 10px !important; /* Smaller font size for the header */ | |||||
} | |||||
.small-calendar .p-datepicker-calendar td { | |||||
font-size: 10px !important; /* Smaller font size for the days */ | |||||
} | |||||
.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; | |||||
} | |||||
@ -0,0 +1,226 @@ | |||||
import { PermissionService } from '@abp/ng.core'; | |||||
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'; | |||||
import { MessageService } from 'primeng/api'; | |||||
@Component({ | |||||
selector: 'app-all-patients', | |||||
templateUrl: './all-patients.component.html', | |||||
styleUrl: './all-patients.component.scss', | |||||
providers: [PatientService, MessageService, 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(); | |||||
uploadfile: { | |||||
file: File[]; | |||||
name: string; | |||||
}[] = []; | |||||
createpermission: boolean; | |||||
editpermission: boolean; | |||||
deletepermission: boolean; | |||||
constructor( | |||||
private patientService: PatientService, | |||||
private http: HttpClient, | |||||
private messageService: MessageService, | |||||
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, | |||||
}; | |||||
} | |||||
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]); | |||||
} | |||||
editPatient(Patient: any) { | |||||
this.patientDialogTitle = 'Edit Patient'; | |||||
this.selectedPatient = { ...Patient }; | |||||
this.selectedgender = this.selectedPatient.gender; | |||||
this.selectedstatus = this.selectedPatient.status; | |||||
this.selectadmissionDate = new Date(this.selectedPatient.admissionDate); | |||||
this.selectdischargeDate = new Date(this.selectedPatient.dischargeDate); | |||||
this.patientDialog = true; | |||||
this.isEditMode = true; | |||||
} | |||||
deletePatient(id: any) { | |||||
this.patientService.deletePatient(id).subscribe(() => { | |||||
this.messageService.add({ | |||||
severity: 'success', | |||||
summary: 'Success', | |||||
detail: 'Patient deleted successfully', | |||||
}); | |||||
this.loadPatient(this.params); | |||||
}); | |||||
} | |||||
savePatient(form: NgForm) { | |||||
debugger; | |||||
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(); | |||||
console.log(this.selectedPatient); | |||||
if (this.isEditMode) { | |||||
this.patientService | |||||
.updatePatient(this.selectedPatient.id, this.selectedPatient) | |||||
.subscribe(() => { | |||||
this.messageService.add({ | |||||
severity: 'success', | |||||
summary: 'Success', | |||||
detail: 'Patient updated successfully', | |||||
}); | |||||
this.patientDialog = false; | |||||
this.loadPatient({ | |||||
first: 0, | |||||
rows: 10, | |||||
sortField: 'id', | |||||
sortOrder: 1, | |||||
globalFilter: null, | |||||
}); | |||||
}); | |||||
} else { | |||||
this.patientService.createPatient(this.selectedPatient).subscribe(() => { | |||||
this.messageService.add({ | |||||
severity: 'success', | |||||
summary: 'Success', | |||||
detail: 'Patient created successfully', | |||||
}); | |||||
this.patientDialog = false; | |||||
this.loadPatient({ | |||||
first: 0, | |||||
rows: 10, | |||||
sortField: 'id', | |||||
sortOrder: 1, | |||||
globalFilter: null, | |||||
}); | |||||
}); | |||||
} | |||||
} | |||||
closeDialog() { | |||||
this.patientDialog = false; | |||||
} | |||||
} |
@ -0,0 +1,266 @@ | |||||
<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>Status:</strong> | |||||
<span class="status" [ngClass]="{'active': patientdto?.status === 'Active', 'inactive': patientdto?.status === 'Inactive'}"> | |||||
{{ status[patientdto?.status] }} | |||||
</span> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<div> | |||||
<p-table #dt2 dataKey="id" [value]="patientrecords" [paginator]="true" [rows]="10" [totalRecords]="totalRecords" | |||||
[lazy]="true" (onLazyLoad)="loadPatient($event,userid)" [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> | |||||
</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> | |||||
</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> | |||||
</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,96 @@ | |||||
.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; | |||||
} | |||||
.status { | |||||
font-weight: bold; | |||||
padding: 4px 8px; | |||||
border-radius: 4px; | |||||
} | |||||
.status.active { | |||||
background: #28a745; | |||||
color: white; | |||||
} | |||||
.status.inactive { | |||||
background: #dc3545; | |||||
color: white; | |||||
} | |||||
@ -0,0 +1,254 @@ | |||||
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 { MessageService } from 'primeng/api'; | |||||
import { PermissionService } from '@abp/ng.core'; | |||||
import { ActivatedRoute } from '@angular/router'; | |||||
@Component({ | |||||
selector: 'app-patient-record', | |||||
templateUrl: './patient-record.component.html', | |||||
styleUrl: './patient-record.component.scss', | |||||
providers: [PatientService, MessageService, 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(); | |||||
uploadfile: { | |||||
file: File[]; | |||||
name: string; | |||||
}[] = []; | |||||
createpermission: boolean; | |||||
editpermission: boolean; | |||||
deletepermission: boolean; | |||||
userid: any; | |||||
patientImageUrl: string; | |||||
constructor( | |||||
private patientService: PatientService, | |||||
private messageService: MessageService, | |||||
private permissionChecker: PermissionService, | |||||
private route: ActivatedRoute | |||||
) {} | |||||
ngOnInit() { | |||||
this.userid = this.route.snapshot.paramMap.get('id'); | |||||
console.log(this.userid); | |||||
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.userid, | |||||
dateOfAdmission: '', | |||||
labReportUrl: '', | |||||
medicationUrl: '', | |||||
medicationHistoryUrl: '', | |||||
nextFollowUp: '', | |||||
diagnosis: '', | |||||
treatmentPlan: '', | |||||
doctorNotes: '', | |||||
insuranceProvider: '', | |||||
status: Status.InTreatment, | |||||
}; | |||||
} | |||||
loadPatient(event: any, id: any) { | |||||
this.selectedPatient.patientId = this.userid; | |||||
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.userid).subscribe(result => { | |||||
this.patientdto = result; | |||||
}); | |||||
this.patientService.getPatientRecordList(this.params, id).subscribe(data => { | |||||
this.patientrecords = data.items; | |||||
this.totalRecords = data.totalCount; | |||||
this.loading = false; | |||||
}); | |||||
} | |||||
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.patientDialogTitle = 'Edit Patient'; | |||||
this.selectedPatient = { ...Patient }; | |||||
this.selectedPatient.patientId = this.userid; | |||||
this.selectdateOfAdmission = new Date(this.selectedPatient.dateOfAdmission); | |||||
this.selectnextFollowUp = new Date(this.selectedPatient.nextFollowUp); | |||||
this.patientDialog = true; | |||||
this.isEditMode = true; | |||||
console.log(this.selectedPatient); | |||||
} | |||||
deletePatient(id: any) { | |||||
this.patientService.deletePatientRecord(id).subscribe(() => { | |||||
this.messageService.add({ | |||||
severity: 'success', | |||||
summary: 'Success', | |||||
detail: 'Patient deleted successfully', | |||||
}); | |||||
this.loadPatient(this.params, this.userid); | |||||
}); | |||||
} | |||||
// handleLabReportUpload(event: any): void { | |||||
// const input = event.target as HTMLInputElement; | |||||
// console.log(input); | |||||
// const files: File[] = event.files; // Files uploaded | |||||
// this.addToUploadList(files, 'Lab-Report'); | |||||
// } | |||||
handleLabReportUpload(event: Event): void { | |||||
const input = event.target as HTMLInputElement; | |||||
if (input && input.files) { | |||||
const files: File[] = Array.from(input.files); // Convert FileList to an array of File | |||||
this.addToUploadList(files, 'Lab-Report'); | |||||
} else { | |||||
console.error('No files selected'); | |||||
} | |||||
} | |||||
handleMedicationsUpload(event: any): void { | |||||
const files: File[] = event.files; // Files uploaded | |||||
this.addToUploadList(files, 'Medications'); | |||||
} | |||||
handleMedicationHistoryUpload(event: any): void { | |||||
const files: File[] = event.files; // Files uploaded | |||||
this.addToUploadList(files, 'Medication-History'); | |||||
} | |||||
private addToUploadList(files: File[], name: string): void { | |||||
const existingIndex = this.uploadfile.findIndex(item => item.name === name); | |||||
if (existingIndex > -1) { | |||||
this.uploadfile[existingIndex].file = files; | |||||
} else { | |||||
this.uploadfile.push({ file: files, name }); | |||||
} | |||||
console.log(this.uploadfile); | |||||
} | |||||
savePatient(form: NgForm) { | |||||
// console.log(form); | |||||
this.selectedPatient.patientId = this.userid; | |||||
this.selectedPatient.status = this.patientdto.status; | |||||
this.selectedPatient.dateOfAdmission = this.selectdateOfAdmission.toDateString(); | |||||
this.selectedPatient.nextFollowUp = this.selectnextFollowUp.toDateString(); | |||||
if (this.isEditMode) { | |||||
this.patientService | |||||
.updatePatientRecord(this.selectedPatient.id, this.selectedPatient) | |||||
.subscribe(() => { | |||||
this.messageService.add({ | |||||
severity: 'success', | |||||
summary: 'Success', | |||||
detail: 'Patient updated successfully', | |||||
}); | |||||
this.patientDialog = false; | |||||
this.loadPatient( | |||||
{ | |||||
first: 0, | |||||
rows: 10, | |||||
sortField: 'id', | |||||
sortOrder: 1, | |||||
globalFilter: null, | |||||
}, | |||||
this.userid | |||||
); | |||||
}); | |||||
} else { | |||||
this.patientService.createPatientRecord(this.selectedPatient).subscribe(() => { | |||||
this.messageService.add({ | |||||
severity: 'success', | |||||
summary: 'Success', | |||||
detail: 'Patient created successfully', | |||||
}); | |||||
this.patientDialog = false; | |||||
this.loadPatient( | |||||
{ | |||||
first: 0, | |||||
rows: 10, | |||||
sortField: 'id', | |||||
sortOrder: 1, | |||||
globalFilter: null, | |||||
}, | |||||
this.userid | |||||
); | |||||
}); | |||||
} | |||||
} | |||||
closeDialog() { | |||||
this.patientDialog = false; | |||||
} | |||||
} |
@ -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 {} |
@ -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 {} |
@ -0,0 +1 @@ | |||||
export * from './models'; |
@ -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; | |||||
} |
@ -0,0 +1,8 @@ | |||||
import { mapEnumToOptions } from '@abp/ng.core'; | |||||
export enum Gender { | |||||
Male = 1, | |||||
Female = 2, | |||||
} | |||||
export const genderOptions = mapEnumToOptions(Gender); |
@ -0,0 +1,2 @@ | |||||
export * from './gender.enum'; | |||||
export * from './status.enum'; |
@ -0,0 +1,9 @@ | |||||
import { mapEnumToOptions } from '@abp/ng.core'; | |||||
export enum Status { | |||||
Recovered = 1, | |||||
Observation = 2, | |||||
InTreatment = 3, | |||||
} | |||||
export const statusOptions = mapEnumToOptions(Status); |
@ -0,0 +1,4 @@ | |||||
import * as Dto from './dto'; | |||||
import * as GlobalEnum from './global-enum'; | |||||
import * as Patients from './patients'; | |||||
export { Dto, GlobalEnum, Patients }; |
@ -0,0 +1 @@ | |||||
export * from './models'; |
@ -0,0 +1,65 @@ | |||||
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; | |||||
} | |||||
export interface CreateUpdatePatientRecordDto { | |||||
id?: string; | |||||
patientId?: string; | |||||
dateOfAdmission?: string; | |||||
labReportUrl?: string; | |||||
medicationUrl?: string; | |||||
medicationHistoryUrl?: 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; | |||||
} | |||||
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; | |||||
} |
@ -0,0 +1,3 @@ | |||||
import * as Dto from './dto'; | |||||
export * from './patient.service'; | |||||
export { Dto }; |
@ -0,0 +1,124 @@ | |||||
import type { CreateUpdatePatientDto, CreateUpdatePatientRecordDto, PatientDto, PatientRecordDto } from './dto/models'; | |||||
import { RestService, Rest } from '@abp/ng.core'; | |||||
import type { PagedResultDto } from '@abp/ng.core'; | |||||
import { Injectable } from '@angular/core'; | |||||
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 }); | |||||
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 }); | |||||
constructor(private restService: RestService) {} | |||||
} |
@ -0,0 +1,27 @@ | |||||
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; } | |||||
} | |||||
} |
@ -0,0 +1,46 @@ | |||||
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 string FullName { get; set; } | |||||
//public string Mobile { get; set; } | |||||
//public Gender Gender { get; set; } | |||||
public Guid PatientId { get; set; } | |||||
public DateTime DateOfAdmission { get; set; } | |||||
public string? LabReportUrl { get; set; } | |||||
public string? MedicationUrl { get; set; } | |||||
public string? MedicationHistoryUrl { 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,26 @@ | |||||
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; } | |||||
} | |||||
} |
@ -0,0 +1,48 @@ | |||||
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 string FullName { get; set; } | |||||
//public string Mobile { get; set; } | |||||
//public Gender Gender { 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; } | |||||
} | |||||
} |
@ -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,347 @@ | |||||
using ClosedXML.Excel; | |||||
using HospitalManagementSystem.Dto; | |||||
using HospitalManagementSystem.GlobalEnum; | |||||
using HospitalManagementSystem.Patients.Dto; | |||||
using HospitalManagementSystem.Permissions; | |||||
using Microsoft.AspNetCore.Authorization; | |||||
using Microsoft.EntityFrameworkCore; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.IO; | |||||
using System.Linq; | |||||
using System.Linq.Dynamic.Core; | |||||
using System.Threading.Tasks; | |||||
using Volo.Abp.Application.Dtos; | |||||
using Volo.Abp.Application.Services; | |||||
using Volo.Abp.Domain.Repositories; | |||||
namespace HospitalManagementSystem.Patients | |||||
{ | |||||
public class PatientAppService : ApplicationService | |||||
{ | |||||
private IRepository<PatientRecord, Guid> _patientrecordRepository; | |||||
private IRepository<Patient, Guid> _patientRepository; | |||||
public PatientAppService(IRepository<PatientRecord, Guid> patientrecordRepository, IRepository<Patient, Guid> patientRepository) | |||||
{ | |||||
_patientrecordRepository = patientrecordRepository; | |||||
_patientRepository = patientRepository; | |||||
} | |||||
#region PatientRecord | |||||
#region Get Patient List with Paging and Searching | |||||
[Authorize(HospitalManagementSystemPermissions.Patient.Default)] | |||||
public async Task<PagedResultDto<PatientRecordDto>> GetPatientRecordListAsync(PagingSortPatientResultDto input, Guid Id) | |||||
{ | |||||
//List<PatientRecord>? query; | |||||
//query = _patientrecordRepository.GetQueryableAsync().Result | |||||
// .Include(x => x.Patients) | |||||
// .WhereIf(!String.IsNullOrEmpty(input.Search), x => x.Patients.Name.ToLower().Contains(input.Search.ToLower())) | |||||
// .Where(x => x.Patients.Id == Id) | |||||
// .OrderBy(input.Sorting ?? (nameof(PatientRecord.Id) + " asc")) | |||||
// .Skip(input.SkipCount) | |||||
// .Take(input.MaxResultCount) | |||||
// .ToList(); | |||||
//var totalCount = await _patientrecordRepository.CountAsync(); | |||||
//return new PagedResultDto<PatientRecordDto>( | |||||
// totalCount, | |||||
// ObjectMapper.Map<List<PatientRecord>, List<PatientRecordDto>>(query) | |||||
//); | |||||
var queryable = await _patientrecordRepository.GetQueryableAsync(); | |||||
var filteredQuery = queryable | |||||
.Include(x => x.Patients) | |||||
.WhereIf(!string.IsNullOrEmpty(input.Search), x => x.Patients.Name.ToLower().Contains(input.Search.ToLower())) | |||||
.Where(x => x.Patients.Id == Id); | |||||
// Get total count after filtering | |||||
var totalCount = await filteredQuery.CountAsync(); | |||||
// Apply sorting dynamically (ensure input.Sorting is valid) | |||||
filteredQuery = !string.IsNullOrEmpty(input.Sorting) | |||||
? filteredQuery.OrderBy(input.Sorting) | |||||
: filteredQuery.OrderBy(x => x.Id); | |||||
// Apply paging | |||||
var pagedQuery = await filteredQuery | |||||
.Skip(input.SkipCount) | |||||
.Take(input.MaxResultCount) | |||||
.ToListAsync(); | |||||
return new PagedResultDto<PatientRecordDto>( | |||||
totalCount, | |||||
ObjectMapper.Map<List<PatientRecord>, List<PatientRecordDto>>(pagedQuery) | |||||
); | |||||
} | |||||
#endregion | |||||
#region Get Single Patient by Id | |||||
[Authorize(HospitalManagementSystemPermissions.Patient.Default)] | |||||
public async Task<PatientRecordDto> GetPatientRecordByIdAsync(Guid id) | |||||
{ | |||||
var patient = await _patientrecordRepository.GetAsync(id); | |||||
return ObjectMapper.Map<PatientRecord, PatientRecordDto>(patient); | |||||
} | |||||
#endregion | |||||
#region Export Patient Data to Excel | |||||
public async Task<FileDownloadDto> GetExportPatientRecordAsync() | |||||
{ | |||||
var patients = await _patientrecordRepository.GetListAsync(); | |||||
var folderPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "exports"); | |||||
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 = "Status"; | |||||
for (int i = 0; i < patients.Count; i++) | |||||
{ | |||||
worksheet.Cell(i + 2, 1).Value = patients[i].Patients.Name; | |||||
worksheet.Cell(i + 2, 2).Value = patients[i].Patients.Gender.ToString(); | |||||
worksheet.Cell(i + 2, 3).Value = patients[i].DateOfAdmission.ToShortDateString(); | |||||
worksheet.Cell(i + 2, 4).Value = patients[i].Diagnosis; | |||||
worksheet.Cell(i + 2, 5).Value = patients[i].NextFollowUp?.ToShortDateString(); | |||||
worksheet.Cell(i + 2, 6).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) // 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; // Assign the fetched entity | |||||
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) | |||||
{ | |||||
var patientRecord = await _patientrecordRepository.GetAsync(id); | |||||
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); | |||||
patientRecord = await _patientrecordRepository.UpdateAsync(patientRecord); | |||||
return ObjectMapper.Map<PatientRecord, PatientRecordDto>(patientRecord); | |||||
} | |||||
#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.GetAsync(id); | |||||
return ObjectMapper.Map<Patient, PatientDto>(patient); | |||||
} | |||||
#endregion | |||||
#region Export Patient Data to Excel | |||||
public async Task<FileDownloadDto> GetExportPatientDataAsync() | |||||
{ | |||||
var patients = await _patientRepository.GetListAsync(); | |||||
var folderPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "exports"); | |||||
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 = "Treatment"; | |||||
worksheet.Cell(1, 5).Value = "Doctor Assigned"; | |||||
worksheet.Cell(1, 6).Value = "Admission Date"; | |||||
worksheet.Cell(1, 7).Value = "Discharge Date"; | |||||
worksheet.Cell(1, 8).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].Treatment; | |||||
worksheet.Cell(i + 2, 5).Value = patients[i].DoctorAssigned; | |||||
worksheet.Cell(i + 2, 6).Value = patients[i].AdmissionDate.ToShortDateString(); | |||||
worksheet.Cell(i + 2, 7).Value = patients[i].DischargeDate?.ToShortDateString(); | |||||
worksheet.Cell(i + 2, 8).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); | |||||
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.GetAsync(id); | |||||
ObjectMapper.Map(input, patient); | |||||
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 | |||||
} | |||||
} |
@ -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,22 @@ | |||||
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 | |||||
} | |||||
} |
@ -0,0 +1,36 @@ | |||||
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; } | |||||
} | |||||
} | |||||
@ -0,0 +1,48 @@ | |||||
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; | |||||
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 string? LabReportUrl { get; set; } | |||||
public string? MedicationUrl { get; set; } | |||||
public string? MedicationHistoryUrl { get; set; } | |||||
public DateTime? NextFollowUp { get; set; } | |||||
public string InsuranceProvider { get; set; } | |||||
[Required] | |||||
public Status Status { get; set; } | |||||
} | |||||
} |
@ -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"); | |||||
} | |||||
} | |||||
} |
@ -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; | |||||
} |
@ -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; | |||||
} | |||||
})(); |
@ -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); |
@ -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); |
@ -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 |
@ -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); |
@ -0,0 +1 @@ | |||||
!function(a){a.fn.datepicker.dates["en-IE"]={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); |
@ -0,0 +1 @@ | |||||
!function(a){a.fn.datepicker.dates["en-NZ"]={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-US"]={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:"m/d/yyyy"}}(jQuery); |
@ -0,0 +1 @@ | |||||
!function(a){a.fn.datepicker.dates["en-ZA"]={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:"yyyy/mm/d"}}(jQuery); |
@ -0,0 +1 @@ | |||||
!function(a){a.fn.datepicker.dates.eo={days:["dimanĉo","lundo","mardo","merkredo","ĵaŭdo","vendredo","sabato"],daysShort:["dim.","lun.","mar.","mer.","ĵaŭ.","ven.","sam."],daysMin:["d","l","ma","me","ĵ","v","s"],months:["januaro","februaro","marto","aprilo","majo","junio","julio","aŭgusto","septembro","oktobro","novembro","decembro"],monthsShort:["jan.","feb.","mar.","apr.","majo","jun.","jul.","aŭg.","sep.","okt.","nov.","dec."],today:"Hodiaŭ",clear:"Nuligi",weekStart:1,format:"yyyy-mm-dd"}}(jQuery); |
@ -0,0 +1 @@ | |||||
!function(a){a.fn.datepicker.dates.es={days:["Domingo","Lunes","Martes","Miércoles","Jueves","Viernes","Sábado"],daysShort:["Dom","Lun","Mar","Mié","Jue","Vie","Sáb"],daysMin:["Do","Lu","Ma","Mi","Ju","Vi","Sa"],months:["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"],monthsShort:["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"],today:"Hoy",monthsTitle:"Meses",clear:"Borrar",weekStart:1,format:"dd/mm/yyyy"}}(jQuery); |
@ -0,0 +1 @@ | |||||
!function(a){a.fn.datepicker.dates.et={days:["Pühapäev","Esmaspäev","Teisipäev","Kolmapäev","Neljapäev","Reede","Laupäev"],daysShort:["Pühap","Esmasp","Teisip","Kolmap","Neljap","Reede","Laup"],daysMin:["P","E","T","K","N","R","L"],months:["Jaanuar","Veebruar","Märts","Aprill","Mai","Juuni","Juuli","August","September","Oktoober","November","Detsember"],monthsShort:["Jaan","Veebr","Märts","Apr","Mai","Juuni","Juuli","Aug","Sept","Okt","Nov","Dets"],today:"Täna",clear:"Tühjenda",weekStart:1,format:"dd.mm.yyyy"}}(jQuery); |
@ -0,0 +1 @@ | |||||
!function(a){a.fn.datepicker.dates.eu={days:["Igandea","Astelehena","Asteartea","Asteazkena","Osteguna","Ostirala","Larunbata"],daysShort:["Ig","Al","Ar","Az","Og","Ol","Lr"],daysMin:["Ig","Al","Ar","Az","Og","Ol","Lr"],months:["Urtarrila","Otsaila","Martxoa","Apirila","Maiatza","Ekaina","Uztaila","Abuztua","Iraila","Urria","Azaroa","Abendua"],monthsShort:["Urt","Ots","Mar","Api","Mai","Eka","Uzt","Abu","Ira","Urr","Aza","Abe"],today:"Gaur",monthsTitle:"Hilabeteak",clear:"Ezabatu",weekStart:1,format:"yyyy/mm/dd"}}(jQuery); |
@ -0,0 +1 @@ | |||||
!function(a){a.fn.datepicker.dates.fa={days:["یکشنبه","دوشنبه","سهشنبه","چهارشنبه","پنجشنبه","جمعه","شنبه","یکشنبه"],daysShort:["یک","دو","سه","چهار","پنج","جمعه","شنبه","یک"],daysMin:["ی","د","س","چ","پ","ج","ش","ی"],months:["ژانویه","فوریه","مارس","آوریل","مه","ژوئن","ژوئیه","اوت","سپتامبر","اکتبر","نوامبر","دسامبر"],monthsShort:["ژان","فور","مار","آور","مه","ژون","ژوی","اوت","سپت","اکت","نوا","دسا"],today:"امروز",clear:"پاک کن",weekStart:1,format:"yyyy/mm/dd"}}(jQuery); |
@ -0,0 +1 @@ | |||||
!function(a){a.fn.datepicker.dates.fi={days:["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"],daysShort:["sun","maa","tii","kes","tor","per","lau"],daysMin:["su","ma","ti","ke","to","pe","la"],months:["tammikuu","helmikuu","maaliskuu","huhtikuu","toukokuu","kesäkuu","heinäkuu","elokuu","syyskuu","lokakuu","marraskuu","joulukuu"],monthsShort:["tammi","helmi","maalis","huhti","touko","kesä","heinä","elo","syys","loka","marras","joulu"],today:"tänään",clear:"Tyhjennä",weekStart:1,format:"d.m.yyyy"}}(jQuery); |
@ -0,0 +1 @@ | |||||
!function(a){a.fn.datepicker.dates.fo={days:["Sunnudagur","Mánadagur","Týsdagur","Mikudagur","Hósdagur","Fríggjadagur","Leygardagur"],daysShort:["Sun","Mán","Týs","Mik","Hós","Frí","Ley"],daysMin:["Su","Má","Tý","Mi","Hó","Fr","Le"],months:["Januar","Februar","Marts","Apríl","Mei","Juni","Juli","August","Septembur","Oktobur","Novembur","Desembur"],monthsShort:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des"],today:"Í Dag",clear:"Reinsa"}}(jQuery); |
@ -0,0 +1 @@ | |||||
!function(a){a.fn.datepicker.dates.fr={days:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],daysShort:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],daysMin:["D","L","Ma","Me","J","V","S"],months:["Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre"],monthsShort:["Jan","Fév","Mar","Avr","Mai","Jui","Jul","Aou","Sep","Oct","Nov","Déc"],today:"Aujourd'hui",monthsTitle:"Mois",clear:"Effacer",weekStart:1,format:"dd.mm.yyyy"}}(jQuery); |
@ -0,0 +1 @@ | |||||
!function(a){a.fn.datepicker.dates.fr={days:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],daysShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],daysMin:["d","l","ma","me","j","v","s"],months:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthsShort:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."],today:"Aujourd'hui",monthsTitle:"Mois",clear:"Effacer",weekStart:1,format:"dd/mm/yyyy"}}(jQuery); |