RED-10206: disable new dossier button when the template is invalid.

This commit is contained in:
Nicoleta Panaghiu 2024-11-01 16:34:11 +02:00
parent 4dc7ecee78
commit b2e40b8f86
9 changed files with 32 additions and 24 deletions

View File

@ -15,7 +15,6 @@ import {
import { DossierStatsService } from '@services/dossiers/dossier-stats.service'; import { DossierStatsService } from '@services/dossiers/dossier-stats.service';
import { DefaultColorsService } from '@services/entity-services/default-colors.service'; import { DefaultColorsService } from '@services/entity-services/default-colors.service';
import { DossierStatesMapService } from '@services/entity-services/dossier-states-map.service'; import { DossierStatesMapService } from '@services/entity-services/dossier-states-map.service';
import { PermissionsService } from '@services/permissions.service';
import { SharedDialogService } from '@shared/services/dialog.service'; import { SharedDialogService } from '@shared/services/dialog.service';
import { workflowFileStatusTranslations } from '@translations/file-status-translations'; import { workflowFileStatusTranslations } from '@translations/file-status-translations';
import { workloadTranslations } from '@translations/workload-translations'; import { workloadTranslations } from '@translations/workload-translations';
@ -40,7 +39,6 @@ export class ConfigService {
private readonly _dossierStatsService: DossierStatsService, private readonly _dossierStatsService: DossierStatsService,
private readonly _dossierStatesMapService: DossierStatesMapService, private readonly _dossierStatesMapService: DossierStatesMapService,
private readonly _dialogService: SharedDialogService, private readonly _dialogService: SharedDialogService,
private readonly _permissionsService: PermissionsService,
private readonly _defaultColorsService: DefaultColorsService, private readonly _defaultColorsService: DefaultColorsService,
) {} ) {}
@ -67,9 +65,10 @@ export class ConfigService {
{ {
label: _('dossier-listing.add-new'), label: _('dossier-listing.add-new'),
action: () => this.#openAddDossierDialog(dossierTemplate.id), action: () => this.#openAddDossierDialog(dossierTemplate.id),
hide: !this._permissionsService.canCreateDossier(dossierTemplate),
icon: 'iqser:plus', icon: 'iqser:plus',
type: 'primary', type: 'primary',
tooltip: dossierTemplate.isInactive ? _('dossier-listing.template-inactive') : null,
disabled: dossierTemplate.isInactive,
helpModeKey: 'new_dossier', helpModeKey: 'new_dossier',
}, },
]; ];

View File

@ -1,5 +1,5 @@
<section> <section>
<iqser-page-header [buttonConfigs]="buttonConfigs" [helpModeKey]="'dossier'"> <iqser-page-header [buttonConfigs]="buttonConfigs()" [helpModeKey]="'dossier'">
<ng-container slot="beforeFilters"> <ng-container slot="beforeFilters">
<redaction-dossiers-type-switch></redaction-dossiers-type-switch> <redaction-dossiers-type-switch></redaction-dossiers-type-switch>
</ng-container> </ng-container>
@ -18,7 +18,7 @@
[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(dossierTemplate)" [showNoDataButton]="permissionsService.canCreateDossier(dossierTemplate())"
[tableColumnConfigs]="tableColumnConfigs" [tableColumnConfigs]="tableColumnConfigs"
[rowIdPrefix]="'dossier'" [rowIdPrefix]="'dossier'"
[namePropertyKey]="'dossierName'" [namePropertyKey]="'dossierName'"
@ -33,7 +33,7 @@
</section> </section>
<ng-template #needsWorkFilterTemplate let-filter="filter"> <ng-template #needsWorkFilterTemplate let-filter="filter">
<redaction-type-filter [dossierTemplateId]="dossierTemplate.id" [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,8 +1,7 @@
import { ChangeDetectionStrategy, Component, OnInit, TemplateRef, ViewChild } from '@angular/core'; import { ChangeDetectionStrategy, Component, computed, OnInit, TemplateRef, ViewChild } from '@angular/core';
import { Dossier, DOSSIER_TEMPLATE_ID, DossierTemplate } from '@red/domain'; import { Dossier, DOSSIER_TEMPLATE_ID } from '@red/domain';
import { PermissionsService } from '@services/permissions.service'; import { PermissionsService } from '@services/permissions.service';
import { import {
ButtonConfig,
HasScrollbarDirective, HasScrollbarDirective,
IqserListingModule, IqserListingModule,
ListingComponent, ListingComponent,
@ -25,6 +24,7 @@ import { DossiersListingDetailsComponent } from '../components/dossiers-listing-
import { AsyncPipe, NgIf } from '@angular/common'; import { AsyncPipe, NgIf } from '@angular/common';
import { TypeFilterComponent } from '@shared/components/type-filter/type-filter.component'; import { TypeFilterComponent } from '@shared/components/type-filter/type-filter.component';
import { TableItemComponent } from '../components/table-item/table-item.component'; import { TableItemComponent } from '../components/table-item/table-item.component';
import { toSignal } from '@angular/core/rxjs-interop';
@Component({ @Component({
templateUrl: './dossiers-listing-screen.component.html', templateUrl: './dossiers-listing-screen.component.html',
@ -47,8 +47,10 @@ import { TableItemComponent } from '../components/table-item/table-item.componen
export class DossiersListingScreenComponent extends ListingComponent<Dossier> implements OnInit, OnAttach { export class DossiersListingScreenComponent extends ListingComponent<Dossier> implements OnInit, OnAttach {
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 dossierTemplateId = this.router.routerState.snapshot.root.firstChild.firstChild.paramMap.get(DOSSIER_TEMPLATE_ID);
readonly dossierTemplate: DossierTemplate; readonly dossierTemplates = toSignal(this.dossierTemplatesService.all$);
readonly dossierTemplate = computed(() => this.dossierTemplates().find(template => this.dossierTemplateId === template.id));
readonly buttonConfigs = computed(() => this._configService.buttonsConfig(this.dossierTemplate()));
readonly computeFilters$ = this._activeDossiersService.all$.pipe(tap(() => this._computeAllFilters())); readonly computeFilters$ = this._activeDossiersService.all$.pipe(tap(() => this._computeAllFilters()));
@ViewChild('needsWorkFilterTemplate', { @ViewChild('needsWorkFilterTemplate', {
read: TemplateRef, read: TemplateRef,
@ -68,20 +70,19 @@ export class DossiersListingScreenComponent extends ListingComponent<Dossier> im
readonly dossierTemplatesService: DossierTemplatesService, readonly dossierTemplatesService: DossierTemplatesService,
) { ) {
super(); super();
const dossierTemplateId = router.routerState.snapshot.root.firstChild.firstChild.paramMap.get(DOSSIER_TEMPLATE_ID); this.entitiesService.setEntities(this._activeDossiersService.all.filter(d => d.dossierTemplateId === this.dossierTemplate().id));
this.dossierTemplate = dossierTemplatesService.find(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', { dossierTemplateId: this.dossierTemplate.id }); this._dialogService.openDialog('addDossier', { dossierTemplateId: this.dossierTemplate().id });
} }
async ngOnInit(): Promise<void> { async ngOnInit(): Promise<void> {
await this._userPreferenceService.saveLastDossierTemplate(this.dossierTemplate.id); await this._userPreferenceService.saveLastDossierTemplate(this.dossierTemplate().id);
this.addSubscription = this._activeDossiersService.all$ this.addSubscription = this._activeDossiersService.all$
.pipe(tap(dossiers => this.entitiesService.setEntities(dossiers.filter(d => d.dossierTemplateId === this.dossierTemplate.id)))) .pipe(
tap(dossiers => this.entitiesService.setEntities(dossiers.filter(d => d.dossierTemplateId === this.dossierTemplate().id))),
)
.subscribe(); .subscribe();
this._loadingService.stop(); this._loadingService.stop();
} }
@ -95,7 +96,7 @@ export class DossiersListingScreenComponent extends ListingComponent<Dossier> im
const filterGroups = this._configService.filterGroups( const filterGroups = this._configService.filterGroups(
this.entitiesService.all, this.entitiesService.all,
this._needsWorkFilterTemplate, this._needsWorkFilterTemplate,
this.dossierTemplate.id, this.dossierTemplate().id,
); );
this.filterService.addFilterGroups(filterGroups); this.filterService.addFilterGroups(filterGroups);
} }

View File

@ -943,7 +943,8 @@
}, },
"table-header": { "table-header": {
"title": "{length} {length, plural, one{aktives Dossier} other{aktive Dossiers}}" "title": "{length} {length, plural, one{aktives Dossier} other{aktive Dossiers}}"
} },
"template-inactive": "Aktuell ausgewählte Dossier-Vorlage inaktiv!"
}, },
"dossier-overview": { "dossier-overview": {
"approve": "Freigeben", "approve": "Freigeben",

View File

@ -943,7 +943,8 @@
}, },
"table-header": { "table-header": {
"title": "{length} active {length, plural, one{dossier} other{dossiers}}" "title": "{length} active {length, plural, one{dossier} other{dossiers}}"
} },
"template-inactive": "Currently selected dossier template inactive!"
}, },
"dossier-overview": { "dossier-overview": {
"approve": "Approve", "approve": "Approve",

View File

@ -943,7 +943,8 @@
}, },
"table-header": { "table-header": {
"title": "{length} {length, plural, one{aktives Dossier} other{aktive Dossiers}}" "title": "{length} {length, plural, one{aktives Dossier} other{aktive Dossiers}}"
} },
"template-inactive": "Aktuell ausgewählte Dossier-Vorlage inaktiv!"
}, },
"dossier-overview": { "dossier-overview": {
"approve": "Genehmigen", "approve": "Genehmigen",

View File

@ -943,7 +943,8 @@
}, },
"table-header": { "table-header": {
"title": "{length} active {length, plural, one{dossier} other{dossiers}}" "title": "{length} active {length, plural, one{dossier} other{dossiers}}"
} },
"template-inactive": "Currently selected dossier template inactive!"
}, },
"dossier-overview": { "dossier-overview": {
"approve": "Move to 'Done'", "approve": "Move to 'Done'",

@ -1 +1 @@
Subproject commit 074f88e66abc765b0ef8654eb56a552d88e1bbda Subproject commit b5724849502e72995cba0d53f37688284f6d3e5f

View File

@ -49,6 +49,10 @@ export class DossierTemplate implements IDossierTemplate, IListable {
return this.dossierTemplateStatus === DossierTemplateStatuses.ACTIVE; return this.dossierTemplateStatus === DossierTemplateStatuses.ACTIVE;
} }
get isInactive(): boolean {
return this.dossierTemplateStatus === DossierTemplateStatuses.INACTIVE;
}
get id(): string { get id(): string {
return this.dossierTemplateId; return this.dossierTemplateId;
} }