RED-2994: Adjust 'Deleted documents' tab in 'Edit Dossier'

This commit is contained in:
Adina Țeudan 2022-01-10 15:59:42 +02:00
parent a3b6d683a0
commit f0767204fc
8 changed files with 56 additions and 15 deletions

View File

@ -60,7 +60,6 @@
*ngIf="form.get('userId').value !== ALL_USERS"
[user]="form.get('userId').value"
[withName]="true"
size="small"
></redaction-initials-avatar>
<div *ngIf="form.get('userId').value === ALL_USERS" [translate]="ALL_USERS"></div>
</mat-select-trigger>
@ -69,7 +68,6 @@
*ngIf="userId !== ALL_USERS"
[user]="userId"
[withName]="true"
size="small"
></redaction-initials-avatar>
<div *ngIf="userId === ALL_USERS" [translate]="ALL_USERS"></div>
</mat-option>
@ -109,7 +107,7 @@
</div>
<div class="user-column cell">
<redaction-initials-avatar [user]="log.userId" [withName]="true" size="small"></redaction-initials-avatar>
<redaction-initials-avatar [user]="log.userId" [withName]="true"></redaction-initials-avatar>
</div>
<div [translate]="translations[log.category]" class="cell"></div>

View File

@ -28,7 +28,7 @@
<iqser-circle-button
(action)="hardDelete()"
*ngIf="listingService.areSomeSelected$ | async"
*ngIf="canDeleteSelected$ | async"
[tooltip]="'edit-dossier-dialog.deleted-documents.bulk.delete' | translate"
[type]="circleButtonTypes.dark"
icon="iqser:trash"
@ -48,6 +48,24 @@
</div>
</div>
<div class="cell user-column">
<redaction-initials-avatar [user]="file.assignee" [withName]="true"></redaction-initials-avatar>
</div>
<div class="cell">
<iqser-status-bar
[configs]="[
{
color: file.workflowStatus,
label: fileStatusTranslations[file.workflowStatus] | translate,
length: 1,
cssClass: 'all-caps-label'
}
]"
[small]="true"
></iqser-status-bar>
</div>
<div class="cell">
<span class="small-label">{{ file.softDeleted | date: 'exactDate' }}</span>
</div>
@ -65,6 +83,7 @@
<iqser-circle-button
(action)="hardDelete([file])"
*ngIf="file.canHardDelete"
[tooltip]="'edit-dossier-dialog.deleted-documents.action.delete' | translate"
[type]="circleButtonTypes.dark"
icon="iqser:trash"

View File

@ -1,6 +1,6 @@
import { Component, forwardRef, Injector, Input, OnInit } from '@angular/core';
import { EditDossierSaveResult, EditDossierSectionInterface } from '../edit-dossier-section.interface';
import { Dossier, IFile } from '@red/domain';
import { Dossier, File, IFile } from '@red/domain';
import {
CircleButtonTypes,
ConfirmationDialogInput,
@ -21,8 +21,12 @@ import { distinctUntilChanged, map } from 'rxjs/operators';
import { DossiersDialogService } from '../../../services/dossiers-dialog.service';
import { FilesService } from '@services/entity-services/files.service';
import { FileManagementService } from '@services/entity-services/file-management.service';
import { workflowFileStatusTranslations } from '../../../translations/file-status-translations';
import { PermissionsService } from '@services/permissions.service';
import { UserService } from '@services/user.service';
interface FileListItem extends IFile, IListable {
readonly canHardDelete: boolean;
readonly canRestore: boolean;
readonly restoreDate: string;
}
@ -37,14 +41,18 @@ interface FileListItem extends IFile, IListable {
],
})
export class EditDossierDeletedDocumentsComponent extends ListingComponent<FileListItem> implements EditDossierSectionInterface, OnInit {
readonly fileStatusTranslations = workflowFileStatusTranslations;
@Input() dossier: Dossier;
readonly changed = false;
readonly valid = false;
readonly canRestoreSelected$ = this._canRestoreSelected$;
readonly canDeleteSelected$ = this._canDeleteSelected$;
disabled: boolean;
readonly tableColumnConfigs: TableColumnConfig<FileListItem>[] = [
{ label: _('edit-dossier-dialog.deleted-documents.table-col-names.name'), width: '3fr' },
{ label: _('edit-dossier-dialog.deleted-documents.table-col-names.pages') },
{ label: _('edit-dossier-dialog.deleted-documents.table-col-names.assignee'), class: 'user-column' },
{ label: _('edit-dossier-dialog.deleted-documents.table-col-names.status') },
{ label: _('edit-dossier-dialog.deleted-documents.table-col-names.deleted-on'), sortByKey: 'softDeleted', width: '2fr' },
{ label: _('edit-dossier-dialog.deleted-documents.table-col-names.time-to-restore'), sortByKey: 'softDeleted', width: '2fr' },
];
@ -59,6 +67,8 @@ export class EditDossierDeletedDocumentsComponent extends ListingComponent<FileL
private readonly _loadingService: LoadingService,
private readonly _configService: ConfigService,
private readonly _dialogService: DossiersDialogService,
private readonly _permissionsService: PermissionsService,
private readonly _userService: UserService,
) {
super(_injector);
}
@ -70,6 +80,13 @@ export class EditDossierDeletedDocumentsComponent extends ListingComponent<FileL
);
}
private get _canDeleteSelected$(): Observable<boolean> {
return this.listingService.selectedEntities$.pipe(
map(entities => entities.length && !entities.find(file => !file.canHardDelete)),
distinctUntilChanged(),
);
}
hardDelete(files = this.listingService.selected) {
const data = new ConfirmationDialogInput({
title: _('confirmation-dialog.permanently-delete-file.title'),
@ -133,21 +150,26 @@ export class EditDossierDeletedDocumentsComponent extends ListingComponent<FileL
return files.map(file => this._toListItem(file));
}
private _toListItem(file: IFile): FileListItem {
const restoreDate = this._getRestoreDate(file.softDeleted);
private _toListItem(_file: IFile): FileListItem {
const file = new File(_file, this._userService.getNameForId(_file.assignee));
const restoreDate = this._getRestoreDate(_file.softDeleted);
return {
id: file.fileId,
...file,
restoreDate,
searchKey: file.filename,
canRestore: this._canRestoreFile(restoreDate),
canRestore: this._canRestore(file, restoreDate),
canHardDelete: this._canPerformActions(file),
};
}
private _canRestoreFile(restoreDate: string): boolean {
const { daysLeft, hoursLeft, minutesLeft } = getLeftDateTime(restoreDate);
private _canPerformActions(file: File): boolean {
return this._userService.currentUser.isManager || this._permissionsService.canDeleteFile(file);
}
return daysLeft >= 0 && hoursLeft >= 0 && minutesLeft >= 0;
private _canRestore(file: File, restoreDate: string): boolean {
const { daysLeft, hoursLeft, minutesLeft } = getLeftDateTime(restoreDate);
return this._canPerformActions(file) && daysLeft + hoursLeft + minutesLeft > 0;
}
private _getRestoreDate(softDeletedTime: string): string {

View File

@ -28,5 +28,5 @@
</div>
<ng-template #avatar let-userId="userId">
<redaction-initials-avatar [user]="userId" [withName]="true" color="gray" size="small"></redaction-initials-avatar>
<redaction-initials-avatar [user]="userId" [withName]="true" color="gray"></redaction-initials-avatar>
</ng-template>

View File

@ -1,5 +1,5 @@
<button [class.overlay]="showDot" mat-button>
<redaction-initials-avatar [user]="userService.currentUser$ | async" [withName]="true" size="small"></redaction-initials-avatar>
<redaction-initials-avatar [user]="userService.currentUser$ | async" [withName]="true"></redaction-initials-avatar>
<mat-icon svgIcon="iqser:arrow-down"></mat-icon>
</button>
<div *ngIf="showDot" class="dot"></div>

View File

@ -6,7 +6,7 @@
>
{{ _user | name: { showInitials: true } }}
</div>
<div *ngIf="withName" [class.disabled]="disabled" class="clamp-2 username">
<div *ngIf="withName" [class.disabled]="disabled" class="clamp-1 username">
{{ userName }}
</div>
</div>

View File

@ -875,9 +875,11 @@
"title": "There are no deleted documents."
},
"table-col-names": {
"assignee": "Assignee",
"deleted-on": "Deleted On",
"name": "Name",
"pages": "Pages",
"status": "Status",
"time-to-restore": "Time To Restore"
},
"table-header": {

@ -1 +1 @@
Subproject commit 0610684e8fb963fab1f7dd51fd850a7b47287fca
Subproject commit 3d7d8d3d28a682cd26df7af4e6c1bbc90f640521