+
+
+
+
+
-
-
- {{ 'edit-dossier-dialog.general-info.form.template' | translate }}
-
-
+
+ {{ 'edit-dossier-dialog.general-info.form.template' | translate }}
+
+
+ {{ dossierTemplate.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ 'edit-dossier-dialog.general-info.form.watermark' | translate }}
+
+
+
+
+
+ {{ 'edit-dossier-dialog.general-info.form.watermark-preview' | translate }}
+
+
+
+
+
+
+
+
+
+ {{ 'edit-dossier-dialog.general-info.form.due-date' | translate }}
+
-
-
-
-
-
-
-
- {{ 'edit-dossier-dialog.general-info.form.watermark' | translate }}
-
-
-
-
-
- {{ 'edit-dossier-dialog.general-info.form.watermark-preview' | translate }}
-
-
-
-
diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.scss b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.scss
index 695782375..cadbd6f7a 100644
--- a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.scss
+++ b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.scss
@@ -23,3 +23,15 @@
border-top: none;
padding: 0;
}
+
+.fields-container {
+ flex-direction: column;
+
+ &:first-child {
+ margin-right: 40px;
+ }
+}
+
+redaction-small-chip {
+ margin-right: 8px;
+}
diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.ts b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.ts
index 8b9d48bf1..622aca251 100644
--- a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.ts
+++ b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.ts
@@ -1,7 +1,7 @@
import { Component, Input, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import * as moment from 'moment';
-import { Dossier, IDossierRequest, IDossierTemplate } from '@red/domain';
+import { Dossier, DossierState, IDossierRequest, IDossierTemplate } from '@red/domain';
import { EditDossierSaveResult, EditDossierSectionInterface } from '../edit-dossier-section.interface';
import { DossiersDialogService } from '../../../services/dossiers-dialog.service';
import { PermissionsService } from '@services/permissions.service';
@@ -14,7 +14,9 @@ import { DossiersService } from '@services/entity-services/dossiers.service';
import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service';
import { DossierStatsService } from '@services/entity-services/dossier-stats.service';
import { firstValueFrom } from 'rxjs';
+import { DossierStateService } from '@services/entity-services/dossier-state.service';
import { DOSSIER_TEMPLATE_ID } from '@utils/constants';
+import { TranslateService } from '@ngx-translate/core';
@Component({
selector: 'redaction-edit-dossier-general-info',
@@ -29,9 +31,12 @@ export class EditDossierGeneralInfoComponent implements OnInit, EditDossierSecti
form: FormGroup;
hasDueDate: boolean;
dossierTemplates: IDossierTemplate[];
+ states: DossierState[];
+ currentStatus: DossierState;
constructor(
readonly permissionsService: PermissionsService,
+ private readonly _dossierStateService: DossierStateService,
private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _dossiersService: DossiersService,
private readonly _dossierStatsService: DossierStatsService,
@@ -40,6 +45,7 @@ export class EditDossierGeneralInfoComponent implements OnInit, EditDossierSecti
private readonly _router: Router,
private readonly _editDossierDialogRef: MatDialogRef
,
private readonly _toaster: Toaster,
+ private readonly _translateService: TranslateService,
) {}
get changed(): boolean {
@@ -67,12 +73,26 @@ export class EditDossierGeneralInfoComponent implements OnInit, EditDossierSecti
return this.hasDueDate && this.form.get('dueDate').value === null;
}
+ get statusPlaceholder(): string {
+ if (this.states.length === 0) {
+ return this._translateService.instant('edit-dossier-dialog.general-info.form.dossier-status.no-status-placeholder');
+ }
+
+ return (
+ this.currentStatus?.name ?? this._translateService.instant('edit-dossier-dialog.general-info.form.dossier-status.placeholder')
+ );
+ }
+
ngOnInit() {
- this._filterInvalidDossierTemplates();
- this.form = this._getForm();
+ this.#filterInvalidDossierTemplates();
+ this.form = this.#getForm();
if (!this.permissionsService.canEditDossier(this.dossier)) {
this.form.disable();
}
+ this.states = this._dossierStateService.all.filter(s => s.dossierTemplateId === this.dossier.dossierTemplateId);
+ if (this.dossier.dossierStatusId) {
+ this.currentStatus = this._dossierStateService.all.find(s => s.dossierStatusId === this.dossier.dossierStatusId);
+ }
this.hasDueDate = !!this.dossier.dueDate;
}
@@ -80,6 +100,7 @@ export class EditDossierGeneralInfoComponent implements OnInit, EditDossierSecti
this.form.reset({
dossierName: this.dossier.dossierName,
dossierTemplateId: this.dossier.dossierTemplateId,
+ dossierStatusId: this.dossier.dossierStatusId,
description: this.dossier.description,
watermarkEnabled: this.dossier.watermarkEnabled,
watermarkPreviewEnabled: this.dossier.watermarkPreviewEnabled,
@@ -96,6 +117,7 @@ export class EditDossierGeneralInfoComponent implements OnInit, EditDossierSecti
watermarkPreviewEnabled: this.form.get('watermarkPreviewEnabled').value,
dueDate: this.hasDueDate ? this.form.get('dueDate').value : undefined,
dossierTemplateId: this.form.get(DOSSIER_TEMPLATE_ID).value,
+ dossierStatusId: this.form.get('dossierStatusId').value,
} as IDossierRequest;
try {
await firstValueFrom(this._dossiersService.createOrUpdate(dossier));
@@ -122,11 +144,11 @@ export class EditDossierGeneralInfoComponent implements OnInit, EditDossierSecti
this._dialogService.openDialog('confirm', null, data, async () => {
await firstValueFrom(this._dossiersService.delete(this.dossier));
this._editDossierDialogRef.close();
- this._router.navigate(['main', 'dossiers']).then(() => this._notifyDossierDeleted());
+ this._router.navigate(['main', 'dossiers']).then(() => this.#notifyDossierDeleted());
});
}
- private _getForm(): FormGroup {
+ #getForm(): FormGroup {
return this._formBuilder.group({
dossierName: [this.dossier.dossierName, Validators.required],
dossierTemplateId: [
@@ -136,6 +158,7 @@ export class EditDossierGeneralInfoComponent implements OnInit, EditDossierSecti
},
Validators.required,
],
+ dossierStatusId: [this.dossier.dossierStatusId],
description: [this.dossier.description],
dueDate: [this.dossier.dueDate],
watermarkEnabled: [this.dossier.watermarkEnabled],
@@ -143,11 +166,11 @@ export class EditDossierGeneralInfoComponent implements OnInit, EditDossierSecti
});
}
- private _notifyDossierDeleted() {
+ #notifyDossierDeleted() {
this._toaster.success(_('edit-dossier-dialog.delete-successful'), { params: { dossierName: this.dossier.dossierName } });
}
- private _filterInvalidDossierTemplates() {
+ #filterInvalidDossierTemplates() {
this.dossierTemplates = this._dossierTemplatesService.all.filter(r => {
if (this.dossier?.dossierTemplateId === r.dossierTemplateId) {
return true;
diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossier-documents-status/dossier-documents-status.component.html b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossier-documents-status/dossier-documents-status.component.html
new file mode 100644
index 000000000..3025a99af
--- /dev/null
+++ b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossier-documents-status/dossier-documents-status.component.html
@@ -0,0 +1 @@
+
diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossier-documents-status/dossier-documents-status.component.scss b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossier-documents-status/dossier-documents-status.component.scss
new file mode 100644
index 000000000..e69de29bb
diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossier-documents-status/dossier-documents-status.component.ts b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossier-documents-status/dossier-documents-status.component.ts
new file mode 100644
index 000000000..00fc9084f
--- /dev/null
+++ b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossier-documents-status/dossier-documents-status.component.ts
@@ -0,0 +1,24 @@
+import { ChangeDetectionStrategy, Component, Input, OnChanges } from '@angular/core';
+import { DossierStats, StatusSorter } from '../../../../../../../../../../libs/red-domain/src';
+import { List, StatusBarConfig } from '../../../../../../../../../../libs/common-ui/src';
+
+@Component({
+ selector: 'redaction-dossier-documents-status',
+ templateUrl: './dossier-documents-status.component.html',
+ styleUrls: ['./dossier-documents-status.component.scss'],
+ changeDetection: ChangeDetectionStrategy.OnPush,
+})
+export class DossierDocumentsStatusComponent implements OnChanges {
+ @Input() stats: DossierStats;
+ statusBarConfig: List>;
+
+ private get _statusConfig(): List> {
+ const { fileCountPerWorkflowStatus } = this.stats;
+ const statuses = Object.keys(fileCountPerWorkflowStatus).sort(StatusSorter.byStatus);
+ return statuses.map(status => ({ length: fileCountPerWorkflowStatus[status], color: status }));
+ }
+
+ ngOnChanges(): void {
+ this.statusBarConfig = this._statusConfig;
+ }
+}
diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-actions/dossiers-listing-actions.component.html b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-actions/dossiers-listing-actions.component.html
index 2b521e11f..d0a5803d2 100644
--- a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-actions/dossiers-listing-actions.component.html
+++ b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-actions/dossiers-listing-actions.component.html
@@ -1,5 +1,3 @@
-
-
> {
- const { fileCountPerWorkflowStatus } = this.stats;
- const statuses = Object.keys(fileCountPerWorkflowStatus).sort(StatusSorter.byStatus);
- return statuses.map(status => ({ length: fileCountPerWorkflowStatus[status], color: status }));
- }
-
ngOnChanges() {
- this.statusBarConfig = this._statusConfig;
this.files = this.filesMapService.get(this.dossier.dossierId);
this.displayReanalyseBtn = this.permissionsService.displayReanalyseBtn(this.dossier) && this.analysisForced;
}
diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-details/dossiers-listing-details.component.html b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-details/dossiers-listing-details.component.html
index 1371e0061..75ad9ceb1 100644
--- a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-details/dossiers-listing-details.component.html
+++ b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-details/dossiers-listing-details.component.html
@@ -26,7 +26,7 @@
-
+
_dossierStatsMap.watch$(dossier.dossierId)),
@@ -37,12 +40,19 @@ export class DossiersListingDetailsComponent {
}
private async _toDossierChartData(dossiers: Dossier[]): Promise {
+ const config: DoughnutChartConfig[] = [];
+ this._dossierStateService.all.forEach(state => {
+ state.dossierCount = this.dossiersService.getCountWithState(state.dossierStatusId);
+ config.push({ value: state.dossierCount, label: state.name, color: state.color });
+ });
+ const notAssignedLength = this.dossiersService.all.length - config.map(v => v.value).reduce((acc, val) => acc + val, 0);
+ config.push({
+ value: notAssignedLength,
+ label: this._translateService.instant('edit-dossier-dialog.general-info.form.dossier-status.placeholder'),
+ color: '#E2E4E9',
+ });
// TODO: deleted dossiers count should come with stats
- // const deletedDossiers = await this.dossiersService.getDeleted();
- return [
- { value: dossiers.length, color: 'ACTIVE', label: _('active') },
- // { value: deletedDossiers.length, color: 'DELETED', label: _('archived') },
- ];
+ return config;
}
private _toChartData(stats: DossierStats[]) {
diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-status/dossiers-listing-status.component.html b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-status/dossiers-listing-status.component.html
new file mode 100644
index 000000000..1ec18fba9
--- /dev/null
+++ b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-status/dossiers-listing-status.component.html
@@ -0,0 +1,13 @@
+
+
+
{{ currentState.name }}
+
+
+
+
+
+
+
{{ 'edit-dossier-dialog.general-info.form.dossier-status.placeholder' | translate }}
+
+
+
diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-status/dossiers-listing-status.component.scss b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-status/dossiers-listing-status.component.scss
new file mode 100644
index 000000000..7d5a74298
--- /dev/null
+++ b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-status/dossiers-listing-status.component.scss
@@ -0,0 +1,16 @@
+@use 'variables';
+
+.dossier-status-container {
+ justify-content: flex-end;
+ width: 100%;
+}
+
+redaction-small-chip {
+ margin-left: 8px;
+}
+
+.dossier-status-text {
+ font-size: 13px;
+ line-height: 16px;
+ color: variables.$grey-1;
+}
diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-status/dossiers-listing-status.component.ts b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-status/dossiers-listing-status.component.ts
new file mode 100644
index 000000000..e3994df3d
--- /dev/null
+++ b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-status/dossiers-listing-status.component.ts
@@ -0,0 +1,31 @@
+import { ChangeDetectionStrategy, Component, Input, OnChanges, OnInit } from '@angular/core';
+import { Dossier } from '../../../../../../../../../../libs/red-domain/src';
+import { DossierStateService } from '../../../../../../services/entity-services/dossier-state.service';
+import { DossierState } from '@red/domain';
+
+@Component({
+ selector: 'redaction-dossiers-listing-status',
+ templateUrl: './dossiers-listing-status.component.html',
+ styleUrls: ['./dossiers-listing-status.component.scss'],
+ changeDetection: ChangeDetectionStrategy.OnPush,
+})
+export class DossiersListingStatusComponent implements OnInit, OnChanges {
+ @Input() dossier: Dossier;
+ currentState: DossierState;
+
+ constructor(private readonly _dossierStateService: DossierStateService) {}
+
+ ngOnInit(): void {
+ this.#setState();
+ }
+
+ ngOnChanges(): void {
+ this.#setState();
+ }
+
+ #setState(): void {
+ if (this.dossier.dossierStatusId) {
+ this.currentState = this._dossierStateService.all.find(s => s.dossierStatusId === this.dossier.dossierStatusId);
+ }
+ }
+}
diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/table-item/table-item.component.html b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/table-item/table-item.component.html
index fcff19968..7ad67122e 100644
--- a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/table-item/table-item.component.html
+++ b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/table-item/table-item.component.html
@@ -12,6 +12,12 @@
+
+
+
+
+
+
diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/table-item/table-item.component.ts b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/table-item/table-item.component.ts
index d1e991d3c..0151c3320 100644
--- a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/table-item/table-item.component.ts
+++ b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/table-item/table-item.component.ts
@@ -14,15 +14,15 @@ export class TableItemComponent implements OnChanges {
@Input() dossier!: Dossier;
readonly stats$: Observable
;
- private readonly _ngOnChanges$ = new BehaviorSubject(undefined);
+ readonly #ngOnChanges$ = new BehaviorSubject(undefined);
constructor(readonly dossierStatsService: DossierStatsService) {
- this.stats$ = this._ngOnChanges$.pipe(switchMap(dossierId => this.dossierStatsService.watch$(dossierId)));
+ this.stats$ = this.#ngOnChanges$.pipe(switchMap(dossierId => this.dossierStatsService.watch$(dossierId)));
}
ngOnChanges() {
if (this.dossier) {
- this._ngOnChanges$.next(this.dossier.dossierId);
+ this.#ngOnChanges$.next(this.dossier.dossierId);
}
}
}
diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/config.service.ts b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/config.service.ts
index ce0711162..66fdedebd 100644
--- a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/config.service.ts
+++ b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/config.service.ts
@@ -26,7 +26,8 @@ export class ConfigService {
{ label: _('dossier-listing.table-col-names.name'), sortByKey: 'searchKey', width: '2fr' },
{ label: _('dossier-listing.table-col-names.needs-work') },
{ label: _('dossier-listing.table-col-names.owner'), class: 'user-column' },
- { label: _('dossier-listing.table-col-names.status'), class: 'flex-end', width: 'auto' },
+ { label: _('dossier-listing.table-col-names.documents-status'), class: 'flex-end', width: 'auto' },
+ { label: _('dossier-listing.table-col-names.dossier-status'), class: 'flex-end' },
];
}
diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/dossiers-listing.module.ts b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/dossiers-listing.module.ts
index f04907531..29af016b3 100644
--- a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/dossiers-listing.module.ts
+++ b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/dossiers-listing.module.ts
@@ -12,6 +12,8 @@ import { ConfigService } from './config.service';
import { TableItemComponent } from './components/table-item/table-item.component';
import { SharedDossiersModule } from '../../shared/shared-dossiers.module';
import { DossierWorkloadColumnComponent } from './components/dossier-workload-column/dossier-workload-column.component';
+import { DossiersListingStatusComponent } from './components/dossiers-listing-status/dossiers-listing-status.component';
+import { DossierDocumentsStatusComponent } from './components/dossier-documents-status/dossier-documents-status.component';
const routes: Routes = [
{
@@ -30,6 +32,8 @@ const routes: Routes = [
DossiersListingDossierNameComponent,
DossierWorkloadColumnComponent,
TableItemComponent,
+ DossiersListingStatusComponent,
+ DossierDocumentsStatusComponent,
],
providers: [ConfigService],
imports: [RouterModule.forChild(routes), CommonModule, SharedModule, SharedDossiersModule, IqserIconsModule, TranslateModule],
diff --git a/apps/red-ui/src/app/modules/shared/components/simple-doughnut-chart/simple-doughnut-chart.component.ts b/apps/red-ui/src/app/modules/shared/components/simple-doughnut-chart/simple-doughnut-chart.component.ts
index ec11bf6e7..ccea0ce17 100644
--- a/apps/red-ui/src/app/modules/shared/components/simple-doughnut-chart/simple-doughnut-chart.component.ts
+++ b/apps/red-ui/src/app/modules/shared/components/simple-doughnut-chart/simple-doughnut-chart.component.ts
@@ -23,7 +23,7 @@ export class SimpleDoughnutChartComponent implements OnChanges, OnInit {
@Input() radius = 85;
@Input() strokeWidth = 20;
@Input() direction: 'row' | 'column' = 'column';
- @Input() totalType: 'sum' | 'count' = 'sum';
+ @Input() totalType: 'sum' | 'count' | 'simpleLabel' = 'sum';
@Input() counterText: string;
@Input() filterKey = 'statusFilters';
filtersEnabled: boolean;
@@ -96,7 +96,11 @@ export class SimpleDoughnutChartComponent implements OnChanges, OnInit {
}
getLabel({ label, value }: DoughnutChartConfig): string {
- return this.totalType === 'sum' ? `${value} ${label}` : `${label} (${value} ${this.counterText})`;
+ return this.totalType === 'simpleLabel'
+ ? `${label}`
+ : this.totalType === 'sum'
+ ? `${value} ${label}`
+ : `${label} (${value} ${this.counterText})`;
}
selectValue(key: string): void {
diff --git a/apps/red-ui/src/app/services/entity-services/dossier-state.service.ts b/apps/red-ui/src/app/services/entity-services/dossier-state.service.ts
new file mode 100644
index 000000000..a3c2edc54
--- /dev/null
+++ b/apps/red-ui/src/app/services/entity-services/dossier-state.service.ts
@@ -0,0 +1,41 @@
+import { Injectable, Injector } from '@angular/core';
+import { EntitiesService, mapEach, RequiredParam, Validate } from '@iqser/common-ui';
+import { DossierState, IDossierState } from '@red/domain';
+import { forkJoin, Observable, switchMap } from 'rxjs';
+import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service';
+import { map, tap } from 'rxjs/operators';
+
+@Injectable({
+ providedIn: 'root',
+})
+export class DossierStateService extends EntitiesService {
+ constructor(protected readonly _injector: Injector, private readonly _dossierTemplatesService: DossierTemplatesService) {
+ super(_injector, DossierState, 'dossier-status');
+ }
+
+ @Validate()
+ setDossierState(@RequiredParam() body: IDossierState) {
+ return this._post(body, this._defaultModelPath);
+ }
+
+ @Validate()
+ loadAllForTemplate(@RequiredParam() templateId: string) {
+ return this.loadAll(`${this._defaultModelPath}/dossier-template/${templateId}`);
+ }
+
+ loadAllForAllTemplates(): Observable {
+ return this._dossierTemplatesService.all$.pipe(
+ mapEach(template => template.dossierTemplateId),
+ mapEach(id => this.loadAllForTemplate(id)),
+ switchMap(all => forkJoin(all)),
+ map(value => value.flatMap(item => item)),
+ tap(value => this.setEntities(value)),
+ );
+ }
+
+ @Validate()
+ deleteAndReplace(@RequiredParam() dossierStatusId: string, @RequiredParam() replaceDossierStatusId: string) {
+ const url = `${this._defaultModelPath}/${dossierStatusId}?replaceDossierStatusId=${replaceDossierStatusId}`;
+ return this.delete({}, url);
+ }
+}
diff --git a/apps/red-ui/src/app/services/entity-services/dossiers.service.ts b/apps/red-ui/src/app/services/entity-services/dossiers.service.ts
index 0babadb88..4787fdb30 100644
--- a/apps/red-ui/src/app/services/entity-services/dossiers.service.ts
+++ b/apps/red-ui/src/app/services/entity-services/dossiers.service.ts
@@ -7,6 +7,7 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { HttpErrorResponse, HttpStatusCode } from '@angular/common/http';
import { DossierStatsService } from '@services/entity-services/dossier-stats.service';
import { CHANGED_CHECK_INTERVAL } from '@utils/constants';
+import { DossierStateService } from '@services/entity-services/dossier-state.service';
export interface IDossiersStats {
totalPeople: number;
@@ -37,6 +38,7 @@ export class DossiersService extends EntitiesService {
private readonly _toaster: Toaster,
protected readonly _injector: Injector,
private readonly _dossierStatsService: DossierStatsService,
+ private readonly _dossierStateService: DossierStateService,
) {
super(_injector, Dossier, 'dossier');
@@ -54,6 +56,7 @@ export class DossiersService extends EntitiesService {
mapEach(entity => new Dossier(entity)),
/* Load stats before updating entities */
switchMap(dossiers => this._dossierStatsService.getFor(dossierIds(dossiers)).pipe(mapTo(dossiers))),
+ switchMap(dossiers => this._dossierStateService.loadAllForAllTemplates().pipe(mapTo(dossiers))),
tap(dossiers => this.setEntities(dossiers)),
);
}
@@ -108,6 +111,10 @@ export class DossiersService extends EntitiesService {
return firstValueFrom(super.delete(body, 'deleted-dossiers/hard-delete', body));
}
+ getCountWithState(dossierStatusId: string): number {
+ return this.all.filter(dossier => dossier.dossierStatusId === dossierStatusId).length;
+ }
+
private _emitFileChanges(changes: ChangesDetails): void {
changes.dossierChanges.filter(change => change.fileChanges).forEach(change => this.dossierFileChanges$.next(change.dossierId));
}
diff --git a/apps/red-ui/src/assets/i18n/de.json b/apps/red-ui/src/assets/i18n/de.json
index 21819e941..b228549e1 100644
--- a/apps/red-ui/src/assets/i18n/de.json
+++ b/apps/red-ui/src/assets/i18n/de.json
@@ -605,6 +605,7 @@
"title": "Datei-Attribute anlegen"
},
"dossier": "Dossier",
+ "dossier-states": "",
"dossier-attribute-types": {
"date": "Datum",
"image": "Bild",
diff --git a/apps/red-ui/src/assets/i18n/en.json b/apps/red-ui/src/assets/i18n/en.json
index 9a64201c7..0864eb2d2 100644
--- a/apps/red-ui/src/assets/i18n/en.json
+++ b/apps/red-ui/src/assets/i18n/en.json
@@ -8,7 +8,6 @@
"all": "All",
"none": "None"
},
- "active": "Active",
"add-dossier-dialog": {
"actions": {
"save": "Save",
@@ -72,6 +71,16 @@
"save": "Save Attribute",
"title": "{type, select, edit{Edit {name}} create{Add New} other{}} Dossier Attribute"
},
+ "add-edit-dossier-state": {
+ "form": {
+ "color": "Hex Color",
+ "color-placeholder": "#",
+ "name": "Status Name",
+ "name-placeholder": "Enter Name"
+ },
+ "save": "Save Status",
+ "title": "{type, select, edit{Edit {name}} create{Create} other{}} Dossier Status"
+ },
"add-edit-dossier-template": {
"error": {
"conflict": "Failed to create dossier template: a dossier template with the same name already exists.",
@@ -399,6 +408,18 @@
}
},
"configurations": "Configurations",
+ "confirm-delete-dossier-state": {
+ "cancel": "Cancel",
+ "delete-replace": "Delete and Replace",
+ "delete": "Delete only",
+ "form": {
+ "status": "Replace Status",
+ "status-placeholder": "Choose another status"
+ },
+ "suggestion": "Would you like to replace the states of the Dossiers with another status?",
+ "title": "Delete Dossier Status",
+ "warning": "The {name} status is assigned to {count} {count, plural, one{Dossier} other{Dossiers}}."
+ },
"confirm-delete-file-attribute": {
"cancel": "Keep {type, select, single{Attribute} bulk{Attributes} other{}}",
"delete": "Delete {type, select, single{Attribute} bulk{Attributes} other{}}",
@@ -696,10 +717,11 @@
"total-people": "Total users"
},
"table-col-names": {
+ "documents-status": "Documents Status",
+ "dossier-status": "Dossier Status",
"name": "Name",
"needs-work": "Workload",
- "owner": "Owner",
- "status": "Status"
+ "owner": "Owner"
},
"table-header": {
"title": "{length} active {length, plural, one{Dossier} other{Dossiers}}"
@@ -803,6 +825,35 @@
"under-review": "Under Review",
"upload-files": "Drag & drop files anywhere..."
},
+ "dossier-states": "Dossier States",
+ "dossier-states-listing": {
+ "action": {
+ "delete": "Delete Status",
+ "edit": "Edit Status"
+ },
+ "add-new": "New Status",
+ "chart": {
+ "dossier-states": "{count, plural, one{Dossier State} other{Dossier States}}"
+ },
+ "error": {
+ "conflict": "Dossier State with this name already exists!",
+ "generic": "Failed to add Dossier State"
+ },
+ "no-data": {
+ "title": "There are no dossier states."
+ },
+ "no-match": {
+ "title": "No dossier states match your current filters."
+ },
+ "search": "Search...",
+ "table-col-names": {
+ "dossiers-count": "Dossiers Count",
+ "name": "Name"
+ },
+ "table-header": {
+ "title": "{length} dossier {length, plural, one{state} other{states}}"
+ }
+ },
"dossier-template-info": "Info",
"dossier-template-info-screen": {
"created-by": "Created by",
@@ -957,6 +1008,11 @@
"label": "Description",
"placeholder": "Enter Description"
},
+ "dossier-status": {
+ "label": "Dossier Status",
+ "no-status-placeholder": "This dossier template has no states",
+ "placeholder": "Undefined"
+ },
"due-date": "Due Date",
"name": {
"label": "Dossier Name",
@@ -1633,8 +1689,8 @@
"no-time-left": "Time to restore already passed"
},
"toggle-auto-analysis-message": {
- "success": "{toggleOperation} automatic processing.",
- "error": "Something went wrong."
+ "error": "Something went wrong.",
+ "success": "{toggleOperation} automatic processing."
},
"top-bar": {
"navigation-items": {
diff --git a/libs/common-ui b/libs/common-ui
index 77e227582..f54374859 160000
--- a/libs/common-ui
+++ b/libs/common-ui
@@ -1 +1 @@
-Subproject commit 77e22758239cf564965e82579e662416a6349010
+Subproject commit f54374859ec75ea73921b9e6a934bd3747f9721d
diff --git a/libs/red-domain/src/index.ts b/libs/red-domain/src/index.ts
index aee8ff159..e2d4bf0e4 100644
--- a/libs/red-domain/src/index.ts
+++ b/libs/red-domain/src/index.ts
@@ -19,3 +19,4 @@ export * from './lib/configuration';
export * from './lib/signature';
export * from './lib/legal-basis';
export * from './lib/dossier-stats';
+export * from './lib/dossier-state';
diff --git a/libs/red-domain/src/lib/dossier-state/dossier-state.model.ts b/libs/red-domain/src/lib/dossier-state/dossier-state.model.ts
new file mode 100644
index 000000000..242a34ace
--- /dev/null
+++ b/libs/red-domain/src/lib/dossier-state/dossier-state.model.ts
@@ -0,0 +1,28 @@
+import { IListable } from '@iqser/common-ui';
+import { IDossierState } from './dossier-state';
+
+export class DossierState implements IDossierState, IListable {
+ readonly description: string;
+ readonly dossierStatusId: string;
+ readonly dossierTemplateId: string;
+ readonly name: string;
+ readonly color: string;
+ dossierCount?: number;
+
+ constructor(dossierState: IDossierState) {
+ this.description = dossierState.description;
+ this.dossierStatusId = dossierState.dossierStatusId;
+ this.dossierTemplateId = dossierState.dossierTemplateId;
+ this.name = dossierState.name;
+ this.color = dossierState.color;
+ this.dossierCount = dossierState.dossierCount;
+ }
+
+ get id(): string {
+ return this.dossierStatusId;
+ }
+
+ get searchKey(): string {
+ return this.name;
+ }
+}
diff --git a/libs/red-domain/src/lib/dossier-state/dossier-state.ts b/libs/red-domain/src/lib/dossier-state/dossier-state.ts
new file mode 100644
index 000000000..f7491e23b
--- /dev/null
+++ b/libs/red-domain/src/lib/dossier-state/dossier-state.ts
@@ -0,0 +1,8 @@
+export interface IDossierState {
+ description: string;
+ dossierStatusId: string;
+ dossierTemplateId: string;
+ name: string;
+ color: string;
+ dossierCount?: number;
+}
diff --git a/libs/red-domain/src/lib/dossier-state/index.ts b/libs/red-domain/src/lib/dossier-state/index.ts
new file mode 100644
index 000000000..166b90570
--- /dev/null
+++ b/libs/red-domain/src/lib/dossier-state/index.ts
@@ -0,0 +1,2 @@
+export * from './dossier-state';
+export * from './dossier-state.model';
diff --git a/libs/red-domain/src/lib/dossiers/dossier.model.ts b/libs/red-domain/src/lib/dossiers/dossier.model.ts
index 8c8ab6e5b..e2a79d550 100644
--- a/libs/red-domain/src/lib/dossiers/dossier.model.ts
+++ b/libs/red-domain/src/lib/dossiers/dossier.model.ts
@@ -11,6 +11,7 @@ export class Dossier implements IDossier, IListable {
readonly approverIds: List;
readonly reportTemplateIds: List;
readonly dossierName: string;
+ readonly dossierStatusId: string;
readonly date: string;
readonly dueDate?: string;
readonly description?: string;
@@ -29,6 +30,7 @@ export class Dossier implements IDossier, IListable {
this.date = dossier.date;
this.description = dossier.description;
this.dossierName = dossier.dossierName;
+ this.dossierStatusId = dossier.dossierStatusId;
this.dossierTemplateId = dossier.dossierTemplateId;
this.downloadFileTypes = dossier.downloadFileTypes;
this.dueDate = dossier.dueDate;
diff --git a/libs/red-domain/src/lib/dossiers/dossier.ts b/libs/red-domain/src/lib/dossiers/dossier.ts
index 9b4883801..1ff219033 100644
--- a/libs/red-domain/src/lib/dossiers/dossier.ts
+++ b/libs/red-domain/src/lib/dossiers/dossier.ts
@@ -7,6 +7,7 @@ export interface IDossier {
readonly date: string;
readonly description?: string;
readonly dossierId: string;
+ readonly dossierStatusId: string;
readonly dossierName: string;
readonly dossierTemplateId: string;
readonly downloadFileTypes?: List;