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 2799eb133..c39824e79 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..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 @@ -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) { + files = []; + } + } 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 c8cad635e..b40170a80 100644 --- a/apps/red-ui/src/assets/i18n/de.json +++ b/apps/red-ui/src/assets/i18n/de.json @@ -1687,6 +1687,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", @@ -1699,13 +1703,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 d97384278..3cd11e248 100644 --- a/apps/red-ui/src/assets/i18n/en.json +++ b/apps/red-ui/src/assets/i18n/en.json @@ -1687,8 +1687,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": { @@ -1699,13 +1703,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 e4c6d5fc7..0a6b0c49b 160000 --- a/libs/common-ui +++ b/libs/common-ui @@ -1 +1 @@ -Subproject commit e4c6d5fc759ba807c0616aff855ea280e40173b8 +Subproject commit 0a6b0c49bb211a158d30935af52758fb54c40339