move dossier templates related methods to own service

This commit is contained in:
Dan Percic 2021-10-05 00:10:13 +03:00
parent d5f7993c8f
commit 5828597e71
30 changed files with 250 additions and 231 deletions

View File

@ -1,35 +1,31 @@
<div class="menu flex-2 visible-lg breadcrumbs-container">
<a
*ngIf="root || !!appStateService.activeDossierTemplate"
*ngIf="root || !!dossierTemplatesService.activeDossierTemplate"
[routerLink]="'/main/admin/dossier-templates'"
class="breadcrumb"
translate="dossier-templates"
></a>
<ng-container *ngIf="appStateService.activeDossierTemplate">
<ng-container *ngIf="dossierTemplatesService.activeDossierTemplate$ | async as activeDossierTemplate">
<mat-icon svgIcon="iqser:arrow-right"></mat-icon>
<a
[class.active]="!appStateService.activeDictionaryType"
[routerLink]="'/main/admin/dossier-templates/' + appStateService.activeDossierTemplateId"
class="breadcrumb ml-0"
>
{{ appStateService.activeDossierTemplate.name }}
<a [class.active]="!appStateService.activeDictionaryType" [routerLink]="activeDossierTemplate.routerLink" class="breadcrumb ml-0">
{{ activeDossierTemplate.name }}
</a>
</ng-container>
<ng-container *ngIf="appStateService.activeDictionary">
<mat-icon svgIcon="iqser:arrow-right"></mat-icon>
<a
[routerLink]="
'/main/admin/dossier-templates/' +
appStateService.activeDossierTemplateId +
'/dictionaries/' +
appStateService.activeDictionaryType
"
class="breadcrumb ml-0"
routerLinkActive="active"
>
{{ appStateService.activeDictionary.label }}
</a>
<ng-container *ngIf="appStateService.activeDictionary">
<mat-icon svgIcon="iqser:arrow-right"></mat-icon>
<a
[routerLink]="
'/main/admin/dossier-templates/' +
activeDossierTemplate.dossierTemplateId +
'/dictionaries/' +
appStateService.activeDictionaryType
"
class="breadcrumb ml-0"
routerLinkActive="active"
>
{{ appStateService.activeDictionary.label }}
</a>
</ng-container>
</ng-container>
</div>

View File

@ -2,6 +2,7 @@ import { Component, Input } from '@angular/core';
import { AppStateService } from '@state/app-state.service';
import { UserPreferenceService } from '@services/user-preference.service';
import { PermissionsService } from '@services/permissions.service';
import { DossierTemplatesService } from '../../../dossier/services/dossier-templates.service';
@Component({
selector: 'redaction-admin-breadcrumbs',
@ -14,6 +15,7 @@ export class AdminBreadcrumbsComponent {
constructor(
readonly userPreferenceService: UserPreferenceService,
readonly permissionService: PermissionsService,
readonly appStateService: AppStateService
readonly appStateService: AppStateService,
readonly dossierTemplatesService: DossierTemplatesService
) {}
}

View File

@ -6,6 +6,7 @@ import { DossierTemplateControllerService } from '@redaction/red-ui-http';
import { CircleButtonTypes, LoadingService, Toaster } from '@iqser/common-ui';
import { UserService } from '@services/user.service';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { DossierTemplatesService } from '../../../dossier/services/dossier-templates.service';
@Component({
selector: 'redaction-dossier-template-actions',
@ -25,16 +26,17 @@ export class DossierTemplateActionsComponent implements OnInit {
private readonly _userService: UserService,
private readonly _loadingService: LoadingService,
private readonly _appStateService: AppStateService,
private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _dialogService: AdminDialogService,
private readonly _dossierTemplateControllerService: DossierTemplateControllerService
) {}
get dossierTemplate() {
return this._appStateService.getDossierTemplateById(this.dossierTemplateId);
return this._dossierTemplatesService.find(this.dossierTemplateId);
}
ngOnInit() {
this.dossierTemplateId ??= this._appStateService.activeDossierTemplateId;
this.dossierTemplateId ??= this._dossierTemplatesService.activeDossierTemplateId;
}
openEditDossierTemplateDialog($event: any) {
@ -59,7 +61,7 @@ export class DossierTemplateActionsComponent implements OnInit {
this._loadingService.stop();
});
await this._dossierTemplateControllerService.deleteDossierTemplates([this.dossierTemplateId]).toPromise();
await this._appStateService.loadAllDossierTemplates();
await this._dossierTemplatesService.loadAll();
await this._appStateService.loadDictionaryData();
await this._router.navigate(['main', 'admin']);
this._loadingService.stop();

View File

@ -1,12 +1,13 @@
import {Component, Inject} from '@angular/core';
import {AppStateService} from '@state/app-state.service';
import {FormBuilder, FormGroup, Validators} from '@angular/forms';
import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';
import { Component, Inject } from '@angular/core';
import { AppStateService } from '@state/app-state.service';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import * as moment from 'moment';
import {Moment} from 'moment';
import {DossierTemplateControllerService, DownloadFileType, IDossierTemplate} from '@redaction/red-ui-http';
import {applyIntervalConstraints} from '@utils/date-inputs-utils';
import {downloadTypesTranslations} from '../../../../translations/download-types-translations';
import { Moment } from 'moment';
import { DossierTemplateControllerService, DownloadFileType, IDossierTemplate } from '@redaction/red-ui-http';
import { applyIntervalConstraints } from '@utils/date-inputs-utils';
import { downloadTypesTranslations } from '../../../../translations/download-types-translations';
import { DossierTemplatesService } from '../../../dossier/services/dossier-templates.service';
@Component({
selector: 'redaction-add-edit-dossier-template-dialog',
@ -28,6 +29,7 @@ export class AddEditDossierTemplateDialogComponent {
constructor(
private readonly _appStateService: AppStateService,
private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _formBuilder: FormBuilder,
private readonly _dossierTemplateController: DossierTemplateControllerService,
public dialogRef: MatDialogRef<AddEditDossierTemplateDialogComponent>,
@ -98,7 +100,7 @@ export class AddEditDossierTemplateDialogComponent {
validTo: this.hasValidTo ? this.dossierTemplateForm.get('validTo').value : null
};
await this._dossierTemplateController.createOrUpdateDossierTemplate(dossierTemplate).toPromise();
await this._appStateService.loadAllDossierTemplates();
await this._dossierTemplatesService.loadAll();
await this._appStateService.loadDictionaryData();
this.dialogRef.close(true);
}

View File

@ -16,6 +16,7 @@ import { defaultColorsTranslations } from '../../translations/default-colors-tra
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { UserService } from '@services/user.service';
import { DictionaryService } from '@shared/services/dictionary.service';
import { DossierTemplatesService } from '../../../dossier/services/dossier-templates.service';
interface ListItem extends IListable {
readonly key: string;
@ -45,11 +46,11 @@ export class DefaultColorsScreenComponent extends ListingComponent<ListItem> imp
private readonly _loadingService: LoadingService,
private readonly _activatedRoute: ActivatedRoute,
private readonly _appStateService: AppStateService,
private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _dialogService: AdminDialogService,
private readonly _dictionaryService: DictionaryService
) {
super(_injector);
_appStateService.activateDossierTemplate(_activatedRoute.snapshot.params.dossierTemplateId);
}
async ngOnInit() {
@ -63,18 +64,18 @@ export class DefaultColorsScreenComponent extends ListingComponent<ListItem> imp
{
colors: this._colorsObj,
colorKey: color.key,
dossierTemplateId: this._appStateService.activeDossierTemplateId
dossierTemplateId: this._dossierTemplatesService.activeDossierTemplateId
},
async () => {
await this._loadColors();
await this._appStateService.refreshDossierTemplate(this._appStateService.activeDossierTemplateId);
await this._appStateService.refreshDossierTemplate(this._dossierTemplatesService.activeDossierTemplateId);
}
);
}
private async _loadColors() {
this._loadingService.start();
const data = await this._appStateService.loadColors(this._appStateService.activeDossierTemplateId).toPromise();
const data = await this._appStateService.loadColors(this._dossierTemplatesService.activeDossierTemplateId).toPromise();
this._colorsObj = data;
const entities = Object.keys(data)
.map(key => ({

View File

@ -18,6 +18,7 @@ import { AdminDialogService } from '../../services/admin-dialog.service';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { UserService } from '@services/user.service';
import { DictionaryService } from '@shared/services/dictionary.service';
import { DossierTemplatesService } from '../../../dossier/services/dossier-templates.service';
const toChartConfig = (dict: TypeValue): DoughnutChartConfig => ({
value: dict.entries?.length ?? 0,
@ -49,13 +50,13 @@ export class DictionaryListingScreenComponent extends ListingComponent<TypeValue
private readonly _activatedRoute: ActivatedRoute,
private readonly _loadingService: LoadingService,
private readonly _appStateService: AppStateService,
private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _dialogService: AdminDialogService,
private readonly _translateService: TranslateService,
private readonly _dictionaryService: DictionaryService
) {
super(_injector);
_loadingService.start();
_appStateService.activateDossierTemplate(_activatedRoute.snapshot.params.dossierTemplateId);
}
ngOnInit(): void {
@ -68,7 +69,7 @@ export class DictionaryListingScreenComponent extends ListingComponent<TypeValue
await this._dictionaryService
.deleteTypes(
types.map(t => t.type),
this._appStateService.activeDossierTemplateId
this._dossierTemplatesService.activeDossierTemplateId
)
.toPromise();
this.entitiesService.setSelected([]);
@ -85,7 +86,7 @@ export class DictionaryListingScreenComponent extends ListingComponent<TypeValue
$event,
{
dictionary,
dossierTemplateId: this._appStateService.activeDossierTemplateId
dossierTemplateId: this._dossierTemplatesService.activeDossierTemplateId
},
async () => {
this._loadingService.start();
@ -98,7 +99,7 @@ export class DictionaryListingScreenComponent extends ListingComponent<TypeValue
}
private _loadDictionaryData(loadEntries = true): void {
const appStateDictionaryData = this._appStateService.dictionaryData[this._appStateService.activeDossierTemplateId];
const appStateDictionaryData = this._appStateService.dictionaryData[this._dossierTemplatesService.activeDossierTemplateId];
const entities = Object.values(appStateDictionaryData).filter(d => !d.virtual);
if (!loadEntries) {
@ -117,7 +118,7 @@ export class DictionaryListingScreenComponent extends ListingComponent<TypeValue
}
const dataObs = this.allEntities.map(dict =>
this._dictionaryService.getFor(this._appStateService.activeDossierTemplateId, dict.type).pipe(
this._dictionaryService.getFor(this._dossierTemplatesService.activeDossierTemplateId, dict.type).pipe(
tap(values => (dict.entries = [...values.entries] ?? [])),
catchError(() => {
dict.entries = [];

View File

@ -57,6 +57,7 @@
#dictionaryManager
(saveDictionary)="saveEntries($event)"
[canEdit]="currentUser.isAdmin"
[filterByDossierTemplate]="true"
[initialEntries]="entries"
></redaction-dictionary-manager>

View File

@ -10,6 +10,7 @@ import { DictionaryService } from '@shared/services/dictionary.service';
import { TypeValue } from '@models/file/type-value';
import { CircleButtonTypes, LoadingService } from '@iqser/common-ui';
import { UserService } from '@services/user.service';
import { DossierTemplatesService } from '../../../dossier/services/dossier-templates.service';
@Component({
templateUrl: './dictionary-overview-screen.component.html',
@ -32,6 +33,7 @@ export class DictionaryOverviewScreenComponent extends ComponentHasChanges imple
private readonly _activatedRoute: ActivatedRoute,
private readonly _loadingService: LoadingService,
private readonly _appStateService: AppStateService,
private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _dialogService: AdminDialogService,
protected readonly _translateService: TranslateService,
private readonly _dictionaryService: DictionaryService
@ -44,10 +46,7 @@ export class DictionaryOverviewScreenComponent extends ComponentHasChanges imple
}
async ngOnInit() {
await this._appStateService.activateDictionary(
this._activatedRoute.snapshot.params.type,
this._activatedRoute.snapshot.params.dossierTemplateId
);
await this._appStateService.activateDictionary(this._activatedRoute.snapshot.params.type);
this.dictionary = this._appStateService.activeDictionary;
await this._loadEntries();
}
@ -79,7 +78,7 @@ export class DictionaryOverviewScreenComponent extends ComponentHasChanges imple
'/main',
'admin',
'dossier-templates',
this._appStateService.activeDossierTemplateId,
this._dossierTemplatesService.activeDossierTemplateId,
'dictionaries'
]);
});

View File

@ -16,6 +16,7 @@ import { dossierAttributeTypesTranslations } from '../../translations/dossier-at
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { UserService } from '@services/user.service';
import { DossierAttributeConfig } from '@state/model/dossier-attribute-config';
import { DossierTemplatesService } from '../../../dossier/services/dossier-templates.service';
@Component({
templateUrl: './dossier-attributes-listing-screen.component.html',
@ -40,6 +41,7 @@ export class DossierAttributesListingScreenComponent extends ListingComponent<Do
constructor(
protected readonly _injector: Injector,
private readonly _appStateService: AppStateService,
private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _activatedRoute: ActivatedRoute,
private readonly _dialogService: AdminDialogService,
private readonly _loadingService: LoadingService,
@ -47,7 +49,6 @@ export class DossierAttributesListingScreenComponent extends ListingComponent<Do
private readonly _userService: UserService
) {
super(_injector);
_appStateService.activateDossierTemplate(_activatedRoute.snapshot.params.dossierTemplateId);
}
async ngOnInit() {
@ -65,7 +66,7 @@ export class DossierAttributesListingScreenComponent extends ListingComponent<Do
}
openAddEditAttributeDialog($event: MouseEvent, dossierAttribute?: IDossierAttributeConfig) {
const dossierTemplateId = this._appStateService.activeDossierTemplateId;
const dossierTemplateId = this._dossierTemplatesService.activeDossierTemplateId;
this._dialogService.openDialog(
'addEditDossierAttribute',

View File

@ -5,10 +5,13 @@ import { AdminDialogService } from '../../services/admin-dialog.service';
import { DossierTemplate } from '@models/file/dossier-template';
import {
CircleButtonTypes,
DefaultListingServices,
EntitiesService,
FilterService,
IconButtonTypes,
ListingComponent,
LoadingService,
SearchService,
SortingService,
TableColumnConfig,
Toaster
} from '@iqser/common-ui';
@ -16,13 +19,17 @@ import { DossierTemplateControllerService } from '@redaction/red-ui-http';
import { UserService } from '@services/user.service';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { RouterHistoryService } from '@services/router-history.service';
import { DossierTemplatesService } from '../../../dossier/services/dossier-templates.service';
@Component({
templateUrl: './dossier-templates-listing-screen.component.html',
styleUrls: ['./dossier-templates-listing-screen.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
providers: [
...DefaultListingServices,
FilterService,
SearchService,
SortingService,
{ provide: EntitiesService, useExisting: DossierTemplatesService },
{ provide: ListingComponent, useExisting: forwardRef(() => DossierTemplatesListingScreenComponent) }
]
})
@ -44,6 +51,7 @@ export class DossierTemplatesListingScreenComponent extends ListingComponent<Dos
private readonly _userService: UserService,
private readonly _loadingService: LoadingService,
private readonly _appStateService: AppStateService,
private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _dialogService: AdminDialogService,
readonly routerHistoryService: RouterHistoryService,
readonly userPreferenceService: UserPreferenceService,
@ -64,7 +72,6 @@ export class DossierTemplatesListingScreenComponent extends ListingComponent<Dos
loadDossierTemplatesData() {
this._appStateService.reset();
this.entitiesService.setEntities(this._appStateService.dossierTemplates);
this._loadDossierTemplateStats();
}
@ -74,7 +81,7 @@ export class DossierTemplatesListingScreenComponent extends ListingComponent<Dos
});
}
private async _deleteTemplates(templateIds: string[] = this.entitiesService.selected.map(d => d.dossierTemplateId)) {
private async _deleteTemplates(templateIds = this.entitiesService.selected.map(d => d.dossierTemplateId)) {
await this._dossierTemplateControllerService
.deleteDossierTemplates(templateIds)
.toPromise()
@ -86,7 +93,7 @@ export class DossierTemplatesListingScreenComponent extends ListingComponent<Dos
}
});
this.entitiesService.setSelected([]);
await this._appStateService.loadAllDossierTemplates();
await this._dossierTemplatesService.loadAll();
await this._appStateService.loadDictionaryData();
this.loadDossierTemplatesData();
}

View File

@ -16,6 +16,7 @@ import { UserService } from '@services/user.service';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { FileAttributeConfig } from '@models/file/file-attribute-config';
import { FileAttributesService } from '../../../dossier/services/file-attributes.service';
import { DossierTemplatesService } from '../../../dossier/services/dossier-templates.service';
@Component({
templateUrl: './file-attributes-listing-screen.component.html',
@ -55,11 +56,11 @@ export class FileAttributesListingScreenComponent extends ListingComponent<FileA
private readonly _activatedRoute: ActivatedRoute,
private readonly _loadingService: LoadingService,
private readonly _appStateService: AppStateService,
private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _dialogService: AdminDialogService,
private readonly _fileAttributesService: FileAttributesService
) {
super(_injector);
_appStateService.activateDossierTemplate(_activatedRoute.snapshot.params.dossierTemplateId);
}
async ngOnInit() {
@ -70,13 +71,13 @@ export class FileAttributesListingScreenComponent extends ListingComponent<FileA
this._dialogService.openDialog(
'addEditFileAttribute',
$event,
{ fileAttribute, dossierTemplateId: this._appStateService.activeDossierTemplateId },
{ fileAttribute, dossierTemplateId: this._dossierTemplatesService.activeDossierTemplateId },
async (newValue: IFileAttributeConfig) => {
this._loadingService.start();
await this._fileAttributesService
.setFileAttributesConfig(newValue, this._appStateService.activeDossierTemplateId)
.setFileAttributesConfig(newValue, this._dossierTemplatesService.activeDossierTemplateId)
.toPromise();
await this._appStateService.refreshDossierTemplate(this._appStateService.activeDossierTemplateId);
await this._appStateService.refreshDossierTemplate(this._dossierTemplatesService.activeDossierTemplateId);
await this._loadData();
}
);
@ -85,19 +86,18 @@ export class FileAttributesListingScreenComponent extends ListingComponent<FileA
openConfirmDeleteAttributeDialog($event: MouseEvent, fileAttribute?: IFileAttributeConfig) {
this._dialogService.openDialog('deleteFileAttribute', $event, fileAttribute, async () => {
this._loadingService.start();
const dossierTemplateId = this._dossierTemplatesService.activeDossierTemplateId;
if (fileAttribute) {
await this._fileAttributesService
.deleteFileAttributes([fileAttribute.id], this._appStateService.activeDossierTemplateId)
.toPromise();
await this._fileAttributesService.deleteFileAttributes([fileAttribute.id], dossierTemplateId).toPromise();
} else {
await this._fileAttributesService
.deleteFileAttributes(
this.entitiesService.selected.map(f => f.id),
this._appStateService.activeDossierTemplateId
dossierTemplateId
)
.toPromise();
}
await this._appStateService.refreshDossierTemplate(this._appStateService.activeDossierTemplateId);
await this._appStateService.refreshDossierTemplate(dossierTemplateId);
await this._loadData();
});
}
@ -111,7 +111,7 @@ export class FileAttributesListingScreenComponent extends ListingComponent<FileA
null,
{
csv,
dossierTemplateId: this._appStateService.activeDossierTemplateId,
dossierTemplateId: this._dossierTemplatesService.activeDossierTemplateId,
existingConfiguration: this._existingConfiguration
},
async () => await this._loadData()
@ -123,7 +123,7 @@ export class FileAttributesListingScreenComponent extends ListingComponent<FileA
try {
const response = await this._fileAttributesService
.getFileAttributesConfig(this._appStateService.activeDossierTemplateId)
.getFileAttributesConfig(this._dossierTemplatesService.activeDossierTemplateId)
.toPromise();
this._existingConfiguration = response;
const fileAttributeConfig = response?.fileAttributeConfigs.map(item => new FileAttributeConfig(item)) || [];

View File

@ -12,6 +12,7 @@ import {
import { removeBraces } from '@utils/functions';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { AdminDialogService } from '../../services/admin-dialog.service';
import { DossierTemplatesService } from '../../../dossier/services/dossier-templates.service';
interface Placeholder {
placeholder: string;
@ -36,13 +37,13 @@ export class ReportsScreenComponent implements OnInit {
constructor(
private readonly _activatedRoute: ActivatedRoute,
private readonly _appStateService: AppStateService,
private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _reportTemplateService: ReportTemplateControllerService,
private readonly _dialogService: AdminDialogService,
private readonly _toaster: Toaster,
private readonly _loadingService: LoadingService,
readonly permissionsService: PermissionsService
) {
this._appStateService.activateDossierTemplate(_activatedRoute.snapshot.params.dossierTemplateId);
}
async ngOnInit() {
@ -84,36 +85,36 @@ export class ReportsScreenComponent implements OnInit {
private async _uploadTemplate($event) {
const file = $event.target.files[0];
if (this._isValidFile(file)) {
if (this._isExcelFile(file)) {
const data = new ConfirmationDialogInput({
title: _('confirmation-dialog.upload-report-template.title'),
question: _('confirmation-dialog.upload-report-template.question'),
confirmationText: _('confirmation-dialog.upload-report-template.confirmation-text'),
denyText: _('confirmation-dialog.upload-report-template.deny-text'),
alternativeConfirmationText: _('confirmation-dialog.upload-report-template.alternate-confirmation-text'),
translateParams: {
fileName: file.name
}
});
this._dialogService.openDialog('confirm', null, data, null, async result => {
if (result) {
await this._reportTemplateService
.uploadTemplateForm(this._appStateService.activeDossierTemplateId, result > 1, file)
.toPromise();
await this._loadReportTemplates();
}
});
} else {
await this._reportTemplateService
.uploadTemplateForm(this._appStateService.activeDossierTemplateId, false, file)
.toPromise();
await this._loadReportTemplates();
}
this._fileInput.nativeElement.value = null;
} else {
if (!this._isValidFile(file)) {
this._toaster.error(_('reports-screen.invalid-upload'));
return;
}
const dossierTemplateId = this._dossierTemplatesService.activeDossierTemplateId;
if (this._isExcelFile(file)) {
const data = new ConfirmationDialogInput({
title: _('confirmation-dialog.upload-report-template.title'),
question: _('confirmation-dialog.upload-report-template.question'),
confirmationText: _('confirmation-dialog.upload-report-template.confirmation-text'),
denyText: _('confirmation-dialog.upload-report-template.deny-text'),
alternativeConfirmationText: _('confirmation-dialog.upload-report-template.alternate-confirmation-text'),
translateParams: {
fileName: file.name
}
});
this._dialogService.openDialog('confirm', null, data, null, async result => {
if (result) {
await this._reportTemplateService
.uploadTemplateForm(dossierTemplateId, result > 1, file)
.toPromise();
await this._loadReportTemplates();
}
});
} else {
await this._reportTemplateService.uploadTemplateForm(dossierTemplateId, false, file).toPromise();
await this._loadReportTemplates();
}
this._fileInput.nativeElement.value = null;
}
private async _deleteTemplate(template: ReportTemplate) {
@ -123,13 +124,13 @@ export class ReportsScreenComponent implements OnInit {
private async _loadReportTemplates() {
this.availableTemplates = await this._reportTemplateService
.getAvailableReportTemplates(this._appStateService.activeDossierTemplateId)
.getAvailableReportTemplates(this._dossierTemplatesService.activeDossierTemplateId)
.toPromise();
}
private async _loadPlaceholders() {
const placeholdersResponse: PlaceholdersResponse = await this._reportTemplateService
.getAvailablePlaceholders(this._appStateService.activeDossierTemplateId)
.getAvailablePlaceholders(this._dossierTemplatesService.activeDossierTemplateId)
.toPromise();
this.placeholders = placeholderTypes.flatMap(type =>
placeholdersResponse[type].map(placeholder => ({

View File

@ -1,14 +1,14 @@
import { Component, ElementRef, OnInit, ViewChild } from '@angular/core';
import { PermissionsService } from '@services/permissions.service';
import { RulesControllerService } from '@redaction/red-ui-http';
import { Toaster } from '@iqser/common-ui';
import { Debounce, IconButtonTypes, LoadingService, Toaster } from '@iqser/common-ui';
import { TranslateService } from '@ngx-translate/core';
import { saveAs } from 'file-saver';
import { ComponentHasChanges } from '@guards/can-deactivate.guard';
import { ActivatedRoute } from '@angular/router';
import { AppStateService } from '@state/app-state.service';
import { Debounce, IconButtonTypes, LoadingService } from '@iqser/common-ui';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { DossierTemplatesService } from '../../../dossier/services/dossier-templates.service';
import ICodeEditor = monaco.editor.ICodeEditor;
import IModelDeltaDecoration = monaco.editor.IModelDeltaDecoration;
import IStandaloneEditorConstructionOptions = monaco.editor.IStandaloneEditorConstructionOptions;
@ -40,13 +40,13 @@ export class RulesScreenComponent extends ComponentHasChanges implements OnInit
readonly permissionsService: PermissionsService,
private readonly _rulesControllerService: RulesControllerService,
private readonly _appStateService: AppStateService,
private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _toaster: Toaster,
protected readonly _translateService: TranslateService,
private readonly _activatedRoute: ActivatedRoute,
private readonly _loadingService: LoadingService
) {
super(_translateService);
_appStateService.activateDossierTemplate(_activatedRoute.snapshot.params.dossierTemplateId);
}
get hasChanges(): boolean {
@ -91,7 +91,7 @@ export class RulesScreenComponent extends ComponentHasChanges implements OnInit
await this._rulesControllerService
.uploadRules({
rules: this._codeEditor.getModel().getValue(),
dossierTemplateId: this._appStateService.activeDossierTemplateId
dossierTemplateId: this._dossierTemplatesService.activeDossierTemplateId
})
.toPromise()
.then(
@ -149,7 +149,7 @@ export class RulesScreenComponent extends ComponentHasChanges implements OnInit
private async _initialize() {
this._loadingService.start();
await this._rulesControllerService
.downloadRules(this._appStateService.activeDossierTemplateId)
.downloadRules(this._dossierTemplatesService.activeDossierTemplateId)
.toPromise()
.then(
rules => {

View File

@ -1,7 +1,6 @@
import { ChangeDetectorRef, Component, ElementRef, Inject, OnInit, ViewChild } from '@angular/core';
import { PermissionsService } from '@services/permissions.service';
import WebViewer, { WebViewerInstance } from '@pdftron/webviewer';
import { AppStateService } from '@state/app-state.service';
import { environment } from '@environments/environment';
import { HttpClient } from '@angular/common/http';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
@ -11,6 +10,7 @@ import { ActivatedRoute } from '@angular/router';
import { BASE_HREF } from '../../../../tokens';
import { stampPDFPage } from '@utils/page-stamper';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { DossierTemplatesService } from '../../../dossier/services/dossier-templates.service';
export const DEFAULT_WATERMARK: WatermarkModel = {
text: null,
@ -36,7 +36,6 @@ export class WatermarkScreenComponent implements OnInit {
constructor(
readonly permissionsService: PermissionsService,
readonly appStateService: AppStateService,
@Inject(BASE_HREF) private readonly _baseHref: string,
private readonly _watermarkControllerService: WatermarkControllerService,
private readonly _toaster: Toaster,
@ -44,9 +43,9 @@ export class WatermarkScreenComponent implements OnInit {
private readonly _changeDetectorRef: ChangeDetectorRef,
private readonly _formBuilder: FormBuilder,
private readonly _activatedRoute: ActivatedRoute,
private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _loadingService: LoadingService
) {
appStateService.activateDossierTemplate(_activatedRoute.snapshot.params.dossierTemplateId);
this._loadingService.start();
this._initForm();
}
@ -77,9 +76,11 @@ export class WatermarkScreenComponent implements OnInit {
...this.configForm.getRawValue()
};
const dossierTemplateId = this._dossierTemplatesService.activeDossierTemplateId;
const observable = watermark.text
? this._watermarkControllerService.saveWatermark(watermark, this.appStateService.activeDossierTemplateId)
: this._watermarkControllerService.deleteWatermark(this.appStateService.activeDossierTemplateId);
? this._watermarkControllerService.saveWatermark(watermark, dossierTemplateId)
: this._watermarkControllerService.deleteWatermark(dossierTemplateId);
observable.toPromise().then(
() => {
@ -107,7 +108,7 @@ export class WatermarkScreenComponent implements OnInit {
}
private _loadWatermark() {
this._watermarkControllerService.getWatermark(this.appStateService.activeDossierTemplateId).subscribe(
this._watermarkControllerService.getWatermark(this._dossierTemplatesService.activeDossierTemplateId).subscribe(
watermark => {
this._watermark = watermark;
this.configForm.setValue({ ...this._watermark });

View File

@ -6,6 +6,7 @@ import { AutoUnsubscribe } from '@iqser/common-ui';
import { File } from '@models/file/file';
import { FileAttributesService } from '../../services/file-attributes.service';
import { DossiersService } from '../../services/dossiers.service';
import { DossierTemplatesService } from '../../services/dossier-templates.service';
@Component({
selector: 'redaction-document-info',
@ -21,6 +22,7 @@ export class DocumentInfoComponent extends AutoUnsubscribe implements OnInit {
constructor(
private readonly _appStateService: AppStateService,
private readonly _dossiersService: DossiersService,
private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _fileAttributesService: FileAttributesService,
private readonly _dialogService: DossiersDialogService
) {
@ -32,13 +34,13 @@ export class DocumentInfoComponent extends AutoUnsubscribe implements OnInit {
}
get dossierTemplateName(): string {
return this._appStateService.getDossierTemplateById(this.dossier.dossierTemplateId).name;
return this._dossierTemplatesService.find(this.dossier.dossierTemplateId).name;
}
ngOnInit(): void {
this.fileAttributesConfig = this._fileAttributesService.getFileAttributeConfig(this.dossier.dossierTemplateId);
this.addSubscription = this._appStateService.dossierTemplateChanged$.subscribe(() => {
this.addSubscription = this._dossierTemplatesService.entityChanged$.subscribe(() => {
this.fileAttributesConfig = this._fileAttributesService.getFileAttributeConfig(this.dossier.dossierTemplateId);
});
}

View File

@ -8,11 +8,11 @@ import {
ReportTemplateControllerService
} from '@redaction/red-ui-http';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { AppStateService } from '@state/app-state.service';
import * as moment from 'moment';
import { downloadTypesTranslations } from '../../../../translations/download-types-translations';
import { IconButtonTypes } from '@iqser/common-ui';
import { DossiersService } from '../../services/dossiers.service';
import { DossierTemplatesService } from '../../services/dossier-templates.service';
@Component({
templateUrl: './add-dossier-dialog.component.html',
@ -31,8 +31,8 @@ export class AddDossierDialogComponent {
availableReportTypes = [];
constructor(
private readonly _appStateService: AppStateService,
private readonly _dossiersService: DossiersService,
private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _formBuilder: FormBuilder,
private readonly _reportTemplateController: ReportTemplateControllerService,
readonly dialogRef: MatDialogRef<AddDossierDialogComponent>
@ -110,7 +110,7 @@ export class AddDossierDialogComponent {
}
private _filterInvalidDossierTemplates() {
this.dossierTemplates = this._appStateService.dossierTemplates.filter(r => {
this.dossierTemplates = this._dossierTemplatesService.all.filter(r => {
const notYetValid = !!r.validFrom && moment(r.validFrom).isAfter(moment());
const notValidAnymore = !!r.validTo && moment(r.validTo).add(1, 'd').isBefore(moment());
return !(notYetValid || notValidAnymore);

View File

@ -1,7 +1,6 @@
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
import { DossierRequest, IDossierTemplate } from '@redaction/red-ui-http';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { AppStateService } from '@state/app-state.service';
import * as moment from 'moment';
import { Dossier } from '@state/model/dossier';
import { EditDossierSectionInterface } from '../edit-dossier-section.interface';
@ -13,6 +12,7 @@ import { EditDossierDialogComponent } from '../edit-dossier-dialog.component';
import { ConfirmationDialogInput, IconButtonTypes, TitleColors, Toaster } from '@iqser/common-ui';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { DossiersService } from '../../../services/dossiers.service';
import { DossierTemplatesService } from '../../../services/dossier-templates.service';
@Component({
selector: 'redaction-edit-dossier-general-info',
@ -31,7 +31,7 @@ export class EditDossierGeneralInfoComponent implements OnInit, EditDossierSecti
constructor(
readonly permissionsService: PermissionsService,
private readonly _appStateService: AppStateService,
private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _dossiersService: DossiersService,
private readonly _formBuilder: FormBuilder,
private readonly _dialogService: DossiersDialogService,
@ -133,7 +133,7 @@ export class EditDossierGeneralInfoComponent implements OnInit, EditDossierSecti
}
private _filterInvalidDossierTemplates() {
this.dossierTemplates = this._appStateService.dossierTemplates.filter(r => {
this.dossierTemplates = this._dossierTemplatesService.all.filter(r => {
if (this.dossier?.dossierTemplateId === r.dossierTemplateId) {
return true;
}

View File

@ -2,9 +2,10 @@ import { Component, EventEmitter, Input, Output } from '@angular/core';
import { DossierAttributeWithValue } from '@models/dossier-attributes.model';
import { AppStateService } from '@state/app-state.service';
import { Dossier } from '@state/model/dossier';
import { IDossierTemplate } from '@redaction/red-ui-http';
import { DossiersDialogService } from '../../../../services/dossiers-dialog.service';
import { DossiersService } from '../../../../services/dossiers.service';
import { DossierTemplatesService } from '../../../../services/dossier-templates.service';
import { DossierTemplate } from '@models/file/dossier-template';
@Component({
selector: 'redaction-dossier-details-stats',
@ -18,12 +19,13 @@ export class DossierDetailsStatsComponent {
constructor(
private readonly _appStateService: AppStateService,
private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _dialogService: DossiersDialogService,
readonly dossiersService: DossiersService
) {}
dossierTemplate(dossier: Dossier): IDossierTemplate {
return this._appStateService.getDossierTemplateById(dossier.dossierTemplateId);
dossierTemplate(dossier: Dossier): DossierTemplate {
return this._dossierTemplatesService.find(dossier.dossierTemplateId);
}
openEditDossierAttributesDialog(dossier: Dossier) {

View File

@ -51,6 +51,7 @@ import { FileAttributesService } from '../../../services/file-attributes.service
import { ConfigService as AppConfigService } from '@services/config.service';
import { ConfigService } from '../config.service';
import { DossiersService } from '../../../services/dossiers.service';
import { DossierTemplatesService } from '../../../services/dossier-templates.service';
@Component({
templateUrl: './dossier-overview-screen.component.html',
@ -85,6 +86,7 @@ export class DossierOverviewScreenComponent extends ListingComponent<File> imple
private readonly _loadingService: LoadingService,
private readonly _appStateService: AppStateService,
private readonly _dossiersService: DossiersService,
private readonly _dossierTemplatesService: DossierTemplatesService,
readonly routerHistoryService: RouterHistoryService,
private readonly _appConfigService: AppConfigService,
private readonly _translateService: TranslateService,
@ -153,7 +155,7 @@ export class DossierOverviewScreenComponent extends ListingComponent<File> imple
this.calculateData();
});
this.addSubscription = this._appStateService.dossierTemplateChanged$.subscribe(() => {
this.addSubscription = this._dossierTemplatesService.entityChanged$.subscribe(() => {
this.fileAttributeConfigs = this._fileAttributesService.getFileAttributeConfig(
this.currentDossier.dossierTemplateId
)?.fileAttributeConfigs;

View File

@ -1,18 +1,19 @@
import { Component, Input } from '@angular/core';
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
import { Dossier } from '@state/model/dossier';
import { AppStateService } from '@state/app-state.service';
import { DossierTemplatesService } from '../../../../services/dossier-templates.service';
@Component({
selector: 'redaction-dossiers-listing-dossier-name',
templateUrl: './dossiers-listing-dossier-name.component.html',
styleUrls: ['./dossiers-listing-dossier-name.component.scss']
styleUrls: ['./dossiers-listing-dossier-name.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class DossiersListingDossierNameComponent {
@Input() dossier: Dossier;
constructor(private readonly _appStateService: AppStateService) {}
constructor(private readonly _dossierTemplatesService: DossierTemplatesService) {}
getDossierTemplateNameFor(dossierTemplateId: string): string {
return this._appStateService.getDossierTemplateById(dossierTemplateId).name;
return this._dossierTemplatesService.find(dossierTemplateId).name;
}
}

View File

@ -17,6 +17,7 @@ import {
} from '@utils/index';
import { workloadTranslations } from '../../translations/workload-translations';
import { AppStateService } from '@state/app-state.service';
import { DossierTemplatesService } from '../../services/dossier-templates.service';
@Injectable()
export class ConfigService {
@ -24,7 +25,8 @@ export class ConfigService {
private readonly _translateService: TranslateService,
private readonly _userPreferenceService: UserPreferenceService,
private readonly _userService: UserService,
private readonly _appStateService: AppStateService
private readonly _appStateService: AppStateService,
private readonly _dossierTemplatesService: DossierTemplatesService
) {}
get tableConfig(): TableColumnConfig<Dossier>[] {
@ -171,7 +173,7 @@ export class ConfigService {
id =>
new NestedFilter({
id: id,
label: this._appStateService.getDossierTemplateById(id).name
label: this._dossierTemplatesService.find(id).name
})
);

View File

@ -3,19 +3,67 @@ import { DossierTemplate } from '@models/file/dossier-template';
import { IDossierTemplate } from '@redaction/red-ui-http';
import { Injectable, Injector } from '@angular/core';
import { TEMPORARY_INJECTOR } from './injector';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { BehaviorSubject, Observable } from 'rxjs';
import { FileAttributesService } from './file-attributes.service';
import { ActivationEnd, Router } from '@angular/router';
import { currentComponentRoute } from '@utils/functions';
@Injectable({
providedIn: 'root'
})
export class DossierTemplatesService extends EntitiesService<DossierTemplate, IDossierTemplate> {
constructor(protected readonly _injector: Injector) {
readonly activeDossierTemplate$: Observable<DossierTemplate | undefined>;
private readonly _activeDossierTemplate$ = new BehaviorSubject<DossierTemplate | undefined>(undefined);
constructor(
protected readonly _injector: Injector,
private readonly _fileAttributesService: FileAttributesService,
private readonly _router: Router
) {
super(TEMPORARY_INJECTOR(_injector), 'dossier-template');
this.activeDossierTemplate$ = this._activeDossierTemplate$.asObservable();
_router.events.pipe(currentComponentRoute).subscribe((event: ActivationEnd) => {
const dossierTemplateId = event.snapshot.paramMap.get('dossierTemplateId');
const sameIdAsCurrentActive = dossierTemplateId === this._activeDossierTemplate$.getValue()?.dossierTemplateId;
if (sameIdAsCurrentActive) {
return;
}
if (dossierTemplateId === null || dossierTemplateId === undefined) {
return this._activeDossierTemplate$.next(undefined);
}
if (!this.has(dossierTemplateId)) {
this._activeDossierTemplate$.next(undefined);
return this._router.navigate(['/main/admin/dossier-templates']).then();
}
this._activeDossierTemplate$.next(this.find(dossierTemplateId));
});
}
fetch() {
this.get().pipe(map(entities => entities.map(dossierTemplate => new DossierTemplate(dossierTemplate))));
get activeDossierTemplate(): DossierTemplate | undefined {
return this._activeDossierTemplate$.value;
}
get activeDossierTemplateId(): string | undefined {
return this._activeDossierTemplate$.value?.dossierTemplateId;
}
async loadAll(): Promise<void> {
const dossierTemplates = await this.get().toPromise();
this.setEntities(dossierTemplates.map(dossierTemplate => new DossierTemplate(dossierTemplate)));
for (const dossierTemplate of this.all) {
await this._fileAttributesService.getFileAttributesConfig(dossierTemplate.dossierTemplateId).toPromise();
}
}
async loadAllIfEmpty(): Promise<void> {
if (!this.all.length) {
await this.loadAll();
}
}
/**

View File

@ -2,21 +2,20 @@ import { Injectable, Injector } from '@angular/core';
import { DossierRequest, IDossier } from '@redaction/red-ui-http';
import { EntitiesService, List, QueryParam, RequiredParam, Toaster, Validate } from '@iqser/common-ui';
import { Dossier } from '@state/model/dossier';
import { catchError, filter, map, tap } from 'rxjs/operators';
import { catchError, map, tap } from 'rxjs/operators';
import { TEMPORARY_INJECTOR } from './injector';
import { BehaviorSubject, Observable, of, Subject } from 'rxjs';
import { BehaviorSubject, Observable, of } from 'rxjs';
import { ActivationEnd, Router } from '@angular/router';
import { BaseScreenComponent } from '@components/base-screen/base-screen.component';
import { File } from '@models/file/file';
import { DictionaryService } from '@shared/services/dictionary.service';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { currentComponentRoute } from '@utils/functions';
export interface IDossiersStats {
totalPeople: number;
totalAnalyzedPages: number;
}
const getRelatedEvents = filter(event => event instanceof ActivationEnd && event.snapshot.component !== BaseScreenComponent);
const DOSSIER_EXISTS_MSG = _('add-dossier-dialog.errors.dossier-already-exists');
const GENERIC_MGS = _('add-dossier-dialog.errors.generic');
@ -26,7 +25,6 @@ const GENERIC_MGS = _('add-dossier-dialog.errors.generic');
export class DossiersService extends EntitiesService<Dossier, IDossier> {
readonly stats$ = this.all$.pipe(map(entities => this._computeStats(entities)));
readonly activeDossier$: Observable<Dossier | undefined>;
readonly dossierChanged$ = new Subject<Dossier>();
private readonly _activeDossier$ = new BehaviorSubject<Dossier | undefined>(undefined);
constructor(
@ -38,7 +36,7 @@ export class DossiersService extends EntitiesService<Dossier, IDossier> {
super(TEMPORARY_INJECTOR(_injector), 'dossier');
this.activeDossier$ = this._activeDossier$.asObservable();
_router.events.pipe(getRelatedEvents).subscribe((event: ActivationEnd) => {
_router.events.pipe(currentComponentRoute).subscribe((event: ActivationEnd) => {
const dossierId = event.snapshot.paramMap.get('dossierId');
const sameIdAsCurrentActive = dossierId === this._activeDossier$.getValue()?.dossierId;
@ -79,24 +77,17 @@ export class DossiersService extends EntitiesService<Dossier, IDossier> {
find(dossierId: string): Dossier | undefined;
find(dossierId: string, fileId: string): File | undefined;
find(dossierId: string, fileId?: string): Dossier | File | undefined {
const dossier = this.all.find(item => item.dossierId === dossierId);
const dossier = super.find(dossierId);
return fileId ? dossier?.files.find(file => file.fileId === fileId) : dossier;
}
replace(newDossier: Dossier) {
const dossiers = this.all.filter(dossier => dossier.dossierId !== newDossier.dossierId);
dossiers.push(newDossier);
this.setEntities(dossiers);
this.dossierChanged$.next(newDossier);
super.replace(newDossier);
if (newDossier.dossierId === this.activeDossierId) {
this._activeDossier$.next(newDossier);
}
}
has(dossierId: string): boolean {
return this.all.some(dossier => dossier.dossierId === dossierId);
}
async updateDossierDictionary(dossierTemplateId: string, dossierId: string) {
// dossier exists, load its dictionary
const dossier = this.find(dossierId);
@ -131,7 +122,6 @@ export class DossiersService extends EntitiesService<Dossier, IDossier> {
delete(dossier: Dossier): Observable<unknown> {
const updateDossiers = () => {
console.log(this.all.filter(d => d.dossierId !== dossier.dossierId));
this.setEntities(this.all.filter(d => d.dossierId !== dossier.dossierId));
};
const showToast = () => {

View File

@ -107,7 +107,7 @@ export class FileActionsComponent extends AutoUnsubscribe implements OnInit, OnD
this._setup();
});
this.addSubscription = this.dossiersService.dossierChanged$.subscribe(() => {
this.addSubscription = this.dossiersService.entityChanged$.subscribe(() => {
this._setup();
});
}

View File

@ -30,6 +30,14 @@
{{ 'dictionary-overview.compare.compare' | translate }}
</mat-checkbox>
</div>
<div *ngIf="filterByDossierTemplate" class="iqser-input-group w-200 mt-0 mr-8">
<mat-select [(ngModel)]="dossier" [disabled]="!compare">
<mat-option [value]="selectDossier">{{ selectDossier.dossierName | translate }}</mat-option>
<mat-option *ngFor="let dossier of dossiersService.all$ | async" [value]="dossier">
{{ dossier.dossierName }}
</mat-option>
</mat-select>
</div>
<div class="iqser-input-group w-200 mt-0">
<mat-select [(ngModel)]="dossier" [disabled]="!compare">
<mat-option [value]="selectDossier">{{ selectDossier.dossierName | translate }}</mat-option>

View File

@ -24,6 +24,7 @@ export class DictionaryManagerComponent implements OnChanges, OnInit {
readonly iconButtonTypes = IconButtonTypes;
@Input() withFloatingActions = true;
@Input() filterByDossierTemplate = false;
@Input() initialEntries: List;
@Input() canEdit = false;
@Output() readonly saveDictionary = new EventEmitter<string[]>();

View File

@ -2,9 +2,9 @@ import { Injectable } from '@angular/core';
import { DossierAttribute, DossierAttributes, DossierAttributesControllerService, IDossierAttributeConfig } from '@redaction/red-ui-http';
import { Dossier } from '@state/model/dossier';
import { DossierAttributeWithValue } from '@models/dossier-attributes.model';
import { AppStateService } from '@state/app-state.service';
import { Observable } from 'rxjs';
import { DossierAttributeConfig } from '@state/model/dossier-attribute-config';
import { DossierTemplatesService } from '../../../dossier/services/dossier-templates.service';
@Injectable({
providedIn: 'root'
@ -12,7 +12,7 @@ import { DossierAttributeConfig } from '@state/model/dossier-attribute-config';
export class DossierAttributesService {
constructor(
private readonly _dossierAttributesControllerService: DossierAttributesControllerService,
private readonly _appStateService: AppStateService
private readonly _dossierTemplatesService: DossierTemplatesService
) {}
async getValues(dossier: Dossier): Promise<DossierAttributeWithValue[]> {
@ -31,11 +31,11 @@ export class DossierAttributesService {
return this._dossierAttributesControllerService.setDossierAttributes({ dossierAttributeList }, dossier.id).toPromise();
}
deleteConfigs(ids: string[], dossierTemplateId = this._appStateService.activeDossierTemplateId): Promise<void> {
deleteConfigs(ids: string[], dossierTemplateId = this._dossierTemplatesService.activeDossierTemplateId): Promise<void> {
return this._dossierAttributesControllerService.deleteDossierAttributesConfig(ids, dossierTemplateId).toPromise();
}
async getConfig(dossierTemplateId = this._appStateService.activeDossierTemplateId): Promise<DossierAttributeConfig[]> {
async getConfig(dossierTemplateId = this._dossierTemplatesService.activeDossierTemplateId): Promise<DossierAttributeConfig[]> {
const config$ = this._dossierAttributesControllerService.getDossierAttributesConfig(dossierTemplateId);
const result = (await config$.toPromise())?.dossierAttributeConfigs || [];
return result.map(item => new DossierAttributeConfig(item));
@ -43,7 +43,7 @@ export class DossierAttributesService {
addOrUpdateConfig(
attribute: IDossierAttributeConfig,
dossierTemplateId = this._appStateService.activeDossierTemplateId
dossierTemplateId = this._dossierTemplatesService.activeDossierTemplateId
): Observable<IDossierAttributeConfig> {
return this._dossierAttributesControllerService.addOrUpdateDossierAttributesConfig(attribute, dossierTemplateId);
}

View File

@ -3,6 +3,7 @@ import { ActivatedRouteSnapshot, CanActivate, Router } from '@angular/router';
import { AppStateService } from './app-state.service';
import { UserService } from '@services/user.service';
import { DossiersService } from '../modules/dossier/services/dossiers.service';
import { DossierTemplatesService } from '../modules/dossier/services/dossier-templates.service';
@Injectable({
providedIn: 'root'
@ -11,6 +12,7 @@ export class AppStateGuard implements CanActivate {
constructor(
private readonly _appStateService: AppStateService,
private readonly _dossiersService: DossiersService,
private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _userService: UserService,
private readonly _router: Router
) {}
@ -22,7 +24,7 @@ export class AppStateGuard implements CanActivate {
if (this._userService.currentUser.isUser || this._userService.currentUser.isAdmin) {
await this._userService.loadUsersIfNecessary();
await this._appStateService.loadDossierTemplatesIfNecessary();
await this._dossierTemplatesService.loadAllIfEmpty();
await this._appStateService.loadDictionaryDataIfNecessary();
}
@ -42,7 +44,7 @@ export class AppStateGuard implements CanActivate {
return false;
}
if (dossierTemplateId && !this._appStateService.getDossierTemplateById(dossierTemplateId)) {
if (dossierTemplateId && !this._dossierTemplatesService.find(dossierTemplateId)) {
await this._router.navigate(['main', 'admin', 'dossier-templates']);
return false;
}

View File

@ -1,10 +1,10 @@
import { Injectable } from '@angular/core';
import { Colors, IFile, ReanalysisControllerService } from '@redaction/red-ui-http';
import { ActivationEnd, Event, ResolveStart, Router } from '@angular/router';
import { ActivationEnd, Router } from '@angular/router';
import { UserService } from '@services/user.service';
import { forkJoin, Observable, of, Subject } from 'rxjs';
import { catchError, filter, first, map, tap } from 'rxjs/operators';
import { FALLBACK_COLOR, hexToRgb } from '@utils/functions';
import { currentComponentRoute, FALLBACK_COLOR, hexToRgb } from '@utils/functions';
import { File } from '@models/file/file';
import { Dossier } from './model/dossier';
import { TypeValue } from '@models/file/type-value';
@ -15,26 +15,20 @@ import { FilesService } from '../modules/dossier/services/files.service';
import { DictionaryService } from '@shared/services/dictionary.service';
import { DossierTemplatesService } from '../modules/dossier/services/dossier-templates.service';
import { FileAttributesService } from '../modules/dossier/services/file-attributes.service';
import { BaseScreenComponent } from '@components/base-screen/base-screen.component';
export interface AppState {
dossierTemplates: DossierTemplate[];
activeFileId?: string;
activeDossierTemplateId?: string;
activeDictionaryType?: string;
}
const getRelatedEvents = filter(event => event instanceof ActivationEnd && event.snapshot.component !== BaseScreenComponent);
@Injectable({
providedIn: 'root'
})
export class AppStateService {
readonly fileChanged$ = new Subject<File>();
readonly fileReanalysed$ = new Subject<File>();
readonly dossierTemplateChanged$ = new Subject<DossierTemplate>();
private _appState: AppState;
private _appState: AppState = {};
constructor(
private readonly _router: Router,
@ -47,11 +41,7 @@ export class AppStateService {
private readonly _fileAttributesService: FileAttributesService,
private readonly _userPreferenceService: UserPreferenceService
) {
this._appState = {
dossierTemplates: []
};
_router.events.pipe(getRelatedEvents).subscribe(async (event: ActivationEnd) => {
_router.events.pipe(currentComponentRoute).subscribe(async (event: ActivationEnd) => {
const fileId = event.snapshot.paramMap.get('fileId');
const sameIdAsCurrentActive = fileId === this.activeFileId;
@ -80,16 +70,8 @@ export class AppStateService {
return this._dictionaryData;
}
get activeDossierTemplateId(): string | undefined {
return this._appState.activeDossierTemplateId;
}
get activeDossierTemplate(): DossierTemplate | undefined {
return this.getDossierTemplateById(this.activeDossierTemplateId);
}
get dossierTemplates(): DossierTemplate[] {
return this._appState.dossierTemplates;
return this._dossierTemplatesService.all;
}
get activeDictionaryType(): string | undefined {
@ -97,11 +79,9 @@ export class AppStateService {
}
get activeDictionary(): TypeValue | undefined {
return this.activeDossierTemplateId &&
this.activeDictionaryType &&
this.dictionaryData &&
this.dictionaryData[this.activeDossierTemplateId]
? this.dictionaryData[this.activeDossierTemplateId][this.activeDictionaryType]
const activeDossierTemplateId = this._dossierTemplatesService.activeDossierTemplateId;
return activeDossierTemplateId && this.activeDictionaryType && this.dictionaryData && this.dictionaryData[activeDossierTemplateId]
? this.dictionaryData[activeDossierTemplateId][this.activeDictionaryType]
: undefined;
}
@ -113,10 +93,6 @@ export class AppStateService {
return this._appState.activeFileId;
}
private static _isFileOverviewRoute(event: Event) {
return event instanceof ResolveStart && event.url.includes('/main/dossiers/') && event.url.includes('/file/');
}
async reloadActiveDossierFilesIfNecessary() {
if (this._dossiersService.activeDossier?.hasPendingOrProcessing) {
await this.reloadActiveDossierFiles();
@ -139,13 +115,6 @@ export class AppStateService {
return color ?? this._dictionaryData[dossierTemplateId]['default'].hexColor;
}
getDossierTemplateById(id?: string): DossierTemplate | undefined {
if (!id) {
return undefined;
}
return this.dossierTemplates.find(rs => rs.dossierTemplateId === id);
}
getDictionaryTypeValue(key: string, dossierTemplateId = this._dossiersService.activeDossier.dossierTemplateId): TypeValue | undefined {
if (!dossierTemplateId) {
dossierTemplateId = this.dossierTemplates.length > 0 ? this.dossierTemplates[0].dossierTemplateId : undefined;
@ -226,29 +195,18 @@ export class AppStateService {
await this._updateLastActiveFileForDossier(dossierId, fileId);
}
async activateDossierTemplate(dossierTemplateId: string) {
this._appState.activeDossierTemplateId = dossierTemplateId;
this._appState.activeDictionaryType = null;
if (!this.activeDossierTemplate) {
this._appState.activeDossierTemplateId = null;
await this._router.navigate(['/main/admin/dossier-templates']);
}
}
async activateDictionary(dictionaryType: string, dossierTemplateId: string) {
await this.activateDossierTemplate(dossierTemplateId);
if (this.activeDossierTemplate) {
async activateDictionary(dictionaryType: string) {
if (this._dossierTemplatesService.activeDossierTemplate) {
this._appState.activeDictionaryType = dictionaryType;
if (!this.activeDictionary) {
this._appState.activeDictionaryType = null;
await this._router.navigate(['/main/admin/dossier-templates/' + this.activeDossierTemplateId]);
await this._router.navigate([this._dossierTemplatesService.activeDossierTemplate.routerLink]);
}
}
}
reset() {
this._appState.activeFileId = null;
this._appState.activeDossierTemplateId = null;
this._appState.activeDictionaryType = null;
}
@ -258,33 +216,15 @@ export class AppStateService {
}
}
async loadAllDossierTemplates() {
const dossierTemplates = await this._dossierTemplatesService.get().toPromise();
this._appState.dossierTemplates = dossierTemplates.map(dossierTemplate => new DossierTemplate(dossierTemplate));
for (const dossierTemplate of this._appState.dossierTemplates) {
await this._fileAttributesService.getFileAttributesConfig(dossierTemplate.dossierTemplateId).toPromise();
}
}
async refreshDossierTemplate(dossierTemplateId: string) {
const dossierTemplate = await this._dossierTemplatesService.get(dossierTemplateId).toPromise();
await this._fileAttributesService.getFileAttributesConfig(dossierTemplateId).toPromise();
Object.assign(
this._appState.dossierTemplates.find(d => d.dossierTemplateId === dossierTemplateId),
new DossierTemplate(dossierTemplate)
);
const newDossierTemplate = new DossierTemplate(dossierTemplate);
this._dossierTemplatesService.replace(newDossierTemplate);
await this.refreshDossierTemplateDictionaryData(dossierTemplateId);
this.dossierTemplateChanged$.next(this._appState.dossierTemplates.find(d => d.dossierTemplateId === dossierTemplateId));
}
async loadDossierTemplatesIfNecessary() {
if (!this._appState.dossierTemplates.length) {
await this.loadAllDossierTemplates();
}
}
async loadAllDossiersIfNecessary() {

View File

@ -1,5 +1,12 @@
import * as moment from 'moment';
import { List } from '@iqser/common-ui';
import { filter } from 'rxjs/operators';
import { ActivationEnd } from '@angular/router';
import { BaseScreenComponent } from '@components/base-screen/base-screen.component';
export const currentComponentRoute = filter(
event => event instanceof ActivationEnd && !!event.snapshot.component && event.snapshot.component !== BaseScreenComponent
);
export const FALLBACK_COLOR = '#CCCCCC';