almost unfuck circular imports

This commit is contained in:
Dan Percic 2024-06-19 13:06:20 +03:00
parent ffd02c787d
commit 04e3f5b522
49 changed files with 368 additions and 353 deletions

View File

@ -2,11 +2,16 @@ import { APP_BASE_HREF, DatePipe as BaseDatePipe } from '@angular/common';
import { HTTP_INTERCEPTORS } from '@angular/common/http';
import { ENVIRONMENT_INITIALIZER, ErrorHandler, inject, NgModule } from '@angular/core';
import { MatDividerModule } from '@angular/material/divider';
import { MatIcon } from '@angular/material/icon';
import { MatMenu, MatMenuContent, MatMenuItem, MatMenuTrigger } from '@angular/material/menu';
import { MatProgressSpinner } from '@angular/material/progress-spinner';
import { MAT_TOOLTIP_DEFAULT_OPTIONS, MatTooltip } from '@angular/material/tooltip';
import { BrowserModule } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { ServiceWorkerModule } from '@angular/service-worker';
import { HelpModeKey } from '@common-ui/help-mode/types';
import { GET_TENANT_FROM_PATH_FN, UI_ROOT } from '@common-ui/utils';
import { AuthErrorComponent } from '@components/auth-error/auth-error.component';
import { BaseScreenComponent } from '@components/base-screen/base-screen.component';
import { BreadcrumbsComponent } from '@components/breadcrumbs/breadcrumbs.component';
import { DownloadsListScreenComponent } from '@components/downloads-list-screen/downloads-list-screen.component';
@ -26,7 +31,6 @@ import {
EmptyStateComponent,
HelpButtonComponent,
HelpModeComponent,
HelpModeKey,
HiddenActionDirective,
IconButtonComponent,
InputWithActionComponent,
@ -43,6 +47,7 @@ import {
StopPropagationDirective,
} from '@iqser/common-ui';
import { CommonUiModule } from '@iqser/common-ui/lib/common-ui.module';
import { provideHelpMode } from '@iqser/common-ui/lib/help-mode/utils/help-mode.provider';
import { LogoComponent, SkeletonComponent, ToastComponent } from '@iqser/common-ui/lib/shared';
import { TenantsModule } from '@iqser/common-ui/lib/tenants';
import { InitialsAvatarComponent, IqserUsersModule } from '@iqser/common-ui/lib/users';
@ -54,6 +59,7 @@ import { ActiveDossiersService } from '@services/dossiers/active-dossiers.servic
import { ArchivedDossiersService } from '@services/dossiers/archived-dossiers.service';
import { GlobalErrorHandler } from '@services/global-error-handler.service';
import { LoggerRulesService } from '@services/logger-rules.service';
import { provideCustomDateFormatter } from '@shared/custom-date-formatting.provider';
import { DatePipe } from '@shared/pipes/date.pipe';
import { RedRoleGuard } from '@users/red-role.guard';
import { UserPreferenceService } from '@users/user-preference.service';
@ -65,15 +71,9 @@ import { ToastrModule } from 'ngx-toastr';
import * as helpModeKeys from '../assets/help-mode/help-mode-keys.json';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { IconsModule } from './modules/icons/icons.module';
import { PdfViewerModule } from './modules/pdf-viewer/pdf-viewer.module';
import { ACTIVE_DOSSIERS_SERVICE, ARCHIVED_DOSSIERS_SERVICE } from './tokens';
import { AuthErrorComponent } from '@components/auth-error/auth-error.component';
import { provideCustomDateFormatter } from '@shared/custom-date-formatting.provider';
import { provideHelpMode } from '@iqser/common-ui/lib/help-mode/utils/help-mode.provider';
import { MatMenu, MatMenuContent, MatMenuItem, MatMenuTrigger } from '@angular/material/menu';
import { MatIcon } from '@angular/material/icon';
import { MatProgressSpinner } from '@angular/material/progress-spinner';
import { IconsModule } from './modules/icons/icons.module';
export const appModuleFactory = (config: AppConfig) => {
@NgModule({

View File

@ -1,7 +1,7 @@
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivate } from '@angular/router';
import { firstValueFrom } from 'rxjs';
import { EntityPermissionsService } from '@services/entity-permissions/entity-permissions.service';
import { firstValueFrom } from 'rxjs';
@Injectable({ providedIn: 'root' })
export class PermissionsGuard implements CanActivate {

View File

@ -1,14 +1,20 @@
import { NgForOf, NgIf } from '@angular/common';
import { ChangeDetectorRef, Component, inject } from '@angular/core';
import { BaseFormComponent } from '@common-ui/form';
import { FormBuilder, FormGroup, ReactiveFormsModule } from '@angular/forms';
import { MatCheckbox } from '@angular/material/checkbox';
import { MatFormField } from '@angular/material/form-field';
import { MatOption, MatSelect } from '@angular/material/select';
import { BaseFormComponent } from '@common-ui/form';
import { AsControl } from '@common-ui/utils';
import { IconButtonComponent } from '@iqser/common-ui';
import { TranslateModule } from '@ngx-translate/core';
import { PreferencesKeys, UserPreferenceService } from '@users/user-preference.service';
import {
RedactOrHintOption,
RedactOrHintOptions,
RemoveRedactionOption,
RemoveRedactionOptions,
} from '../../../../file-preview/utils/dialog-options';
import { PreferencesKeys, UserPreferenceService } from '@users/user-preference.service';
import { AsControl } from '@common-ui/utils';
} from '../../../../file-preview/utils/dialog-types';
import {
hintAddOptions,
recommendationRemoveOptions,
@ -17,12 +23,6 @@ import {
removeOptions,
SystemDefaultType,
} from '../../../utils/dialog-defaults';
import { TranslateModule } from '@ngx-translate/core';
import { MatFormField } from '@angular/material/form-field';
import { MatOption, MatSelect } from '@angular/material/select';
import { NgForOf, NgIf } from '@angular/common';
import { MatCheckbox } from '@angular/material/checkbox';
import { IconButtonComponent } from '@iqser/common-ui';
interface DefaultOptionsForm {
addRedaction: RedactOrHintOption | SystemDefaultType;
@ -68,6 +68,10 @@ export class DialogDefaultsComponent extends BaseFormComponent {
readonly redactionRemoveOptions = redactionRemoveOptions;
readonly recommendationRemoveOptions = recommendationRemoveOptions;
constructor() {
super();
}
get displayExtraOptionAddRedaction() {
return RedactOrHintOptions.IN_DOSSIER === this.form.controls.addRedaction.value;
}
@ -92,10 +96,6 @@ export class DialogDefaultsComponent extends BaseFormComponent {
return RemoveRedactionOptions.DO_NOT_RECOMMEND === this.form.controls.removeRecommendation.value;
}
constructor() {
super();
}
async save(): Promise<any> {
const formValue = this.form.value;

View File

@ -1,8 +1,8 @@
import { redactTextTranslations } from '@translations/redact-text-translations';
import { RedactOrHintOptions, RemoveRedactionOptions } from '../../file-preview/utils/dialog-options';
import { removeRedactionTranslations } from '@translations/remove-redaction-translations';
import { addHintTranslations } from '@translations/add-hint-translations';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { addHintTranslations } from '@translations/add-hint-translations';
import { redactTextTranslations } from '@translations/redact-text-translations';
import { removeRedactionTranslations } from '@translations/remove-redaction-translations';
import { RedactOrHintOptions, RemoveRedactionOptions } from '../../file-preview/utils/dialog-types';
export const SystemDefaults = {
ADD_REDACTION_DEFAULT: RedactOrHintOptions.IN_DOSSIER,

View File

@ -1,10 +1,9 @@
import { Component, Inject, ViewChild } from '@angular/core';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { User } from '@red/domain';
import { UserDetailsComponent } from './user-details/user-details.component';
import { BaseDialogComponent, CircleButtonComponent } from '@iqser/common-ui';
import { User } from '@red/domain';
import { ResetPasswordComponent } from './reset-password/reset-password.component';
import { AdminDialogService } from '../../services/admin-dialog.service';
import { UserDetailsComponent } from './user-details/user-details.component';
@Component({
selector: 'redaction-add-edit-user-dialog',
@ -13,8 +12,8 @@ import { AdminDialogService } from '../../services/admin-dialog.service';
imports: [UserDetailsComponent, ResetPasswordComponent, CircleButtonComponent],
})
export class AddEditUserDialogComponent extends BaseDialogComponent {
resettingPassword = false;
@ViewChild(UserDetailsComponent) private readonly _userDetailsComponent: UserDetailsComponent;
resettingPassword = false;
constructor(
protected readonly _dialogRef: MatDialogRef<AddEditUserDialogComponent>,

View File

@ -1,5 +1,9 @@
import { AsyncPipe, NgClass, NgIf } from '@angular/common';
import { Component, inject, OnInit } from '@angular/core';
import { MatIcon } from '@angular/material/icon';
import { MatSlideToggle } from '@angular/material/slide-toggle';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { InitialsAvatarComponent } from '@common-ui/users';
import {
ButtonConfig,
CircleButtonComponent,
@ -24,12 +28,9 @@ import { UserService } from '@users/user.service';
import { firstValueFrom, Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { userTypeChecker, userTypeFilters } from '../../../../utils';
import { AdminDialogService } from '../../services/admin-dialog.service';
import { UsersStatsComponent } from '../../components/users-stats/users-stats.component';
import { AsyncPipe, NgClass, NgIf } from '@angular/common';
import { InitialsAvatarComponent } from '@common-ui/users';
import { MatSlideToggle } from '@angular/material/slide-toggle';
import { MatIcon } from '@angular/material/icon';
import { AddEditUserDialogComponent } from '../../dialogs/add-edit-user-dialog/add-edit-user-dialog.component';
import { AdminDialogService } from '../../services/admin-dialog.service';
function configToFilter({ key, label }: DonutChartConfig) {
return new NestedFilter({
@ -112,7 +113,7 @@ export class UserListingScreenComponent extends ListingComponent<User> implement
}
openAddEditUserDialog(user?: User) {
this._dialogService.openDialog('addEditUser', user, async () => {
this._dialogService.open(AddEditUserDialogComponent, user, { autoFocus: true }, async () => {
await this.#loadData();
});
}

View File

@ -1,9 +1,6 @@
import { Injectable, TemplateRef } from '@angular/core';
import { MatDialog } from '@angular/material/dialog';
import { AddEntityDialogComponent } from '../dialogs/add-entity-dialog/add-entity-dialog.component';
import { EditColorDialogComponent } from '../dialogs/edit-color-dialog/edit-color-dialog.component';
import { SmtpAuthDialogComponent } from '../dialogs/smtp-auth-dialog/smtp-auth-dialog.component';
import { AddEditUserDialogComponent } from '../dialogs/add-edit-user-dialog/add-edit-user-dialog.component';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import {
ConfirmationDialogComponent,
ConfirmOptions,
@ -13,22 +10,23 @@ import {
LoadingService,
TitleColors,
} from '@iqser/common-ui';
import { UploadDictionaryDialogComponent } from '../dialogs/upload-dictionary-dialog/upload-dictionary-dialog.component';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { firstValueFrom, forkJoin } from 'rxjs';
import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service';
import { UserService } from '@users/user.service';
import { IDossierAttributeConfig, IFileAttributeConfig, IReportTemplate } from '@red/domain';
import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service';
import { ReportTemplateService } from '@services/report-template.service';
import { ConfigureCertificateDialogComponent } from '../dialogs/configure-digital-signature-dialog/configure-certificate-dialog.component';
import { AuditInfoDialogComponent } from '../dialogs/audit-info-dialog/audit-info-dialog.component';
import { UserService } from '@users/user.service';
import { firstValueFrom, forkJoin } from 'rxjs';
import { AddCloneDossierTemplateDialogComponent } from '../dialogs/add-clone-dossier-template-dialog/add-clone-dossier-template-dialog.component';
import { AddEntityDialogComponent } from '../dialogs/add-entity-dialog/add-entity-dialog.component';
import { AuditInfoDialogComponent } from '../dialogs/audit-info-dialog/audit-info-dialog.component';
import { ConfigureCertificateDialogComponent } from '../dialogs/configure-digital-signature-dialog/configure-certificate-dialog.component';
import { EditColorDialogComponent } from '../dialogs/edit-color-dialog/edit-color-dialog.component';
import { SmtpAuthDialogComponent } from '../dialogs/smtp-auth-dialog/smtp-auth-dialog.component';
import { UploadDictionaryDialogComponent } from '../dialogs/upload-dictionary-dialog/upload-dictionary-dialog.component';
type DialogType =
| 'confirm'
| 'addEntity'
| 'editColor'
| 'addEditUser'
| 'smtpAuthConfig'
| 'addCloneDossierTemplate'
| 'auditInfo'
@ -50,10 +48,6 @@ export class AdminDialogService extends DialogService<DialogType> {
component: EditColorDialogComponent,
dialogConfig: { autoFocus: true },
},
addEditUser: {
component: AddEditUserDialogComponent,
dialogConfig: { autoFocus: true },
},
smtpAuthConfig: {
component: SmtpAuthDialogComponent,
dialogConfig: { autoFocus: true },

View File

@ -1,15 +1,16 @@
import { AsyncPipe, DecimalPipe, NgForOf, NgIf } from '@angular/common';
import { Component, Input, OnInit } from '@angular/core';
import { MatIcon } from '@angular/material/icon';
import { getConfig, largeDialogConfig } from '@iqser/common-ui';
import { TranslateModule } from '@ngx-translate/core';
import { Dossier, DossierAttributeWithValue, DossierStats } from '@red/domain';
import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service';
import { FilesService } from '@services/files/files.service';
import { firstValueFrom, Observable } from 'rxjs';
import { DossierStatsService } from '@services/dossiers/dossier-stats.service';
import { DossiersDialogService } from '../../../shared-dossiers/services/dossiers-dialog.service';
import { getConfig } from '@iqser/common-ui';
import { MatIcon } from '@angular/material/icon';
import { AsyncPipe, DecimalPipe, NgForOf, NgIf } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core';
import { FilesService } from '@services/files/files.service';
import { DatePipe } from '@shared/pipes/date.pipe';
import { firstValueFrom, Observable } from 'rxjs';
import { EditDossierDialogComponent } from '../../../shared-dossiers/dialogs/edit-dossier-dialog/edit-dossier-dialog.component';
import { DossiersDialogService } from '../../../shared-dossiers/services/dossiers-dialog.service';
@Component({
selector: 'redaction-dossier-details-stats',
@ -41,7 +42,7 @@ export class DossierDetailsStatsComponent implements OnInit {
openEditDossierDialog(section: string): void {
const data = { dossierId: this.dossier.id, section };
this._dialogService.openDialog('editDossier', data, async () => {
this._dialogService.open(EditDossierDialogComponent, data, { ...largeDialogConfig, width: '98vw', maxWidth: '98vw' }, async () => {
await firstValueFrom(this._filesService.loadAll(this.dossier.id));
});
}

View File

@ -4,6 +4,7 @@ import {
ActionConfig,
getConfig,
IqserPermissionsService,
largeDialogConfig,
ListingMode,
ListingModes,
TableColumnConfig,
@ -41,7 +42,8 @@ import { UserService } from '@users/user.service';
import dayjs from 'dayjs';
import { BehaviorSubject, Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { annotationFilterChecker, RedactionFilterSorter, sortByName, sortArray } from '../../utils';
import { annotationFilterChecker, RedactionFilterSorter, sortArray, sortByName } from '../../utils';
import { EditDossierDialogComponent } from '../shared-dossiers/dialogs/edit-dossier-dialog/edit-dossier-dialog.component';
import { DossiersDialogService } from '../shared-dossiers/services/dossiers-dialog.service';
import { BulkActionsService } from './services/bulk-actions.service';
@ -472,6 +474,6 @@ export class ConfigService {
}
#openEditDossierDialog(dossierId: string) {
this._dialogService.openDialog('editDossier', { dossierId });
this._dialogService.open(EditDossierDialogComponent, { dossierId }, { ...largeDialogConfig, width: '98vw', maxWidth: '98vw' });
}
}

View File

@ -1,6 +1,11 @@
import { NgIf } from '@angular/common';
import { Component, OnInit } from '@angular/core';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { FormBuilder, ReactiveFormsModule, UntypedFormGroup } from '@angular/forms';
import { MatDialogClose } from '@angular/material/dialog';
import { MatFormField } from '@angular/material/form-field';
import { MatOption, MatSelect, MatSelectTrigger } from '@angular/material/select';
import { MatTooltip } from '@angular/material/tooltip';
import {
CircleButtonComponent,
DetailsRadioComponent,
@ -12,22 +17,17 @@ import {
IqserDialogComponent,
IqserPermissionsService,
} from '@iqser/common-ui';
import { TranslateModule } from '@ngx-translate/core';
import { Dictionary, Dossier, IAddRedactionRequest } from '@red/domain';
import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service';
import { DictionaryService } from '@services/entity-services/dictionary.service';
import { Roles } from '@users/roles';
import { tap } from 'rxjs/operators';
import { getRedactOrHintOptions, RedactOrHintOption, RedactOrHintOptions } from '../../utils/dialog-options';
import { AddHintData, AddHintResult } from '../../utils/dialog-types';
import { UserPreferenceService } from '@users/user-preference.service';
import { SystemDefaultOption, SystemDefaults } from '../../../account/utils/dialog-defaults';
import { stringToBoolean } from '@utils/functions';
import { MatFormField } from '@angular/material/form-field';
import { MatOption, MatSelect, MatSelectTrigger } from '@angular/material/select';
import { MatTooltip } from '@angular/material/tooltip';
import { NgIf } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core';
import { MatDialogClose } from '@angular/material/dialog';
import { tap } from 'rxjs/operators';
import { SystemDefaultOption, SystemDefaults } from '../../../account/utils/dialog-defaults';
import { getRedactOrHintOptions } from '../../utils/dialog-options';
import { AddHintData, AddHintResult, RedactOrHintOption, RedactOrHintOptions } from '../../utils/dialog-types';
@Component({
templateUrl: './add-hint-dialog.component.html',

View File

@ -1,4 +1,9 @@
import { CdkFixedSizeVirtualScroll, CdkVirtualForOf } from '@angular/cdk/scrolling';
import { NgIf, NgStyle } from '@angular/common';
import { Component } from '@angular/core';
import { FormBuilder, ReactiveFormsModule, UntypedFormGroup } from '@angular/forms';
import { MatDialogClose } from '@angular/material/dialog';
import { ReplaceNbspPipe } from '@common-ui/pipes/replace-nbsp.pipe';
import {
CircleButtonComponent,
DetailsRadioComponent,
@ -8,14 +13,9 @@ import {
IconButtonTypes,
IqserDialogComponent,
} from '@iqser/common-ui';
import { FormBuilder, ReactiveFormsModule, UntypedFormGroup } from '@angular/forms';
import { RemoveAnnotationData, RemoveAnnotationResult } from '../../../utils/dialog-types';
import { getRemoveRedactionOptions, RemoveAnnotationOption, RemoveAnnotationOptions } from '../../../utils/dialog-options';
import { TranslateModule } from '@ngx-translate/core';
import { CdkFixedSizeVirtualScroll, CdkVirtualForOf } from '@angular/cdk/scrolling';
import { NgIf, NgStyle } from '@angular/common';
import { ReplaceNbspPipe } from '@common-ui/pipes/replace-nbsp.pipe';
import { MatDialogClose } from '@angular/material/dialog';
import { getRemoveRedactionOptions } from '../../../utils/dialog-options';
import { RemoveAnnotationData, RemoveAnnotationOption, RemoveAnnotationOptions, RemoveAnnotationResult } from '../../../utils/dialog-types';
@Component({
templateUrl: 'remove-annotation-dialog.component.html',
@ -47,6 +47,13 @@ export class RemoveAnnotationDialogComponent extends IqserDialogComponent<
form!: UntypedFormGroup;
constructor(private readonly _formBuilder: FormBuilder) {
super();
this.options = getRemoveRedactionOptions(this.data, this.data.applyToAllDossiers, true);
this.redactedTexts = this.data.redactions.map(annotation => annotation.value);
this.form = this.#getForm();
}
get isFalsePositive(): boolean {
return this.form.get('option').value.value === RemoveAnnotationOptions.FALSE_POSITIVE;
}
@ -56,13 +63,6 @@ export class RemoveAnnotationDialogComponent extends IqserDialogComponent<
return selectedOption === RemoveAnnotationOptions.IN_DOSSIER || selectedOption === RemoveAnnotationOptions.FALSE_POSITIVE;
}
constructor(private readonly _formBuilder: FormBuilder) {
super();
this.options = getRemoveRedactionOptions(this.data, this.data.applyToAllDossiers, true);
this.redactedTexts = this.data.redactions.map(annotation => annotation.value);
this.form = this.#getForm();
}
save(): void {
this.dialogRef.close({ ...this.form.getRawValue(), applyToAllDossiers: this.#applyToAllDossiers });
}

View File

@ -1,5 +1,10 @@
import { NgForOf, NgIf } from '@angular/common';
import { Component, inject, OnInit } from '@angular/core';
import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';
import { MatDialogClose } from '@angular/material/dialog';
import { MatFormField } from '@angular/material/form-field';
import { MatOption, MatSelect, MatSelectTrigger } from '@angular/material/select';
import { MatTooltip } from '@angular/material/tooltip';
import {
CircleButtonComponent,
DetailsRadioOption,
@ -10,26 +15,21 @@ import {
IqserDenyDirective,
IqserDialogComponent,
} from '@iqser/common-ui';
import { TranslateModule } from '@ngx-translate/core';
import { Dictionary, SuperTypes } from '@red/domain';
import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service';
import { DictionaryService } from '@services/entity-services/dictionary.service';
import { JustificationsService } from '@services/entity-services/justifications.service';
import { firstValueFrom } from 'rxjs';
import { getEditRedactionOptions, RedactOrHintOption } from '../../utils/dialog-options';
import { EditRedactionData, EditRedactResult } from '../../utils/dialog-types';
import { LegalBasisOption } from '../manual-redaction-dialog/manual-annotation-dialog.component';
import { Roles } from '@users/roles';
import { DialogHelpModeKeys } from '../../utils/constants';
import { firstValueFrom } from 'rxjs';
import {
SelectedAnnotationsTableComponent,
ValueColumn,
} from '../../components/selected-annotations-table/selected-annotations-table.component';
import { TranslateModule } from '@ngx-translate/core';
import { MatFormField } from '@angular/material/form-field';
import { NgForOf, NgIf } from '@angular/common';
import { MatOption, MatSelect, MatSelectTrigger } from '@angular/material/select';
import { MatTooltip } from '@angular/material/tooltip';
import { MatDialogClose } from '@angular/material/dialog';
import { DialogHelpModeKeys } from '../../utils/constants';
import { getEditRedactionOptions } from '../../utils/dialog-options';
import { EditRedactionData, EditRedactResult, RedactOrHintOption } from '../../utils/dialog-types';
import { LegalBasisOption } from '../manual-redaction-dialog/manual-annotation-dialog.component';
interface TypeSelectOptions {
type: string;
@ -66,6 +66,7 @@ export class EditRedactionDialogComponent
{
readonly #dossier = inject(ActiveDossiersService).find(this.data.dossierId);
readonly #applyToAllDossiers = this.data.applyToAllDossiers;
protected readonly roles = Roles;
readonly annotations = this.data.annotations;
readonly iconButtonTypes = IconButtonTypes;
readonly isModifyDictionary = this.annotations.every(annotation => annotation.isModifyDictionary);
@ -90,8 +91,6 @@ export class EditRedactionDialogComponent
{ label: redaction.value, show: true, bold: true },
{ label: redaction.typeLabel, show: true },
]);
protected readonly roles = Roles;
options: DetailsRadioOption<RedactOrHintOption>[] | undefined;
legalOptions: LegalBasisOption[] = [];
dictionaries: Dictionary[] = [];

View File

@ -1,6 +1,11 @@
import { NgForOf, NgIf } from '@angular/common';
import { Component, inject, OnInit } from '@angular/core';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { FormBuilder, ReactiveFormsModule } from '@angular/forms';
import { MatDialogClose } from '@angular/material/dialog';
import { MatFormField } from '@angular/material/form-field';
import { MatOption, MatSelect, MatSelectTrigger } from '@angular/material/select';
import { MatTooltip } from '@angular/material/tooltip';
import {
CircleButtonComponent,
DetailsRadioComponent,
@ -11,25 +16,20 @@ import {
IqserDialogComponent,
} from '@iqser/common-ui';
import { AnnotationWrapper } from '@models/file/annotation.wrapper';
import { TranslateModule } from '@ngx-translate/core';
import { Dictionary, IAddRedactionRequest, SuperTypes } from '@red/domain';
import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service';
import { DictionaryService } from '@services/entity-services/dictionary.service';
import { JustificationsService } from '@services/entity-services/justifications.service';
import { firstValueFrom } from 'rxjs';
import { tap } from 'rxjs/operators';
import { getRedactOrHintOptions, RedactOrHintOption, RedactOrHintOptions } from '../../utils/dialog-options';
import { RedactRecommendationData, RedactRecommendationResult } from '../../utils/dialog-types';
import { LegalBasisOption } from '../manual-redaction-dialog/manual-annotation-dialog.component';
import {
SelectedAnnotationsTableComponent,
ValueColumn,
} from '../../components/selected-annotations-table/selected-annotations-table.component';
import { MatFormField } from '@angular/material/form-field';
import { NgForOf, NgIf } from '@angular/common';
import { MatOption, MatSelect, MatSelectTrigger } from '@angular/material/select';
import { MatTooltip } from '@angular/material/tooltip';
import { TranslateModule } from '@ngx-translate/core';
import { MatDialogClose } from '@angular/material/dialog';
import { getRedactOrHintOptions } from '../../utils/dialog-options';
import { RedactOrHintOption, RedactOrHintOptions, RedactRecommendationData, RedactRecommendationResult } from '../../utils/dialog-types';
import { LegalBasisOption } from '../manual-redaction-dialog/manual-annotation-dialog.component';
@Component({
templateUrl: './redact-recommendation-dialog.component.html',

View File

@ -1,6 +1,11 @@
import { AsyncPipe, NgClass, NgForOf, NgIf, NgStyle } from '@angular/common';
import { Component, inject, OnInit } from '@angular/core';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { FormBuilder, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';
import { MatDialogClose } from '@angular/material/dialog';
import { MatFormField } from '@angular/material/form-field';
import { MatOption, MatSelect, MatSelectTrigger } from '@angular/material/select';
import { MatTooltip } from '@angular/material/tooltip';
import {
CircleButtonComponent,
DetailsRadioComponent,
@ -10,25 +15,20 @@ import {
IconButtonTypes,
IqserDialogComponent,
} from '@iqser/common-ui';
import { TranslateModule } from '@ngx-translate/core';
import { Dictionary, IAddRedactionRequest, SuperTypes } from '@red/domain';
import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service';
import { DictionaryService } from '@services/entity-services/dictionary.service';
import { JustificationsService } from '@services/entity-services/justifications.service';
import { Roles } from '@users/roles';
import { UserPreferenceService } from '@users/user-preference.service';
import { calcTextWidthInPixels, stringToBoolean } from '@utils/functions';
import { firstValueFrom, Observable } from 'rxjs';
import { map, tap } from 'rxjs/operators';
import { getRedactOrHintOptions, RedactOrHintOption, RedactOrHintOptions } from '../../utils/dialog-options';
import { RedactTextData, RedactTextResult } from '../../utils/dialog-types';
import { LegalBasisOption } from '../manual-redaction-dialog/manual-annotation-dialog.component';
import { UserPreferenceService } from '@users/user-preference.service';
import { SystemDefaultOption, SystemDefaults } from '../../../account/utils/dialog-defaults';
import { AsyncPipe, NgClass, NgForOf, NgIf, NgStyle } from '@angular/common';
import { MatFormField } from '@angular/material/form-field';
import { MatOption, MatSelect, MatSelectTrigger } from '@angular/material/select';
import { MatTooltip } from '@angular/material/tooltip';
import { TranslateModule } from '@ngx-translate/core';
import { MatDialogClose } from '@angular/material/dialog';
import { getRedactOrHintOptions } from '../../utils/dialog-options';
import { RedactOrHintOption, RedactOrHintOptions, RedactTextData, RedactTextResult } from '../../utils/dialog-types';
import { LegalBasisOption } from '../manual-redaction-dialog/manual-annotation-dialog.component';
const MAXIMUM_TEXT_AREA_WIDTH = 421;
@ -60,6 +60,9 @@ export class RedactTextDialogComponent
extends IqserDialogComponent<RedactTextDialogComponent, RedactTextData, RedactTextResult>
implements OnInit
{
readonly #dossier = inject(ActiveDossiersService).find(this.data.dossierId);
readonly #manualRedactionTypeExists = inject(DictionaryService).hasManualType(this.#dossier.dossierTemplateId);
#applyToAllDossiers = this.applyToAll;
readonly roles = Roles;
readonly iconButtonTypes = IconButtonTypes;
readonly initialText = this.data?.manualRedactionEntryWrapper?.manualRedactionEntry?.value;
@ -72,36 +75,11 @@ export class RedactTextDialogComponent
selectedTextRows = 1;
readonly options: DetailsRadioOption<RedactOrHintOption>[];
readonly displayedDictionaryLabel$: Observable<string>;
readonly #dossier = inject(ActiveDossiersService).find(this.data.dossierId);
readonly #manualRedactionTypeExists = inject(DictionaryService).hasManualType(this.#dossier.dossierTemplateId);
#applyToAllDossiers = this.applyToAll;
readonly maximumTextAreaWidth = MAXIMUM_TEXT_AREA_WIDTH;
readonly maximumSelectedTextWidth = 567;
textWidth: number;
get isSystemDefault(): boolean {
return this._userPreferences.getAddRedactionDefaultOption() === SystemDefaultOption.SYSTEM_DEFAULT;
}
get defaultOption() {
const defaultOption = this.isSystemDefault
? this.#getOption(SystemDefaults.ADD_REDACTION_DEFAULT)
: this.#getOption(this._userPreferences.getAddRedactionDefaultOption() as RedactOrHintOption);
this.dictionaryRequest = defaultOption.value === RedactOrHintOptions.IN_DOSSIER;
if (this.dictionaryRequest) {
this.#setDictionaries();
return defaultOption;
}
return defaultOption ?? this.options[0];
}
get applyToAll() {
return this.isSystemDefault || this._userPreferences.getAddRedactionDefaultExtraOption() === 'undefined'
? this.data.applyToAllDossiers ?? true
: stringToBoolean(this._userPreferences.getAddRedactionDefaultExtraOption());
}
constructor(
private readonly _justificationsService: JustificationsService,
private readonly _dictionaryService: DictionaryService,
@ -137,6 +115,28 @@ export class RedactTextDialogComponent
);
}
get isSystemDefault(): boolean {
return this._userPreferences.getAddRedactionDefaultOption() === SystemDefaultOption.SYSTEM_DEFAULT;
}
get defaultOption() {
const defaultOption = this.isSystemDefault
? this.#getOption(SystemDefaults.ADD_REDACTION_DEFAULT)
: this.#getOption(this._userPreferences.getAddRedactionDefaultOption() as RedactOrHintOption);
this.dictionaryRequest = defaultOption.value === RedactOrHintOptions.IN_DOSSIER;
if (this.dictionaryRequest) {
this.#setDictionaries();
return defaultOption;
}
return defaultOption ?? this.options[0];
}
get applyToAll() {
return this.isSystemDefault || this._userPreferences.getAddRedactionDefaultExtraOption() === 'undefined'
? this.data.applyToAllDossiers ?? true
: stringToBoolean(this._userPreferences.getAddRedactionDefaultExtraOption());
}
async ngOnInit(): Promise<void> {
const data = await firstValueFrom(this._justificationsService.getForDossierTemplate(this.#dossier.dossierTemplateId));
this.legalOptions = data.map(lbm => ({

View File

@ -1,5 +1,8 @@
import { NgStyle } from '@angular/common';
import { Component, computed } from '@angular/core';
import { toSignal } from '@angular/core/rxjs-interop';
import { FormBuilder, ReactiveFormsModule, UntypedFormGroup } from '@angular/forms';
import { MatDialogClose } from '@angular/material/dialog';
import {
CircleButtonComponent,
DetailsRadioComponent,
@ -11,22 +14,19 @@ import {
IqserDenyDirective,
IqserDialogComponent,
} from '@iqser/common-ui';
import { getRemoveRedactionOptions, RemoveRedactionOption, RemoveRedactionOptions } from '../../utils/dialog-options';
import { RemoveRedactionData, RemoveRedactionResult } from '../../utils/dialog-types';
import { TranslateModule } from '@ngx-translate/core';
import { Roles } from '@users/roles';
import { DialogHelpModeKeys } from '../../utils/constants';
import { toSignal } from '@angular/core/rxjs-interop';
import { UserPreferenceService } from '@users/user-preference.service';
import { stringToBoolean } from '@utils/functions';
import { map } from 'rxjs/operators';
import { SystemDefaultOption, SystemDefaults } from '../../../account/utils/dialog-defaults';
import {
SelectedAnnotationsTableComponent,
ValueColumn,
} from '../../components/selected-annotations-table/selected-annotations-table.component';
import { UserPreferenceService } from '@users/user-preference.service';
import { SystemDefaultOption, SystemDefaults } from '../../../account/utils/dialog-defaults';
import { stringToBoolean } from '@utils/functions';
import { TranslateModule } from '@ngx-translate/core';
import { NgStyle } from '@angular/common';
import { MatDialogClose } from '@angular/material/dialog';
import { DialogHelpModeKeys } from '../../utils/constants';
import { getRemoveRedactionOptions } from '../../utils/dialog-options';
import { RemoveRedactionData, RemoveRedactionOption, RemoveRedactionOptions, RemoveRedactionResult } from '../../utils/dialog-types';
@Component({
templateUrl: './remove-redaction-dialog.component.html',
@ -51,12 +51,11 @@ export class RemoveRedactionDialogComponent extends IqserDialogComponent<
RemoveRedactionData,
RemoveRedactionResult
> {
protected readonly roles = Roles;
readonly iconButtonTypes = IconButtonTypes;
readonly recommendation = this.data.redactions.every(redaction => redaction.isRecommendation);
readonly hint = this.data.redactions.every(redaction => redaction.isHint);
readonly annotationsType = this.hint ? 'hint' : this.recommendation ? 'recommendation' : 'redaction';
readonly optionByType = {
recommendation: {
main: this._userPreferences.getRemoveRecommendationDefaultOption(),
@ -71,7 +70,6 @@ export class RemoveRedactionDialogComponent extends IqserDialogComponent<
extra: this._userPreferences.getRemoveRedactionDefaultExtraOption(),
},
};
readonly systemDefaultByType = {
recommendation: {
main: SystemDefaults.REMOVE_RECOMMENDATION_DEFAULT,
@ -86,24 +84,19 @@ export class RemoveRedactionDialogComponent extends IqserDialogComponent<
extra: false,
},
};
readonly #applyToAllDossiers = this.systemDefaultByType[this.annotationsType].extra;
readonly isSystemDefault = this.optionByType[this.annotationsType].main === SystemDefaultOption.SYSTEM_DEFAULT;
readonly isExtraOptionSystemDefault = this.optionByType[this.annotationsType].extra === 'undefined';
readonly defaultOptionPreference = this.isSystemDefault
? this.systemDefaultByType[this.annotationsType].main
: this.optionByType[this.annotationsType].main;
readonly extraOptionPreference = stringToBoolean(this.optionByType[this.annotationsType].extra);
readonly #applyToAllDossiers = this.systemDefaultByType[this.annotationsType].extra;
readonly options: DetailsRadioOption<RemoveRedactionOption>[] = getRemoveRedactionOptions(
this.data,
this.isSystemDefault || this.isExtraOptionSystemDefault ? this.#applyToAllDossiers : this.extraOptionPreference,
);
readonly skipped = this.data.redactions.some(annotation => annotation.isSkipped);
readonly redactedTexts = this.data.redactions.map(annotation => annotation.value);
protected readonly roles = Roles;
form: UntypedFormGroup = this._formBuilder.group({
comment: [null],
option: [this.defaultOption],

View File

@ -1,5 +1,9 @@
import { NgIf } from '@angular/common';
import { Component, inject } from '@angular/core';
import { FormBuilder, FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';
import { MatDialogClose } from '@angular/material/dialog';
import { MatFormField } from '@angular/material/form-field';
import { MatOption, MatSelect, MatSelectTrigger } from '@angular/material/select';
import {
CircleButtonComponent,
DetailsRadioComponent,
@ -9,15 +13,11 @@ import {
IconButtonTypes,
IqserDialogComponent,
} from '@iqser/common-ui';
import { TranslateModule } from '@ngx-translate/core';
import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service';
import { DictionariesMapService } from '@services/entity-services/dictionaries-map.service';
import { getResizeRedactionOptions, ResizeOptions, ResizeRedactionOption } from '../../utils/dialog-options';
import { ResizeRedactionData, ResizeRedactionResult } from '../../utils/dialog-types';
import { TranslateModule } from '@ngx-translate/core';
import { MatFormField } from '@angular/material/form-field';
import { MatOption, MatSelect, MatSelectTrigger } from '@angular/material/select';
import { MatDialogClose } from '@angular/material/dialog';
import { NgIf } from '@angular/common';
import { getResizeRedactionOptions } from '../../utils/dialog-options';
import { ResizeOptions, ResizeRedactionData, ResizeRedactionOption, ResizeRedactionResult } from '../../utils/dialog-types';
@Component({
templateUrl: './resize-redaction-dialog.component.html',

View File

@ -29,11 +29,11 @@ import { EditRedactionDialogComponent } from '../dialogs/edit-redaction-dialog/e
import { RedactRecommendationDialogComponent } from '../dialogs/redact-recommendation-dialog/redact-recommendation-dialog.component';
import { RemoveRedactionDialogComponent } from '../dialogs/remove-redaction-dialog/remove-redaction-dialog.component';
import { ResizeRedactionDialogComponent } from '../dialogs/resize-redaction-dialog/resize-redaction-dialog.component';
import { RemoveRedactionOptions } from '../utils/dialog-options';
import {
EditRedactionData,
EditRedactResult,
RemoveRedactionData,
RemoveRedactionOptions,
RemoveRedactionPermissions,
RemoveRedactionResult,
ResizeRedactionData,

View File

@ -1,10 +1,9 @@
import { effect, Injectable, Signal, signal } from '@angular/core';
import { bool } from '@iqser/common-ui/lib/utils';
import { REDAnnotationManager } from '../../pdf-viewer/services/annotation-manager.service';
import { FilePreviewStateService } from './file-preview-state.service';
import { getLocalStorageDataByFileId, setLocalStorageDataByFileId } from '@utils/local-storage';
export const HIDE_SKIPPED = 'hide-skipped';
import { REDAnnotationManager } from '../../pdf-viewer/services/annotation-manager.service';
import { HIDE_SKIPPED } from '../utils/constants';
import { FilePreviewStateService } from './file-preview-state.service';
@Injectable()
export class SkippedService {

View File

@ -53,3 +53,5 @@ export const TextPopups = {
ADD_RECTANGLE: 'add-rectangle',
ADD_FALSE_POSITIVE: 'add-false-positive',
} as const;
export const HIDE_SKIPPED = 'hide-skipped';

View File

@ -6,33 +6,20 @@ import { editRedactionTranslations, redactTextTranslations } from '@translations
import { removeAnnotationTranslations } from '@translations/remove-annotation-translations';
import { removeRedactionTranslations } from '@translations/remove-redaction-translations';
import { resizeRedactionTranslations } from '@translations/resize-redaction-translations';
import { RemoveRedactionData } from './dialog-types';
import {
RedactOrHintOption,
RedactOrHintOptions,
RemoveRedactionData,
RemoveRedactionOption,
RemoveRedactionOptions,
ResizeOptions,
ResizeRedactionOption,
} from './dialog-types';
const PIN_ICON = 'red:push-pin';
const FOLDER_ICON = 'red:folder';
const REMOVE_FROM_DICT_ICON = 'red:remove-from-dict';
export const RedactOrHintOptions = {
ONLY_HERE: 'ONLY_HERE',
IN_DOSSIER: 'IN_DOSSIER',
} as const;
export type RedactOrHintOption = keyof typeof RedactOrHintOptions;
export const ResizeOptions = RedactOrHintOptions;
export type ResizeRedactionOption = RedactOrHintOption;
export const RemoveRedactionOptions = {
ONLY_HERE: 'ONLY_HERE',
IN_DOSSIER: 'IN_DOSSIER',
FALSE_POSITIVE: 'FALSE_POSITIVE',
DO_NOT_RECOMMEND: 'DO_NOT_RECOMMEND',
} as const;
export const RemoveAnnotationOptions = RemoveRedactionOptions;
export type RemoveRedactionOption = keyof typeof RemoveRedactionOptions;
export type RemoveAnnotationOption = RemoveRedactionOption;
export const getEditRedactionOptions = (
dossierName: string,
applyToAllDossiers: boolean,

View File

@ -2,7 +2,27 @@ import { DetailsRadioOption } from '@iqser/common-ui';
import { AnnotationWrapper } from '@models/file/annotation.wrapper';
import { ManualRedactionEntryWrapper } from '@models/file/manual-redaction-entry.wrapper';
import { Dictionary, Dossier, File, IAddRedactionRequest, IManualRedactionEntry } from '@red/domain';
import { RemoveRedactionOption } from './dialog-options';
export const RedactOrHintOptions = {
ONLY_HERE: 'ONLY_HERE',
IN_DOSSIER: 'IN_DOSSIER',
} as const;
export type RedactOrHintOption = keyof typeof RedactOrHintOptions;
export const ResizeOptions = RedactOrHintOptions;
export type ResizeRedactionOption = RedactOrHintOption;
export const RemoveRedactionOptions = {
ONLY_HERE: 'ONLY_HERE',
IN_DOSSIER: 'IN_DOSSIER',
FALSE_POSITIVE: 'FALSE_POSITIVE',
DO_NOT_RECOMMEND: 'DO_NOT_RECOMMEND',
} as const;
export const RemoveAnnotationOptions = RemoveRedactionOptions;
export type RemoveRedactionOption = keyof typeof RemoveRedactionOptions;
export type RemoveAnnotationOption = RemoveRedactionOption;
export interface RedactTextData {
manualRedactionEntryWrapper: ManualRedactionEntryWrapper;

View File

@ -3,15 +3,15 @@ import { bool, List } from '@iqser/common-ui/lib/utils';
import { AnnotationWrapper } from '@models/file/annotation.wrapper';
import { Core } from '@pdftron/webviewer';
import { getLast, urlFileId } from '@utils/functions';
import { getLocalStorageDataByFileId } from '@utils/local-storage';
import { NGXLogger } from 'ngx-logger';
import { Subject } from 'rxjs';
import { HIDE_SKIPPED } from '../../file-preview/utils/constants';
import { AnnotationToolNames } from '../utils/constants';
import { asList, getId, isStringOrWrapper } from '../utils/functions';
import { AnnotationPredicate, DeleteAnnotationsOptions } from '../utils/types';
import AnnotationManager = Core.AnnotationManager;
import Annotation = Core.Annotations.Annotation;
import { getLocalStorageDataByFileId } from '@utils/local-storage';
import { HIDE_SKIPPED } from '../../file-preview/services/skipped.service';
const MODIFY_ACTION = 'modify';
const RESIZE_OPTION = 'resize';

View File

@ -1,17 +1,18 @@
import { AsyncPipe, NgIf } from '@angular/common';
import { Component, Input, OnChanges } from '@angular/core';
import { CircleButtonComponent, IqserAllowDirective, IqserPermissionsService } from '@iqser/common-ui';
import { CircleButtonComponent, IqserAllowDirective, IqserPermissionsService, largeDialogConfig } from '@iqser/common-ui';
import { getCurrentUser } from '@iqser/common-ui/lib/users';
import { TranslateModule } from '@ngx-translate/core';
import type { Dossier, File, User } from '@red/domain';
import { FilesMapService } from '@services/files/files-map.service';
import { PermissionsService } from '@services/permissions.service';
import { ReanalysisService } from '@services/reanalysis.service';
import { FileDownloadBtnComponent } from '@shared/components/buttons/file-download-btn/file-download-btn.component';
import { LongPressDirective, LongPressEvent } from '@shared/directives/long-press.directive';
import { Roles } from '@users/roles';
import { UserPreferenceService } from '@users/user-preference.service';
import { EditDossierDialogComponent } from '../../dialogs/edit-dossier-dialog/edit-dossier-dialog.component';
import { DossiersDialogService } from '../../services/dossiers-dialog.service';
import { TranslateModule } from '@ngx-translate/core';
import { AsyncPipe, NgIf } from '@angular/common';
import { FileDownloadBtnComponent } from '@shared/components/buttons/file-download-btn/file-download-btn.component';
@Component({
selector: 'redaction-dossiers-listing-actions [dossier]',
@ -54,7 +55,7 @@ export class DossiersListingActionsComponent implements OnChanges {
}
openEditDossierDialog(dossierId: string): void {
this._dialogService.openDialog('editDossier', { dossierId });
this._dialogService.open(EditDossierDialogComponent, { dossierId }, { ...largeDialogConfig, width: '98vw', maxWidth: '98vw' });
}
async reanalyseDossier(dossier: Dossier): Promise<void> {

View File

@ -42,12 +42,13 @@
[dossier]="dossier()"
></redaction-edit-dossier-download-package>
<redaction-edit-dossier-dictionary
*ngIf="activeNav() === 'dossierDictionary'"
[dossier]="dossier()"
></redaction-edit-dossier-dictionary>
@defer (when activeNav() === 'dossierDictionary') {
<redaction-edit-dossier-dictionary [dossier]="dossier()"></redaction-edit-dossier-dictionary>
}
<redaction-edit-dossier-team *ngIf="activeNav() === 'members'" [dossier]="dossier()"></redaction-edit-dossier-team>
@if (activeNav() === 'members') {
<redaction-edit-dossier-team [dossier]="dossier()"></redaction-edit-dossier-team>
}
<redaction-edit-dossier-attributes
*ngIf="activeNav() === 'dossierAttributes'"

View File

@ -1,9 +1,10 @@
import { NgForOf, NgIf } from '@angular/common';
import { AfterViewInit, Component, computed, Inject, Signal, signal, untracked, viewChild, WritableSignal } from '@angular/core';
import { toSignal } from '@angular/core/rxjs-interop';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { Dossier } from '@red/domain';
import { EditDossierGeneralInfoComponent } from './general-info/edit-dossier-general-info.component';
import { EditDossierDownloadPackageComponent } from './download-package/edit-dossier-download-package.component';
import { EditDossierSectionInterface } from './edit-dossier-section.interface';
import { MatIcon } from '@angular/material/icon';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { SideNavComponent } from '@common-ui/shared';
import {
BaseDialogComponent,
CircleButtonComponent,
@ -14,20 +15,20 @@ import {
IqserDenyDirective,
SaveOptions,
} from '@iqser/common-ui';
import { EditDossierDictionaryComponent } from './dictionary/edit-dossier-dictionary.component';
import { EditDossierAttributesComponent } from './attributes/edit-dossier-attributes.component';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { EditDossierTeamComponent } from './edit-dossier-team/edit-dossier-team.component';
import { PermissionsService } from '@services/permissions.service';
import { TranslateModule } from '@ngx-translate/core';
import { Dossier } from '@red/domain';
import { ConfigService } from '@services/config.service';
import { DossiersService } from '@services/dossiers/dossiers.service';
import { dossiersServiceProvider } from '@services/entity-services/dossiers.service.provider';
import { PermissionsService } from '@services/permissions.service';
import { Roles } from '@users/roles';
import { ConfigService } from '@services/config.service';
import { toSignal } from '@angular/core/rxjs-interop';
import { TranslateModule } from '@ngx-translate/core';
import { SideNavComponent } from '@common-ui/shared';
import { NgForOf, NgIf } from '@angular/common';
import { MatIcon } from '@angular/material/icon';
import { EditDossierAttributesComponent } from './attributes/edit-dossier-attributes.component';
import { EditDossierDictionaryComponent } from './dictionary/edit-dossier-dictionary.component';
import { EditDossierDownloadPackageComponent } from './download-package/edit-dossier-download-package.component';
import { EditDossierSectionInterface } from './edit-dossier-section.interface';
import { EditDossierTeamComponent } from './edit-dossier-team/edit-dossier-team.component';
import { EditDossierTeamModule } from './edit-dossier-team/edit-dossier-team.module';
import { EditDossierGeneralInfoComponent } from './general-info/edit-dossier-general-info.component';
type Section = 'dossierInfo' | 'downloadPackage' | 'dossierDictionary' | 'members' | 'dossierAttributes';
@ -54,7 +55,7 @@ interface NavItem {
EditDossierGeneralInfoComponent,
EditDossierDownloadPackageComponent,
EditDossierDictionaryComponent,
EditDossierTeamComponent,
EditDossierTeamModule,
EditDossierAttributesComponent,
IconButtonComponent,
HelpButtonComponent,
@ -75,11 +76,11 @@ export class EditDossierDialogComponent extends BaseDialogComponent implements A
readonly showHeading: Signal<boolean>;
readonly showActionButtons: Signal<boolean>;
generalInfoComponent = viewChild(EditDossierGeneralInfoComponent);
downloadPackageComponent = viewChild(EditDossierDownloadPackageComponent);
dictionaryComponent = viewChild(EditDossierDictionaryComponent);
membersComponent = viewChild(EditDossierTeamComponent);
attributesComponent = viewChild(EditDossierAttributesComponent);
readonly generalInfoComponent = viewChild(EditDossierGeneralInfoComponent);
readonly downloadPackageComponent = viewChild(EditDossierDownloadPackageComponent);
readonly dictionaryComponent = viewChild(EditDossierDictionaryComponent);
readonly membersComponent = viewChild(EditDossierTeamComponent);
readonly attributesComponent = viewChild(EditDossierAttributesComponent);
constructor(
private readonly _dossiersService: DossiersService,

View File

@ -1,6 +1,6 @@
import { ChangeDetectionStrategy, Component, inject, Input, OnChanges, SimpleChanges } from '@angular/core';
import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';
import { getConfig, InputWithActionComponent, RoundCheckboxComponent, StopPropagationDirective } from '@iqser/common-ui';
import { FormControl, FormGroup, Validators } from '@angular/forms';
import { getConfig } from '@iqser/common-ui';
import { Debounce } from '@iqser/common-ui/lib/utils';
import { Dossier, IDossierRequest } from '@red/domain';
import { DossiersService } from '@services/dossiers/dossiers.service';
@ -11,51 +11,25 @@ import { compareLists } from '@utils/functions';
import { firstValueFrom } from 'rxjs';
import { map } from 'rxjs/operators';
import { EditDossierSaveResult, EditDossierSectionInterface } from '../edit-dossier-section.interface';
import { MatFormField } from '@angular/material/form-field';
import { MatOption, MatSelect } from '@angular/material/select';
import { NamePipe } from '@common-ui/users/name.pipe';
import { AsyncPipe, NgForOf, NgIf } from '@angular/common';
import { TeamMembersComponent } from '@shared/components/team-members/team-members.component';
import { TranslateModule } from '@ngx-translate/core';
import { InitialsAvatarComponent } from '@common-ui/users';
import { MatIcon } from '@angular/material/icon';
@Component({
selector: 'redaction-edit-dossier-team',
templateUrl: './edit-dossier-team.component.html',
styleUrls: ['./edit-dossier-team.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [
ReactiveFormsModule,
MatFormField,
MatSelect,
MatOption,
NamePipe,
NgForOf,
NgIf,
AsyncPipe,
TeamMembersComponent,
TranslateModule,
InputWithActionComponent,
InitialsAvatarComponent,
StopPropagationDirective,
RoundCheckboxComponent,
MatIcon,
],
})
export class EditDossierTeamComponent implements EditDossierSectionInterface, OnChanges {
readonly #userService = inject(UserService);
readonly #dossiersService = inject(DossiersService);
readonly #permissionsService = inject(PermissionsService);
readonly #filesService = inject(FilesService);
form = this.#getForm();
readonly #formValue$ = this.form.valueChanges;
searchQuery = '';
@Input() dossier: Dossier;
membersSelectOptions: string[] = [];
readonly isDocumine = getConfig().IS_DOCUMINE;
readonly #userService = inject(UserService);
readonly ownersSelectOptions = this.#userService.all.filter(u => u.isManager).map(m => m.id);
readonly #dossiersService = inject(DossiersService);
readonly #permissionsService = inject(PermissionsService);
readonly #filesService = inject(FilesService);
readonly #formValue$ = this.form.valueChanges;
readonly selectedReviewers$ = this.#formValue$.pipe(map(v => v.members.filter(m => !v.approvers.includes(m))));
readonly selectedApprovers$ = this.#formValue$.pipe(map(v => v.approvers));

View File

@ -0,0 +1,42 @@
import { AsyncPipe, NgForOf, NgIf } from '@angular/common';
import { NgModule } from '@angular/core';
import { ReactiveFormsModule } from '@angular/forms';
import { MatFormField } from '@angular/material/form-field';
import { MatIcon } from '@angular/material/icon';
import { MatOption, MatSelect } from '@angular/material/select';
import { InitialsAvatarComponent } from '@common-ui/users';
import { NamePipe } from '@common-ui/users/name.pipe';
import {
CircleButtonComponent,
InputWithActionComponent,
IqserAllowDirective,
RoundCheckboxComponent,
StopPropagationDirective,
} from '@iqser/common-ui';
import { TranslateModule } from '@ngx-translate/core';
import { TeamMembersComponent } from '@shared/components/team-members/team-members.component';
import { EditDossierTeamComponent } from './edit-dossier-team.component';
@NgModule({
declarations: [EditDossierTeamComponent, TeamMembersComponent],
exports: [EditDossierTeamComponent, TeamMembersComponent],
imports: [
ReactiveFormsModule,
MatFormField,
MatSelect,
MatOption,
NamePipe,
NgForOf,
NgIf,
AsyncPipe,
TranslateModule,
InputWithActionComponent,
InitialsAvatarComponent,
StopPropagationDirective,
RoundCheckboxComponent,
MatIcon,
CircleButtonComponent,
IqserAllowDirective,
],
})
export class EditDossierTeamModule {}

View File

@ -1,12 +1,16 @@
import { NgForOf, NgIf } from '@angular/common';
import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core';
import { ReactiveFormsModule, UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
import { Dossier, DOSSIER_TEMPLATE_ID, IDossierRequest, IDossierTemplate } from '@red/domain';
import { EditDossierSaveResult, EditDossierSectionInterface } from '../edit-dossier-section.interface';
import { DossiersDialogService } from '../../../services/dossiers-dialog.service';
import { PermissionsService } from '@services/permissions.service';
import { Router } from '@angular/router';
import { MatCheckbox } from '@angular/material/checkbox';
import { MatDatepickerModule } from '@angular/material/datepicker';
import { MatDialogRef } from '@angular/material/dialog';
import { EditDossierDialogComponent } from '../edit-dossier-dialog.component';
import { MatFormField, MatSuffix } from '@angular/material/form-field';
import { MatIcon } from '@angular/material/icon';
import { MatOption, MatSelect } from '@angular/material/select';
import { MatTooltip } from '@angular/material/tooltip';
import { Router } from '@angular/router';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { SmallChipComponent } from '@common-ui/shared';
import {
ConfirmOptions,
HasScrollbarDirective,
@ -17,25 +21,21 @@ import {
TitleColors,
Toaster,
} from '@iqser/common-ui';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service';
import { DossierStatsService } from '@services/dossiers/dossier-stats.service';
import { firstValueFrom } from 'rxjs';
import { TranslateModule, TranslateService } from '@ngx-translate/core';
import { DossiersService } from '@services/dossiers/dossiers.service';
import { TrashService } from '@services/entity-services/trash.service';
import { Dossier, DOSSIER_TEMPLATE_ID, IDossierRequest, IDossierTemplate } from '@red/domain';
import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service';
import { ArchivedDossiersService } from '@services/dossiers/archived-dossiers.service';
import { DossierStatsService } from '@services/dossiers/dossier-stats.service';
import { DossiersService } from '@services/dossiers/dossiers.service';
import { DossierStatesMapService } from '@services/entity-services/dossier-states-map.service';
import dayjs from 'dayjs';
import { TrashService } from '@services/entity-services/trash.service';
import { PermissionsService } from '@services/permissions.service';
import { dateWithoutTime } from '@utils/functions';
import { MatFormField, MatSuffix } from '@angular/material/form-field';
import { MatOption, MatSelect } from '@angular/material/select';
import { NgForOf, NgIf } from '@angular/common';
import { MatTooltip } from '@angular/material/tooltip';
import { SmallChipComponent } from '@common-ui/shared';
import { MatCheckbox } from '@angular/material/checkbox';
import { MatDatepickerModule } from '@angular/material/datepicker';
import { MatIcon } from '@angular/material/icon';
import dayjs from 'dayjs';
import { firstValueFrom } from 'rxjs';
import { DossiersDialogService } from '../../../services/dossiers-dialog.service';
import { type EditDossierDialogComponent } from '../edit-dossier-dialog.component';
import { EditDossierSaveResult, EditDossierSectionInterface } from '../edit-dossier-section.interface';
@Component({
selector: 'redaction-edit-dossier-general-info',

View File

@ -1,10 +1,9 @@
import { Injectable } from '@angular/core';
import { MatDialog } from '@angular/material/dialog';
import { ConfirmationDialogComponent, DialogConfig, DialogService, largeDialogConfig } from '@iqser/common-ui';
import { ConfirmationDialogComponent, DialogConfig, DialogService } from '@iqser/common-ui';
import { ImportRedactionsDialogComponent } from '../../file-preview/dialogs/import-redactions-dialog/import-redactions-dialog';
import { EditDossierDialogComponent } from '../dialogs/edit-dossier-dialog/edit-dossier-dialog.component';
type DialogType = 'confirm' | 'editDossier' | 'importRedactions';
type DialogType = 'confirm' | 'importRedactions';
@Injectable({
providedIn: 'root',
@ -15,10 +14,6 @@ export class DossiersDialogService extends DialogService<DialogType> {
component: ConfirmationDialogComponent,
dialogConfig: { disableClose: false },
},
editDossier: {
component: EditDossierDialogComponent,
dialogConfig: { ...largeDialogConfig, width: '98vw', maxWidth: '98vw' },
},
importRedactions: {
component: ImportRedactionsDialogComponent,
dialogConfig: { disableClose: false },

View File

@ -1,21 +1,17 @@
import { Component, ElementRef, EventEmitter, inject, Input, OnChanges, Output, ViewChild } from '@angular/core';
import { CircleButtonComponent, CircleButtonTypes, IqserAllowDirective } from '@iqser/common-ui';
import { DossiersDialogService } from '../../../shared-dossiers/services/dossiers-dialog.service';
import { Roles } from '@users/roles';
import { User } from '@red/domain';
import { UserService } from '@users/user.service';
import { getCurrentUser, InitialsAvatarComponent } from '@iqser/common-ui/lib/users';
import { CircleButtonTypes, largeDialogConfig } from '@iqser/common-ui';
import { getCurrentUser } from '@iqser/common-ui/lib/users';
import { List } from '@iqser/common-ui/lib/utils';
import { NgForOf, NgIf } from '@angular/common';
import { MatIcon } from '@angular/material/icon';
import { TranslateModule } from '@ngx-translate/core';
import { User } from '@red/domain';
import { Roles } from '@users/roles';
import { UserService } from '@users/user.service';
import { EditDossierDialogComponent } from '../../../shared-dossiers/dialogs/edit-dossier-dialog/edit-dossier-dialog.component';
import { DossiersDialogService } from '../../../shared-dossiers/services/dossiers-dialog.service';
@Component({
selector: 'redaction-team-members',
templateUrl: './team-members.component.html',
styleUrls: ['./team-members.component.scss'],
standalone: true,
imports: [NgForOf, MatIcon, NgIf, CircleButtonComponent, IqserAllowDirective, TranslateModule, InitialsAvatarComponent],
})
export class TeamMembersComponent implements OnChanges {
readonly circleButtonTypes = CircleButtonTypes;
@ -65,6 +61,6 @@ export class TeamMembersComponent implements OnChanges {
openEditDossierDialog(): void {
const data = { dossierId: this.dossierId, section: 'members' };
this._dialogService.openDialog('editDossier', data);
this._dialogService.open(EditDossierDialogComponent, data, { ...largeDialogConfig, width: '98vw', maxWidth: '98vw' });
}
}

View File

@ -1,6 +1,13 @@
import { NgForOf, NgIf } from '@angular/common';
import { Component, Inject, OnInit } from '@angular/core';
import { ReactiveFormsModule, Validators } from '@angular/forms';
import { MatCheckbox } from '@angular/material/checkbox';
import { MatDatepickerModule } from '@angular/material/datepicker';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { MatFormField, MatSuffix } from '@angular/material/form-field';
import { MatIcon } from '@angular/material/icon';
import { MatOption, MatSelect } from '@angular/material/select';
import { MatTooltip } from '@angular/material/tooltip';
import { Router } from '@angular/router';
import {
BaseDialogComponent,
@ -12,27 +19,22 @@ import {
IconButtonTypes,
IqserDenyDirective,
IqserPermissionsService,
largeDialogConfig,
SaveOptions,
} from '@iqser/common-ui';
import { TranslateModule } from '@ngx-translate/core';
import { DOSSIER_TEMPLATE_ID, DownloadFileType, IDossierRequest, IDossierTemplate, IReportTemplate } from '@red/domain';
import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service';
import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service';
import { ReportTemplateService } from '@services/report-template.service';
import { WatermarkSelectorComponent } from '@shared/components/dossier-watermark-selector/watermark-selector.component';
import { SelectComponent } from '@shared/components/select/select.component';
import { downloadTypesTranslations } from '@translations/download-types-translations';
import { Roles } from '@users/roles';
import dayjs from 'dayjs';
import { firstValueFrom } from 'rxjs';
import { EditDossierDialogComponent } from '../../../shared-dossiers/dialogs/edit-dossier-dialog/edit-dossier-dialog.component';
import { DossiersDialogService } from '../../../shared-dossiers/services/dossiers-dialog.service';
import { NgForOf, NgIf } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core';
import { MatFormField, MatSuffix } from '@angular/material/form-field';
import { MatOption, MatSelect } from '@angular/material/select';
import { MatTooltip } from '@angular/material/tooltip';
import { WatermarkSelectorComponent } from '@shared/components/dossier-watermark-selector/watermark-selector.component';
import { MatCheckbox } from '@angular/material/checkbox';
import { MatDatepickerModule } from '@angular/material/datepicker';
import { MatIcon } from '@angular/material/icon';
import { SelectComponent } from '@shared/components/select/select.component';
interface DialogData {
readonly dossierTemplateId?: string;
@ -123,10 +125,14 @@ export class AddDossierDialogComponent extends BaseDialogComponent implements On
if (savedDossier) {
await this._router.navigate([savedDossier.routerLink]);
if (options?.nextAction) {
this._dialogService.openDialog('editDossier', {
dossierId: savedDossier.id,
section: 'members',
});
this._dialogService.open(
EditDossierDialogComponent,
{
dossierId: savedDossier.id,
section: 'members',
},
{ ...largeDialogConfig, width: '98vw', maxWidth: '98vw' },
);
}
this._dialogRef.close(savedDossier);
}

View File

@ -1,6 +1,6 @@
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { RemoveAnnotationOption } from '../modules/file-preview/utils/dialog-options';
import { DialogOption } from '@translations/redact-text-translations';
import { RemoveAnnotationOption } from '../modules/file-preview/utils/dialog-types';
export const removeAnnotationTranslations: { [key in RemoveAnnotationOption]: DialogOption } = {
ONLY_HERE: {

View File

@ -1,6 +1,6 @@
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { RemoveRedactionOption } from '../modules/file-preview/utils/dialog-options';
import { DialogOption } from '@translations/redact-text-translations';
import { RemoveRedactionOption } from '../modules/file-preview/utils/dialog-types';
export const removeRedactionTranslations: { [key in RemoveRedactionOption]: DialogOption } = {
ONLY_HERE: {

View File

@ -1,7 +1,7 @@
import { Injectable } from '@angular/core';
import { IqserUserPreferenceService, ListingMode } from '@iqser/common-ui';
import { RedactOrHintOption, RemoveRedactionOption } from '../modules/file-preview/utils/dialog-options';
import { SystemDefaultOption, SystemDefaultType } from '../modules/account/utils/dialog-defaults';
import { RedactOrHintOption, RemoveRedactionOption } from '../modules/file-preview/utils/dialog-types';
export const PreferencesKeys = {
dossierRecent: 'Dossier-Recent',

View File

@ -1,5 +1,5 @@
import { handleCheckedValue, INestedFilter } from '@iqser/common-ui/lib/filtering';
import { ComponentLogEntry, Dossier, File, User, UserType } from '@red/domain';
import { Dossier, File, User, UserType } from '@red/domain';
export function handleFilterDelta(oldFilters: INestedFilter[], newFilters: INestedFilter[], allFilters: INestedFilter[]) {
const newFiltersDelta = {};

@ -1 +1 @@
Subproject commit 04ae68891c9298b92327868006d1e7c79529c7e6
Subproject commit d595a22db164ec8669da572fdd49a28b464eb61a

View File

@ -1,6 +1,5 @@
import { IListable } from '@iqser/common-ui';
import { IDossierAttributeConfig } from './dossier-attribute-config';
import { DossierAttributeConfigType } from './types';
import { DossierAttributeConfigType, IDossierAttributeConfig } from './dossier-attribute-config';
export class DossierAttributeConfig implements IDossierAttributeConfig, IListable {
readonly id: string;

View File

@ -1,4 +1,13 @@
import { DossierAttributeConfigType } from './types';
export const DossierAttributeConfigTypes = {
DATE: 'DATE',
IMAGE: 'IMAGE',
NUMBER: 'NUMBER',
TEXT: 'TEXT',
} as const;
export type DossierAttributeConfigType = keyof typeof DossierAttributeConfigTypes;
export type DossierAttributeWithValue = IDossierAttributeConfig & { value: string };
export interface IDossierAttributeConfig {
readonly id: string;

View File

@ -1,4 +1,3 @@
export * from './types';
export * from './dossier-attribute-config';
export * from './dossier-attribute-config.model';
export * from './dossier-attribute';

View File

@ -1,12 +0,0 @@
import { IDossierAttributeConfig } from './dossier-attribute-config';
export const DossierAttributeConfigTypes = {
DATE: 'DATE',
IMAGE: 'IMAGE',
NUMBER: 'NUMBER',
TEXT: 'TEXT',
} as const;
export type DossierAttributeConfigType = keyof typeof DossierAttributeConfigTypes;
export type DossierAttributeWithValue = IDossierAttributeConfig & { value: string };

View File

@ -1,4 +1,11 @@
import { isProcessingStatuses, OCR_STATES, PENDING_STATES, PROCESSED_STATES, PROCESSING_STATES, ProcessingFileStatus } from '../files';
import {
isProcessingStatuses,
OCR_STATES,
PENDING_STATES,
PROCESSED_STATES,
PROCESSING_STATES,
ProcessingFileStatus,
} from '../files/types';
import { IDossierStats } from './dossier-stats';
import { FileCountPerProcessingStatus, FileCountPerWorkflowStatus } from './types';

View File

@ -1,4 +1,4 @@
import { ProcessingFileStatus, WorkflowFileStatus } from '../files';
import { ProcessingFileStatus, WorkflowFileStatus } from '../files/types';
export type FileCountPerWorkflowStatus = { [key in WorkflowFileStatus]?: number };
export type FileCountPerProcessingStatus = { [key in ProcessingFileStatus]?: number };

View File

@ -1,6 +1,6 @@
import { IListable } from '@iqser/common-ui';
import { List } from '@iqser/common-ui/lib/utils';
import { DownloadFileType } from '../shared';
import { DownloadFileType } from '../shared/types';
import { ARCHIVE_ROUTE, DOSSIERS_ROUTE } from './constants';
import { IDossier } from './dossier';

View File

@ -1,5 +1,5 @@
import { DownloadFileType } from '../shared';
import { List } from '@iqser/common-ui/lib/utils';
import { DownloadFileType } from '../shared/types';
export interface IDossier {
readonly approverIds: List;

View File

@ -1,8 +1,8 @@
import { Entity } from '@iqser/common-ui';
import { ProcessingType, ProcessingTypes } from '../dossier-stats';
import { ARCHIVE_ROUTE, DOSSIERS_ROUTE } from '../dossiers';
import { FileAttributes } from '../file-attributes';
import { StatusSorter } from '../shared';
import { ProcessingType, ProcessingTypes } from '../dossier-stats/dossier-stats.model';
import { ARCHIVE_ROUTE, DOSSIERS_ROUTE } from '../dossiers/constants';
import { FileAttributes } from '../file-attributes/file-attributes';
import { StatusSorter } from '../shared/sorters/status-sorter';
import { IFile } from './file';
import {
isFullProcessingStatuses,

View File

@ -1,5 +1,5 @@
import { Entity } from '@iqser/common-ui';
import { IViewedPage } from '.';
import { IViewedPage } from './viewed-page';
export class ViewedPage extends Entity<IViewedPage, number> {
readonly fileId: string;

View File

@ -1,3 +1,3 @@
import { WorkflowFileStatus } from '../files';
import { WorkflowFileStatus } from '../files/types';
export type Color = WorkflowFileStatus | string;

View File

@ -1,7 +1,7 @@
import { Observable } from 'rxjs';
import { CircleButtonType, ITrackable } from '@iqser/common-ui';
import { type File } from '../files';
import { type Dossier } from '../dossiers';
import { Observable } from 'rxjs';
import { Dossier } from '../dossiers/dossier.model';
import { File } from '../files/file.model';
export const ActionTypes = {
circleBtn: 'circleBtn',

View File

@ -1,4 +1,4 @@
import { WorkflowFileStatus } from '../../files';
import { WorkflowFileStatus } from '../../files/types';
type StatusSorterItem = { key: WorkflowFileStatus } | WorkflowFileStatus | string;
type Sorter = Record<WorkflowFileStatus, number> & {