fix rebase

This commit is contained in:
Dan Percic 2021-09-28 16:35:54 +03:00
parent 10798dd934
commit e09358a4c0
6 changed files with 67 additions and 72 deletions

View File

@ -97,7 +97,7 @@
<iqser-circle-button <iqser-circle-button
(action)="setFileApproved($event)" (action)="setFileApproved($event)"
*ngIf="showApprove" *ngIf="showApprove"
[disabled]="!fileStatus.canBeApproved" [disabled]="!file.canBeApproved"
[tooltipPosition]="tooltipPosition" [tooltipPosition]="tooltipPosition"
[tooltip]="file.canBeApproved ? ('dossier-overview.approve' | translate) : ('dossier-overview.approve-disabled' | translate)" [tooltip]="file.canBeApproved ? ('dossier-overview.approve' | translate) : ('dossier-overview.approve-disabled' | translate)"
[type]="buttonType" [type]="buttonType"

View File

@ -88,8 +88,8 @@ export class FileActionsComponent extends AutoUnsubscribe implements OnInit, OnD
} }
ngOnInit(): void { ngOnInit(): void {
if (!this.fileStatus) { if (!this.file) {
this.fileStatus = this.appStateService.activeFile; this.file = this.appStateService.activeFile;
} }
this._setup(); this._setup();
this.addSubscription = this.appStateService.fileChanged$.pipe(filter(file => file.fileId === this.file?.fileId)).subscribe(file => { this.addSubscription = this.appStateService.fileChanged$.pipe(filter(file => file.fileId === this.file?.fileId)).subscribe(file => {
@ -240,30 +240,28 @@ export class FileActionsComponent extends AutoUnsubscribe implements OnInit, OnD
} }
private _setup() { private _setup() {
this.statusBarConfig = [{ color: this.fileStatus.status, length: 1 }]; this.statusBarConfig = [{ color: this.file.status, length: 1 }];
this.tooltipPosition = this.isFilePreview ? 'below' : 'above'; this.tooltipPosition = this.isFilePreview ? 'below' : 'above';
this.assignTooltip = this.fileStatus.isUnderApproval this.assignTooltip = this.file.isUnderApproval ? _('dossier-overview.assign-approver') : _('dossier-overview.assign-reviewer');
? _('dossier-overview.assign-approver')
: _('dossier-overview.assign-reviewer');
this.buttonType = this.isFilePreview ? CircleButtonTypes.default : CircleButtonTypes.dark; this.buttonType = this.isFilePreview ? CircleButtonTypes.default : CircleButtonTypes.dark;
this.toggleTooltip = this._toggleTooltip; this.toggleTooltip = this._toggleTooltip;
this.showUndoApproval = this.permissionsService.canUndoApproval(this.fileStatus) && !this.isDossierOverviewWorkflow; this.showUndoApproval = this.permissionsService.canUndoApproval(this.file) && !this.isDossierOverviewWorkflow;
this.showUnderReview = this.permissionsService.canSetUnderReview(this.fileStatus) && !this.isDossierOverviewWorkflow; this.showUnderReview = this.permissionsService.canSetUnderReview(this.file) && !this.isDossierOverviewWorkflow;
this.showUnderApproval = this.permissionsService.canSetUnderApproval(this.fileStatus) && !this.isDossierOverviewWorkflow; this.showUnderApproval = this.permissionsService.canSetUnderApproval(this.file) && !this.isDossierOverviewWorkflow;
this.showApprove = this.permissionsService.isReadyForApproval(this.fileStatus) && !this.isDossierOverviewWorkflow; this.showApprove = this.permissionsService.isReadyForApproval(this.file) && !this.isDossierOverviewWorkflow;
this.canToggleAnalysis = this.permissionsService.canToggleAnalysis(this.fileStatus); this.canToggleAnalysis = this.permissionsService.canToggleAnalysis(this.file);
this.showDelete = this.permissionsService.canDeleteFile(this.fileStatus); this.showDelete = this.permissionsService.canDeleteFile(this.file);
this.showOCR = this.fileStatus.canBeOCRed; this.showOCR = this.file.canBeOCRed;
this.canReanalyse = this.permissionsService.canReanalyseFile(this.fileStatus); this.canReanalyse = this.permissionsService.canReanalyseFile(this.file);
this.showStatusBar = this.fileStatus.isWorkable && this.isDossierOverviewList; this.showStatusBar = this.file.isWorkable && this.isDossierOverviewList;
this.showAssignToSelf = this.permissionsService.canAssignToSelf(this.fileStatus) && this.isDossierOverview; this.showAssignToSelf = this.permissionsService.canAssignToSelf(this.file) && this.isDossierOverview;
this.showAssign = this.permissionsService.canAssignUser(this.fileStatus) && this.isDossierOverview; this.showAssign = this.permissionsService.canAssignUser(this.file) && this.isDossierOverview;
this.showOpenDocument = this.fileStatus.canBeOpened && this.isDossierOverviewWorkflow; this.showOpenDocument = this.file.canBeOpened && this.isDossierOverviewWorkflow;
this.showExcludePages = this.isFilePreview; this.showExcludePages = this.isFilePreview;
this.showDocumentInfo = this.isFilePreview; this.showDocumentInfo = this.isFilePreview;

View File

@ -94,18 +94,18 @@
<ng-template #filenameTemplate let-file="entity"> <ng-template #filenameTemplate let-file="entity">
<div class="cell"> <div class="cell">
<div> <div>
<div [class.error]="fileStatus.isError" [matTooltip]="fileStatus.filename" class="table-item-title" matTooltipPosition="above"> <div [class.error]="file.isError" [matTooltip]="file.filename" class="table-item-title" matTooltipPosition="above">
{{ fileStatus.filename }} {{ file.filename }}
</div> </div>
</div> </div>
<div *ngIf="fileStatus.primaryAttribute" class="small-label"> <div *ngIf="file.primaryAttribute" class="small-label">
<div class="primary-attribute"> <div class="primary-attribute">
<span [matTooltip]="fileStatus.primaryAttribute" matTooltipPosition="above"> <span [matTooltip]="file.primaryAttribute" matTooltipPosition="above">
{{ fileStatus.primaryAttribute }} {{ file.primaryAttribute }}
</span> </span>
</div> </div>
</div> </div>
<ng-container *ngTemplateOutlet="statsTemplate; context: { entity: fileStatus }"></ng-container> <ng-container *ngTemplateOutlet="statsTemplate; context: { entity: file }"></ng-container>
</div> </div>
</ng-template> </ng-template>
@ -199,41 +199,41 @@
</div> </div>
</ng-template> </ng-template>
<ng-template #workflowItemTemplate let-fileStatus="entity"> <ng-template #workflowItemTemplate let-file="entity">
<div class="workflow-item"> <div class="workflow-item">
<div> <div>
<div class="details"> <div class="details">
<div [matTooltip]="fileStatus.filename" class="filename" matTooltipPosition="above"> <div [matTooltip]="file.filename" class="filename" matTooltipPosition="above">
{{ fileStatus.filename }} {{ file.filename }}
</div> </div>
<ng-container *ngTemplateOutlet="statsTemplate; context: { entity: fileStatus }"></ng-container> <ng-container *ngTemplateOutlet="statsTemplate; context: { entity: file }"></ng-container>
</div> </div>
<div class="user"> <div class="user">
<redaction-initials-avatar [userId]="fileStatus.currentReviewer"></redaction-initials-avatar> <redaction-initials-avatar [userId]="file.currentReviewer"></redaction-initials-avatar>
</div> </div>
</div> </div>
<redaction-file-actions <redaction-file-actions
(actionPerformed)="actionPerformed($event, fileStatus)" (actionPerformed)="actionPerformed($event, file)"
*ngIf="!fileStatus.isProcessing" *ngIf="!file.isProcessing"
[fileStatus]="fileStatus" [file]="file"
type="dossier-overview-workflow" type="dossier-overview-workflow"
></redaction-file-actions> ></redaction-file-actions>
</div> </div>
</ng-template> </ng-template>
<ng-template #statsTemplate let-fileStatus="entity"> <ng-template #statsTemplate let-file="entity">
<div class="small-label stats-subtitle"> <div class="small-label stats-subtitle">
<div> <div>
<mat-icon svgIcon="red:pages"></mat-icon> <mat-icon svgIcon="red:pages"></mat-icon>
{{ fileStatus.numberOfPages }} {{ file.numberOfPages }}
</div> </div>
<div> <div>
<mat-icon svgIcon="red:exclude-pages"></mat-icon> <mat-icon svgIcon="red:exclude-pages"></mat-icon>
{{ fileStatus.excludedPagesCount }} {{ file.excludedPagesCount }}
</div> </div>
<div *ngIf="fileStatus.lastOCRTime" [matTooltipPosition]="'above'" [matTooltip]="'dossier-overview.ocr-performed' | translate"> <div *ngIf="file.lastOCRTime" [matTooltipPosition]="'above'" [matTooltip]="'dossier-overview.ocr-performed' | translate">
<mat-icon svgIcon="red:ocr"></mat-icon> <mat-icon svgIcon="red:ocr"></mat-icon>
{{ fileStatus.lastOCRTime | date: 'mediumDate' }} {{ file.lastOCRTime | date: 'mediumDate' }}
</div> </div>
</div> </div>
</ng-template> </ng-template>

View File

@ -10,7 +10,7 @@ import {
TemplateRef, TemplateRef,
ViewChild ViewChild
} from '@angular/core'; } from '@angular/core';
import { FileAttributeConfig, FileStatus } from '@redaction/red-ui-http'; import { FileStatus, FileStatuses, IFileAttributeConfig } from '@redaction/red-ui-http';
import { AppStateService } from '@state/app-state.service'; import { AppStateService } from '@state/app-state.service';
import { FileDropOverlayService } from '@upload-download/services/file-drop-overlay.service'; import { FileDropOverlayService } from '@upload-download/services/file-drop-overlay.service';
import { FileUploadModel } from '@upload-download/model/file-upload.model'; import { FileUploadModel } from '@upload-download/model/file-upload.model';
@ -52,11 +52,9 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { annotationFilterChecker } from '@utils/filter-utils'; import { annotationFilterChecker } from '@utils/filter-utils';
import { PermissionsService } from '@services/permissions.service'; import { PermissionsService } from '@services/permissions.service';
import { RouterHistoryService } from '@services/router-history.service'; import { RouterHistoryService } from '@services/router-history.service';
import { IFileAttributeConfig } from '@redaction/red-ui-http';
import { Dossier } from '@state/model/dossier'; import { Dossier } from '@state/model/dossier';
import { Router } from '@angular/router'; import { Router } from '@angular/router';
import { FileActionService } from '../../services/file-action.service'; import { FileActionService } from '../../services/file-action.service';
import StatusEnum = FileStatus.StatusEnum;
@Component({ @Component({
templateUrl: './dossier-overview-screen.component.html', templateUrl: './dossier-overview-screen.component.html',
@ -88,7 +86,7 @@ export class DossierOverviewScreenComponent extends ListingComponent<File> imple
@ViewChild('reviewerTemplate', { static: true }) reviewerTemplate: TemplateRef<unknown>; @ViewChild('reviewerTemplate', { static: true }) reviewerTemplate: TemplateRef<unknown>;
@ViewChild('pagesTemplate', { static: true }) pagesTemplate: TemplateRef<unknown>; @ViewChild('pagesTemplate', { static: true }) pagesTemplate: TemplateRef<unknown>;
@ViewChild('statusTemplate', { static: true }) statusTemplate: TemplateRef<unknown>; @ViewChild('statusTemplate', { static: true }) statusTemplate: TemplateRef<unknown>;
readonly workflowConfig: WorkflowConfig<FileStatusWrapper, StatusEnum>; readonly workflowConfig: WorkflowConfig<File, FileStatus>;
@ViewChild(DossierDetailsComponent, { static: false }) @ViewChild(DossierDetailsComponent, { static: false })
private readonly _dossierDetailsComponent: DossierDetailsComponent; private readonly _dossierDetailsComponent: DossierDetailsComponent;
private _lastScrolledIndex: number; private _lastScrolledIndex: number;
@ -123,38 +121,38 @@ export class DossierOverviewScreenComponent extends ListingComponent<File> imple
).fileAttributeConfigs; ).fileAttributeConfigs;
this.workflowConfig = { this.workflowConfig = {
columnIdentifierFn: entity => entity.status, columnIdentifierFn: entity => entity.status,
itemVersionFn: (entity: FileStatusWrapper) => `${entity.lastUpdated}-${entity.numberOfAnalyses}`, itemVersionFn: (entity: File) => `${entity.lastUpdated}-${entity.numberOfAnalyses}`,
columns: [ columns: [
{ {
label: fileStatusTranslations[StatusEnum.UNASSIGNED], label: fileStatusTranslations[FileStatuses.UNASSIGNED],
key: StatusEnum.UNASSIGNED, key: FileStatuses.UNASSIGNED,
enterFn: this.unassignFn, enterFn: this.unassignFn,
enterPredicate: (entity: FileStatusWrapper) => false, enterPredicate: (entity: File) => false,
color: '#D3D5DA' color: '#D3D5DA'
}, },
{ {
label: fileStatusTranslations[StatusEnum.UNDERREVIEW], label: fileStatusTranslations[FileStatuses.UNDER_REVIEW],
enterFn: this.underReviewFn, enterFn: this.underReviewFn,
enterPredicate: (file: FileStatusWrapper) => enterPredicate: (file: File) =>
this.permissionsService.canSetUnderReview(file) || this.permissionsService.canSetUnderReview(file) ||
this.permissionsService.canAssignToSelf(file) || this.permissionsService.canAssignToSelf(file) ||
this.permissionsService.canAssignUser(file), this.permissionsService.canAssignUser(file),
key: StatusEnum.UNDERREVIEW, key: FileStatuses.UNDER_REVIEW,
color: '#FDBD00' color: '#FDBD00'
}, },
{ {
label: fileStatusTranslations[StatusEnum.UNDERAPPROVAL], label: fileStatusTranslations[FileStatuses.UNDER_APPROVAL],
enterFn: this.underApprovalFn, enterFn: this.underApprovalFn,
enterPredicate: (file: FileStatusWrapper) => enterPredicate: (file: File) =>
this.permissionsService.canSetUnderApproval(file) || this.permissionsService.canUndoApproval(file), this.permissionsService.canSetUnderApproval(file) || this.permissionsService.canUndoApproval(file),
key: StatusEnum.UNDERAPPROVAL, key: FileStatuses.UNDER_APPROVAL,
color: '#374C81' color: '#374C81'
}, },
{ {
label: fileStatusTranslations[StatusEnum.APPROVED], label: fileStatusTranslations[FileStatuses.APPROVED],
enterFn: this.approveFn, enterFn: this.approveFn,
enterPredicate: (file: FileStatusWrapper) => this.permissionsService.isReadyForApproval(file), enterPredicate: (file: File) => this.permissionsService.isReadyForApproval(file),
key: StatusEnum.APPROVED, key: FileStatuses.APPROVED,
color: '#48C9F7' color: '#48C9F7'
} }
] ]
@ -173,47 +171,47 @@ export class DossierOverviewScreenComponent extends ListingComponent<File> imple
return this.fileAttributeConfigs.filter(config => config.displayedInFileList); return this.fileAttributeConfigs.filter(config => config.displayedInFileList);
} }
unassignFn = async (file: FileStatusWrapper) => { unassignFn = async (file: File) => {
// TODO // TODO
console.log('unassign', file); console.log('unassign', file);
}; };
underReviewFn = (file: FileStatusWrapper) => { underReviewFn = (file: File) => {
this._fileActionService.assignFile('reviewer', null, file, () => this._loadingService.loadWhile(this.reloadDossiers()), true); this._fileActionService.assignFile('reviewer', null, file, () => this._loadingService.loadWhile(this.reloadDossiers()), true);
}; };
underApprovalFn = async (file: FileStatusWrapper) => { underApprovalFn = async (file: File) => {
if (this._appStateService.activeDossier.approverIds.length > 1) { if (this._appStateService.activeDossier.approverIds.length > 1) {
this._fileActionService.assignFile('approver', null, file, () => this._loadingService.loadWhile(this.reloadDossiers()), true); this._fileActionService.assignFile('approver', null, file, () => this._loadingService.loadWhile(this.reloadDossiers()), true);
} else { } else {
this._loadingService.start(); this._loadingService.start();
await this._fileActionService.setFileUnderApproval(file).toPromise(); await this._fileActionService.setFilesUnderApproval([file]).toPromise();
await this.reloadDossiers(); await this.reloadDossiers();
this._loadingService.stop(); this._loadingService.stop();
} }
}; };
approveFn = async (file: FileStatusWrapper) => { approveFn = async (file: File) => {
this._loadingService.start(); this._loadingService.start();
await this._fileActionService.setFileApproved(file).toPromise(); await this._fileActionService.setFilesApproved([file]).toPromise();
await this.reloadDossiers(); await this.reloadDossiers();
this._loadingService.stop(); this._loadingService.stop();
}; };
actionPerformed(action?: string, fileStatus?: FileStatusWrapper) { actionPerformed(action?: string, fileStatus?: File) {
this._calculateData(); this.calculateData();
if (action === 'navigate') { if (action === 'navigate') {
this._router.navigate(this.routerLinkFn(fileStatus)); this._router.navigate(this.routerLinkFn(fileStatus));
} }
} }
routerLinkFn = (fileStatus: FileStatusWrapper) => routerLinkFn = (fileStatus: File) =>
fileStatus.canBeOpened ? [`/main/dossiers/${this.currentDossier.id}/file/${fileStatus.fileId}`] : []; fileStatus.canBeOpened ? [`/main/dossiers/${this.currentDossier.id}/file/${fileStatus.fileId}`] : [];
disabledFn = (fileStatus: FileStatusWrapper) => fileStatus.excluded; disabledFn = (fileStatus: File) => fileStatus.excluded;
lastOpenedFn = (fileStatus: FileStatusWrapper) => fileStatus.lastOpened; lastOpenedFn = (fileStatus: File) => fileStatus.lastOpened;
async ngOnInit(): Promise<void> { async ngOnInit(): Promise<void> {
this._configureTableColumns(); this._configureTableColumns();
@ -221,7 +219,7 @@ export class DossierOverviewScreenComponent extends ListingComponent<File> imple
try { try {
this._fileDropOverlayService.initFileDropHandling(); this._fileDropOverlayService.initFileDropHandling();
this._calculateData(); this.calculateData();
this.addSubscription = timer(0, 7500).subscribe(async () => { this.addSubscription = timer(0, 7500).subscribe(async () => {
await this._appStateService.reloadActiveDossierFilesIfNecessary(); await this._appStateService.reloadActiveDossierFilesIfNecessary();
@ -229,7 +227,7 @@ export class DossierOverviewScreenComponent extends ListingComponent<File> imple
}); });
this.addSubscription = this._appStateService.fileChanged$.subscribe(() => { this.addSubscription = this._appStateService.fileChanged$.subscribe(() => {
this._calculateData(); this.calculateData();
}); });
this.addSubscription = this._appStateService.dossierTemplateChanged$.subscribe(() => { this.addSubscription = this._appStateService.dossierTemplateChanged$.subscribe(() => {
@ -277,10 +275,10 @@ export class DossierOverviewScreenComponent extends ListingComponent<File> imple
async reloadDossiers() { async reloadDossiers() {
await this._appStateService.getFiles(this.currentDossier, false); await this._appStateService.getFiles(this.currentDossier, false);
this._calculateData(); this.calculateData();
} }
_calculateData(): void { calculateData(): void {
if (!this._appStateService.activeDossierId) { if (!this._appStateService.activeDossierId) {
return; return;
} }

View File

@ -8,7 +8,6 @@ import { DossiersDialogService } from './dossiers-dialog.service';
import { ConfirmationDialogInput } from '@shared/dialogs/confirmation-dialog/confirmation-dialog.component'; import { ConfirmationDialogInput } from '@shared/dialogs/confirmation-dialog/confirmation-dialog.component';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { FilesService } from './files.service'; import { FilesService } from './files.service';
import { Observable } from 'rxjs';
@Injectable() @Injectable()
export class FileActionService { export class FileActionService {

View File

@ -1,7 +1,7 @@
import { Component, EventEmitter, Input, Optional, Output, TemplateRef } from '@angular/core'; import { Component, EventEmitter, Input, Optional, Output, TemplateRef } from '@angular/core';
import { ActionConfig } from '@shared/components/page-header/models/action-config.model'; import { ActionConfig } from '@shared/components/page-header/models/action-config.model';
import { ButtonConfig } from '@shared/components/page-header/models/button-config.model'; import { ButtonConfig } from '@shared/components/page-header/models/button-config.model';
import { FilterService, IListable, SearchService } from '@iqser/common-ui'; import { FilterService, IconButtonTypes, IListable, SearchService } from '@iqser/common-ui';
import { distinctUntilChanged, map } from 'rxjs/operators'; import { distinctUntilChanged, map } from 'rxjs/operators';
import { combineLatest, Observable, of } from 'rxjs'; import { combineLatest, Observable, of } from 'rxjs';
import { SearchPosition, SearchPositions } from '@shared/components/page-header/models/search-positions.type'; import { SearchPosition, SearchPositions } from '@shared/components/page-header/models/search-positions.type';