luthor/otis/src/app/cases/case-detail/case-detail.component.ts

420 lines
14 KiB
TypeScript

import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core';
import { FormBuilder, FormControl, FormGroup } from '@angular/forms';
import { MatDialog } from '@angular/material/dialog';
import { ActivatedRoute, Router } from '@angular/router';
import * as moment from 'moment';
import { BehaviorSubject, Observable } from 'rxjs';
import { distinctUntilChanged, startWith, switchMap } from 'rxjs/operators';
import { Act } from '../../core/act';
import { Case } from '../../core/case';
import { CaseSource } from '../../core/case-source';
import { CaseType } from '../../core/case-type';
import { Court } from '../../core/court';
import { CourtStatus } from '../../core/court-status';
import { Department } from '../../core/department';
import { Hearing } from '../../core/hearing';
import { Nature } from '../../core/nature';
import { Office } from '../../core/office';
import { OfficeStatus } from '../../core/office-status';
import { ToasterService } from '../../core/toaster.service';
import { ConfirmDialogComponent } from '../../shared/confirm-dialog/confirm-dialog.component';
import { CaseService } from '../case.service';
import { HearingDatasource } from './case-detail-datasource';
import { HearingDialogComponent } from './hearing-dialog.component';
@Component({
selector: 'app-case-detail',
templateUrl: './case-detail.component.html',
styleUrls: ['./case-detail.component.css'],
})
export class CaseDetailComponent implements OnInit, AfterViewInit {
@ViewChild('nameElement', { static: true }) nameElement?: ElementRef;
public hearingsObservable = new BehaviorSubject<Hearing[]>([]);
dataSource: HearingDatasource = new HearingDatasource(this.hearingsObservable);
form: FormGroup;
caseSources: CaseSource[] = [];
caseTypes: CaseType[] = [];
courts: Court[] = [];
departments: Department[] = [];
offices: Observable<Office[]> = new Observable<Office[]>();
courtStatuses: CourtStatus[] = [];
officeStatuses: OfficeStatus[] = [];
acts: Act[] = [];
natures: Nature[] = [];
item: Case = new Case();
displayedColumns = [
'itemNumber',
'bench',
'courtStatus',
'proceedings',
'complianceDate',
'nextHearingDate',
'action',
];
constructor(
private route: ActivatedRoute,
private router: Router,
private dialog: MatDialog,
private fb: FormBuilder,
private toaster: ToasterService,
private ser: CaseService,
) {
// Create form
this.form = this.fb.group({
caseSource: '',
officeFileNumber: '',
courtCaseNumber: '',
year: '',
title: '',
docketNumber: '',
receiptDate: '',
limitationDate: '',
filingDate: '',
appearOnBehalfOf: '',
questionOfLaw: '',
aorName: '',
opposingCouncilAor: '',
opposingCouncilDetail: '',
lowerCourtCaseNumber: '',
dateOfImpugnedJudgement: '',
briefDescription: '',
remarks: '',
slpCounter: '',
contactDetail: '',
caseConnectedWith: '',
bunchCases: '',
court: '',
department: '',
office: '',
caseType: '',
act: '',
nature: '',
officeStatus: '',
courtStatus: '',
addRow: this.fb.group({
courtNumber: '',
itemNumber: '',
bench: '',
latestStatus: '',
proceedings: '',
complianceDate: '',
nextHearingDate: '',
}),
});
}
ngOnInit() {
this.route.data.subscribe((value) => {
const data = value as {
item: Case;
caseSources: CaseSource[];
caseTypes: CaseType[];
courts: Court[];
departments: Department[];
courtStatuses: CourtStatus[];
officeStatuses: OfficeStatus[];
acts: Act[];
natures: Nature[];
};
this.caseSources = data.caseSources;
this.caseTypes = data.caseTypes;
this.courts = data.courts;
this.departments = data.departments;
this.courtStatuses = data.courtStatuses;
this.officeStatuses = data.officeStatuses;
this.acts = data.acts;
this.natures = data.natures;
this.showItem(data.item);
});
}
showItem(item: Case) {
this.item = item;
this.form.patchValue({
caseSource: this.item.caseSource.id,
officeFileNumber: this.item.officeFileNumber,
courtCaseNumber: this.item.courtCaseNumber,
year: this.item.year,
title: this.item.title,
docketNumber: this.item.docketNumber,
receiptDate: this.item.receiptDate
? moment(this.item.receiptDate, 'DD-MMM-YYYY').toDate()
: '',
limitationDate: this.item.limitationDate
? moment(this.item.limitationDate, 'DD-MMM-YYYY').toDate()
: '',
filingDate: this.item.filingDate ? moment(this.item.filingDate, 'DD-MMM-YYYY').toDate() : '',
appearOnBehalfOf: this.item.appearOnBehalfOf,
questionOfLaw: this.item.questionOfLaw,
aorName: this.item.aorName,
opposingCouncilAor: this.item.opposingCouncilAor,
opposingCouncilDetail: this.item.opposingCouncilDetail,
lowerCourtCaseNumber: this.item.lowerCourtCaseNumber,
dateOfImpugnedJudgement: this.item.dateOfImpugnedJudgement
? moment(this.item.dateOfImpugnedJudgement, 'DD-MMM-YYYY').toDate()
: '',
briefDescription: this.item.briefDescription,
remarks: this.item.remarks,
slpCounter: this.item.slpCounter,
contactDetail: this.item.contactDetail,
caseConnectedWith: this.item.caseConnectedWith,
bunchCases: this.item.bunchCases,
court: this.item.court ? this.item.court.id : '',
department: this.item.department ? this.item.department.id : '',
office: this.item.office ? this.item.office.id : '',
caseType: this.item.caseType ? this.item.caseType.id : '',
act: this.item.act ? this.item.act.id : '',
nature: this.item.nature ? this.item.nature.id : '',
officeStatus: this.item.officeStatus ? this.item.officeStatus.id : '',
courtStatus: this.item.courtStatus ? this.item.courtStatus.id : '',
});
(this.form.get('caseSource') as FormControl).valueChanges
.pipe(
startWith(this.item.caseSource.id),
distinctUntilChanged(),
switchMap((x) => this.ser.newOfficeFileNumber(x)),
)
.subscribe((x) => {
if (
this.item.officeFileNumber === null ||
this.item.officeFileNumber === undefined ||
this.item.officeFileNumber === ''
) {
this.form.patchValue({ officeFileNumber: x });
}
});
this.hearingsObservable.next(this.item.hearings);
}
ngAfterViewInit() {
setTimeout(() => {
if (this.nameElement !== undefined) {
this.nameElement.nativeElement.focus();
}
}, 0);
}
save() {
this.ser.saveOrUpdate(this.getItem()).subscribe(
() => {
this.toaster.show('Success', '');
this.router.navigateByUrl('/cases');
},
(error) => {
this.toaster.show('Error', error);
},
);
}
delete() {
this.ser.delete(this.item.id as string).subscribe(
() => {
this.toaster.show('Success', '');
this.router.navigateByUrl('/cases');
},
(error) => {
this.toaster.show('Error', error);
},
);
}
confirmDelete(): void {
const dialogRef = this.dialog.open(ConfirmDialogComponent, {
width: '250px',
data: { title: 'Delete Case?', content: 'Are you sure? This cannot be undone.' },
});
dialogRef.afterClosed().subscribe((result: boolean) => {
if (result) {
this.delete();
}
});
}
getItem(): Case {
const formModel = this.form.value;
this.item.caseSource.id = formModel.caseSource;
this.item.officeFileNumber = formModel.officeFileNumber;
this.item.courtCaseNumber = formModel.courtCaseNumber;
this.item.year = formModel.year;
this.item.title = formModel.title;
this.item.docketNumber = formModel.docketNumber;
if (formModel.receiptDate === '') {
this.item.receiptDate = null;
} else {
this.item.receiptDate = moment(formModel.receiptDate).format('DD-MMM-YYYY');
}
if (formModel.limitationDate === '') {
this.item.limitationDate = null;
} else {
this.item.limitationDate = moment(formModel.limitationDate).format('DD-MMM-YYYY');
}
if (formModel.filingDate === '') {
this.item.filingDate = null;
} else {
this.item.filingDate = moment(formModel.filingDate).format('DD-MMM-YYYY');
}
this.item.appearOnBehalfOf = formModel.appearOnBehalfOf;
this.item.questionOfLaw = formModel.questionOfLaw;
this.item.aorName = formModel.aorName;
this.item.opposingCouncilAor = formModel.opposingCouncilAor;
this.item.opposingCouncilDetail = formModel.opposingCouncilDetail;
this.item.lowerCourtCaseNumber = formModel.lowerCourtCaseNumber;
if (formModel.dateOfImpugnedJudgement === '') {
this.item.dateOfImpugnedJudgement = null;
} else {
this.item.dateOfImpugnedJudgement = moment(formModel.dateOfImpugnedJudgement).format(
'DD-MMM-YYYY',
);
}
this.item.briefDescription = formModel.briefDescription;
this.item.remarks = formModel.remarks;
this.item.slpCounter = formModel.slpCounter;
this.item.contactDetail = formModel.contactDetail;
this.item.caseConnectedWith = formModel.caseConnectedWith;
this.item.bunchCases = formModel.bunchCases;
if (formModel.court === undefined || formModel.court === '') {
this.item.court = undefined;
} else {
if (this.item.court === null || this.item.court === undefined) {
this.item.court = new Court();
}
this.item.court.id = formModel.court;
}
if (formModel.department === undefined || formModel.department === '') {
this.item.department = undefined;
} else {
if (this.item.department === null || this.item.department === undefined) {
this.item.department = new Department();
}
this.item.department.id = formModel.department;
}
if (formModel.office === undefined || formModel.office === '') {
this.item.office = undefined;
} else {
if (this.item.office === null || this.item.office === undefined) {
this.item.office = new Office();
}
this.item.office.id = formModel.office;
}
if (formModel.caseType === undefined || formModel.caseType === '') {
this.item.caseType = undefined;
} else {
if (this.item.caseType === null || this.item.caseType === undefined) {
this.item.caseType = new CaseType();
}
this.item.caseType.id = formModel.caseType;
}
if (formModel.act === undefined || formModel.act === '') {
this.item.act = undefined;
} else {
if (this.item.act === null || this.item.act === undefined) {
this.item.act = new Act();
}
this.item.act.id = formModel.act;
}
if (formModel.nature === undefined || formModel.nature === '') {
this.item.nature = undefined;
} else {
if (this.item.nature === null || this.item.nature === undefined) {
this.item.nature = new Nature();
}
this.item.nature.id = formModel.nature;
}
if (formModel.officeStatus === undefined || formModel.officeStatus === '') {
this.item.officeStatus = undefined;
} else {
if (this.item.officeStatus === null || this.item.officeStatus === undefined) {
this.item.officeStatus = new OfficeStatus();
}
this.item.officeStatus.id = formModel.officeStatus;
}
if (formModel.courtStatus === undefined || formModel.courtStatus === '') {
this.item.courtStatus = undefined;
} else {
if (this.item.courtStatus === null || this.item.courtStatus === undefined) {
this.item.courtStatus = new CourtStatus();
}
this.item.courtStatus.id = formModel.courtStatus;
}
return this.item;
}
addHearing() {
const formValue = (this.form.get('addRow') as FormControl).value;
const courtNumber: string = formValue.courtNumber;
const itemNumber: string = formValue.itemNumber;
const bench: string = formValue.bench;
const latestStatus =
formValue.latestStatus === ''
? null
: new CourtStatus({
id: formValue.latestStatus,
name: (this.courtStatuses.find((x) => x.id === formValue.latestStatus) as CourtStatus)
.name,
});
const proceedings = formValue.proceedings;
const complianceDate = formValue.complianceDate
? moment(formValue.complianceDate).format('DD-MMM-YYYY')
: null;
const nextHearingDate = formValue.nextHearingDate
? moment(formValue.nextHearingDate).format('DD-MMM-YYYY')
: null;
this.item.hearings.push(
new Hearing({
courtNumber,
itemNumber,
bench,
courtStatus: latestStatus,
proceedings,
complianceDate,
nextHearingDate,
}),
);
this.hearingsObservable.next(this.item.hearings);
this.resetAddRow();
}
resetAddRow() {
(this.form.get('addRow') as FormControl).reset({
courtNumber: '',
itemNumber: '',
bench: '',
courtStatus: '',
proceedings: '',
complianceDate: '',
nextHearingDate: '',
});
}
editRow(row: Hearing) {
const dialogRef = this.dialog.open(HearingDialogComponent, {
width: '750px',
data: { hearing: { ...row }, courtStatuses: this.courtStatuses },
});
dialogRef.afterClosed().subscribe((result: boolean | Hearing) => {
if (!result) {
return;
}
const h = result as Hearing;
Object.assign(row, h);
this.hearingsObservable.next(this.item.hearings);
this.resetAddRow();
});
}
deleteRow(row: Hearing) {
this.item.hearings.splice(this.item.hearings.indexOf(row), 1);
this.hearingsObservable.next(this.item.hearings);
}
}