Pull request #367: VM/RED-4169

Merge in RED/ui from VM/RED-4169 to master

* commit 'e9cfca3c51337129392e170cd62cdde9a671a9a8':
  RED-4169 - in case of archive and skip option, do not send anything to the backend
  RED-4169 - updated common-ui
  RED-4169 - Improved Upload / Overwrite file dialog
This commit is contained in:
Valentin-Gabriel Mihai 2022-06-16 16:42:50 +02:00
commit 3b554f1bf8
8 changed files with 90 additions and 32 deletions

View File

@ -1,27 +1,48 @@
<section class="dialog">
<div class="dialog-header heading-l" translate="overwrite-files-dialog.title"></div>
<div
class="dialog-header heading-l"
[translate]="filename ? 'overwrite-files-dialog.file-title' : 'overwrite-files-dialog.archive-title'"
></div>
<div class="dialog-content">
<p [innerHTML]="'overwrite-files-dialog.question' | translate: { filename: filename }" class="mb-24"></p>
<p *ngIf="filename" [innerHTML]="'overwrite-files-dialog.file-question' | translate: { filename: filename }" class="mb-24"></p>
<p *ngIf="!filename" [innerHTML]="'overwrite-files-dialog.archive-question' | translate" class="mb-24"></p>
<form [formGroup]="form">
<iqser-details-radio [options]="options" formControlName="option"></iqser-details-radio>
<div *ngIf="filename" class="iqser-input-group mt-0">
<mat-checkbox color="primary" formControlName="rememberChoice" name="primaryAttribute">
{{ 'overwrite-files-dialog.remember' | translate }}
</mat-checkbox>
</div>
</form>
</div>
<div class="dialog-actions">
<iqser-icon-button
(action)="selectOption(false)"
[disabled]="!form.valid"
[label]="'overwrite-files-dialog.options.current-files' | translate"
*ngIf="!filename"
(action)="selectOption()"
[disabled]="rememberChoice"
[label]="'overwrite-files-dialog.options.proceed' | translate"
[type]="iconButtonTypes.primary"
></iqser-icon-button>
<iqser-icon-button
(action)="selectOption(true)"
[disabled]="!form.valid"
[label]="'overwrite-files-dialog.options.all-files' | translate"
[type]="iconButtonTypes.dark"
></iqser-icon-button>
<ng-container *ngIf="filename">
<iqser-icon-button
*ngIf="filename"
(action)="selectOption()"
[disabled]="rememberChoice"
[label]="'overwrite-files-dialog.options.current-files' | translate"
[type]="iconButtonTypes.primary"
></iqser-icon-button>
<iqser-icon-button
*ngIf="filename"
(action)="selectOption(true)"
[label]="'overwrite-files-dialog.options.all-files' | translate"
[type]="iconButtonTypes.dark"
[boldText]="true"
></iqser-icon-button>
</ng-container>
<div (click)="cancel()" class="all-caps-label cancel" translate="overwrite-files-dialog.options.cancel"></div>
</div>
</section>

View File

@ -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,
});
}
}

View File

@ -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<IFileUploadResult> 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) {

View File

@ -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,

View File

@ -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[] {

View File

@ -1687,6 +1687,10 @@
}
},
"overwrite-files-dialog": {
"archive-question": "",
"archive-title": "",
"file-question": "<b>{filename}</b> 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": "<b>{filename}</b> ist bereits vorhanden. Wie möchten Sie fortfahren?",
"title": "Das Dokument existiert bereits!"
"remember": ""
},
"page": "Seite",
"page-rotation": {

View File

@ -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": "<b>{filename}</b> 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": "<b>{filename}</b> 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": {

@ -1 +1 @@
Subproject commit e4c6d5fc759ba807c0616aff855ea280e40173b8
Subproject commit 0a6b0c49bb211a158d30935af52758fb54c40339