From d750fb13e60128b8b3d0936f190723abbe1b8ff8 Mon Sep 17 00:00:00 2001 From: Tristan Slater <1631008+trslater@users.noreply.github.com> Date: Wed, 26 Feb 2025 13:21:06 -0800 Subject: [PATCH] Make upload dialog more robust and secure - Create interfaces for setting data to allow for better validation - Create a global options const that can be used for both add and edit to make sure they are consistent - Pass in parcel/owner services to avoid long modal opening times --- .../documents/documents.component.ts | 85 +++++++---------- .../inquiry/documents/documents.component.ts | 27 +++--- .../documents/documents.component.ts | 86 +++++++---------- .../documents/documents.component.ts | 36 +++++--- .../documents/documents.component.ts | 36 +++++--- .../document-upload-dialog.component.html | 10 +- .../document-upload-dialog.component.ts | 92 ++++++++++--------- .../document-upload-dialog.dto.ts | 22 ++++- .../document-upload-dialog.interface.ts | 40 +++++++- 9 files changed, 242 insertions(+), 192 deletions(-) diff --git a/alcs-frontend/src/app/features/application/documents/documents.component.ts b/alcs-frontend/src/app/features/application/documents/documents.component.ts index deb7d5e2f..6b6c278bd 100644 --- a/alcs-frontend/src/app/features/application/documents/documents.component.ts +++ b/alcs-frontend/src/app/features/application/documents/documents.component.ts @@ -18,6 +18,25 @@ import { DocumentUploadDialogComponent, VisibilityGroup, } from '../../../shared/document-upload-dialog/document-upload-dialog.component'; +import { + DocumentUploadDialogData, + DocumentUploadDialogOptions, +} from '../../../shared/document-upload-dialog/document-upload-dialog.interface'; + +const DOCUMENT_UPLOAD_DIALOG_OPTIONS: DocumentUploadDialogOptions = { + allowedVisibilityFlags: ['A', 'C', 'G', 'P'], + allowsFileEdit: true, + documentTypeOverrides: { + [DOCUMENT_TYPE.CERTIFICATE_OF_TITLE]: { + visibilityGroups: [VisibilityGroup.INTERNAL], + allowsFileEdit: false, + }, + [DOCUMENT_TYPE.CORPORATE_SUMMARY]: { + visibilityGroups: [VisibilityGroup.INTERNAL], + allowsFileEdit: false, + }, + }, +}; @Component({ selector: 'app-documents', @@ -63,37 +82,19 @@ export class DocumentsComponent implements OnInit { } async onUploadFile() { - const submission = await this.applicationSubmissionService.fetchSubmission(this.fileId); - const parcels = await this.applicationParcelService.fetchParcels(this.fileId); + const data: DocumentUploadDialogData = Object.assign(DOCUMENT_UPLOAD_DIALOG_OPTIONS, { + fileId: this.fileId, + documentService: this.applicationDocumentService, + parcelService: this.applicationParcelService, + submissionService: this.applicationSubmissionService, + }); this.dialog .open(DocumentUploadDialogComponent, { minWidth: '600px', maxWidth: '800px', width: '70%', - data: { - fileId: this.fileId, - documentService: this.applicationDocumentService, - selectableParcels: parcels.map((parcel, index) => ({ ...parcel, index })), - selectableOwners: submission.owners - .filter((owner) => owner.type.code === 'ORGZ') - .map((owner) => ({ - label: owner.organizationName ?? owner.displayName, - uuid: owner.uuid, - })), - allowedVisibilityFlags: ['A', 'C', 'G', 'P'], - allowsFileEdit: true, - documentTypeOverrides: { - [DOCUMENT_TYPE.CERTIFICATE_OF_TITLE]: { - visibilityGroups: [VisibilityGroup.INTERNAL], - allowsFileEdit: false, - }, - [DOCUMENT_TYPE.CORPORATE_SUMMARY]: { - visibilityGroups: [VisibilityGroup.INTERNAL], - allowsFileEdit: false, - }, - }, - }, + data, }) .afterClosed() .subscribe((isDirty) => { @@ -126,37 +127,21 @@ export class DocumentsComponent implements OnInit { } async onEditFile(element: ApplicationDocumentDto) { - const submission = await this.applicationSubmissionService.fetchSubmission(this.fileId); - const parcels = await this.applicationParcelService.fetchParcels(this.fileId); + const data: DocumentUploadDialogData = Object.assign(DOCUMENT_UPLOAD_DIALOG_OPTIONS, { + allowsFileEdit: element.system === DOCUMENT_SYSTEM.ALCS, + fileId: this.fileId, + existingDocument: element, + documentService: this.applicationDocumentService, + parcelService: this.applicationParcelService, + submissionService: this.applicationSubmissionService, + }); this.dialog .open(DocumentUploadDialogComponent, { minWidth: '600px', maxWidth: '800px', width: '70%', - data: { - fileId: this.fileId, - existingDocument: element, - documentService: this.applicationDocumentService, - selectableParcels: parcels.map((parcel, index) => ({ ...parcel, index })), - selectableOwners: submission.owners - .filter((owner) => owner.type.code === 'ORGZ') - .map((owner) => ({ - label: owner.organizationName ?? owner.displayName, - uuid: owner.uuid, - })), - allowsFileEdit: element.system === DOCUMENT_SYSTEM.ALCS, - documentTypeOverrides: { - [DOCUMENT_TYPE.CERTIFICATE_OF_TITLE]: { - visibilityGroups: [VisibilityGroup.INTERNAL], - allowsFileEdit: false, - }, - [DOCUMENT_TYPE.CORPORATE_SUMMARY]: { - visibilityGroups: [VisibilityGroup.INTERNAL], - allowsFileEdit: false, - }, - }, - }, + data, }) .afterClosed() .subscribe((isDirty: boolean) => { diff --git a/alcs-frontend/src/app/features/inquiry/documents/documents.component.ts b/alcs-frontend/src/app/features/inquiry/documents/documents.component.ts index 57a8dde9d..bf9f10799 100644 --- a/alcs-frontend/src/app/features/inquiry/documents/documents.component.ts +++ b/alcs-frontend/src/app/features/inquiry/documents/documents.component.ts @@ -11,6 +11,7 @@ import { ConfirmationDialogService } from '../../../shared/confirmation-dialog/c import { DOCUMENT_SYSTEM } from '../../../shared/document/document.dto'; import { FILE_NAME_TRUNCATE_LENGTH } from '../../../shared/constants'; import { DocumentUploadDialogComponent } from '../../../shared/document-upload-dialog/document-upload-dialog.component'; +import { DocumentUploadDialogData } from '../../../shared/document-upload-dialog/document-upload-dialog.interface'; @Component({ selector: 'app-documents', @@ -47,16 +48,18 @@ export class DocumentsComponent implements OnInit { } async onUploadFile() { + const data: DocumentUploadDialogData = { + allowsFileEdit: true, + fileId: this.fileId, + documentService: this.inquiryDocumentService, + }; + this.dialog .open(DocumentUploadDialogComponent, { minWidth: '600px', maxWidth: '800px', width: '70%', - data: { - fileId: this.fileId, - documentService: this.inquiryDocumentService, - allowsFileEdit: true, - }, + data, }) .afterClosed() .subscribe((isDirty) => { @@ -89,17 +92,19 @@ export class DocumentsComponent implements OnInit { } onEditFile(element: PlanningReviewDocumentDto) { + const data: DocumentUploadDialogData = { + allowsFileEdit: element.system === DOCUMENT_SYSTEM.ALCS, + fileId: this.fileId, + existingDocument: element, + documentService: this.inquiryDocumentService, + }; + this.dialog .open(DocumentUploadDialogComponent, { minWidth: '600px', maxWidth: '800px', width: '70%', - data: { - fileId: this.fileId, - existingDocument: element, - documentService: this.inquiryDocumentService, - allowsFileEdit: element.system === DOCUMENT_SYSTEM.ALCS, - }, + data, }) .afterClosed() .subscribe((isDirty: boolean) => { diff --git a/alcs-frontend/src/app/features/notice-of-intent/documents/documents.component.ts b/alcs-frontend/src/app/features/notice-of-intent/documents/documents.component.ts index 60fc85646..994df384a 100644 --- a/alcs-frontend/src/app/features/notice-of-intent/documents/documents.component.ts +++ b/alcs-frontend/src/app/features/notice-of-intent/documents/documents.component.ts @@ -23,6 +23,25 @@ import { } from '../../../shared/document-upload-dialog/document-upload-dialog.component'; import { NoticeOfIntentSubmissionService } from '../../../services/notice-of-intent/notice-of-intent-submission/notice-of-intent-submission.service'; import { NoticeOfIntentParcelService } from '../../../services/notice-of-intent/notice-of-intent-parcel/notice-of-intent-parcel.service'; +import { + DocumentUploadDialogData, + DocumentUploadDialogOptions, +} from '../../../shared/document-upload-dialog/document-upload-dialog.interface'; + +const DOCUMENT_UPLOAD_DIALOG_OPTIONS: DocumentUploadDialogOptions = { + allowedVisibilityFlags: ['A', 'C', 'G', 'P'], + allowsFileEdit: true, + documentTypeOverrides: { + [DOCUMENT_TYPE.CERTIFICATE_OF_TITLE]: { + visibilityGroups: [VisibilityGroup.INTERNAL], + allowsFileEdit: false, + }, + [DOCUMENT_TYPE.CORPORATE_SUMMARY]: { + visibilityGroups: [VisibilityGroup.INTERNAL], + allowsFileEdit: false, + }, + }, +}; @Component({ selector: 'app-noi-documents', @@ -67,37 +86,19 @@ export class NoiDocumentsComponent implements OnInit { } async onUploadFile() { - const submission = await this.noiSubmissionService.fetchSubmission(this.fileId); - const parcels = await this.noiParcelService.fetchParcels(this.fileId); + const data: DocumentUploadDialogData = Object.assign(DOCUMENT_UPLOAD_DIALOG_OPTIONS, { + fileId: this.fileId, + documentService: this.noiDocumentService, + parcelService: this.noiParcelService, + submissionService: this.noiSubmissionService, + }); this.dialog .open(DocumentUploadDialogComponent, { minWidth: '600px', maxWidth: '800px', width: '70%', - data: { - fileId: this.fileId, - documentService: this.noiDocumentService, - selectableParcels: parcels.map((parcel, index) => ({ ...parcel, index })), - selectableOwners: submission.owners - .filter((owner) => owner.type.code === 'ORGZ') - .map((owner) => ({ - label: owner.organizationName ?? owner.displayName, - uuid: owner.uuid, - })), - allowedVisibilityFlags: ['A', 'C', 'G', 'P'], - allowsFileEdit: true, - documentTypeOverrides: { - [DOCUMENT_TYPE.CERTIFICATE_OF_TITLE]: { - visibilityGroups: [VisibilityGroup.INTERNAL], - allowsFileEdit: false, - }, - [DOCUMENT_TYPE.CORPORATE_SUMMARY]: { - visibilityGroups: [VisibilityGroup.INTERNAL], - allowsFileEdit: false, - }, - }, - }, + data, }) .afterClosed() .subscribe((isDirty) => { @@ -116,38 +117,21 @@ export class NoiDocumentsComponent implements OnInit { } async onEditFile(element: NoticeOfIntentDocumentDto) { - const submission = await this.noiSubmissionService.fetchSubmission(this.fileId); - const parcels = await this.noiParcelService.fetchParcels(this.fileId); + const data: DocumentUploadDialogData = Object.assign(DOCUMENT_UPLOAD_DIALOG_OPTIONS, { + allowsFileEdit: element.system === DOCUMENT_SYSTEM.ALCS, + fileId: this.fileId, + existingDocument: element, + documentService: this.noiDocumentService, + parcelService: this.noiParcelService, + submissionService: this.noiSubmissionService, + }); this.dialog .open(DocumentUploadDialogComponent, { minWidth: '600px', maxWidth: '800px', width: '70%', - data: { - fileId: this.fileId, - existingDocument: element, - documentService: this.noiDocumentService, - selectableParcels: parcels.map((parcel, index) => ({ ...parcel, index })), - selectableOwners: submission.owners - .filter((owner) => owner.type.code === 'ORGZ') - .map((owner) => ({ - label: owner.organizationName ?? owner.displayName, - uuid: owner.uuid, - })), - allowedVisibilityFlags: ['A', 'C', 'G', 'P'], - allowsFileEdit: element.system === DOCUMENT_SYSTEM.ALCS, - documentTypeOverrides: { - [DOCUMENT_TYPE.CERTIFICATE_OF_TITLE]: { - visibilityGroups: [VisibilityGroup.INTERNAL], - allowsFileEdit: false, - }, - [DOCUMENT_TYPE.CORPORATE_SUMMARY]: { - visibilityGroups: [VisibilityGroup.INTERNAL], - allowsFileEdit: false, - }, - }, - }, + data, }) .afterClosed() .subscribe((isDirty: boolean) => { diff --git a/alcs-frontend/src/app/features/notification/documents/documents.component.ts b/alcs-frontend/src/app/features/notification/documents/documents.component.ts index 304785905..b34c4d720 100644 --- a/alcs-frontend/src/app/features/notification/documents/documents.component.ts +++ b/alcs-frontend/src/app/features/notification/documents/documents.component.ts @@ -12,6 +12,15 @@ import { ConfirmationDialogService } from '../../../shared/confirmation-dialog/c import { DOCUMENT_SYSTEM } from '../../../shared/document/document.dto'; import { FILE_NAME_TRUNCATE_LENGTH } from '../../../shared/constants'; import { DocumentUploadDialogComponent } from '../../../shared/document-upload-dialog/document-upload-dialog.component'; +import { + DocumentUploadDialogData, + DocumentUploadDialogOptions, +} from '../../../shared/document-upload-dialog/document-upload-dialog.interface'; + +const DOCUMENT_UPLOAD_DIALOG_OPTIONS: DocumentUploadDialogOptions = { + allowedVisibilityFlags: ['A', 'G', 'P'], + allowsFileEdit: true, +}; @Component({ selector: 'app-notification-documents', @@ -48,17 +57,17 @@ export class NotificationDocumentsComponent implements OnInit { } async onUploadFile() { + const data: DocumentUploadDialogData = Object.assign(DOCUMENT_UPLOAD_DIALOG_OPTIONS, { + fileId: this.fileId, + documentService: this.notificationDocumentService, + }); + this.dialog .open(DocumentUploadDialogComponent, { minWidth: '600px', maxWidth: '800px', width: '70%', - data: { - fileId: this.fileId, - documentService: this.notificationDocumentService, - allowedVisibilityFlags: ['A', 'G', 'P'], - allowsFileEdit: true, - }, + data, }) .afterClosed() .subscribe((isDirty) => { @@ -91,18 +100,19 @@ export class NotificationDocumentsComponent implements OnInit { } onEditFile(element: NoticeOfIntentDocumentDto) { + const data: DocumentUploadDialogData = Object.assign(DOCUMENT_UPLOAD_DIALOG_OPTIONS, { + allowsFileEdit: element.system === DOCUMENT_SYSTEM.ALCS, + fileId: this.fileId, + existingDocument: element, + documentService: this.notificationDocumentService, + }); + this.dialog .open(DocumentUploadDialogComponent, { minWidth: '600px', maxWidth: '800px', width: '70%', - data: { - fileId: this.fileId, - existingDocument: element, - documentService: this.notificationDocumentService, - allowedVisibilityFlags: ['A', 'G', 'P'], - allowsFileEdit: element.system === DOCUMENT_SYSTEM.ALCS, - }, + data, }) .afterClosed() .subscribe((isDirty: boolean) => { diff --git a/alcs-frontend/src/app/features/planning-review/documents/documents.component.ts b/alcs-frontend/src/app/features/planning-review/documents/documents.component.ts index f666bed56..25e50b576 100644 --- a/alcs-frontend/src/app/features/planning-review/documents/documents.component.ts +++ b/alcs-frontend/src/app/features/planning-review/documents/documents.component.ts @@ -10,6 +10,15 @@ import { ConfirmationDialogService } from '../../../shared/confirmation-dialog/c import { DOCUMENT_SYSTEM } from '../../../shared/document/document.dto'; import { FILE_NAME_TRUNCATE_LENGTH } from '../../../shared/constants'; import { DocumentUploadDialogComponent } from '../../../shared/document-upload-dialog/document-upload-dialog.component'; +import { + DocumentUploadDialogData, + DocumentUploadDialogOptions, +} from '../../../shared/document-upload-dialog/document-upload-dialog.interface'; + +const DOCUMENT_UPLOAD_DIALOG_OPTIONS: DocumentUploadDialogOptions = { + allowedVisibilityFlags: ['C'], + allowsFileEdit: true, +}; @Component({ selector: 'app-documents', @@ -48,17 +57,17 @@ export class DocumentsComponent implements OnInit { } async onUploadFile() { + const data: DocumentUploadDialogData = Object.assign(DOCUMENT_UPLOAD_DIALOG_OPTIONS, { + fileId: this.fileId, + documentService: this.planningReviewDocumentService, + }); + this.dialog .open(DocumentUploadDialogComponent, { minWidth: '600px', maxWidth: '800px', width: '70%', - data: { - fileId: this.fileId, - documentService: this.planningReviewDocumentService, - allowedVisibilityFlags: ['C'], - allowsFileEdit: true, - }, + data, }) .afterClosed() .subscribe((isDirty) => { @@ -91,18 +100,19 @@ export class DocumentsComponent implements OnInit { } onEditFile(element: PlanningReviewDocumentDto) { + const data: DocumentUploadDialogData = Object.assign(DOCUMENT_UPLOAD_DIALOG_OPTIONS, { + allowsFileEdit: element.system === DOCUMENT_SYSTEM.ALCS, + fileId: this.fileId, + existingDocument: element, + documentService: this.planningReviewDocumentService, + }); + this.dialog .open(DocumentUploadDialogComponent, { minWidth: '600px', maxWidth: '800px', width: '70%', - data: { - fileId: this.fileId, - existingDocument: element, - documentService: this.planningReviewDocumentService, - allowsFileEdit: true, - allowedVisibilityFlags: ['C'], - }, + data, }) .afterClosed() .subscribe((isDirty: boolean) => { diff --git a/alcs-frontend/src/app/shared/document-upload-dialog/document-upload-dialog.component.html b/alcs-frontend/src/app/shared/document-upload-dialog/document-upload-dialog.component.html index 0931a4cc9..a4bcb11c6 100644 --- a/alcs-frontend/src/app/shared/document-upload-dialog/document-upload-dialog.component.html +++ b/alcs-frontend/src/app/shared/document-upload-dialog/document-upload-dialog.component.html @@ -86,23 +86,23 @@