From 9ba2477f5649d988eb7c2743e3bc24aea0f1bb26 Mon Sep 17 00:00:00 2001 From: Valentin Mihai Date: Thu, 9 Jun 2022 13:55:01 +0300 Subject: [PATCH 1/3] RED-4169 - Improved Upload / Overwrite file dialog --- .../overwrite-files-dialog.component.html | 43 ++++++++++++++----- .../overwrite-files-dialog.component.ts | 13 +++++- .../services/file-upload.service.ts | 25 +++++++++-- .../upload-download-dialog.service.ts | 4 +- apps/red-ui/src/app/utils/file-drop-utils.ts | 17 ++++---- apps/red-ui/src/assets/i18n/de.json | 9 ++-- apps/red-ui/src/assets/i18n/en.json | 10 +++-- libs/common-ui | 2 +- 8 files changed, 90 insertions(+), 33 deletions(-) diff --git a/apps/red-ui/src/app/modules/upload-download/dialogs/overwrite-files-dialog/overwrite-files-dialog.component.html b/apps/red-ui/src/app/modules/upload-download/dialogs/overwrite-files-dialog/overwrite-files-dialog.component.html index 460259cef..c9c1c1d10 100644 --- a/apps/red-ui/src/app/modules/upload-download/dialogs/overwrite-files-dialog/overwrite-files-dialog.component.html +++ b/apps/red-ui/src/app/modules/upload-download/dialogs/overwrite-files-dialog/overwrite-files-dialog.component.html @@ -1,27 +1,48 @@
-
+
-

+

+

+ +
+ + {{ 'overwrite-files-dialog.remember' | translate }} + +
- + + + +
diff --git a/apps/red-ui/src/app/modules/upload-download/dialogs/overwrite-files-dialog/overwrite-files-dialog.component.ts b/apps/red-ui/src/app/modules/upload-download/dialogs/overwrite-files-dialog/overwrite-files-dialog.component.ts index 9505967a3..b8e466cca 100644 --- a/apps/red-ui/src/app/modules/upload-download/dialogs/overwrite-files-dialog/overwrite-files-dialog.component.ts +++ b/apps/red-ui/src/app/modules/upload-download/dialogs/overwrite-files-dialog/overwrite-files-dialog.component.ts @@ -40,14 +40,23 @@ export class OverwriteFilesDialogComponent { ) { this.form = this._formBuilder.group({ option: [this.options[0], Validators.required], + rememberChoice: [false], }); } + get rememberChoice() { + return this.form.get('rememberChoice').value; + } + cancel() { this.dialogRef.close(); } - selectOption(remember: boolean) { - this.dialogRef.close({ option: this.form.get('option').value.value, remember }); + selectOption(applyToAllFiles: boolean = false) { + this.dialogRef.close({ + option: this.form.get('option').value.value, + rememberChoice: this.rememberChoice, + applyToAllFiles, + }); } } diff --git a/apps/red-ui/src/app/modules/upload-download/services/file-upload.service.ts b/apps/red-ui/src/app/modules/upload-download/services/file-upload.service.ts index 40d4f2538..c9bce157f 100644 --- a/apps/red-ui/src/app/modules/upload-download/services/file-upload.service.ts +++ b/apps/red-ui/src/app/modules/upload-download/services/file-upload.service.ts @@ -5,7 +5,7 @@ import { interval, Subject, Subscription } from 'rxjs'; import { ConfigService } from '@services/config.service'; import { TranslateService } from '@ngx-translate/core'; import { IFileUploadResult, OverwriteFileOption, OverwriteFileOptions } from '@red/domain'; -import { isAcceptedFileType, isCsv } from '@utils/file-drop-utils'; +import { isAcceptedFileType, isCsv, isZip } from '@utils/file-drop-utils'; import { ErrorMessageService, GenericService, HeadersConfiguration, RequiredParam, Validate } from '@iqser/common-ui'; import { FilesMapService } from '@services/files/files-map.service'; import { switchMap, tap, throttleTime } from 'rxjs/operators'; @@ -70,18 +70,35 @@ export class FileUploadService extends GenericService impleme const maxSizeMB = this._configService.values.MAX_FILE_SIZE_MB; const maxSizeBytes = maxSizeMB * 1024 * 1024; const dossierFiles = this._filesMapService.get(dossierId); - let option: OverwriteFileOption; + let option: OverwriteFileOption = localStorage.getItem('overwriteFileOption') as OverwriteFileOption; for (let idx = 0; idx < files.length; ++idx) { const file = files[idx]; let currentOption = option; - if (dossierFiles.find(pf => pf.filename === file.file.name)) { + + if (isZip(file)) { + const res = await this._dialogService.openOverwriteFileDialog(null); + if (res.cancel) { + return; + } + if (res.option === OverwriteFileOptions.PARTIAL_OVERWRITE) { + file.keepManualRedactions = true; + } + if (res.option === OverwriteFileOptions.SKIP) { + delete file.keepManualRedactions; + } + } else if (dossierFiles.find(pf => pf.filename === file.file.name)) { if (!option) { const res = await this._dialogService.openOverwriteFileDialog(file.file.name); if (res.cancel) { return; } + + if (res.rememberChoice) { + localStorage.setItem('overwriteFileOption', res.option); + } + currentOption = res.option; - option = res.remember ? currentOption : undefined; + option = res.applyToAllFiles ? currentOption : undefined; } if (currentOption === OverwriteFileOptions.PARTIAL_OVERWRITE) { diff --git a/apps/red-ui/src/app/modules/upload-download/services/upload-download-dialog.service.ts b/apps/red-ui/src/app/modules/upload-download/services/upload-download-dialog.service.ts index efa7bc4dd..761aefb74 100644 --- a/apps/red-ui/src/app/modules/upload-download/services/upload-download-dialog.service.ts +++ b/apps/red-ui/src/app/modules/upload-download/services/upload-download-dialog.service.ts @@ -14,7 +14,9 @@ const dialogConfig = { export class UploadDownloadDialogService { constructor(private readonly _dialog: MatDialog) {} - openOverwriteFileDialog(filename: string): Promise<{ option?: OverwriteFileOption; remember?: boolean; cancel?: boolean }> { + openOverwriteFileDialog( + filename: string, + ): Promise<{ option?: OverwriteFileOption; rememberChoice?: boolean; applyToAllFiles?: boolean; cancel?: boolean }> { const ref = this._dialog.open(OverwriteFilesDialogComponent, { ...dialogConfig, data: filename, diff --git a/apps/red-ui/src/app/utils/file-drop-utils.ts b/apps/red-ui/src/app/utils/file-drop-utils.ts index 4fe68b25b..45b8b8fab 100644 --- a/apps/red-ui/src/app/utils/file-drop-utils.ts +++ b/apps/red-ui/src/app/utils/file-drop-utils.ts @@ -13,6 +13,14 @@ const validDocumentMimeTypes = [ const validDocumentExtensions = ['doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'pdf']; +export function isPdf(file: FileUploadModel): boolean { + return file.file.type?.toLowerCase() === 'application/pdf' || file.file.name.toLowerCase().endsWith('.pdf'); +} + +export function isZip(file: FileUploadModel): boolean { + return file.file.type?.toLowerCase() === 'application/zip' || file.file.name.toLowerCase().endsWith('.zip'); +} + export function isCsv(file: FileUploadModel): boolean { return file.file.type?.toLowerCase() === 'text/csv' || file.file.name.toLowerCase().endsWith('.csv'); } @@ -25,14 +33,7 @@ export function isDocument(file: FileUploadModel): boolean { export type Files = FileList | File[]; export function isAcceptedFileType(file: FileUploadModel): boolean { - return ( - file.file.type?.toLowerCase() === 'application/pdf' || - file.file.name.toLowerCase().endsWith('.pdf') || - file.file.type?.toLowerCase() === 'application/zip' || - file.file.name.toLowerCase().endsWith('.zip') || - isDocument(file) || - isCsv(file) - ); + return isPdf(file) || isZip(file) || isDocument(file) || isCsv(file); } export function convertFiles(files: FileList | File[], dossier: Dossier): FileUploadModel[] { diff --git a/apps/red-ui/src/assets/i18n/de.json b/apps/red-ui/src/assets/i18n/de.json index 3fa044f0e..e0c16e214 100644 --- a/apps/red-ui/src/assets/i18n/de.json +++ b/apps/red-ui/src/assets/i18n/de.json @@ -690,7 +690,6 @@ }, "digital-signature-screen": { "action": { - "certificate-not-valid-error": "", "delete-error": "Die digitale Signatur konnte nicht entfernt werden, bitte versuchen Sie es erneut.", "delete-success": "Die digitale Signatur wurde gelöscht. Geschwärzte Dateien werden nicht länger mit einer Signatur versehen!", "remove": "", @@ -1689,6 +1688,10 @@ } }, "overwrite-files-dialog": { + "archive-question": "", + "archive-title": "", + "file-question": "{filename} ist bereits vorhanden. Wie möchten Sie fortfahren?", + "file-title": "Das Dokument existiert bereits!", "options": { "all-files": "", "cancel": "Alle Uploads abbrechen", @@ -1701,13 +1704,13 @@ "description": "", "label": "" }, + "proceed": "", "skip": { "description": "", "label": "" } }, - "question": "{filename} ist bereits vorhanden. Wie möchten Sie fortfahren?", - "title": "Das Dokument existiert bereits!" + "remember": "" }, "page": "Seite", "page-rotation": { diff --git a/apps/red-ui/src/assets/i18n/en.json b/apps/red-ui/src/assets/i18n/en.json index 74ed57195..b83691f44 100644 --- a/apps/red-ui/src/assets/i18n/en.json +++ b/apps/red-ui/src/assets/i18n/en.json @@ -1688,8 +1688,12 @@ } }, "overwrite-files-dialog": { + "archive-question": "Dossier is not empty, so files might overlap with the contents of the archive you are uploading. Choose how to proceed in case of duplicates:", + "archive-title": "Uploading a ZIP archive", + "file-question": "{filename} already exists. Choose how to proceed:", + "file-title": "File already exists!", "options": { - "all-files": "Apply to all remaining files in current upload", + "all-files": "Apply to all files of current upload", "cancel": "Cancel upload", "current-files": "Apply to current file", "full-overwrite": { @@ -1700,13 +1704,13 @@ "description": "Manual changes are kept only if the affected redactions are still at the same position in the file. Some redactions could be misplaced if the content of the file changed.", "label": "Overwrite and keep manual changes" }, + "proceed": "Proceed", "skip": { "description": "The upload will be skipped and the existing file will not be replaced.", "label": "Keep the existing file and do not overwrite" } }, - "question": "{filename} already exists. Choose how to proceed:", - "title": "Document already exists!" + "remember": "Remember choice and don't ask me again" }, "page": "Page {page} - {count} {count, plural, one{annotation} other{annotations}}", "page-rotation": { diff --git a/libs/common-ui b/libs/common-ui index 43a9067bf..9c7f6f232 160000 --- a/libs/common-ui +++ b/libs/common-ui @@ -1 +1 @@ -Subproject commit 43a9067bf3c712316c78223a243ae98868e46932 +Subproject commit 9c7f6f232929e0b680f442ec7f035b797a5b7132 From a74f5a30447caffaf0a4b1a271446097c1e14311 Mon Sep 17 00:00:00 2001 From: Valentin Mihai Date: Thu, 16 Jun 2022 16:44:39 +0300 Subject: [PATCH 2/3] RED-4169 - updated common-ui --- libs/common-ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/common-ui b/libs/common-ui index 9c7f6f232..0a6b0c49b 160000 --- a/libs/common-ui +++ b/libs/common-ui @@ -1 +1 @@ -Subproject commit 9c7f6f232929e0b680f442ec7f035b797a5b7132 +Subproject commit 0a6b0c49bb211a158d30935af52758fb54c40339 From e9cfca3c51337129392e170cd62cdde9a671a9a8 Mon Sep 17 00:00:00 2001 From: Valentin Mihai Date: Thu, 16 Jun 2022 17:25:01 +0300 Subject: [PATCH 3/3] RED-4169 - in case of archive and skip option, do not send anything to the backend --- .../app/modules/upload-download/services/file-upload.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/red-ui/src/app/modules/upload-download/services/file-upload.service.ts b/apps/red-ui/src/app/modules/upload-download/services/file-upload.service.ts index c9bce157f..242c54047 100644 --- a/apps/red-ui/src/app/modules/upload-download/services/file-upload.service.ts +++ b/apps/red-ui/src/app/modules/upload-download/services/file-upload.service.ts @@ -84,7 +84,7 @@ export class FileUploadService extends GenericService impleme file.keepManualRedactions = true; } if (res.option === OverwriteFileOptions.SKIP) { - delete file.keepManualRedactions; + files = []; } } else if (dossierFiles.find(pf => pf.filename === file.file.name)) { if (!option) {