refactor dossier model

This commit is contained in:
Dan Percic 2021-09-25 00:54:23 +03:00
parent a546b155db
commit c0640a65dc
55 changed files with 316 additions and 314 deletions

View File

@ -63,7 +63,7 @@ export class BaseScreenComponent {
text: this._translateService.instant('search.this-dossier'), text: this._translateService.instant('search.this-dossier'),
icon: 'red:enter', icon: 'red:enter',
hide: (): boolean => !this.appStateService.activeDossier, hide: (): boolean => !this.appStateService.activeDossier,
action: (query): void => this._search(query, this.appStateService.activeDossier.dossierId) action: (query): void => this._search(query, this.appStateService.activeDossier.id)
}, },
{ {
text: this._translateService.instant('search.entire-platform'), text: this._translateService.instant('search.entire-platform'),

View File

@ -1,7 +1,7 @@
import { AuditModel } from '@redaction/red-ui-http'; import { AuditModel } from '@redaction/red-ui-http';
import { Listable } from '@iqser/common-ui'; import { IListable } from '@iqser/common-ui';
export class AuditModelWrapper implements Listable { export class AuditModelWrapper implements IListable {
constructor(public auditModel: AuditModel) {} constructor(public auditModel: AuditModel) {}
get category(): string { get category(): string {

View File

@ -1,7 +1,7 @@
import { DossierTemplateModel, FileAttributesConfig } from '@redaction/red-ui-http'; import { DossierTemplateModel, FileAttributesConfig } from '@redaction/red-ui-http';
import { Listable } from '@iqser/common-ui'; import { IListable } from '@iqser/common-ui';
export class DossierTemplateModelWrapper implements Listable { export class DossierTemplateModelWrapper implements IListable {
dictionariesCount = 0; dictionariesCount = 0;
totalDictionaryEntries = 0; totalDictionaryEntries = 0;

View File

@ -1,4 +1,4 @@
import { Listable } from '@iqser/common-ui'; import { IListable } from '@iqser/common-ui';
import { FileAttributesConfig, FileStatus } from '@redaction/red-ui-http'; import { FileAttributesConfig, FileStatus } from '@redaction/red-ui-http';
import { StatusSorter } from '@utils/sorters/status-sorter'; import { StatusSorter } from '@utils/sorters/status-sorter';
@ -10,7 +10,7 @@ const processingStatuses = [
FileStatus.StatusEnum.PROCESSING FileStatus.StatusEnum.PROCESSING
] as const; ] as const;
export class FileStatusWrapper implements FileStatus, Listable { export class FileStatusWrapper implements FileStatus, IListable {
readonly added = this.fileStatus.added; readonly added = this.fileStatus.added;
readonly allManualRedactionsApplied = this.fileStatus.allManualRedactionsApplied; readonly allManualRedactionsApplied = this.fileStatus.allManualRedactionsApplied;
readonly analysisDuration = this.fileStatus.analysisDuration; readonly analysisDuration = this.fileStatus.analysisDuration;

View File

@ -1,7 +1,7 @@
import { Listable } from '@iqser/common-ui'; import { IListable } from '@iqser/common-ui';
import { TypeValue } from '@redaction/red-ui-http'; import { TypeValue } from '@redaction/red-ui-http';
export class TypeValueWrapper implements Listable { export class TypeValueWrapper implements IListable {
entries: string[] = []; entries: string[] = [];
constructor(public typeValue: TypeValue, public label?: string, public virtual?: boolean) { constructor(public typeValue: TypeValue, public label?: string, public virtual?: boolean) {

View File

@ -5,9 +5,9 @@ import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import * as moment from 'moment'; import * as moment from 'moment';
import { Moment } from 'moment'; import { Moment } from 'moment';
import { import {
Dossier,
DossierTemplateControllerService, DossierTemplateControllerService,
DossierTemplateModel, DossierTemplateModel,
DownloadFileType,
ReportTemplate, ReportTemplate,
ReportTemplateControllerService ReportTemplateControllerService
} from '@redaction/red-ui-http'; } from '@redaction/red-ui-http';
@ -23,8 +23,8 @@ export class AddEditDossierTemplateDialogComponent implements OnInit {
dossierTemplateForm: FormGroup; dossierTemplateForm: FormGroup;
hasValidFrom: boolean; hasValidFrom: boolean;
hasValidTo: boolean; hasValidTo: boolean;
downloadTypesEnum: Dossier.DownloadFileTypesEnum[] = ['ORIGINAL', 'PREVIEW', 'REDACTED']; downloadTypesEnum: DownloadFileType[] = ['ORIGINAL', 'PREVIEW', 'REDACTED'];
downloadTypes: { key: Dossier.DownloadFileTypesEnum; label: string }[] = this.downloadTypesEnum.map(type => ({ downloadTypes: { key: DownloadFileType; label: string }[] = this.downloadTypesEnum.map(type => ({
key: type, key: type,
label: downloadTypesTranslations[type] label: downloadTypesTranslations[type]
})); }));

View File

@ -5,10 +5,10 @@ import * as Papa from 'papaparse';
import { FileAttributeConfig, FileAttributesConfig, FileAttributesControllerService } from '@redaction/red-ui-http'; import { FileAttributeConfig, FileAttributesConfig, FileAttributesControllerService } from '@redaction/red-ui-http';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { map, startWith } from 'rxjs/operators'; import { map, startWith } from 'rxjs/operators';
import { DefaultListingServices, Listable, ListingComponent, TableColumnConfig, Toaster } from '@iqser/common-ui'; import { DefaultListingServices, IListable, ListingComponent, TableColumnConfig, Toaster } from '@iqser/common-ui';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
export interface Field extends Listable { export interface Field extends IListable {
id: string; id: string;
csvColumn: string; csvColumn: string;
name: string; name: string;

View File

@ -3,13 +3,20 @@ import { AppStateService } from '@state/app-state.service';
import { Colors, DictionaryControllerService } from '@redaction/red-ui-http'; import { Colors, DictionaryControllerService } from '@redaction/red-ui-http';
import { ActivatedRoute } from '@angular/router'; import { ActivatedRoute } from '@angular/router';
import { AdminDialogService } from '../../services/admin-dialog.service'; import { AdminDialogService } from '../../services/admin-dialog.service';
import { CircleButtonTypes, DefaultListingServices, Listable, ListingComponent, LoadingService, TableColumnConfig } from '@iqser/common-ui'; import {
CircleButtonTypes,
DefaultListingServices,
IListable,
ListingComponent,
LoadingService,
TableColumnConfig
} from '@iqser/common-ui';
import { DefaultColorType } from '@models/default-color-key.model'; import { DefaultColorType } from '@models/default-color-key.model';
import { defaultColorsTranslations } from '../../translations/default-colors-translations'; import { defaultColorsTranslations } from '../../translations/default-colors-translations';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { UserService } from '@services/user.service'; import { UserService } from '@services/user.service';
interface ListItem extends Listable { interface ListItem extends IListable {
readonly key: string; readonly key: string;
readonly value: string; readonly value: string;
} }

View File

@ -1,9 +1,9 @@
import { ChangeDetectionStrategy, Component, forwardRef, Injector, OnInit, TemplateRef, ViewChild } from '@angular/core'; import { ChangeDetectionStrategy, Component, forwardRef, Injector, OnInit, TemplateRef, ViewChild } from '@angular/core';
import { Dossier } from '@redaction/red-ui-http'; import { IDossier } from '@redaction/red-ui-http';
import { import {
CircleButtonTypes, CircleButtonTypes,
DefaultListingServices, DefaultListingServices,
Listable, IListable,
ListingComponent, ListingComponent,
LoadingService, LoadingService,
SortingOrders, SortingOrders,
@ -20,7 +20,7 @@ import { distinctUntilChanged, map } from 'rxjs/operators';
import { getLeftDateTime } from '@utils/functions'; import { getLeftDateTime } from '@utils/functions';
import { RouterHistoryService } from '@services/router-history.service'; import { RouterHistoryService } from '@services/router-history.service';
interface DossierListItem extends Dossier, Listable { interface DossierListItem extends IDossier, IListable {
readonly canRestore: boolean; readonly canRestore: boolean;
readonly restoreDate: string; readonly restoreDate: string;
} }
@ -140,11 +140,11 @@ export class TrashScreenComponent extends ListingComponent<DossierListItem> impl
return daysLeft >= 0 && hoursLeft >= 0 && minutesLeft > 0; return daysLeft >= 0 && hoursLeft >= 0 && minutesLeft > 0;
} }
private _toListItems(dossiers: Dossier[]): DossierListItem[] { private _toListItems(dossiers: IDossier[]): DossierListItem[] {
return dossiers.map(dossier => this._toListItem(dossier)); return dossiers.map(dossier => this._toListItem(dossier));
} }
private _toListItem(dossier: Dossier): DossierListItem { private _toListItem(dossier: IDossier): DossierListItem {
const restoreDate = this._getRestoreDate(dossier.softDeletedTime); const restoreDate = this._getRestoreDate(dossier.softDeletedTime);
return { return {
id: dossier.dossierId, id: dossier.dossierId,
@ -157,19 +157,19 @@ export class TrashScreenComponent extends ListingComponent<DossierListItem> impl
} }
private async _restore(dossiers: DossierListItem[]): Promise<void> { private async _restore(dossiers: DossierListItem[]): Promise<void> {
const dossierIds = dossiers.map(d => d.dossierId); const dossierIds = dossiers.map(d => d.id);
await this._dossiersService.restore(dossierIds); await this._dossiersService.restore(dossierIds);
this._removeFromList(dossierIds); this._removeFromList(dossierIds);
} }
private async _hardDelete(dossiers: DossierListItem[]) { private async _hardDelete(dossiers: DossierListItem[]) {
const dossierIds = dossiers.map(d => d.dossierId); const dossierIds = dossiers.map(d => d.id);
await this._dossiersService.hardDelete(dossierIds); await this._dossiersService.hardDelete(dossierIds);
this._removeFromList(dossierIds); this._removeFromList(dossierIds);
} }
private _removeFromList(ids: string[]): void { private _removeFromList(ids: string[]): void {
const entities = this.entitiesService.all.filter(e => !ids.includes(e.dossierId)); const entities = this.entitiesService.all.filter(e => !ids.includes(e.id));
this.entitiesService.setEntities(entities); this.entitiesService.setEntities(entities);
this.entitiesService.setSelected([]); this.entitiesService.setSelected([]);
} }

View File

@ -164,7 +164,7 @@ export class DossierOverviewBulkActionsComponent {
async reanalyse() { async reanalyse() {
const fileIds = this.selectedFiles.filter(file => file.analysisRequired).map(file => file.fileId); const fileIds = this.selectedFiles.filter(file => file.analysisRequired).map(file => file.fileId);
this._performBulkAction( this._performBulkAction(
this._reanalysisControllerService.reanalyzeFilesForDossier(fileIds, this._appStateService.activeDossier.dossierId) this._reanalysisControllerService.reanalyzeFilesForDossier(fileIds, this._appStateService.activeDossier.id)
); );
} }

View File

@ -4,7 +4,7 @@
</div> </div>
<div> <div>
<mat-icon svgIcon="red:user"></mat-icon> <mat-icon svgIcon="red:user"></mat-icon>
<span>{{ 'dossier-overview.dossier-details.stats.people' | translate: { count: activeDossier.memberCount } }}</span> <span>{{ 'dossier-overview.dossier-details.stats.people' | translate: { count: activeDossier.memberIds.length } }}</span>
</div> </div>
<div> <div>
<mat-icon svgIcon="red:pages"></mat-icon> <mat-icon svgIcon="red:pages"></mat-icon>

View File

@ -1,7 +1,7 @@
import { Component, EventEmitter, Input, Output } from '@angular/core'; import { Component, EventEmitter, Input, Output } from '@angular/core';
import { DossierAttributeWithValue } from '@models/dossier-attributes.model'; import { DossierAttributeWithValue } from '@models/dossier-attributes.model';
import { AppStateService } from '@state/app-state.service'; import { AppStateService } from '@state/app-state.service';
import { DossierWrapper } from '@state/model/dossier.wrapper'; import { Dossier } from '../../../../state/model/dossier';
import { DossierTemplateModel } from '@redaction/red-ui-http'; import { DossierTemplateModel } from '@redaction/red-ui-http';
import { DossiersDialogService } from '../../services/dossiers-dialog.service'; import { DossiersDialogService } from '../../services/dossiers-dialog.service';
@ -17,7 +17,7 @@ export class DossierDetailsStatsComponent {
constructor(private readonly _appStateService: AppStateService, private readonly _dialogService: DossiersDialogService) {} constructor(private readonly _appStateService: AppStateService, private readonly _dialogService: DossiersDialogService) {}
get activeDossier(): DossierWrapper { get activeDossier(): Dossier {
return this._appStateService.activeDossier; return this._appStateService.activeDossier;
} }

View File

@ -5,8 +5,7 @@ import { DoughnutChartConfig } from '@shared/components/simple-doughnut-chart/si
import { TranslateChartService } from '@services/translate-chart.service'; import { TranslateChartService } from '@services/translate-chart.service';
import { StatusSorter } from '@utils/sorters/status-sorter'; import { StatusSorter } from '@utils/sorters/status-sorter';
import { UserService, UserWrapper } from '@services/user.service'; import { UserService, UserWrapper } from '@services/user.service';
import { Toaster } from '@iqser/common-ui'; import { FilterService, List, Toaster } from '@iqser/common-ui';
import { FilterService } from '@iqser/common-ui';
import { DossierAttributeWithValue } from '@models/dossier-attributes.model'; import { DossierAttributeWithValue } from '@models/dossier-attributes.model';
import { fileStatusTranslations } from '../../translations/file-status-translations'; import { fileStatusTranslations } from '../../translations/file-status-translations';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
@ -39,7 +38,7 @@ export class DossierDetailsComponent implements OnInit {
private readonly _toaster: Toaster private readonly _toaster: Toaster
) {} ) {}
get memberIds(): string[] { get memberIds(): List {
return this.appStateService.activeDossier.memberIds; return this.appStateService.activeDossier.memberIds;
} }

View File

@ -1,6 +1,6 @@
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core'; import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
import { PermissionsService } from '@services/permissions.service'; import { PermissionsService } from '@services/permissions.service';
import { DossierWrapper } from '@state/model/dossier.wrapper'; import { Dossier } from '../../../../state/model/dossier';
import { StatusSorter } from '@utils/sorters/status-sorter'; import { StatusSorter } from '@utils/sorters/status-sorter';
import { AppStateService } from '@state/app-state.service'; import { AppStateService } from '@state/app-state.service';
import { DossiersDialogService } from '../../services/dossiers-dialog.service'; import { DossiersDialogService } from '../../services/dossiers-dialog.service';
@ -17,8 +17,8 @@ export class DossierListingActionsComponent {
readonly circleButtonTypes = CircleButtonTypes; readonly circleButtonTypes = CircleButtonTypes;
readonly currentUser = this._userService.currentUser; readonly currentUser = this._userService.currentUser;
@Input() dossier: DossierWrapper; @Input() dossier: Dossier;
@Output() actionPerformed = new EventEmitter<DossierWrapper | undefined>(); @Output() actionPerformed = new EventEmitter<Dossier | undefined>();
constructor( constructor(
readonly permissionsService: PermissionsService, readonly permissionsService: PermissionsService,
@ -27,14 +27,14 @@ export class DossierListingActionsComponent {
private readonly _userService: UserService private readonly _userService: UserService
) {} ) {}
openEditDossierDialog($event: MouseEvent, dossierWrapper: DossierWrapper): void { openEditDossierDialog($event: MouseEvent, dossierWrapper: Dossier): void {
this._dialogService.openDialog('editDossier', $event, { this._dialogService.openDialog('editDossier', $event, {
dossierWrapper, dossierWrapper,
afterSave: () => this.actionPerformed.emit() afterSave: () => this.actionPerformed.emit()
}); });
} }
reanalyseDossier($event: MouseEvent, dossier: DossierWrapper): void { reanalyseDossier($event: MouseEvent, dossier: Dossier): void {
$event.stopPropagation(); $event.stopPropagation();
this.appStateService.reanalyzeDossier(dossier).then(() => { this.appStateService.reanalyzeDossier(dossier).then(() => {
this.appStateService.loadAllDossiers().then(() => this.actionPerformed.emit()); this.appStateService.loadAllDossiers().then(() => this.actionPerformed.emit());

View File

@ -1,7 +1,7 @@
import { Component, Input } from '@angular/core'; import { Component, Input } from '@angular/core';
import { AppStateService } from '@state/app-state.service'; import { AppStateService } from '@state/app-state.service';
import { FileStatusWrapper } from '@models/file/file-status.wrapper'; import { FileStatusWrapper } from '@models/file/file-status.wrapper';
import { DossierWrapper } from '@state/model/dossier.wrapper'; import { Dossier } from '../../../../state/model/dossier';
@Component({ @Component({
selector: 'redaction-needs-work-badge', selector: 'redaction-needs-work-badge',
@ -9,7 +9,7 @@ import { DossierWrapper } from '@state/model/dossier.wrapper';
styleUrls: ['./needs-work-badge.component.scss'] styleUrls: ['./needs-work-badge.component.scss']
}) })
export class NeedsWorkBadgeComponent { export class NeedsWorkBadgeComponent {
@Input() needsWorkInput: FileStatusWrapper | DossierWrapper; @Input() needsWorkInput: FileStatusWrapper | Dossier;
constructor(private readonly _appStateService: AppStateService) {} constructor(private readonly _appStateService: AppStateService) {}
@ -50,7 +50,7 @@ export class NeedsWorkBadgeComponent {
} }
reanalysisRequired() { reanalysisRequired() {
if (this.needsWorkInput instanceof DossierWrapper) { if (this.needsWorkInput instanceof Dossier) {
return this.needsWorkInput.reanalysisRequired; return this.needsWorkInput.reanalysisRequired;
} else { } else {
return this.needsWorkInput.analysisRequired; return this.needsWorkInput.analysisRequired;

View File

@ -1,10 +1,10 @@
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
import { Dossier } from '@redaction/red-ui-http'; import { IDossier } from '@redaction/red-ui-http';
import { AppStateService } from '@state/app-state.service'; import { AppStateService } from '@state/app-state.service';
import { UserService } from '@services/user.service'; import { UserService } from '@services/user.service';
import { Toaster } from '@iqser/common-ui'; import { Toaster } from '@iqser/common-ui';
import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { DossierWrapper } from '@state/model/dossier.wrapper'; import { Dossier } from '../../../../state/model/dossier';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
@Component({ @Component({
@ -16,9 +16,9 @@ export class TeamMembersManagerComponent implements OnInit {
teamForm: FormGroup; teamForm: FormGroup;
searchQuery = ''; searchQuery = '';
@Input() dossierWrapper: DossierWrapper; @Input() dossierWrapper: Dossier;
@Output() readonly save = new EventEmitter<Dossier>(); @Output() readonly save = new EventEmitter<IDossier>();
readonly ownersSelectOptions = this.userService.managerUsers.map(m => m.id); readonly ownersSelectOptions = this.userService.managerUsers.map(m => m.id);
selectedReviewersList: string[] = []; selectedReviewersList: string[] = [];
membersSelectOptions: string[] = []; membersSelectOptions: string[] = [];
@ -125,10 +125,10 @@ export class TeamMembersManagerComponent implements OnInit {
return; return;
} }
const initialMembers = this.dossierWrapper.memberIds.sort(); const initialMembers = [...this.dossierWrapper.memberIds].sort();
const currentMembers = this.selectedMembersList.sort(); const currentMembers = this.selectedMembersList.sort();
const initialApprovers = this.dossierWrapper.approverIds.sort(); const initialApprovers = [...this.dossierWrapper.approverIds].sort();
const currentApprovers = this.selectedApproversList.sort(); const currentApprovers = this.selectedApproversList.sort();
this.changed = this._compareLists(initialMembers, currentMembers) || this._compareLists(initialApprovers, currentApprovers); this.changed = this._compareLists(initialMembers, currentMembers) || this._compareLists(initialApprovers, currentApprovers);

View File

@ -1,5 +1,5 @@
import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core'; import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core';
import { CircleButtonTypes } from '@iqser/common-ui'; import { CircleButtonTypes, List } from '@iqser/common-ui';
import { UserService } from '@services/user.service'; import { UserService } from '@services/user.service';
@Component({ @Component({
@ -11,7 +11,7 @@ export class TeamMembersComponent {
readonly circleButtonTypes = CircleButtonTypes; readonly circleButtonTypes = CircleButtonTypes;
readonly currentUser = this._userService.currentUser; readonly currentUser = this._userService.currentUser;
@Input() memberIds: string[]; @Input() memberIds: List;
@Input() perLine: number; @Input() perLine: number;
@Input() canAdd = true; @Input() canAdd = true;
@Input() largeSpacing = false; @Input() largeSpacing = false;
@ -30,7 +30,7 @@ export class TeamMembersComponent {
return this.perLine - (this.canAdd ? 1 : 0); return this.perLine - (this.canAdd ? 1 : 0);
} }
get displayedMembers(): string[] { get displayedMembers(): List {
return this.expandedTeam || !this.overflowCount ? this.memberIds : this.memberIds.slice(0, this.maxTeamMembersBeforeExpand - 1); return this.expandedTeam || !this.overflowCount ? this.memberIds : this.memberIds.slice(0, this.maxTeamMembersBeforeExpand - 1);
} }

View File

@ -1,6 +1,6 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { MatDialogRef } from '@angular/material/dialog'; import { MatDialogRef } from '@angular/material/dialog';
import { Dossier, DossierTemplateModel, ReportTemplate, ReportTemplateControllerService } from '@redaction/red-ui-http'; import { DossierTemplateModel, DownloadFileType, IDossier, ReportTemplate, ReportTemplateControllerService } from '@redaction/red-ui-http';
import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { AppStateService } from '@state/app-state.service'; import { AppStateService } from '@state/app-state.service';
import * as moment from 'moment'; import * as moment from 'moment';
@ -16,8 +16,8 @@ export class AddDossierDialogComponent {
dossierForm: FormGroup; dossierForm: FormGroup;
hasDueDate = false; hasDueDate = false;
downloadTypesEnum: Dossier.DownloadFileTypesEnum[] = ['ORIGINAL', 'PREVIEW', 'REDACTED']; downloadTypesEnum: DownloadFileType[] = ['ORIGINAL', 'PREVIEW', 'REDACTED'];
downloadTypes: { key: Dossier.DownloadFileTypesEnum; label: string }[] = this.downloadTypesEnum.map(type => ({ downloadTypes: { key: DownloadFileType; label: string }[] = this.downloadTypesEnum.map(type => ({
key: type, key: type,
label: downloadTypesTranslations[type] label: downloadTypesTranslations[type]
})); }));
@ -68,21 +68,14 @@ export class AddDossierDialogComponent {
} }
async saveDossier() { async saveDossier() {
const dossier: Dossier = this._formToObject(); const savedDossier = await this._appStateService.createOrUpdateDossier(this._formToObject());
const foundDossier = this._appStateService.allDossiers.find(p => p.dossierId === dossier.dossierId);
if (foundDossier) {
dossier.memberIds = foundDossier.memberIds;
}
const savedDossier = await this._appStateService.createOrUpdateDossier(dossier);
if (savedDossier) { if (savedDossier) {
this.dialogRef.close({ dossier: savedDossier }); this.dialogRef.close({ dossier: savedDossier });
} }
} }
async saveDossierAndAddMembers() { async saveDossierAndAddMembers() {
const dossier: Dossier = this._formToObject(); const dossier: IDossier = this._formToObject();
const savedDossier = await this._appStateService.createOrUpdateDossier(dossier); const savedDossier = await this._appStateService.createOrUpdateDossier(dossier);
if (savedDossier) { if (savedDossier) {
this.dialogRef.close({ addMembers: true, dossier: savedDossier }); this.dialogRef.close({ addMembers: true, dossier: savedDossier });
@ -124,7 +117,7 @@ export class AddDossierDialogComponent {
}); });
} }
private _formToObject(): Dossier { private _formToObject(): IDossier {
return { return {
dossierName: this.dossierForm.get('dossierName').value, dossierName: this.dossierForm.get('dossierName').value,
description: this.dossierForm.get('description').value, description: this.dossierForm.get('description').value,

View File

@ -6,12 +6,12 @@ import { UserService } from '@services/user.service';
import { Toaster } from '@iqser/common-ui'; import { Toaster } from '@iqser/common-ui';
import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { FileStatusWrapper } from '@models/file/file-status.wrapper'; import { FileStatusWrapper } from '@models/file/file-status.wrapper';
import { DossierWrapper } from '@state/model/dossier.wrapper'; import { Dossier } from '../../../../state/model/dossier';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
class DialogData { class DialogData {
mode: 'approver' | 'reviewer'; mode: 'approver' | 'reviewer';
dossier?: DossierWrapper; dossier?: Dossier;
files?: FileStatusWrapper[]; files?: FileStatusWrapper[];
ignoreChanged?: boolean; ignoreChanged?: boolean;
} }

View File

@ -3,7 +3,7 @@ import { FormBuilder, FormGroup } from '@angular/forms';
import { FileAttributeConfig, FileAttributesControllerService, FileStatus } from '@redaction/red-ui-http'; import { FileAttributeConfig, FileAttributesControllerService, FileStatus } from '@redaction/red-ui-http';
import { AppStateService } from '@state/app-state.service'; import { AppStateService } from '@state/app-state.service';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { DossierWrapper } from '@state/model/dossier.wrapper'; import { Dossier } from '../../../../state/model/dossier';
@Component({ @Component({
templateUrl: './document-info-dialog.component.html', templateUrl: './document-info-dialog.component.html',
@ -14,7 +14,7 @@ export class DocumentInfoDialogComponent implements OnInit {
file: FileStatus; file: FileStatus;
attributes: FileAttributeConfig[]; attributes: FileAttributeConfig[];
private _dossier: DossierWrapper; private _dossier: Dossier;
constructor( constructor(
private readonly _appStateService: AppStateService, private readonly _appStateService: AppStateService,

View File

@ -1,6 +1,6 @@
import { Component, ElementRef, EventEmitter, Input, OnInit, Output, QueryList, ViewChildren } from '@angular/core'; import { Component, ElementRef, EventEmitter, Input, OnInit, Output, QueryList, ViewChildren } from '@angular/core';
import { EditDossierSectionInterface } from '../edit-dossier-section.interface'; import { EditDossierSectionInterface } from '../edit-dossier-section.interface';
import { DossierWrapper } from '@state/model/dossier.wrapper'; import { Dossier } from '../../../../../state/model/dossier';
import { AppStateService } from '@state/app-state.service'; import { AppStateService } from '@state/app-state.service';
import { PermissionsService } from '@services/permissions.service'; import { PermissionsService } from '@services/permissions.service';
import { CircleButtonTypes, IconButtonTypes, LoadingService } from '@iqser/common-ui'; import { CircleButtonTypes, IconButtonTypes, LoadingService } from '@iqser/common-ui';
@ -18,7 +18,7 @@ export class EditDossierAttributesComponent implements EditDossierSectionInterfa
readonly iconButtonTypes = IconButtonTypes; readonly iconButtonTypes = IconButtonTypes;
readonly circleButtonTypes = CircleButtonTypes; readonly circleButtonTypes = CircleButtonTypes;
@Input() dossierWrapper: DossierWrapper; @Input() dossierWrapper: Dossier;
@Output() updateDossier = new EventEmitter<any>(); @Output() updateDossier = new EventEmitter<any>();
customAttributes: DossierAttributeWithValue[] = []; customAttributes: DossierAttributeWithValue[] = [];
imageAttributes: DossierAttributeWithValue[] = []; imageAttributes: DossierAttributeWithValue[] = [];

View File

@ -1,10 +1,10 @@
import { Component, EventEmitter, forwardRef, Injector, Input, OnInit, Output, TemplateRef, ViewChild } from '@angular/core'; import { Component, EventEmitter, forwardRef, Injector, Input, OnInit, Output, TemplateRef, ViewChild } from '@angular/core';
import { EditDossierSectionInterface } from '../edit-dossier-section.interface'; import { EditDossierSectionInterface } from '../edit-dossier-section.interface';
import { DossierWrapper } from '@state/model/dossier.wrapper'; import { Dossier } from '../../../../../state/model/dossier';
import { import {
CircleButtonTypes, CircleButtonTypes,
DefaultListingServices, DefaultListingServices,
Listable, IListable,
ListingComponent, ListingComponent,
LoadingService, LoadingService,
SortingOrders, SortingOrders,
@ -21,7 +21,7 @@ import { ConfirmationDialogInput, TitleColors } from '@shared/dialogs/confirmati
import { DossiersDialogService } from '../../../services/dossiers-dialog.service'; import { DossiersDialogService } from '../../../services/dossiers-dialog.service';
import { AppStateService } from '@state/app-state.service'; import { AppStateService } from '@state/app-state.service';
interface FileListItem extends FileStatus, Listable { interface FileListItem extends FileStatus, IListable {
readonly canRestore: boolean; readonly canRestore: boolean;
readonly restoreDate: string; readonly restoreDate: string;
} }
@ -36,8 +36,8 @@ interface FileListItem extends FileStatus, Listable {
] ]
}) })
export class EditDossierDeletedDocumentsComponent extends ListingComponent<FileListItem> implements EditDossierSectionInterface, OnInit { export class EditDossierDeletedDocumentsComponent extends ListingComponent<FileListItem> implements EditDossierSectionInterface, OnInit {
@Input() dossierWrapper: DossierWrapper; @Input() dossier: Dossier;
@Output() updateDossier = new EventEmitter<any>(); @Output() readonly updateDossier = new EventEmitter();
readonly changed = false; readonly changed = false;
readonly canRestoreSelected$ = this._canRestoreSelected$; readonly canRestoreSelected$ = this._canRestoreSelected$;
disabled: boolean; disabled: boolean;
@ -91,7 +91,7 @@ export class EditDossierDeletedDocumentsComponent extends ListingComponent<FileL
async ngOnInit() { async ngOnInit() {
this._configureTableColumns(); this._configureTableColumns();
this._loadingService.start(); this._loadingService.start();
const files = await this._statusController.getDeletedFileStatus(this.dossierWrapper.dossierId).toPromise(); const files = await this._statusController.getDeletedFileStatus(this.dossier.id).toPromise();
this.entitiesService.setEntities(this._toListItems(files)); this.entitiesService.setEntities(this._toListItems(files));
this.sortingService.setSortingOption({ this.sortingService.setSortingOption({
column: 'softDeleted', column: 'softDeleted',
@ -138,7 +138,7 @@ export class EditDossierDeletedDocumentsComponent extends ListingComponent<FileL
private async _restore(files: FileListItem[]): Promise<void> { private async _restore(files: FileListItem[]): Promise<void> {
const fileIds = files.map(f => f.fileId); const fileIds = files.map(f => f.fileId);
await this._fileManagementController.restoreFiles(fileIds, this.dossierWrapper.dossierId).toPromise(); await this._fileManagementController.restoreFiles(fileIds, this.dossier.id).toPromise();
this._removeFromList(fileIds); this._removeFromList(fileIds);
await this._appStateService.reloadActiveDossierFiles(); await this._appStateService.reloadActiveDossierFiles();
this.updateDossier.emit(); this.updateDossier.emit();
@ -146,7 +146,7 @@ export class EditDossierDeletedDocumentsComponent extends ListingComponent<FileL
private async _hardDelete(files: FileListItem[]) { private async _hardDelete(files: FileListItem[]) {
const fileIds = files.map(f => f.fileId); const fileIds = files.map(f => f.fileId);
await this._fileManagementController.hardDeleteFile(this.dossierWrapper.dossierId, fileIds).toPromise(); await this._fileManagementController.hardDeleteFile(this.dossier.id, fileIds).toPromise();
this._removeFromList(fileIds); this._removeFromList(fileIds);
this.updateDossier.emit(); this.updateDossier.emit();
} }

View File

@ -1,10 +1,10 @@
<div class="header-wrapper"> <div class="header-wrapper">
<div class="heading"> <div class="heading">
<div>{{ dossierWrapper.type?.label }}</div> <div>{{ dossier.type?.label }}</div>
<div class="small-label stats-subtitle"> <div class="small-label stats-subtitle">
<div> <div>
<mat-icon svgIcon="red:entries"></mat-icon> <mat-icon svgIcon="red:entries"></mat-icon>
{{ 'edit-dossier-dialog.dictionary.entries' | translate: { length: (dossierWrapper.type?.entries || []).length } }} {{ 'edit-dossier-dialog.dictionary.entries' | translate: { length: (dossier.type?.entries || []).length } }}
</div> </div>
</div> </div>
</div> </div>
@ -19,13 +19,13 @@
[placeholder]="'edit-dossier-dialog.dictionary.display-name.placeholder' | translate" [placeholder]="'edit-dossier-dialog.dictionary.display-name.placeholder' | translate"
[saveTooltip]="'edit-dossier-dialog.dictionary.display-name.save' | translate" [saveTooltip]="'edit-dossier-dialog.dictionary.display-name.save' | translate"
[showPreview]="false" [showPreview]="false"
[value]="dossierWrapper.type?.label" [value]="dossier.type?.label"
></iqser-editable-input> ></iqser-editable-input>
</div> </div>
</div> </div>
<redaction-dictionary-manager <redaction-dictionary-manager
[canEdit]="canEdit" [canEdit]="canEdit"
[initialEntries]="dossierWrapper.type?.entries || []" [initialEntries]="dossier.type?.entries || []"
[withFloatingActions]="false" [withFloatingActions]="false"
></redaction-dictionary-manager> ></redaction-dictionary-manager>

View File

@ -1,6 +1,6 @@
import { Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core'; import { Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core';
import { AppStateService } from '@state/app-state.service'; import { AppStateService } from '@state/app-state.service';
import { DossierWrapper } from '@state/model/dossier.wrapper'; import { Dossier } from '@state/model/dossier';
import { EditDossierSectionInterface } from '../edit-dossier-section.interface'; import { EditDossierSectionInterface } from '../edit-dossier-section.interface';
import { PermissionsService } from '@services/permissions.service'; import { PermissionsService } from '@services/permissions.service';
import { DictionaryManagerComponent } from '@shared/components/dictionary-manager/dictionary-manager.component'; import { DictionaryManagerComponent } from '@shared/components/dictionary-manager/dictionary-manager.component';
@ -15,8 +15,8 @@ import { Dictionary, DictionaryControllerService } from '@redaction/red-ui-http'
styleUrls: ['./edit-dossier-dictionary.component.scss'] styleUrls: ['./edit-dossier-dictionary.component.scss']
}) })
export class EditDossierDictionaryComponent implements EditDossierSectionInterface, OnInit { export class EditDossierDictionaryComponent implements EditDossierSectionInterface, OnInit {
@Input() dossierWrapper: DossierWrapper; @Input() dossier: Dossier;
@Output() updateDossier: EventEmitter<any> = new EventEmitter<any>(); @Output() readonly updateDossier = new EventEmitter();
canEdit = false; canEdit = false;
readonly circleButtonTypes = CircleButtonTypes; readonly circleButtonTypes = CircleButtonTypes;
@ -30,7 +30,7 @@ export class EditDossierDictionaryComponent implements EditDossierSectionInterfa
private readonly _loadingService: LoadingService, private readonly _loadingService: LoadingService,
private readonly _formBuilder: FormBuilder private readonly _formBuilder: FormBuilder
) { ) {
this.canEdit = this._permissionsService.isDossierMember(this.dossierWrapper); this.canEdit = this._permissionsService.isDossierMember(this.dossier);
} }
get changed() { get changed() {
@ -43,16 +43,16 @@ export class EditDossierDictionaryComponent implements EditDossierSectionInterfa
async ngOnInit() { async ngOnInit() {
this._loadingService.start(); this._loadingService.start();
await this._appStateService.updateDossierDictionary(this.dossierWrapper.dossierTemplateId, this.dossierWrapper.dossierId); await this._appStateService.updateDossierDictionary(this.dossier.dossierTemplateId, this.dossier.id);
this._loadingService.stop(); this._loadingService.stop();
} }
async updateDisplayName(label: string) { async updateDisplayName(label: string) {
const typeValue: Dictionary = { ...this.dossierWrapper.type, label }; const typeValue: Dictionary = { ...this.dossier.type, label };
await this._dictionaryControllerService await this._dictionaryControllerService
.updateType(typeValue, this.dossierWrapper.dossierTemplateId, 'dossier_redaction', this.dossierWrapper.dossierId) .updateType(typeValue, this.dossier.dossierTemplateId, 'dossier_redaction', this.dossier.id)
.toPromise(); .toPromise();
await this._appStateService.updateDossierDictionary(this.dossierWrapper.dossierTemplateId, this.dossierWrapper.dossierId); await this._appStateService.updateDossierDictionary(this.dossier.dossierTemplateId, this.dossier.id);
this.updateDossier.emit(); this.updateDossier.emit();
} }
@ -61,13 +61,13 @@ export class EditDossierDictionaryComponent implements EditDossierSectionInterfa
.saveEntries( .saveEntries(
this._dictionaryManager.currentEntries, this._dictionaryManager.currentEntries,
this._dictionaryManager.initialEntries, this._dictionaryManager.initialEntries,
this.dossierWrapper.dossierTemplateId, this.dossier.dossierTemplateId,
'dossier_redaction', 'dossier_redaction',
this.dossierWrapper.dossierId, this.dossier.id,
false false
) )
.toPromise(); .toPromise();
await this._appStateService.updateDossierDictionary(this.dossierWrapper.dossierTemplateId, this.dossierWrapper.dossierId); await this._appStateService.updateDossierDictionary(this.dossier.dossierTemplateId, this.dossier.id);
this.updateDossier.emit(); this.updateDossier.emit();
} }

View File

@ -1,8 +1,8 @@
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
import { Dossier, DossierTemplateModel, ReportTemplate, ReportTemplateControllerService } from '@redaction/red-ui-http'; import { DossierTemplateModel, DownloadFileType, ReportTemplate, ReportTemplateControllerService } from '@redaction/red-ui-http';
import { FormBuilder, FormGroup } from '@angular/forms'; import { FormBuilder, FormGroup } from '@angular/forms';
import { AppStateService } from '@state/app-state.service'; import { AppStateService } from '@state/app-state.service';
import { DossierWrapper } from '@state/model/dossier.wrapper'; import { Dossier } from '../../../../../state/model/dossier';
import { EditDossierSectionInterface } from '../edit-dossier-section.interface'; import { EditDossierSectionInterface } from '../edit-dossier-section.interface';
import { downloadTypesTranslations } from '../../../../../translations/download-types-translations'; import { downloadTypesTranslations } from '../../../../../translations/download-types-translations';
@ -13,15 +13,15 @@ import { downloadTypesTranslations } from '../../../../../translations/download-
}) })
export class EditDossierDownloadPackageComponent implements OnInit, EditDossierSectionInterface { export class EditDossierDownloadPackageComponent implements OnInit, EditDossierSectionInterface {
dossierForm: FormGroup; dossierForm: FormGroup;
downloadTypesEnum: Dossier.DownloadFileTypesEnum[] = ['ORIGINAL', 'PREVIEW', 'REDACTED']; downloadTypesEnum: DownloadFileType[] = ['ORIGINAL', 'PREVIEW', 'REDACTED'];
downloadTypes: { key: Dossier.DownloadFileTypesEnum; label: string }[] = this.downloadTypesEnum.map(type => ({ downloadTypes: { key: DownloadFileType; label: string }[] = this.downloadTypesEnum.map(type => ({
key: type, key: type,
label: downloadTypesTranslations[type] label: downloadTypesTranslations[type]
})); }));
dossierTemplates: DossierTemplateModel[]; dossierTemplates: DossierTemplateModel[];
availableReportTypes: ReportTemplate[] = []; availableReportTypes: ReportTemplate[] = [];
@Input() dossierWrapper: DossierWrapper; @Input() dossierWrapper: Dossier;
@Output() updateDossier = new EventEmitter<any>(); @Output() updateDossier = new EventEmitter<any>();
constructor( constructor(

View File

@ -1,6 +1,6 @@
<section class="dialog"> <section class="dialog">
<div class="dialog-header heading-l"> <div class="dialog-header heading-l">
{{ 'edit-dossier-dialog.header' | translate: { dossierName: dossierWrapper.dossierName } }} {{ 'edit-dossier-dialog.header' | translate: { dossierName: dossier.dossierName } }}
</div> </div>
<div class="dialog-content"> <div class="dialog-content">
@ -22,37 +22,37 @@
<redaction-edit-dossier-general-info <redaction-edit-dossier-general-info
(updateDossier)="updatedDossier()" (updateDossier)="updatedDossier()"
*ngIf="activeNav === 'dossierInfo'" *ngIf="activeNav === 'dossierInfo'"
[dossierWrapper]="dossierWrapper" [dossierWrapper]="dossier"
></redaction-edit-dossier-general-info> ></redaction-edit-dossier-general-info>
<redaction-edit-dossier-download-package <redaction-edit-dossier-download-package
(updateDossier)="updatedDossier()" (updateDossier)="updatedDossier()"
*ngIf="activeNav === 'downloadPackage'" *ngIf="activeNav === 'downloadPackage'"
[dossierWrapper]="dossierWrapper" [dossierWrapper]="dossier"
></redaction-edit-dossier-download-package> ></redaction-edit-dossier-download-package>
<redaction-edit-dossier-dictionary <redaction-edit-dossier-dictionary
(updateDossier)="updatedDossier()" (updateDossier)="updatedDossier()"
*ngIf="activeNav === 'dossierDictionary'" *ngIf="activeNav === 'dossierDictionary'"
[dossierWrapper]="dossierWrapper" [dossier]="dossier"
></redaction-edit-dossier-dictionary> ></redaction-edit-dossier-dictionary>
<redaction-edit-dossier-team-members <redaction-edit-dossier-team-members
(updateDossier)="updatedDossier()" (updateDossier)="updatedDossier()"
*ngIf="activeNav === 'members'" *ngIf="activeNav === 'members'"
[dossierWrapper]="dossierWrapper" [dossierWrapper]="dossier"
></redaction-edit-dossier-team-members> ></redaction-edit-dossier-team-members>
<redaction-edit-dossier-attributes <redaction-edit-dossier-attributes
(updateDossier)="updatedDossier()" (updateDossier)="updatedDossier()"
*ngIf="activeNav === 'dossierAttributes'" *ngIf="activeNav === 'dossierAttributes'"
[dossierWrapper]="dossierWrapper" [dossierWrapper]="dossier"
></redaction-edit-dossier-attributes> ></redaction-edit-dossier-attributes>
<redaction-edit-dossier-deleted-documents <redaction-edit-dossier-deleted-documents
(updateDossier)="updatedDossier()" (updateDossier)="updatedDossier()"
*ngIf="activeNav === 'deletedDocuments'" *ngIf="activeNav === 'deletedDocuments'"
[dossierWrapper]="dossierWrapper" [dossier]="dossier"
></redaction-edit-dossier-deleted-documents> ></redaction-edit-dossier-deleted-documents>
</div> </div>

View File

@ -1,6 +1,6 @@
import { ChangeDetectorRef, Component, Inject, ViewChild } from '@angular/core'; import { ChangeDetectorRef, Component, Inject, ViewChild } from '@angular/core';
import { MAT_DIALOG_DATA } from '@angular/material/dialog'; import { MAT_DIALOG_DATA } from '@angular/material/dialog';
import { DossierWrapper } from '@state/model/dossier.wrapper'; import { Dossier } from '@state/model/dossier';
import { EditDossierGeneralInfoComponent } from './general-info/edit-dossier-general-info.component'; import { EditDossierGeneralInfoComponent } from './general-info/edit-dossier-general-info.component';
import { EditDossierDownloadPackageComponent } from './download-package/edit-dossier-download-package.component'; import { EditDossierDownloadPackageComponent } from './download-package/edit-dossier-download-package.component';
import { EditDossierSectionInterface } from './edit-dossier-section.interface'; import { EditDossierSectionInterface } from './edit-dossier-section.interface';
@ -22,7 +22,7 @@ type Section = 'dossierInfo' | 'downloadPackage' | 'dossierDictionary' | 'member
export class EditDossierDialogComponent { export class EditDossierDialogComponent {
readonly navItems: { key: Section; title?: string; sideNavTitle?: string }[]; readonly navItems: { key: Section; title?: string; sideNavTitle?: string }[];
activeNav: Section; activeNav: Section;
dossierWrapper: DossierWrapper; dossier: Dossier;
@ViewChild(EditDossierGeneralInfoComponent) generalInfoComponent: EditDossierGeneralInfoComponent; @ViewChild(EditDossierGeneralInfoComponent) generalInfoComponent: EditDossierGeneralInfoComponent;
@ViewChild(EditDossierDownloadPackageComponent) downloadPackageComponent: EditDossierDownloadPackageComponent; @ViewChild(EditDossierDownloadPackageComponent) downloadPackageComponent: EditDossierDownloadPackageComponent;
@ -37,7 +37,7 @@ export class EditDossierDialogComponent {
private readonly _changeRef: ChangeDetectorRef, private readonly _changeRef: ChangeDetectorRef,
@Inject(MAT_DIALOG_DATA) @Inject(MAT_DIALOG_DATA)
private readonly _data: { private readonly _data: {
dossierWrapper: DossierWrapper; dossierWrapper: Dossier;
afterSave: Function; afterSave: Function;
section?: Section; section?: Section;
} }
@ -73,7 +73,7 @@ export class EditDossierDialogComponent {
} }
]; ];
this.dossierWrapper = _data.dossierWrapper; this.dossier = _data.dossierWrapper;
this.activeNav = _data.section || 'dossierInfo'; this.activeNav = _data.section || 'dossierInfo';
} }
@ -105,8 +105,8 @@ export class EditDossierDialogComponent {
} }
updatedDossier() { updatedDossier() {
this._toaster.success(_('edit-dossier-dialog.change-successful'), { params: { dossierName: this.dossierWrapper.dossierName } }); this._toaster.success(_('edit-dossier-dialog.change-successful'), { params: { dossierName: this.dossier.dossierName } });
this.dossierWrapper = this._appStateService.getDossierById(this.dossierWrapper.dossierId); this.dossier = this._appStateService.getDossierById(this.dossier.id);
this._changeRef.detectChanges(); this._changeRef.detectChanges();
this.afterSave(); this.afterSave();
} }

View File

@ -3,7 +3,7 @@ import { DossierTemplateModel } from '@redaction/red-ui-http';
import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { AppStateService } from '../../../../../state/app-state.service'; import { AppStateService } from '../../../../../state/app-state.service';
import * as moment from 'moment'; import * as moment from 'moment';
import { DossierWrapper } from '@state/model/dossier.wrapper'; import { Dossier } from '../../../../../state/model/dossier';
import { EditDossierSectionInterface } from '../edit-dossier-section.interface'; import { EditDossierSectionInterface } from '../edit-dossier-section.interface';
import { DossiersDialogService } from '../../../services/dossiers-dialog.service'; import { DossiersDialogService } from '../../../services/dossiers-dialog.service';
import { PermissionsService } from '@services/permissions.service'; import { PermissionsService } from '@services/permissions.service';
@ -27,7 +27,7 @@ export class EditDossierGeneralInfoComponent implements OnInit, EditDossierSecti
hasDueDate: boolean; hasDueDate: boolean;
dossierTemplates: DossierTemplateModel[]; dossierTemplates: DossierTemplateModel[];
@Input() dossierWrapper: DossierWrapper; @Input() dossierWrapper: Dossier;
@Output() updateDossier = new EventEmitter<any>(); @Output() updateDossier = new EventEmitter<any>();
constructor( constructor(

View File

@ -1,6 +1,6 @@
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core'; import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
import { AppStateService } from '@state/app-state.service'; import { AppStateService } from '@state/app-state.service';
import { DossierWrapper } from '@state/model/dossier.wrapper'; import { Dossier } from '../../../../../state/model/dossier';
import { EditDossierSectionInterface } from '../edit-dossier-section.interface'; import { EditDossierSectionInterface } from '../edit-dossier-section.interface';
import { TeamMembersManagerComponent } from '../../../components/team-members-manager/team-members-manager.component'; import { TeamMembersManagerComponent } from '../../../components/team-members-manager/team-members-manager.component';
import { UserService } from '@services/user.service'; import { UserService } from '@services/user.service';
@ -13,7 +13,7 @@ import { UserService } from '@services/user.service';
export class EditDossierTeamMembersComponent implements EditDossierSectionInterface { export class EditDossierTeamMembersComponent implements EditDossierSectionInterface {
readonly currentUser = this._userService.currentUser; readonly currentUser = this._userService.currentUser;
@Input() dossierWrapper: DossierWrapper; @Input() dossierWrapper: Dossier;
@Output() updateDossier = new EventEmitter<any>(); @Output() updateDossier = new EventEmitter<any>();
@ViewChild(TeamMembersManagerComponent) managerComponent: TeamMembersManagerComponent; @ViewChild(TeamMembersManagerComponent) managerComponent: TeamMembersManagerComponent;

View File

@ -1,11 +1,11 @@
import { AfterViewInit, Component, forwardRef, Injector, OnDestroy, OnInit, TemplateRef, ViewChild } from '@angular/core'; import { AfterViewInit, Component, forwardRef, Injector, OnDestroy, OnInit, TemplateRef, ViewChild } from '@angular/core';
import { Dossier } from '@redaction/red-ui-http'; import { DossierStatuses } from '@redaction/red-ui-http';
import { AppStateService } from '@state/app-state.service'; import { AppStateService } from '@state/app-state.service';
import { UserService } from '@services/user.service'; import { UserService } from '@services/user.service';
import { DoughnutChartConfig } from '@shared/components/simple-doughnut-chart/simple-doughnut-chart.component'; import { DoughnutChartConfig } from '@shared/components/simple-doughnut-chart/simple-doughnut-chart.component';
import { groupBy } from '@utils/functions'; import { groupBy } from '@utils/functions';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { DossierWrapper } from '@state/model/dossier.wrapper'; import { Dossier } from '../../../../state/model/dossier';
import { timer } from 'rxjs'; import { timer } from 'rxjs';
import { tap } from 'rxjs/operators'; import { tap } from 'rxjs/operators';
import { TranslateChartService } from '@services/translate-chart.service'; import { TranslateChartService } from '@services/translate-chart.service';
@ -29,7 +29,7 @@ import { PermissionsService } from '@services/permissions.service';
providers: [...DefaultListingServices, { provide: ListingComponent, useExisting: forwardRef(() => DossierListingScreenComponent) }] providers: [...DefaultListingServices, { provide: ListingComponent, useExisting: forwardRef(() => DossierListingScreenComponent) }]
}) })
export class DossierListingScreenComponent export class DossierListingScreenComponent
extends ListingComponent<DossierWrapper> extends ListingComponent<Dossier>
implements OnInit, AfterViewInit, OnDestroy, OnAttach, OnDetach implements OnInit, AfterViewInit, OnDestroy, OnAttach, OnDetach
{ {
readonly currentUser = this._userService.currentUser; readonly currentUser = this._userService.currentUser;
@ -43,7 +43,7 @@ export class DossierListingScreenComponent
type: 'primary' type: 'primary'
} }
]; ];
tableColumnConfigs: TableColumnConfig<DossierWrapper>[]; tableColumnConfigs: TableColumnConfig<Dossier>[];
dossiersChartData: DoughnutChartConfig[] = []; dossiersChartData: DoughnutChartConfig[] = [];
documentsChartData: DoughnutChartConfig[] = []; documentsChartData: DoughnutChartConfig[] = [];
@ViewChild('nameTemplate', { static: true }) nameTemplate: TemplateRef<never>; @ViewChild('nameTemplate', { static: true }) nameTemplate: TemplateRef<never>;
@ -57,7 +57,7 @@ export class DossierListingScreenComponent
static: true static: true
}) })
private readonly _needsWorkFilterTemplate: TemplateRef<unknown>; private readonly _needsWorkFilterTemplate: TemplateRef<unknown>;
@ViewChild(TableComponent) private readonly _tableComponent: TableComponent<DossierWrapper>; @ViewChild(TableComponent) private readonly _tableComponent: TableComponent<Dossier>;
constructor( constructor(
private readonly _router: Router, private readonly _router: Router,
@ -76,14 +76,14 @@ export class DossierListingScreenComponent
} }
private get _activeDossiersCount(): number { private get _activeDossiersCount(): number {
return this.entitiesService.all.filter(p => p.status === Dossier.StatusEnum.ACTIVE).length; return this.entitiesService.all.filter(p => p.status === DossierStatuses.ACTIVE).length;
} }
private get _inactiveDossiersCount(): number { private get _inactiveDossiersCount(): number {
return this.entitiesService.all.length - this._activeDossiersCount; return this.entitiesService.all.length - this._activeDossiersCount;
} }
routerLinkFn = (dossier: DossierWrapper) => ['/main/dossiers/' + dossier.dossierId]; routerLinkFn = (dossier: Dossier) => ['/main/dossiers/' + dossier.id];
ngOnInit(): void { ngOnInit(): void {
this._configureTableColumns(); this._configureTableColumns();
@ -120,7 +120,7 @@ export class DossierListingScreenComponent
openAddDossierDialog(): void { openAddDossierDialog(): void {
this._dialogService.openDialog('addDossier', null, null, async addResponse => { this._dialogService.openDialog('addDossier', null, null, async addResponse => {
await this._router.navigate([`/main/dossiers/${addResponse.dossier.dossierId}`]); await this._router.navigate([`/main/dossiers/${addResponse.dossier.id}`]);
if (addResponse.addMembers) { if (addResponse.addMembers) {
this._dialogService.openDialog('editDossier', null, { this._dialogService.openDialog('editDossier', null, {
dossierWrapper: addResponse.dossier, dossierWrapper: addResponse.dossier,
@ -273,7 +273,7 @@ export class DossierListingScreenComponent
this.filterService.addFilterGroup({ this.filterService.addFilterGroup({
slug: 'quickFilters', slug: 'quickFilters',
filters: quickFilters, filters: quickFilters,
checker: (dw: DossierWrapper) => quickFilters.reduce((acc, f) => acc || (f.checked && f.checker(dw)), false) checker: (dw: Dossier) => quickFilters.reduce((acc, f) => acc || (f.checked && f.checker(dw)), false)
}); });
const dossierFilters = this.entitiesService.all.map<NestedFilter>(dossier => ({ const dossierFilters = this.entitiesService.all.map<NestedFilter>(dossier => ({
@ -296,22 +296,22 @@ export class DossierListingScreenComponent
{ {
key: 'my-dossiers', key: 'my-dossiers',
label: myDossiersLabel, label: myDossiersLabel,
checker: (dw: DossierWrapper) => dw.ownerId === this.currentUser.id checker: (dw: Dossier) => dw.ownerId === this.currentUser.id
}, },
{ {
key: 'to-approve', key: 'to-approve',
label: this._translateService.instant('dossier-listing.quick-filters.to-approve'), label: this._translateService.instant('dossier-listing.quick-filters.to-approve'),
checker: (dw: DossierWrapper) => dw.approverIds.includes(this.currentUser.id) checker: (dw: Dossier) => dw.approverIds.includes(this.currentUser.id)
}, },
{ {
key: 'to-review', key: 'to-review',
label: this._translateService.instant('dossier-listing.quick-filters.to-review'), label: this._translateService.instant('dossier-listing.quick-filters.to-review'),
checker: (dw: DossierWrapper) => dw.memberIds.includes(this.currentUser.id) checker: (dw: Dossier) => dw.memberIds.includes(this.currentUser.id)
}, },
{ {
key: 'other', key: 'other',
label: this._translateService.instant('dossier-listing.quick-filters.other'), label: this._translateService.instant('dossier-listing.quick-filters.other'),
checker: (dw: DossierWrapper) => !dw.memberIds.includes(this.currentUser.id) checker: (dw: Dossier) => !dw.memberIds.includes(this.currentUser.id)
} }
]; ];

View File

@ -52,7 +52,7 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { annotationFilterChecker } from '@utils/filter-utils'; import { annotationFilterChecker } from '@utils/filter-utils';
import { PermissionsService } from '@services/permissions.service'; import { PermissionsService } from '@services/permissions.service';
import { RouterHistoryService } from '@services/router-history.service'; import { RouterHistoryService } from '@services/router-history.service';
import { DossierWrapper } from '@state/model/dossier.wrapper'; import { Dossier } from '@state/model/dossier';
import { Router } from '@angular/router'; import { Router } from '@angular/router';
import { FileActionService } from '../../services/file-action.service'; import { FileActionService } from '../../services/file-action.service';
import StatusEnum = FileStatus.StatusEnum; import StatusEnum = FileStatus.StatusEnum;
@ -95,7 +95,7 @@ export class DossierOverviewScreenComponent extends ListingComponent<FileStatusW
@ViewChild('needsWorkFilterTemplate', { read: TemplateRef, static: true }) @ViewChild('needsWorkFilterTemplate', { read: TemplateRef, static: true })
private readonly _needsWorkFilterTemplate: TemplateRef<unknown>; private readonly _needsWorkFilterTemplate: TemplateRef<unknown>;
@ViewChild('fileInput') private readonly _fileInput: ElementRef; @ViewChild('fileInput') private readonly _fileInput: ElementRef;
@ViewChild(TableComponent) private readonly _tableComponent: TableComponent<DossierWrapper>; @ViewChild(TableComponent) private readonly _tableComponent: TableComponent<Dossier>;
constructor( constructor(
private readonly _toaster: Toaster, private readonly _toaster: Toaster,
@ -210,7 +210,7 @@ export class DossierOverviewScreenComponent extends ListingComponent<FileStatusW
} }
routerLinkFn = (fileStatus: FileStatusWrapper) => routerLinkFn = (fileStatus: FileStatusWrapper) =>
fileStatus.canBeOpened ? [`/main/dossiers/${this.currentDossier.dossierId}/file/${fileStatus.fileId}`] : []; fileStatus.canBeOpened ? [`/main/dossiers/${this.currentDossier.id}/file/${fileStatus.fileId}`] : [];
disabledFn = (fileStatus: FileStatusWrapper) => fileStatus.excluded; disabledFn = (fileStatus: FileStatusWrapper) => fileStatus.excluded;

View File

@ -8,6 +8,7 @@ import {
CircleButtonTypes, CircleButtonTypes,
Debounce, Debounce,
FilterService, FilterService,
List,
LoadingService, LoadingService,
NestedFilter, NestedFilter,
processFilters, processFilters,
@ -113,7 +114,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni
}); });
} }
get singleUsersSelectOptions(): string[] { get singleUsersSelectOptions(): List {
return this.appStateService.activeFile?.isUnderApproval return this.appStateService.activeFile?.isUnderApproval
? this.appStateService.activeDossier.approverIds ? this.appStateService.activeDossier.approverIds
: this.appStateService.activeDossier.memberIds; : this.appStateService.activeDossier.memberIds;
@ -200,9 +201,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni
} }
get canAssignReviewer(): boolean { get canAssignReviewer(): boolean {
return ( return !this.currentReviewer && this.permissionsService.canAssignUser() && this.appStateService.activeDossier.hasReviewers;
!this.currentReviewer && this.permissionsService.canAssignUser() && this.appStateService.activeDossier.hasMoreThanOneReviewer
);
} }
updateViewMode(): void { updateViewMode(): void {

View File

@ -1,5 +1,5 @@
import { Component, forwardRef, Injector, OnDestroy, OnInit, TemplateRef, ViewChild } from '@angular/core'; import { Component, forwardRef, Injector, OnDestroy, OnInit, TemplateRef, ViewChild } from '@angular/core';
import { DefaultListingServices, keyChecker, Listable, ListingComponent, LoadingService, TableColumnConfig } from '@iqser/common-ui'; import { DefaultListingServices, IListable, keyChecker, ListingComponent, LoadingService, TableColumnConfig } from '@iqser/common-ui';
import { MatchedDocument, SearchControllerService, SearchResult } from '@redaction/red-ui-http'; import { MatchedDocument, SearchControllerService, SearchResult } from '@redaction/red-ui-http';
import { BehaviorSubject, Observable } from 'rxjs'; import { BehaviorSubject, Observable } from 'rxjs';
import { debounceTime, map, skip, switchMap, tap } from 'rxjs/operators'; import { debounceTime, map, skip, switchMap, tap } from 'rxjs/operators';
@ -9,11 +9,11 @@ import { FileStatusWrapper } from '@models/file/file-status.wrapper';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { fileStatusTranslations } from '../../translations/file-status-translations'; import { fileStatusTranslations } from '../../translations/file-status-translations';
import { SearchPositions } from '@shared/components/page-header/models/search-positions.type'; import { SearchPositions } from '@shared/components/page-header/models/search-positions.type';
import { DossierWrapper } from '@state/model/dossier.wrapper'; import { Dossier } from '../../../../state/model/dossier';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { RouterHistoryService } from '@services/router-history.service'; import { RouterHistoryService } from '@services/router-history.service';
interface ListItem extends Listable { interface ListItem extends IListable {
readonly dossierId: string; readonly dossierId: string;
readonly filename: string; readonly filename: string;
readonly unmatched: readonly string[] | null; readonly unmatched: readonly string[] | null;
@ -73,10 +73,10 @@ export class SearchScreenComponent extends ListingComponent<ListItem> implements
filterceptionPlaceholder: this._translateService.instant('search-screen.filters.search-placeholder'), filterceptionPlaceholder: this._translateService.instant('search-screen.filters.search-placeholder'),
icon: 'red:folder', icon: 'red:folder',
filters: this._appStateService.allDossiers.map(dossier => ({ filters: this._appStateService.allDossiers.map(dossier => ({
key: dossier.dossierId, key: dossier.id,
label: dossier.dossierName label: dossier.dossierName
})), })),
checker: keyChecker('dossierId') checker: keyChecker('id')
}); });
this.addSubscription = _activatedRoute.queryParamMap this.addSubscription = _activatedRoute.queryParamMap
@ -141,7 +141,7 @@ export class SearchScreenComponent extends ListingComponent<ListItem> implements
return this._appStateService.getFileById(dossierId, fileId); return this._appStateService.getFileById(dossierId, fileId);
} }
private _getDossierWrapper(dossierId: string): DossierWrapper { private _getDossierWrapper(dossierId: string): Dossier {
return this._appStateService.getDossierById(dossierId); return this._appStateService.getDossierById(dossierId);
} }

View File

@ -1,5 +1,5 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { Dossier, DossierControllerService } from '@redaction/red-ui-http'; import { IDossier, DossierControllerService } from '@redaction/red-ui-http';
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'
@ -7,7 +7,7 @@ import { Dossier, DossierControllerService } from '@redaction/red-ui-http';
export class DossiersService { export class DossiersService {
constructor(private readonly _dossierControllerService: DossierControllerService) {} constructor(private readonly _dossierControllerService: DossierControllerService) {}
createOrUpdate(dossier: Dossier): Promise<Dossier> { createOrUpdate(dossier: IDossier): Promise<IDossier> {
return this._dossierControllerService.createOrUpdateDossier(dossier).toPromise(); return this._dossierControllerService.createOrUpdateDossier(dossier).toPromise();
} }
@ -15,11 +15,11 @@ export class DossiersService {
return this._dossierControllerService.deleteDossier(dossierId).toPromise(); return this._dossierControllerService.deleteDossier(dossierId).toPromise();
} }
getAll(): Promise<Dossier[]> { getAll(): Promise<IDossier[]> {
return this._dossierControllerService.getDossiers().toPromise(); return this._dossierControllerService.getDossiers().toPromise();
} }
getDeleted(): Promise<Dossier[]> { getDeleted(): Promise<IDossier[]> {
return this._dossierControllerService.getDeletedDossiers().toPromise(); return this._dossierControllerService.getDeletedDossiers().toPromise();
} }

View File

@ -6,7 +6,7 @@ import { FileStatusWrapper } from '@models/file/file-status.wrapper';
import { PermissionsService } from '@services/permissions.service'; import { PermissionsService } from '@services/permissions.service';
import { isArray } from 'rxjs/internal-compatibility'; import { isArray } from 'rxjs/internal-compatibility';
import { DossiersDialogService } from './dossiers-dialog.service'; import { DossiersDialogService } from './dossiers-dialog.service';
import { ConfirmationDialogInput } from '../../shared/dialogs/confirmation-dialog/confirmation-dialog.component'; import { ConfirmationDialogInput } from '@shared/dialogs/confirmation-dialog/confirmation-dialog.component';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
@ -25,11 +25,7 @@ export class FileActionService {
if (!fileStatusWrapper) { if (!fileStatusWrapper) {
fileStatusWrapper = this._appStateService.activeFile; fileStatusWrapper = this._appStateService.activeFile;
} }
return this._reanalysisControllerService.reanalyzeFile( return this._reanalysisControllerService.reanalyzeFile(this._appStateService.activeDossier.id, fileStatusWrapper.fileId, true);
this._appStateService.activeDossier.dossierId,
fileStatusWrapper.fileId,
true
);
} }
toggleAnalysis(fileStatusWrapper?: FileStatusWrapper) { toggleAnalysis(fileStatusWrapper?: FileStatusWrapper) {

View File

@ -1,5 +1,6 @@
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core'; import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
import { UserService, UserWrapper } from '@services/user.service'; import { UserService, UserWrapper } from '@services/user.service';
import { List } from '@redaction/red-ui-http';
@Component({ @Component({
selector: 'redaction-assign-user-dropdown', selector: 'redaction-assign-user-dropdown',
@ -9,7 +10,7 @@ import { UserService, UserWrapper } from '@services/user.service';
}) })
export class AssignUserDropdownComponent { export class AssignUserDropdownComponent {
oldUser: UserWrapper | string; oldUser: UserWrapper | string;
@Input() options: (UserWrapper | string)[]; @Input() options: List<UserWrapper | string>;
@Output() save = new EventEmitter<UserWrapper | string>(); @Output() save = new EventEmitter<UserWrapper | string>();
@Output() cancel = new EventEmitter<never>(); @Output() cancel = new EventEmitter<never>();
private _currentUser: UserWrapper | string; private _currentUser: UserWrapper | string;

View File

@ -1,6 +1,6 @@
import { ChangeDetectionStrategy, Component, Input, OnDestroy } from '@angular/core'; import { ChangeDetectionStrategy, Component, Input, OnDestroy } from '@angular/core';
import { PermissionsService } from '@services/permissions.service'; import { PermissionsService } from '@services/permissions.service';
import { DossierWrapper } from '@state/model/dossier.wrapper'; import { Dossier } from '../../../../../state/model/dossier';
import { FileStatusWrapper } from '@models/file/file-status.wrapper'; import { FileStatusWrapper } from '@models/file/file-status.wrapper';
import { FileDownloadService } from '@upload-download/services/file-download.service'; import { FileDownloadService } from '@upload-download/services/file-download.service';
import { Toaster } from '@iqser/common-ui'; import { Toaster } from '@iqser/common-ui';
@ -17,7 +17,7 @@ export type MenuState = 'OPEN' | 'CLOSED';
changeDetection: ChangeDetectionStrategy.OnPush changeDetection: ChangeDetectionStrategy.OnPush
}) })
export class FileDownloadBtnComponent extends AutoUnsubscribe implements OnDestroy { export class FileDownloadBtnComponent extends AutoUnsubscribe implements OnDestroy {
@Input() dossier: DossierWrapper; @Input() dossier: Dossier;
@Input() file: FileStatusWrapper | FileStatusWrapper[]; @Input() file: FileStatusWrapper | FileStatusWrapper[];
@Input() tooltipPosition: 'above' | 'below' | 'before' | 'after' = 'above'; @Input() tooltipPosition: 'above' | 'below' | 'before' | 'after' = 'above';
@Input() type: CircleButtonType = CircleButtonTypes.default; @Input() type: CircleButtonType = CircleButtonTypes.default;

View File

@ -4,7 +4,7 @@ import { AppStateService } from '@state/app-state.service';
import { Debounce, IconButtonTypes } from '@iqser/common-ui'; import { Debounce, IconButtonTypes } from '@iqser/common-ui';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { map, take } from 'rxjs/operators'; import { map, take } from 'rxjs/operators';
import { DossierWrapper } from '@state/model/dossier.wrapper'; import { Dossier } from '../../../../state/model/dossier';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import ICodeEditor = monaco.editor.ICodeEditor; import ICodeEditor = monaco.editor.ICodeEditor;
import IDiffEditor = monaco.editor.IDiffEditor; import IDiffEditor = monaco.editor.IDiffEditor;
@ -55,13 +55,13 @@ export class DictionaryManagerComponent implements OnChanges, OnInit {
this.currentEntries = this.initialEntries; this.currentEntries = this.initialEntries;
} }
private _dossier: DossierWrapper = this.selectDossier as DossierWrapper; private _dossier: Dossier = this.selectDossier as Dossier;
get dossier() { get dossier() {
return this._dossier; return this._dossier;
} }
set dossier(dossier: DossierWrapper) { set dossier(dossier: Dossier) {
this._dossier = dossier; this._dossier = dossier;
if (dossier === this.selectDossier) { if (dossier === this.selectDossier) {
@ -204,8 +204,8 @@ export class DictionaryManagerComponent implements OnChanges, OnInit {
this._codeEditor.revealLineInCenter(range.startLineNumber, SMOOTH_SCROLL); this._codeEditor.revealLineInCenter(range.startLineNumber, SMOOTH_SCROLL);
} }
private _onDossierChanged({ dossierId, dossierTemplateId }: DossierWrapper): Observable<string> { private _onDossierChanged({ id, dossierTemplateId }: Dossier): Observable<string> {
const dictionary$ = this._dictionaryControllerService.getDictionaryForType(dossierTemplateId, 'dossier_redaction', dossierId); const dictionary$ = this._dictionaryControllerService.getDictionaryForType(dossierTemplateId, 'dossier_redaction', id);
return dictionary$.pipe(map(data => this._toString(data.entries))); return dictionary$.pipe(map(data => this._toString(data.entries)));
} }

View File

@ -5,7 +5,7 @@ import {
DossierAttributesControllerService, DossierAttributesControllerService,
DossierAttributesRes DossierAttributesRes
} from '@redaction/red-ui-http'; } from '@redaction/red-ui-http';
import { DossierWrapper } from '@state/model/dossier.wrapper'; import { Dossier } from '@state/model/dossier';
import { DossierAttributeWithValue } from '@models/dossier-attributes.model'; import { DossierAttributeWithValue } from '@models/dossier-attributes.model';
import { AppStateService } from '@state/app-state.service'; import { AppStateService } from '@state/app-state.service';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
@ -19,10 +19,10 @@ export class DossierAttributesService {
private readonly _appStateService: AppStateService private readonly _appStateService: AppStateService
) {} ) {}
async getValues(dossierWrapper: DossierWrapper): Promise<DossierAttributeWithValue[]> { async getValues(dossier: Dossier): Promise<DossierAttributeWithValue[]> {
const attributes = await this._dossierAttributesControllerService.getDossierAttributes(dossierWrapper.dossierId).toPromise(); const attributes = await this._dossierAttributesControllerService.getDossierAttributes(dossier.id).toPromise();
const attributesConfig = await this._dossierAttributesControllerService const attributesConfig = await this._dossierAttributesControllerService
.getDossierAttributesConfig(dossierWrapper.dossierTemplateId) .getDossierAttributesConfig(dossier.dossierTemplateId)
.toPromise(); .toPromise();
return attributesConfig.dossierAttributeConfigs.map(config => ({ return attributesConfig.dossierAttributeConfigs.map(config => ({
@ -31,10 +31,8 @@ export class DossierAttributesService {
})); }));
} }
setValues(dossierWrapper: DossierWrapper, dossierAttributeList: DossierAttributeReq[]): Promise<DossierAttributesRes> { setValues(dossier: Dossier, dossierAttributeList: DossierAttributeReq[]): Promise<DossierAttributesRes> {
return this._dossierAttributesControllerService return this._dossierAttributesControllerService.setDossierAttributes({ dossierAttributeList }, dossier.id).toPromise();
.setDossierAttributes({ dossierAttributeList }, dossierWrapper.dossierId)
.toPromise();
} }
deleteConfigs(ids: string[], dossierTemplateId = this._appStateService.activeDossierTemplateId): Promise<void> { deleteConfigs(ids: string[], dossierTemplateId = this._appStateService.activeDossierTemplateId): Promise<void> {

View File

@ -1,7 +1,7 @@
import { DownloadDetails, DownloadStatus } from '@redaction/red-ui-http'; import { DownloadDetails, DownloadStatus } from '@redaction/red-ui-http';
import { Listable } from '@iqser/common-ui'; import { IListable } from '@iqser/common-ui';
export class DownloadStatusWrapper implements Listable { export class DownloadStatusWrapper implements IListable {
inProgress: boolean; inProgress: boolean;
constructor(private _downloadStatus: DownloadStatus) {} constructor(private _downloadStatus: DownloadStatus) {}

View File

@ -3,7 +3,7 @@ import { DownloadControllerService, FileManagementControllerService } from '@red
import { interval, Observable } from 'rxjs'; import { interval, Observable } from 'rxjs';
import { ConfigService } from '@services/config.service'; import { ConfigService } from '@services/config.service';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { DossierWrapper } from '@state/model/dossier.wrapper'; import { Dossier } from '@state/model/dossier';
import { FileStatusWrapper } from '@models/file/file-status.wrapper'; import { FileStatusWrapper } from '@models/file/file-status.wrapper';
import { mergeMap, tap } from 'rxjs/operators'; import { mergeMap, tap } from 'rxjs/operators';
import { DownloadStatusWrapper } from '../model/download-status.wrapper'; import { DownloadStatusWrapper } from '../model/download-status.wrapper';
@ -34,11 +34,11 @@ export class FileDownloadService {
}); });
} }
downloadFiles(fileStatusWrappers: FileStatusWrapper[], dossier: DossierWrapper): Observable<any> { downloadFiles(fileStatusWrappers: FileStatusWrapper[], dossier: Dossier): Observable<any> {
return this._downloadControllerService return this._downloadControllerService
.prepareDownload({ .prepareDownload({
fileIds: fileStatusWrappers.map(f => f.fileId), fileIds: fileStatusWrappers.map(f => f.fileId),
dossierId: dossier.dossierId dossierId: dossier.id
}) })
.pipe(mergeMap(() => this.getDownloadStatus())); .pipe(mergeMap(() => this.getDownloadStatus()));
} }

View File

@ -3,7 +3,7 @@ import { AppStateService } from '@state/app-state.service';
import { UserService } from './user.service'; import { UserService } from './user.service';
import { FileStatusWrapper } from '@models/file/file-status.wrapper'; import { FileStatusWrapper } from '@models/file/file-status.wrapper';
import { Comment } from '@redaction/red-ui-http'; import { Comment } from '@redaction/red-ui-http';
import { DossierWrapper } from '@state/model/dossier.wrapper'; import { Dossier } from '../state/model/dossier';
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'
@ -15,7 +15,7 @@ export class PermissionsService {
return this._appStateService.activeFile; return this._appStateService.activeFile;
} }
private get _activeDossier(): DossierWrapper | undefined { private get _activeDossier(): Dossier | undefined {
return this._appStateService.activeDossier; return this._appStateService.activeDossier;
} }
@ -42,14 +42,14 @@ export class PermissionsService {
return fileStatus.currentReviewer === this._userService.currentUser.id; return fileStatus.currentReviewer === this._userService.currentUser.id;
} }
canDeleteFile(fileStatus = this._activeFile, dossier?: DossierWrapper): boolean { canDeleteFile(fileStatus = this._activeFile, dossier?: Dossier): boolean {
return (this.isOwner(dossier) && !fileStatus.isApproved) || fileStatus.isUnassigned; return (this.isOwner(dossier) && !fileStatus.isApproved) || fileStatus.isUnassigned;
} }
canAssignToSelf(fileStatus = this._activeFile): boolean { canAssignToSelf(fileStatus = this._activeFile): boolean {
const precondition = this.isDossierMember() && !fileStatus.isProcessing && !fileStatus.isError && !fileStatus.isApproved; const precondition = this.isDossierMember() && !fileStatus.isProcessing && !fileStatus.isError && !fileStatus.isApproved;
const isTheOnlyReviewer = !this._appStateService.activeDossier?.hasMoreThanOneReviewer; const isTheOnlyReviewer = !this._appStateService.activeDossier?.hasReviewers;
if (precondition) { if (precondition) {
if ( if (
@ -66,10 +66,10 @@ export class PermissionsService {
const precondition = !fileStatus.isProcessing && !fileStatus.isError && !fileStatus.isApproved && this.isApprover(); const precondition = !fileStatus.isProcessing && !fileStatus.isError && !fileStatus.isApproved && this.isApprover();
if (precondition) { if (precondition) {
if ((fileStatus.isUnassigned || fileStatus.isUnderReview) && this._activeDossier.hasMoreThanOneReviewer) { if ((fileStatus.isUnassigned || fileStatus.isUnderReview) && this._activeDossier.hasReviewers) {
return true; return true;
} }
if (fileStatus.isUnderApproval && this._activeDossier.hasMoreThanOneApprover) { if (fileStatus.isUnderApproval && this._activeDossier.approverIds.length > 1) {
return true; return true;
} }
} }

View File

@ -6,7 +6,7 @@ import { User, UserControllerService } from '@redaction/red-ui-http';
import { wipeCaches } from '@redaction/red-cache'; import { wipeCaches } from '@redaction/red-cache';
import { BASE_HREF } from '../tokens'; import { BASE_HREF } from '../tokens';
import { Subject } from 'rxjs'; import { Subject } from 'rxjs';
import { Listable } from '@iqser/common-ui'; import { IListable } from '@iqser/common-ui';
export interface ProfileModel { export interface ProfileModel {
username?: string; username?: string;
@ -16,7 +16,7 @@ export interface ProfileModel {
language: string; language: string;
} }
export class UserWrapper implements Listable { export class UserWrapper implements IListable {
constructor(private readonly _user: KeycloakProfile | User, public roles: string[], public id: string) {} constructor(private readonly _user: KeycloakProfile | User, public roles: string[], public id: string) {}
email = this._user.email; email = this._user.email;

View File

@ -1,11 +1,11 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { import {
DictionaryControllerService, DictionaryControllerService,
Dossier,
DossierTemplateControllerService, DossierTemplateControllerService,
FileAttributesConfig, FileAttributesConfig,
FileAttributesControllerService, FileAttributesControllerService,
FileStatus, FileStatus,
IDossier,
ReanalysisControllerService, ReanalysisControllerService,
StatusControllerService StatusControllerService
} from '@redaction/red-ui-http'; } from '@redaction/red-ui-http';
@ -17,7 +17,7 @@ import { forkJoin, Observable, of, Subject } from 'rxjs';
import { catchError, map, tap } from 'rxjs/operators'; import { catchError, map, tap } from 'rxjs/operators';
import { FALLBACK_COLOR, hexToRgb } from '@utils/functions'; import { FALLBACK_COLOR, hexToRgb } from '@utils/functions';
import { FileStatusWrapper } from '@models/file/file-status.wrapper'; import { FileStatusWrapper } from '@models/file/file-status.wrapper';
import { DossierWrapper } from './model/dossier.wrapper'; import { Dossier } from './model/dossier';
import { TypeValueWrapper } from '@models/file/type-value.wrapper'; import { TypeValueWrapper } from '@models/file/type-value.wrapper';
import { DossierTemplateModelWrapper } from '@models/file/dossier-template-model.wrapper'; import { DossierTemplateModelWrapper } from '@models/file/dossier-template-model.wrapper';
import { DossiersService } from '../modules/dossier/services/dossiers.service'; import { DossiersService } from '../modules/dossier/services/dossiers.service';
@ -25,7 +25,7 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { UserPreferenceService } from '@services/user-preference.service'; import { UserPreferenceService } from '@services/user-preference.service';
export interface AppState { export interface AppState {
dossiers: DossierWrapper[]; dossiers: Dossier[];
dossierTemplates: DossierTemplateModelWrapper[]; dossierTemplates: DossierTemplateModelWrapper[];
activeDossierId: string; activeDossierId: string;
activeFileId: string; activeFileId: string;
@ -42,7 +42,7 @@ export interface AppState {
export class AppStateService { export class AppStateService {
readonly fileChanged$ = new Subject<FileStatusWrapper>(); readonly fileChanged$ = new Subject<FileStatusWrapper>();
readonly fileReanalysed$ = new Subject<FileStatusWrapper>(); readonly fileReanalysed$ = new Subject<FileStatusWrapper>();
readonly dossierChanged$ = new Subject<DossierWrapper>(); readonly dossierChanged$ = new Subject<Dossier>();
readonly dossierTemplateChanged$ = new Subject<DossierTemplateModelWrapper>(); readonly dossierTemplateChanged$ = new Subject<DossierTemplateModelWrapper>();
private _appState: AppState; private _appState: AppState;
@ -121,11 +121,11 @@ export class AppStateService {
return this._appState.activeDossierId; return this._appState.activeDossierId;
} }
get activeDossier(): DossierWrapper | undefined { get activeDossier(): Dossier | undefined {
return this.allDossiers.find(p => p.dossierId === this.activeDossierId); return this.allDossiers.find(p => p.id === this.activeDossierId);
} }
get allDossiers(): DossierWrapper[] { get allDossiers(): Dossier[] {
return this._appState.dossiers; return this._appState.dossiers;
} }
@ -208,7 +208,7 @@ export class AppStateService {
} }
getDossierById(id: string) { getDossierById(id: string) {
return this.allDossiers.find(dossier => dossier.dossierId === id); return this.allDossiers.find(dossier => dossier.id === id);
} }
getFileById(dossierId: string, fileId: string) { getFileById(dossierId: string, fileId: string) {
@ -222,12 +222,12 @@ export class AppStateService {
} }
const mappedDossiers = dossiers.map( const mappedDossiers = dossiers.map(
p => new DossierWrapper(p, this.getDossierTemplateById(p.dossierTemplateId).name, this._getExistingFiles(p.dossierId)) p => new Dossier(p, this.getDossierTemplateById(p.dossierTemplateId).name, this._getExistingFiles(p.dossierId))
); );
const fileData = await this._statusControllerService.getFileStatusForDossiers(mappedDossiers.map(p => p.dossierId)).toPromise(); const fileData = await this._statusControllerService.getFileStatusForDossiers(mappedDossiers.map(p => p.id)).toPromise();
for (const dossierId of Object.keys(fileData)) { for (const dossierId of Object.keys(fileData)) {
const dossier = mappedDossiers.find(p => p.dossierId === dossierId); const dossier = mappedDossiers.find(p => p.id === dossierId);
this._processFiles(dossier, fileData[dossierId], emitEvents); this._processFiles(dossier, fileData[dossierId], emitEvents);
} }
@ -261,14 +261,14 @@ export class AppStateService {
return activeFileWrapper; return activeFileWrapper;
} }
async getFiles(dossier: DossierWrapper = this.activeDossier, emitEvents = true) { async getFiles(dossier: Dossier = this.activeDossier, emitEvents = true) {
const files = await this._statusControllerService.getDossierStatus(dossier.dossierId).toPromise(); const files = await this._statusControllerService.getDossierStatus(dossier.id).toPromise();
return this._processFiles(dossier, files, emitEvents); return this._processFiles(dossier, files, emitEvents);
} }
async reanalyzeDossier({ dossierId }: DossierWrapper = this.activeDossier) { async reanalyzeDossier({ id }: Dossier = this.activeDossier) {
await this._reanalysisControllerService.reanalyzeDossier(dossierId, true).toPromise(); await this._reanalysisControllerService.reanalyzeDossier(id, true).toPromise();
} }
async activateDossier(dossierId: string) { async activateDossier(dossierId: string) {
@ -337,29 +337,29 @@ export class AppStateService {
this._appState.activeDictionaryType = null; this._appState.activeDictionaryType = null;
} }
deleteDossier(dossier: DossierWrapper) { deleteDossier(dossier: Dossier) {
return this._dossiersService.delete(dossier.dossierId).then( return this._dossiersService.delete(dossier.id).then(
() => { () => {
const index = this.allDossiers.findIndex(p => p.dossierId === dossier.dossierId); const index = this.allDossiers.findIndex(p => p.id === dossier.id);
this._appState.dossiers.splice(index, 1); this._appState.dossiers.splice(index, 1);
}, },
() => this._toaster.error(_('dossier-listing.delete.delete-failed'), { params: dossier }) () => this._toaster.error(_('dossier-listing.delete.delete-failed'), { params: dossier })
); );
} }
async createOrUpdateDossier(dossier: Dossier) { async createOrUpdateDossier(dossier: IDossier) {
try { try {
const updatedDossier = await this._dossiersService.createOrUpdate(dossier); const updatedDossier = await this._dossiersService.createOrUpdate(dossier);
let foundDossier = this.allDossiers.find(p => p.dossierId === updatedDossier.dossierId); let foundDossier = this.allDossiers.find(p => p.id === updatedDossier.dossierId);
if (foundDossier) { if (foundDossier) {
this._appState.dossiers.splice(this._appState.dossiers.indexOf(foundDossier), 1); this._appState.dossiers.splice(this._appState.dossiers.indexOf(foundDossier), 1);
foundDossier = new DossierWrapper( foundDossier = new Dossier(
updatedDossier, updatedDossier,
this.getDossierTemplateById(updatedDossier.dossierTemplateId).name, this.getDossierTemplateById(updatedDossier.dossierTemplateId).name,
foundDossier.files foundDossier.files
); );
} else { } else {
foundDossier = new DossierWrapper(updatedDossier, this.getDossierTemplateById(updatedDossier.dossierTemplateId).name, []); foundDossier = new Dossier(updatedDossier, this.getDossierTemplateById(updatedDossier.dossierTemplateId).name, []);
} }
this._appState.dossiers.push(foundDossier); this._appState.dossiers.push(foundDossier);
@ -689,11 +689,11 @@ export class AppStateService {
} }
private _getExistingFiles(dossierId: string): FileStatusWrapper[] { private _getExistingFiles(dossierId: string): FileStatusWrapper[] {
const dossier = this.allDossiers.find(p => p.dossierId === dossierId); const dossier = this.allDossiers.find(p => p.id === dossierId);
return dossier?.files ?? []; return dossier?.files ?? [];
} }
private _processFiles(dossier: DossierWrapper, files: FileStatus[], emitEvents: boolean = true) { private _processFiles(dossier: Dossier, files: FileStatus[], emitEvents: boolean = true) {
const oldFiles = [...dossier.files]; const oldFiles = [...dossier.files];
const fileStatusChangedEvent = []; const fileStatusChangedEvent = [];
@ -712,7 +712,7 @@ export class AppStateService {
this.getFileAttributeConfig(file.dossierTemplateId) this.getFileAttributeConfig(file.dossierTemplateId)
); );
fileStatusWrapper.lastOpened = fileStatusWrapper.lastOpened =
fileStatusWrapper.fileId === this._userPreferenceService.getLastOpenedFileForDossier(dossier.dossierId); fileStatusWrapper.fileId === this._userPreferenceService.getLastOpenedFileForDossier(dossier.id);
if (JSON.stringify(oldFile) !== JSON.stringify(fileStatusWrapper)) { if (JSON.stringify(oldFile) !== JSON.stringify(fileStatusWrapper)) {
fileStatusChangedEvent.push(fileStatusWrapper); fileStatusChangedEvent.push(fileStatusWrapper);
} }
@ -749,7 +749,7 @@ export class AppStateService {
fileStatusChangedEvent.forEach(file => this.fileChanged$.next(file)); fileStatusChangedEvent.forEach(file => this.fileChanged$.next(file));
} }
const lastOpenedFileId = this._userPreferenceService.getLastOpenedFileForDossier(dossier.dossierId); const lastOpenedFileId = this._userPreferenceService.getLastOpenedFileForDossier(dossier.id);
dossier.files.forEach(file => (file.lastOpened = file.fileId === lastOpenedFileId)); dossier.files.forEach(file => (file.lastOpened = file.fileId === lastOpenedFileId));
@ -764,7 +764,6 @@ export class AppStateService {
this.allDossiers.forEach(d => { this.allDossiers.forEach(d => {
totalDocuments += d.files.length; totalDocuments += d.files.length;
d.memberIds?.forEach(m => totalPeople.add(m)); d.memberIds?.forEach(m => totalPeople.add(m));
d.totalNumberOfPages = d.files.reduce((acc, file) => acc + file.numberOfPages, 0);
totalAnalysedPages += d.totalNumberOfPages; totalAnalysedPages += d.totalNumberOfPages;
}); });

View File

@ -1,29 +1,25 @@
import { FileStatusWrapper } from '@models/file/file-status.wrapper'; import { FileStatusWrapper } from '@models/file/file-status.wrapper';
import * as moment from 'moment'; import { Dictionary, DossierStatus, DownloadFileType, IDossier, List } from '@redaction/red-ui-http';
import { Dictionary, Dossier } from '@redaction/red-ui-http'; import { IListable } from '@iqser/common-ui';
import { Listable } from '@iqser/common-ui';
export class DossierWrapper implements Dossier, Listable { export class Dossier implements IDossier, IListable {
readonly approverIds = this._dossier.approverIds; readonly id: string;
readonly date = this._dossier.date; readonly ownerId: string;
readonly description = this._dossier.description; readonly memberIds: List;
readonly dossierId = this._dossier.dossierId; readonly approverIds: List;
readonly dossierName = this._dossier.dossierName; readonly reportTemplateIds: List;
readonly dossierTemplateId = this._dossier.dossierTemplateId; readonly dossierTemplateId: string;
readonly downloadFileTypes = this._dossier.downloadFileTypes; readonly dossierName: string;
readonly dueDate = this._dossier.dueDate; readonly date: string;
readonly hardDeletedTime = this._dossier.hardDeletedTime; readonly description: string;
readonly memberIds = this._dossier.memberIds; readonly downloadFileTypes: List<DownloadFileType>;
readonly ownerId = this._dossier.ownerId; readonly dueDate: string;
readonly reportTemplateIds = this._dossier.reportTemplateIds; readonly hardDeletedTime: string;
readonly reportTypes = this._dossier.reportTypes; readonly reportTypes: List;
readonly softDeletedTime = this._dossier.softDeletedTime; readonly softDeletedTime: string;
readonly status = this._dossier.status; readonly status: DossierStatus;
readonly watermarkEnabled = this._dossier.watermarkEnabled; readonly watermarkEnabled: boolean;
readonly hasReviewers: boolean;
readonly hasMoreThanOneApprover = this.approverIds.length > 1;
readonly hasMoreThanOneReviewer = this.memberIds.length > 1;
readonly memberCount = this.memberIds.length;
reanalysisRequired = this._files.some(file => file.analysisRequired); reanalysisRequired = this._files.some(file => file.analysisRequired);
hasFiles = this._files.length > 0; hasFiles = this._files.length > 0;
@ -39,12 +35,26 @@ export class DossierWrapper implements Dossier, Listable {
allFilesApproved?: boolean; allFilesApproved?: boolean;
type?: Dictionary; type?: Dictionary;
constructor(private readonly _dossier: Dossier, readonly dossierTemplateName, private _files: FileStatusWrapper[] = []) { constructor(dossier: IDossier, readonly dossierTemplateName: string, private _files: FileStatusWrapper[] = []) {
this._recomputeFileStatus(); this.id = dossier.dossierId;
} this.approverIds = dossier.approverIds;
this.date = dossier.date;
this.description = dossier.description;
this.dossierName = dossier.dossierName;
this.dossierTemplateId = dossier.dossierTemplateId;
this.downloadFileTypes = dossier.downloadFileTypes;
this.dueDate = dossier.dueDate;
this.hardDeletedTime = dossier.hardDeletedTime;
this.memberIds = dossier.memberIds;
this.ownerId = dossier.ownerId;
this.reportTemplateIds = dossier.reportTemplateIds;
this.reportTypes = dossier.reportTypes;
this.softDeletedTime = dossier.softDeletedTime;
this.status = dossier.status;
this.watermarkEnabled = dossier.watermarkEnabled;
this.hasReviewers = this.memberIds.length > 1;
get id() { this._recomputeFileStatus();
return this.dossierId;
} }
get files() { get files() {
@ -61,11 +71,7 @@ export class DossierWrapper implements Dossier, Listable {
} }
hasMember(memberId: string) { hasMember(memberId: string) {
return this._dossier.memberIds.indexOf(memberId) >= 0; return this.memberIds.indexOf(memberId) >= 0;
}
addedDateMatches(key: string) {
return moment(this.date).format('DD/MM/YYYY') === key;
} }
private _recomputeFileStatus() { private _recomputeFileStatus() {

View File

@ -1,7 +1,7 @@
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { Dossier } from '@redaction/red-ui-http'; import { DownloadFileType } from '@redaction/red-ui-http';
export const downloadTypesTranslations: { [key in Dossier.DownloadFileTypesEnum]: string } = { export const downloadTypesTranslations: { [key in DownloadFileType]: string } = {
ORIGINAL: _('download-type.original'), ORIGINAL: _('download-type.original'),
PREVIEW: _('download-type.preview'), PREVIEW: _('download-type.preview'),
REDACTED: _('download-type.redacted'), REDACTED: _('download-type.redacted'),

View File

@ -1,7 +1,7 @@
import { FileUploadModel } from '@upload-download/model/file-upload.model'; import { FileUploadModel } from '@upload-download/model/file-upload.model';
import { DossierWrapper } from '@state/model/dossier.wrapper'; import { Dossier } from '../state/model/dossier';
export function handleFileDrop(event: DragEvent, dossier: DossierWrapper, uploadFiles: (files: FileUploadModel[]) => void) { export function handleFileDrop(event: DragEvent, dossier: Dossier, uploadFiles: (files: FileUploadModel[]) => void) {
event.preventDefault(); event.preventDefault();
event.stopPropagation(); event.stopPropagation();
const { dataTransfer } = event; const { dataTransfer } = event;
@ -30,7 +30,7 @@ export function isCsv(file: FileUploadModel): boolean {
return file.file.type?.toLowerCase() === 'text/csv' || file.file.name.toLowerCase().endsWith('.csv'); return file.file.type?.toLowerCase() === 'text/csv' || file.file.name.toLowerCase().endsWith('.csv');
} }
export function convertFiles(files: FileList | File[], dossier: DossierWrapper): FileUploadModel[] { export function convertFiles(files: FileList | File[], dossier: Dossier): FileUploadModel[] {
let uploadFiles: FileUploadModel[] = []; let uploadFiles: FileUploadModel[] = [];
for (let i = 0; i < files.length; i++) { for (let i = 0; i < files.length; i++) {
const file = files[i]; const file = files[i];
@ -39,7 +39,7 @@ export function convertFiles(files: FileList | File[], dossier: DossierWrapper):
progress: 0, progress: 0,
completed: false, completed: false,
error: null, error: null,
dossierId: dossier.dossierId, dossierId: dossier.id,
dossierName: dossier.dossierName, dossierName: dossier.dossierName,
sizeError: false, sizeError: false,
retryCount: 0, retryCount: 0,

View File

@ -1,5 +1,5 @@
import { FileStatusWrapper } from '@models/file/file-status.wrapper'; import { FileStatusWrapper } from '@models/file/file-status.wrapper';
import { DossierWrapper } from '@state/model/dossier.wrapper'; import { Dossier } from '../state/model/dossier';
import { handleCheckedValue, NestedFilter } from '@iqser/common-ui'; import { handleCheckedValue, NestedFilter } from '@iqser/common-ui';
export function handleFilterDelta(oldFilters: NestedFilter[], newFilters: NestedFilter[], allFilters: NestedFilter[]) { export function handleFilterDelta(oldFilters: NestedFilter[], newFilters: NestedFilter[], allFilters: NestedFilter[]) {
@ -45,10 +45,10 @@ export function handleFilterDelta(oldFilters: NestedFilter[], newFilters: Nested
}); });
} }
export const annotationFilterChecker = (input: FileStatusWrapper | DossierWrapper, filter: NestedFilter) => { export const annotationFilterChecker = (input: FileStatusWrapper | Dossier, filter: NestedFilter) => {
switch (filter.key) { switch (filter.key) {
case 'analysis': { case 'analysis': {
if (input instanceof DossierWrapper) { if (input instanceof Dossier) {
return input.reanalysisRequired; return input.reanalysisRequired;
} else { } else {
return input.analysisRequired; return input.analysisRequired;
@ -78,10 +78,10 @@ export const annotationFilterChecker = (input: FileStatusWrapper | DossierWrappe
} }
}; };
export const dossierStatusChecker = (dw: DossierWrapper, filter: NestedFilter) => dw.hasStatus(filter.key); export const dossierStatusChecker = (dw: Dossier, filter: NestedFilter) => dw.hasStatus(filter.key);
export const dossierMemberChecker = (dw: DossierWrapper, filter: NestedFilter) => dw.hasMember(filter.key); export const dossierMemberChecker = (dw: Dossier, filter: NestedFilter) => dw.hasMember(filter.key);
export const dossierTemplateChecker = (dw: DossierWrapper, filter: NestedFilter) => dw.dossierTemplateId === filter.key; export const dossierTemplateChecker = (dw: Dossier, filter: NestedFilter) => dw.dossierTemplateId === filter.key;
export const dossierApproverChecker = (dw: DossierWrapper, filter: NestedFilter) => dw.approverIds.includes(filter.key); export const dossierApproverChecker = (dw: Dossier, filter: NestedFilter) => dw.approverIds.includes(filter.key);

@ -1 +1 @@
Subproject commit 0dc6d05cef931e2682bb9584ad0d0cb31144e5c6 Subproject commit 4ffdb4e413a71bbcafadab719dc19a565d489128

View File

@ -16,7 +16,7 @@ import { CustomHttpUrlEncodingCodec } from '../encoder';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { Dossier } from '../model/dossier'; import { IDossier } from '../model/dossier';
import { DossierRequest } from '../model/dossierRequest'; import { DossierRequest } from '../model/dossierRequest';
import { BASE_PATH } from '../variables'; import { BASE_PATH } from '../variables';
@ -49,11 +49,11 @@ export class DossierControllerService {
* @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
* @param reportProgress flag to report request and response progress. * @param reportProgress flag to report request and response progress.
*/ */
public createOrUpdateDossier(body: DossierRequest, observe?: 'body', reportProgress?: boolean): Observable<Dossier>; public createOrUpdateDossier(body: DossierRequest, observe?: 'body', reportProgress?: boolean): Observable<IDossier>;
public createOrUpdateDossier(body: DossierRequest, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<Dossier>>; public createOrUpdateDossier(body: DossierRequest, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<IDossier>>;
public createOrUpdateDossier(body: DossierRequest, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<Dossier>>; public createOrUpdateDossier(body: DossierRequest, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<IDossier>>;
public createOrUpdateDossier(body: DossierRequest, observe: any = 'body', reportProgress: boolean = false): Observable<any> { public createOrUpdateDossier(body: DossierRequest, observe: any = 'body', reportProgress: boolean = false): Observable<any> {
if (body === null || body === undefined) { if (body === null || body === undefined) {
@ -83,7 +83,7 @@ export class DossierControllerService {
headers = headers.set('Content-Type', httpContentTypeSelected); headers = headers.set('Content-Type', httpContentTypeSelected);
} }
return this.httpClient.request<Dossier>('post', `${this.basePath}/dossier`, { return this.httpClient.request<IDossier>('post', `${this.basePath}/dossier`, {
body: body, body: body,
withCredentials: this.configuration.withCredentials, withCredentials: this.configuration.withCredentials,
headers: headers, headers: headers,
@ -140,11 +140,11 @@ export class DossierControllerService {
* @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
* @param reportProgress flag to report request and response progress. * @param reportProgress flag to report request and response progress.
*/ */
public getDeletedDossiers(observe?: 'body', reportProgress?: boolean): Observable<Array<Dossier>>; public getDeletedDossiers(observe?: 'body', reportProgress?: boolean): Observable<Array<IDossier>>;
public getDeletedDossiers(observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<Array<Dossier>>>; public getDeletedDossiers(observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<Array<IDossier>>>;
public getDeletedDossiers(observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<Array<Dossier>>>; public getDeletedDossiers(observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<Array<IDossier>>>;
public getDeletedDossiers(observe: any = 'body', reportProgress: boolean = false): Observable<any> { public getDeletedDossiers(observe: any = 'body', reportProgress: boolean = false): Observable<any> {
let headers = this.defaultHeaders; let headers = this.defaultHeaders;
@ -163,7 +163,7 @@ export class DossierControllerService {
headers = headers.set('Accept', httpHeaderAcceptSelected); headers = headers.set('Accept', httpHeaderAcceptSelected);
} }
return this.httpClient.request<Array<Dossier>>('get', `${this.basePath}/deleted-dossiers`, { return this.httpClient.request<Array<IDossier>>('get', `${this.basePath}/deleted-dossiers`, {
withCredentials: this.configuration.withCredentials, withCredentials: this.configuration.withCredentials,
headers: headers, headers: headers,
observe: observe, observe: observe,
@ -178,11 +178,11 @@ export class DossierControllerService {
* @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
* @param reportProgress flag to report request and response progress. * @param reportProgress flag to report request and response progress.
*/ */
public getDossier(dossierId: string, observe?: 'body', reportProgress?: boolean): Observable<Dossier>; public getDossier(dossierId: string, observe?: 'body', reportProgress?: boolean): Observable<IDossier>;
public getDossier(dossierId: string, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<Dossier>>; public getDossier(dossierId: string, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<IDossier>>;
public getDossier(dossierId: string, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<Dossier>>; public getDossier(dossierId: string, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<IDossier>>;
public getDossier(dossierId: string, observe: any = 'body', reportProgress: boolean = false): Observable<any> { public getDossier(dossierId: string, observe: any = 'body', reportProgress: boolean = false): Observable<any> {
if (dossierId === null || dossierId === undefined) { if (dossierId === null || dossierId === undefined) {
@ -205,7 +205,7 @@ export class DossierControllerService {
headers = headers.set('Accept', httpHeaderAcceptSelected); headers = headers.set('Accept', httpHeaderAcceptSelected);
} }
return this.httpClient.request<Dossier>('get', `${this.basePath}/dossier/${encodeURIComponent(String(dossierId))}`, { return this.httpClient.request<IDossier>('get', `${this.basePath}/dossier/${encodeURIComponent(String(dossierId))}`, {
withCredentials: this.configuration.withCredentials, withCredentials: this.configuration.withCredentials,
headers: headers, headers: headers,
observe: observe, observe: observe,
@ -219,11 +219,11 @@ export class DossierControllerService {
* @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
* @param reportProgress flag to report request and response progress. * @param reportProgress flag to report request and response progress.
*/ */
public getDossiers(observe?: 'body', reportProgress?: boolean): Observable<Array<Dossier>>; public getDossiers(observe?: 'body', reportProgress?: boolean): Observable<Array<IDossier>>;
public getDossiers(observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<Array<Dossier>>>; public getDossiers(observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<Array<IDossier>>>;
public getDossiers(observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<Array<Dossier>>>; public getDossiers(observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<Array<IDossier>>>;
public getDossiers(observe: any = 'body', reportProgress: boolean = false): Observable<any> { public getDossiers(observe: any = 'body', reportProgress: boolean = false): Observable<any> {
let headers = this.defaultHeaders; let headers = this.defaultHeaders;
@ -242,7 +242,7 @@ export class DossierControllerService {
headers = headers.set('Accept', httpHeaderAcceptSelected); headers = headers.set('Accept', httpHeaderAcceptSelected);
} }
return this.httpClient.request<Array<Dossier>>('get', `${this.basePath}/dossier`, { return this.httpClient.request<Array<IDossier>>('get', `${this.basePath}/dossier`, {
withCredentials: this.configuration.withCredentials, withCredentials: this.configuration.withCredentials,
headers: headers, headers: headers,
observe: observe, observe: observe,

View File

@ -3,3 +3,4 @@ export * from './model/models';
export * from './variables'; export * from './variables';
export * from './configuration'; export * from './configuration';
export * from './api.module'; export * from './api.module';
export * from './red-types';

View File

@ -9,38 +9,38 @@
* https://github.com/swagger-api/swagger-codegen.git * https://github.com/swagger-api/swagger-codegen.git
* Do not edit the class manually. * Do not edit the class manually.
*/ */
import { List } from '../red-types';
export interface Dossier { export interface IDossier {
approverIds?: Array<string>; readonly approverIds?: List;
date?: string; readonly date?: string;
description?: string; readonly description?: string;
dossierId?: string; readonly dossierId?: string;
dossierName?: string; readonly dossierName?: string;
dossierTemplateId?: string; readonly dossierTemplateId?: string;
downloadFileTypes?: Array<Dossier.DownloadFileTypesEnum>; readonly downloadFileTypes?: List<DownloadFileType>;
dueDate?: string; readonly dueDate?: string;
hardDeletedTime?: string; readonly hardDeletedTime?: string;
memberIds?: Array<string>; readonly memberIds?: List;
ownerId?: string; readonly ownerId?: string;
reportTemplateIds?: Array<string>; readonly reportTemplateIds?: List;
reportTypes?: Array<string>; readonly reportTypes?: List;
softDeletedTime?: string; readonly softDeletedTime?: string;
status?: Dossier.StatusEnum; readonly status?: DossierStatus;
watermarkEnabled?: boolean; readonly watermarkEnabled?: boolean;
} }
export namespace Dossier { export const DownloadFileTypes = {
export type DownloadFileTypesEnum = 'ANNOTATED' | 'FLATTEN' | 'ORIGINAL' | 'PREVIEW' | 'REDACTED'; ANNOTATED: 'ANNOTATED',
export const DownloadFileTypesEnum = { FLATTEN: 'FLATTEN',
ANNOTATED: 'ANNOTATED' as DownloadFileTypesEnum, ORIGINAL: 'ORIGINAL',
FLATTEN: 'FLATTEN' as DownloadFileTypesEnum, PREVIEW: 'PREVIEW',
ORIGINAL: 'ORIGINAL' as DownloadFileTypesEnum, REDACTED: 'REDACTED'
PREVIEW: 'PREVIEW' as DownloadFileTypesEnum, } as const;
REDACTED: 'REDACTED' as DownloadFileTypesEnum export type DownloadFileType = keyof typeof DownloadFileTypes;
};
export type StatusEnum = 'ACTIVE' | 'DELETED'; export const DossierStatuses = {
export const StatusEnum = { ACTIVE: 'ACTIVE',
ACTIVE: 'ACTIVE' as StatusEnum, DELETED: 'DELETED'
DELETED: 'DELETED' as StatusEnum } as const;
}; export type DossierStatus = keyof typeof DossierStatuses;
}

View File

@ -10,6 +10,8 @@
* Do not edit the class manually. * Do not edit the class manually.
*/ */
import { List } from "../red-types";
/** /**
* Object containing information about a dossier. * Object containing information about a dossier.
*/ */
@ -17,51 +19,51 @@ export interface DossierRequest {
/** /**
* The id(s) of approvers associated to this dossier. * The id(s) of approvers associated to this dossier.
*/ */
approverIds?: Array<string>; readonly approverIds?: List;
/** /**
* The dossier's description (optional). * The dossier's description (optional).
*/ */
description?: string; readonly description?: string;
/** /**
* The id of the dossier, can be null for create requests. * The id of the dossier, can be null for create requests.
*/ */
dossierId?: string; readonly dossierId?: string;
/** /**
* The name of the dossier. Must be unique. * The name of the dossier. Must be unique.
*/ */
dossierName?: string; readonly dossierName?: string;
/** /**
* The dossierTemplateId for this dossier. can be null for update request. * The dossierTemplateId for this dossier. can be null for update request.
*/ */
dossierTemplateId?: string; readonly dossierTemplateId?: string;
/** /**
* Download File Types for this dossiers submission package. * Download File Types for this dossiers submission package.
*/ */
downloadFileTypes?: Array<DossierRequest.DownloadFileTypesEnum>; readonly downloadFileTypes?: List<DossierRequest.DownloadFileTypesEnum>;
/** /**
* The date when the dossier is due. * The date when the dossier is due.
*/ */
dueDate?: string; readonly dueDate?: string;
/** /**
* The id(s) of members associated to this dossier. * The id(s) of members associated to this dossier.
*/ */
memberIds?: Array<string>; readonly memberIds?: List;
/** /**
* The id of the owning user. * The id of the owning user.
*/ */
ownerId?: string; readonly ownerId?: string;
/** /**
* Id(s) of the word report templates used to generate downloads * Id(s) of the word report templates used to generate downloads
*/ */
reportTemplateIds?: Array<string>; readonly reportTemplateIds?: List;
/** /**
* Report File Types for this dossiers submission package. * Report File Types for this dossiers submission package.
*/ */
reportTypes?: Array<string>; readonly reportTypes?: List;
/** /**
* Whether a watermark will be applied to the redacted files or not. * Whether a watermark will be applied to the redacted files or not.
*/ */
watermarkEnabled?: boolean; readonly watermarkEnabled?: boolean;
} }
export namespace DossierRequest { export namespace DossierRequest {

View File

@ -0,0 +1 @@
export type List<T = string> = readonly T[];

View File

@ -106,8 +106,8 @@
"eslint": "7.32.0", "eslint": "7.32.0",
"eslint-config-airbnb-typescript": "^14.0.0", "eslint-config-airbnb-typescript": "^14.0.0",
"eslint-config-prettier": "8.3.0", "eslint-config-prettier": "8.3.0",
"eslint-plugin-prettier": "^4.0.0",
"eslint-plugin-import": "2.24.2", "eslint-plugin-import": "2.24.2",
"eslint-plugin-prettier": "^4.0.0",
"google-translate-api-browser": "^1.1.71", "google-translate-api-browser": "^1.1.71",
"husky": "4.3.8", "husky": "4.3.8",
"jest": "27.1.1", "jest": "27.1.1",