RED-3796: Handle inactive dossier templates

This commit is contained in:
Adina Țeudan 2022-06-07 16:06:49 +03:00
parent 914eac0ca0
commit c3bf6c08ae
7 changed files with 36 additions and 19 deletions

View File

@ -69,7 +69,7 @@
</div> </div>
<iqser-icon-button <iqser-icon-button
(action)="newDossier()" (action)="newDossier()"
*ngIf="permissionsService.canCreateDossier()" *ngIf="permissionsService.canCreateDossier(dossierTemplate)"
[label]="'dashboard.empty-template.new-dossier' | translate" [label]="'dashboard.empty-template.new-dossier' | translate"
[type]="iconButtonTypes.primary" [type]="iconButtonTypes.primary"
icon="iqser:plus" icon="iqser:plus"

View File

@ -1,6 +1,6 @@
import { Injectable, TemplateRef } from '@angular/core'; import { Injectable, TemplateRef } from '@angular/core';
import { ButtonConfig, IFilterGroup, INestedFilter, keyChecker, NestedFilter, TableColumnConfig } from '@iqser/common-ui'; import { ButtonConfig, IFilterGroup, INestedFilter, keyChecker, NestedFilter, TableColumnConfig } from '@iqser/common-ui';
import { Dossier, StatusSorter, User, WorkflowFileStatus } from '@red/domain'; import { Dossier, DossierTemplate, StatusSorter, User, WorkflowFileStatus } from '@red/domain';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { UserPreferenceService } from '@services/user-preference.service'; import { UserPreferenceService } from '@services/user-preference.service';
@ -40,12 +40,12 @@ export class ConfigService {
return this._userService.currentUser; return this._userService.currentUser;
} }
buttonsConfig(dossierTemplateId: string): ButtonConfig[] { buttonsConfig(dossierTemplate: DossierTemplate): ButtonConfig[] {
return [ return [
{ {
label: _('dossier-listing.add-new'), label: _('dossier-listing.add-new'),
action: () => this._openAddDossierDialog(dossierTemplateId), action: () => this._openAddDossierDialog(dossierTemplate.id),
hide: !this._permissionsService.canCreateDossier(), hide: !this._permissionsService.canCreateDossier(dossierTemplate),
icon: 'iqser:plus', icon: 'iqser:plus',
type: 'primary', type: 'primary',
helpModeKey: 'new_dossier_button', helpModeKey: 'new_dossier_button',

View File

@ -12,13 +12,13 @@
<iqser-table <iqser-table
(noDataAction)="openAddDossierDialog()" (noDataAction)="openAddDossierDialog()"
[hasScrollButton]="true" [hasScrollButton]="true"
[helpModeKey]="'dossier'"
[itemSize]="85" [itemSize]="85"
[noDataButtonLabel]="'dossier-listing.no-data.action' | translate" [noDataButtonLabel]="'dossier-listing.no-data.action' | translate"
[noDataText]="'dossier-listing.no-data.title' | translate" [noDataText]="'dossier-listing.no-data.title' | translate"
[noMatchText]="'dossier-listing.no-match.title' | translate" [noMatchText]="'dossier-listing.no-match.title' | translate"
[showNoDataButton]="permissionsService.canCreateDossier()" [showNoDataButton]="permissionsService.canCreateDossier(dossierTemplate)"
[tableColumnConfigs]="tableColumnConfigs" [tableColumnConfigs]="tableColumnConfigs"
[helpModeKey]="'dossier'"
noDataIcon="red:folder" noDataIcon="red:folder"
></iqser-table> ></iqser-table>
</div> </div>
@ -30,7 +30,7 @@
</section> </section>
<ng-template #needsWorkFilterTemplate let-filter="filter"> <ng-template #needsWorkFilterTemplate let-filter="filter">
<redaction-type-filter [dossierTemplateId]="dossierTemplateId" [filter]="filter"></redaction-type-filter> <redaction-type-filter [dossierTemplateId]="dossierTemplate.id" [filter]="filter"></redaction-type-filter>
</ng-template> </ng-template>
<ng-template #tableItemTemplate let-dossier="entity"> <ng-template #tableItemTemplate let-dossier="entity">

View File

@ -1,5 +1,5 @@
import { ChangeDetectionStrategy, Component, forwardRef, Injector, OnInit, TemplateRef, ViewChild } from '@angular/core'; import { ChangeDetectionStrategy, Component, forwardRef, Injector, OnInit, TemplateRef, ViewChild } from '@angular/core';
import { Dossier, DOSSIER_TEMPLATE_ID } from '@red/domain'; import { Dossier, DOSSIER_TEMPLATE_ID, DossierTemplate } from '@red/domain';
import { PermissionsService } from '@services/permissions.service'; import { PermissionsService } from '@services/permissions.service';
import { ButtonConfig, DefaultListingServices, ListingComponent, OnAttach, TableComponent } from '@iqser/common-ui'; import { ButtonConfig, DefaultListingServices, ListingComponent, OnAttach, TableComponent } from '@iqser/common-ui';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
@ -9,6 +9,7 @@ import { tap } from 'rxjs/operators';
import { Router } from '@angular/router'; import { Router } from '@angular/router';
import { UserPreferenceService } from '@services/user-preference.service'; import { UserPreferenceService } from '@services/user-preference.service';
import { SharedDialogService } from '@shared/services/dialog.service'; import { SharedDialogService } from '@shared/services/dialog.service';
import { DossierTemplatesService } from '../../../services/dossier-templates/dossier-templates.service';
@Component({ @Component({
templateUrl: './dossiers-listing-screen.component.html', templateUrl: './dossiers-listing-screen.component.html',
@ -20,7 +21,7 @@ export class DossiersListingScreenComponent extends ListingComponent<Dossier> im
readonly tableColumnConfigs = this._configService.tableConfig; readonly tableColumnConfigs = this._configService.tableConfig;
readonly tableHeaderLabel = _('dossier-listing.table-header.title'); readonly tableHeaderLabel = _('dossier-listing.table-header.title');
readonly buttonConfigs: ButtonConfig[]; readonly buttonConfigs: ButtonConfig[];
readonly dossierTemplateId: string; readonly dossierTemplate: DossierTemplate;
@ViewChild('needsWorkFilterTemplate', { @ViewChild('needsWorkFilterTemplate', {
read: TemplateRef, read: TemplateRef,
static: true, static: true,
@ -36,22 +37,24 @@ export class DossiersListingScreenComponent extends ListingComponent<Dossier> im
private readonly _dialogService: SharedDialogService, private readonly _dialogService: SharedDialogService,
private readonly _activeDossiersService: ActiveDossiersService, private readonly _activeDossiersService: ActiveDossiersService,
private readonly _userPreferenceService: UserPreferenceService, private readonly _userPreferenceService: UserPreferenceService,
private readonly _dossierTemplatesService: DossierTemplatesService,
) { ) {
super(_injector); super(_injector);
this.dossierTemplateId = router.routerState.snapshot.root.firstChild.firstChild.paramMap.get(DOSSIER_TEMPLATE_ID); const dossierTemplateId = router.routerState.snapshot.root.firstChild.firstChild.paramMap.get(DOSSIER_TEMPLATE_ID);
this.buttonConfigs = this._configService.buttonsConfig(this.dossierTemplateId); this.dossierTemplate = this._dossierTemplatesService.find(dossierTemplateId);
this.entitiesService.setEntities(this._activeDossiersService.all.filter(d => d.dossierTemplateId === this.dossierTemplateId)); this.buttonConfigs = this._configService.buttonsConfig(this.dossierTemplate);
this.entitiesService.setEntities(this._activeDossiersService.all.filter(d => d.dossierTemplateId === this.dossierTemplate.id));
} }
openAddDossierDialog(): void { openAddDossierDialog(): void {
this._dialogService.openDialog('addDossier', null, { dossierTemplateId: this.dossierTemplateId }); this._dialogService.openDialog('addDossier', null, { dossierTemplateId: this.dossierTemplate.id });
} }
async ngOnInit(): Promise<void> { async ngOnInit(): Promise<void> {
await this._userPreferenceService.saveLastDossierTemplate(this.dossierTemplateId); await this._userPreferenceService.saveLastDossierTemplate(this.dossierTemplate.id);
this.addSubscription = this.entitiesService.all$.pipe(tap(() => this._computeAllFilters())).subscribe(); this.addSubscription = this.entitiesService.all$.pipe(tap(() => this._computeAllFilters())).subscribe();
this.addSubscription = this._activeDossiersService.all$ this.addSubscription = this._activeDossiersService.all$
.pipe(tap(dossiers => this.entitiesService.setEntities(dossiers.filter(d => d.dossierTemplateId === this.dossierTemplateId)))) .pipe(tap(dossiers => this.entitiesService.setEntities(dossiers.filter(d => d.dossierTemplateId === this.dossierTemplate.id))))
.subscribe(); .subscribe();
} }

View File

@ -1,6 +1,15 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { UserService } from './user.service'; import { UserService } from './user.service';
import { Dictionary, Dossier, DOSSIERS_ARCHIVE, File, IComment, IDossier } from '@red/domain'; import {
Dictionary,
Dossier,
DOSSIERS_ARCHIVE,
DossierTemplateStatus,
DossierTemplateStatuses,
File,
IComment,
IDossier,
} from '@red/domain';
import { FilesMapService } from '@services/files/files-map.service'; import { FilesMapService } from '@services/files/files-map.service';
import { FeaturesService } from '@services/features.service'; import { FeaturesService } from '@services/features.service';
@ -196,8 +205,8 @@ export class PermissionsService {
return this.isOwner(dossier) || (this.isManager() && this.isDossierMember(dossier)); return this.isOwner(dossier) || (this.isManager() && this.isDossierMember(dossier));
} }
canCreateDossier(): boolean { canCreateDossier(dossierTemplate: { dossierTemplateStatus: DossierTemplateStatus }): boolean {
return this.isManager(); return dossierTemplate.dossierTemplateStatus === DossierTemplateStatuses.ACTIVE && this.isManager();
} }
canArchiveDossier(dossier: Dossier): boolean { canArchiveDossier(dossier: Dossier): boolean {

View File

@ -1,6 +1,7 @@
import { IListable, List } from '@iqser/common-ui'; import { IListable, List } from '@iqser/common-ui';
import { CountByStatus, CountPerProcessingStatus, CountPerWorkflowStatus, IDashboardStats } from './dashboard-stats'; import { CountByStatus, CountPerProcessingStatus, CountPerWorkflowStatus, IDashboardStats } from './dashboard-stats';
import { DonutChartConfig, StatusSorter } from '../shared'; import { DonutChartConfig, StatusSorter } from '../shared';
import { DossierTemplateStatus } from './constants';
export class DashboardStats implements IListable, IDashboardStats { export class DashboardStats implements IListable, IDashboardStats {
readonly dossierCountByStatus: List<CountByStatus>; readonly dossierCountByStatus: List<CountByStatus>;
@ -19,6 +20,7 @@ export class DashboardStats implements IListable, IDashboardStats {
readonly numberOfSoftDeletedFiles: number; readonly numberOfSoftDeletedFiles: number;
readonly dossiersChartConfig: DonutChartConfig[]; readonly dossiersChartConfig: DonutChartConfig[];
readonly documentsChartConfig: DonutChartConfig[]; readonly documentsChartConfig: DonutChartConfig[];
readonly dossierTemplateStatus: DossierTemplateStatus;
constructor(stats: IDashboardStats) { constructor(stats: IDashboardStats) {
this.dossierCountByStatus = stats.dossierCountByStatus; this.dossierCountByStatus = stats.dossierCountByStatus;
@ -35,6 +37,7 @@ export class DashboardStats implements IListable, IDashboardStats {
this.numberOfPages = stats.numberOfPages; this.numberOfPages = stats.numberOfPages;
this.numberOfPeople = stats.numberOfPeople; this.numberOfPeople = stats.numberOfPeople;
this.numberOfSoftDeletedFiles = stats.numberOfSoftDeletedFiles; this.numberOfSoftDeletedFiles = stats.numberOfSoftDeletedFiles;
this.dossierTemplateStatus = stats.dossierTemplateStatus;
this.dossiersChartConfig = this.#dossiersChartConfig; this.dossiersChartConfig = this.#dossiersChartConfig;
this.documentsChartConfig = this.#documentsChartConfig; this.documentsChartConfig = this.#documentsChartConfig;

View File

@ -1,5 +1,6 @@
import { ProcessingFileStatus, WorkflowFileStatus } from '../files'; import { ProcessingFileStatus, WorkflowFileStatus } from '../files';
import { List } from '@iqser/common-ui'; import { List } from '@iqser/common-ui';
import { DossierTemplateStatus } from './constants';
interface Counter { interface Counter {
readonly count: number; readonly count: number;
@ -32,4 +33,5 @@ export interface IDashboardStats {
readonly numberOfPages: number; readonly numberOfPages: number;
readonly numberOfPeople: number; readonly numberOfPeople: number;
readonly numberOfSoftDeletedFiles: number; readonly numberOfSoftDeletedFiles: number;
readonly dossierTemplateStatus: DossierTemplateStatus;
} }