Merge remote-tracking branch 'origin/master' into release/4.839.x

This commit is contained in:
Dan Percic 2024-12-05 13:37:08 +02:00
commit b9197b1eb3
298 changed files with 3791 additions and 5920 deletions

View File

@ -16,6 +16,7 @@
}, },
"rules": { "rules": {
"rxjs/no-ignored-subscription": "warn", "rxjs/no-ignored-subscription": "warn",
"@angular-eslint/prefer-standalone": "off",
"@angular-eslint/no-conflicting-lifecycle": "error", "@angular-eslint/no-conflicting-lifecycle": "error",
"@angular-eslint/no-host-metadata-property": "error", "@angular-eslint/no-host-metadata-property": "error",
"@angular-eslint/no-input-rename": "error", "@angular-eslint/no-input-rename": "error",

View File

@ -50,7 +50,7 @@
{ {
"glob": "**/*", "glob": "**/*",
"input": "node_modules/@pdftron/webviewer/public/", "input": "node_modules/@pdftron/webviewer/public/",
"output": "/assets/wv-resources/11.0.0/" "output": "/assets/wv-resources/11.1.0/"
}, },
{ {
"glob": "**/*", "glob": "**/*",

View File

@ -4,26 +4,27 @@ import { UserPreferenceService } from '@users/user-preference.service';
import { getConfig } from '@iqser/common-ui'; import { getConfig } from '@iqser/common-ui';
import { AppConfig } from '@red/domain'; import { AppConfig } from '@red/domain';
import { NavigationEnd, Router } from '@angular/router'; import { NavigationEnd, Router } from '@angular/router';
import { filter, map, switchMap, take } from 'rxjs/operators'; import { filter, map, switchMap, take, tap } from 'rxjs/operators';
import { APP_TYPE_PATHS } from '@common-ui/utils/constants';
import { MatIconRegistry } from '@angular/material/icon';
import { DomSanitizer } from '@angular/platform-browser';
import { TenantsService } from '@common-ui/tenants';
function loadCustomTheme() { export function loadCustomTheme(cssFileName: string) {
const cssFileName = getConfig<AppConfig>().THEME; const head = document.getElementsByTagName('head')[0];
const link = document.createElement('link');
if (cssFileName) { link.id = cssFileName;
const head = document.getElementsByTagName('head')[0]; link.rel = 'stylesheet';
const link = document.createElement('link'); link.type = 'text/css';
link.id = cssFileName; link.href = 'assets/styles/themes/' + cssFileName + '.css';
link.rel = 'stylesheet'; link.media = 'all';
link.type = 'text/css'; head.appendChild(link);
link.href = 'assets/styles/themes/' + cssFileName + '.css';
link.media = 'all';
head.appendChild(link);
}
} }
@Component({ @Component({
selector: 'redaction-root', selector: 'redaction-root',
templateUrl: './app.component.html', templateUrl: './app.component.html',
standalone: false,
}) })
export class AppComponent { export class AppComponent {
constructor( constructor(
@ -34,9 +35,12 @@ export class AppComponent {
userPreferenceService: UserPreferenceService, userPreferenceService: UserPreferenceService,
renderer: Renderer2, renderer: Renderer2,
private readonly _router: Router, private readonly _router: Router,
private readonly _iconRegistry: MatIconRegistry,
private readonly _sanitizer: DomSanitizer,
private readonly _tenantsService: TenantsService,
) { ) {
const config = getConfig<AppConfig>();
renderer.addClass(document.body, userPreferenceService.getTheme()); renderer.addClass(document.body, userPreferenceService.getTheme());
loadCustomTheme();
const removeQueryParams = _router.events.pipe( const removeQueryParams = _router.events.pipe(
filter((event): event is NavigationEnd => event instanceof NavigationEnd), filter((event): event is NavigationEnd => event instanceof NavigationEnd),
@ -47,9 +51,25 @@ export class AppComponent {
); );
removeQueryParams.subscribe(); removeQueryParams.subscribe();
if (getConfig().IS_DOCUMINE) { this._tenantsService
document.getElementById('favicon').setAttribute('href', 'assets/icons/documine-logo.ico'); .waitForSettingTenant()
} .pipe(
tap(() => {
const isDocumine = this._tenantsService.activeTenant.documine;
const logo = isDocumine ? 'documine' : 'redaction';
_iconRegistry.addSvgIconInNamespace(
'iqser',
'logo',
_sanitizer.bypassSecurityTrustResourceUrl(`/assets/icons/general/${logo}-logo.svg`),
);
if (isDocumine) {
document.getElementById('favicon').setAttribute('href', 'assets/icons/documine-logo.ico');
}
loadCustomTheme(isDocumine ? APP_TYPE_PATHS.SCM : APP_TYPE_PATHS.REDACT);
}),
take(1),
)
.subscribe();
} }
#removeKeycloakQueryParams() { #removeKeycloakQueryParams() {

View File

@ -1,6 +1,6 @@
import { APP_BASE_HREF, DatePipe as BaseDatePipe } from '@angular/common'; import { APP_BASE_HREF, DatePipe as BaseDatePipe } from '@angular/common';
import { HTTP_INTERCEPTORS } from '@angular/common/http'; import { HTTP_INTERCEPTORS } from '@angular/common/http';
import { ENVIRONMENT_INITIALIZER, ErrorHandler, inject, NgModule } from '@angular/core'; import { ErrorHandler, inject, NgModule, provideEnvironmentInitializer } from '@angular/core';
import { MatDividerModule } from '@angular/material/divider'; import { MatDividerModule } from '@angular/material/divider';
import { MatIcon } from '@angular/material/icon'; import { MatIcon } from '@angular/material/icon';
import { MatMenu, MatMenuContent, MatMenuItem, MatMenuTrigger } from '@angular/material/menu'; import { MatMenu, MatMenuContent, MatMenuItem, MatMenuTrigger } from '@angular/material/menu';
@ -117,7 +117,7 @@ export const appModuleFactory = (config: AppConfig) => {
resetTimeoutOnDuplicate: true, resetTimeoutOnDuplicate: true,
}), }),
TenantsModule.forRoot(), TenantsModule.forRoot(),
IqserTranslateModule.forRoot({ pathPrefix: config.BASE_TRANSLATIONS_DIRECTORY || '/assets/i18n/redact/' }), IqserTranslateModule.forRoot({ pathPrefix: config.BASE_TRANSLATIONS_DIRECTORY }),
IqserLoadingModule.forRoot(), IqserLoadingModule.forRoot(),
ServiceWorkerModule.register('ngsw-worker.js', { enabled: environment.production }), ServiceWorkerModule.register('ngsw-worker.js', { enabled: environment.production }),
LoggerModule.forRoot(undefined, { LoggerModule.forRoot(undefined, {
@ -233,14 +233,10 @@ export const appModuleFactory = (config: AppConfig) => {
provide: ErrorHandler, provide: ErrorHandler,
useClass: GlobalErrorHandler, useClass: GlobalErrorHandler,
}, },
{ provideEnvironmentInitializer(async () => {
provide: ENVIRONMENT_INITIALIZER, const languageService = inject(LanguageService);
multi: true, return languageService.setInitialLanguage();
useValue: async () => { }),
const languageService = inject(LanguageService);
return languageService.setInitialLanguage();
},
},
{ {
provide: MAX_RETRIES_ON_SERVER_ERROR, provide: MAX_RETRIES_ON_SERVER_ERROR,
useFactory: () => config.MAX_RETRIES_ON_SERVER_ERROR, useFactory: () => config.MAX_RETRIES_ON_SERVER_ERROR,
@ -261,6 +257,7 @@ export const appModuleFactory = (config: AppConfig) => {
provide: MAT_TOOLTIP_DEFAULT_OPTIONS, provide: MAT_TOOLTIP_DEFAULT_OPTIONS,
useValue: { useValue: {
disableTooltipInteractivity: true, disableTooltipInteractivity: true,
showDelay: 1,
}, },
}, },
BaseDatePipe, BaseDatePipe,

View File

@ -7,6 +7,7 @@ import { AppConfig } from '@red/domain';
selector: 'redaction-auth-error', selector: 'redaction-auth-error',
templateUrl: './auth-error.component.html', templateUrl: './auth-error.component.html',
styleUrls: ['./auth-error.component.scss'], styleUrls: ['./auth-error.component.scss'],
standalone: false,
}) })
export class AuthErrorComponent { export class AuthErrorComponent {
readonly #config = getConfig<AppConfig>(); readonly #config = getConfig<AppConfig>();

View File

@ -20,6 +20,7 @@ const isSearchScreen: (url: string) => boolean = url => url.includes('/search');
@Component({ @Component({
templateUrl: './base-screen.component.html', templateUrl: './base-screen.component.html',
styleUrls: ['./base-screen.component.scss'], styleUrls: ['./base-screen.component.scss'],
standalone: false,
}) })
export class BaseScreenComponent { export class BaseScreenComponent {
readonly roles = Roles; readonly roles = Roles;

View File

@ -7,6 +7,7 @@ import { Breadcrumb, BreadcrumbDisplayType, BreadcrumbsService } from '@services
selector: 'redaction-breadcrumbs', selector: 'redaction-breadcrumbs',
templateUrl: './breadcrumbs.component.html', templateUrl: './breadcrumbs.component.html',
styleUrls: ['./breadcrumbs.component.scss'], styleUrls: ['./breadcrumbs.component.scss'],
standalone: false,
}) })
export class BreadcrumbsComponent { export class BreadcrumbsComponent {
constructor(readonly breadcrumbsService: BreadcrumbsService) {} constructor(readonly breadcrumbsService: BreadcrumbsService) {}

View File

@ -13,6 +13,7 @@ import { firstValueFrom } from 'rxjs';
entitiesService: FileDownloadService, entitiesService: FileDownloadService,
component: DownloadsListScreenComponent, component: DownloadsListScreenComponent,
}), }),
standalone: false,
}) })
export class DownloadsListScreenComponent extends ListingComponent<DownloadStatus> implements OnDestroy { export class DownloadsListScreenComponent extends ListingComponent<DownloadStatus> implements OnDestroy {
readonly #interval: number; readonly #interval: number;

View File

@ -25,6 +25,7 @@ function chronologically(first: string, second: string) {
selector: 'redaction-notifications', selector: 'redaction-notifications',
templateUrl: './notifications.component.html', templateUrl: './notifications.component.html',
styleUrls: ['./notifications.component.scss'], styleUrls: ['./notifications.component.scss'],
standalone: false,
}) })
export class NotificationsComponent { export class NotificationsComponent {
readonly hasUnreadNotifications$: Observable<boolean>; readonly hasUnreadNotifications$: Observable<boolean>;

View File

@ -5,5 +5,6 @@ import { ChangeDetectionStrategy, Component } from '@angular/core';
templateUrl: './dashboard-skeleton.component.html', templateUrl: './dashboard-skeleton.component.html',
styleUrls: ['./dashboard-skeleton.component.scss'], styleUrls: ['./dashboard-skeleton.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: false,
}) })
export class DashboardSkeletonComponent {} export class DashboardSkeletonComponent {}

View File

@ -5,6 +5,7 @@ import { ChangeDetectionStrategy, Component, OnInit, TemplateRef, ViewChild } fr
templateUrl: './dossier-skeleton.component.html', templateUrl: './dossier-skeleton.component.html',
styleUrls: ['./dossier-skeleton.component.scss'], styleUrls: ['./dossier-skeleton.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: false,
}) })
export class DossierSkeletonComponent implements OnInit { export class DossierSkeletonComponent implements OnInit {
@ViewChild('workload1', { static: true }) workload1: TemplateRef<unknown>; @ViewChild('workload1', { static: true }) workload1: TemplateRef<unknown>;

View File

@ -5,5 +5,6 @@ import { ChangeDetectionStrategy, Component } from '@angular/core';
templateUrl: './skeleton-stats.component.html', templateUrl: './skeleton-stats.component.html',
styleUrls: ['./skeleton-stats.component.scss'], styleUrls: ['./skeleton-stats.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: false,
}) })
export class SkeletonStatsComponent {} export class SkeletonStatsComponent {}

View File

@ -6,6 +6,7 @@ import { Title } from '@angular/platform-browser';
templateUrl: './skeleton-top-bar.component.html', templateUrl: './skeleton-top-bar.component.html',
styleUrls: ['./skeleton-top-bar.component.scss'], styleUrls: ['./skeleton-top-bar.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: false,
}) })
export class SkeletonTopBarComponent { export class SkeletonTopBarComponent {
constructor(readonly titleService: Title) {} constructor(readonly titleService: Title) {}

View File

@ -9,6 +9,7 @@ import { MatMenuTrigger } from '@angular/material/menu';
templateUrl: './spotlight-search.component.html', templateUrl: './spotlight-search.component.html',
styleUrls: ['./spotlight-search.component.scss'], styleUrls: ['./spotlight-search.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: false,
}) })
export class SpotlightSearchComponent { export class SpotlightSearchComponent {
@Input() actions: readonly SpotlightSearchAction[]; @Input() actions: readonly SpotlightSearchAction[];

View File

@ -9,6 +9,7 @@ interface ITenant extends IStoredTenantId {
selector: 'app-tenants-menu', selector: 'app-tenants-menu',
templateUrl: './tenants-menu.component.html', templateUrl: './tenants-menu.component.html',
styleUrls: ['./tenants-menu.component.scss'], styleUrls: ['./tenants-menu.component.scss'],
standalone: false,
}) })
export class TenantsMenuComponent { export class TenantsMenuComponent {
readonly tenantsService = inject(TenantsService); readonly tenantsService = inject(TenantsService);

View File

@ -20,6 +20,7 @@ interface MenuItem {
selector: 'app-user-menu', selector: 'app-user-menu',
templateUrl: './user-menu.component.html', templateUrl: './user-menu.component.html',
styleUrls: ['./user-menu.component.scss'], styleUrls: ['./user-menu.component.scss'],
standalone: false,
}) })
export class UserMenuComponent { export class UserMenuComponent {
readonly currentUser = getCurrentUser<User>(); readonly currentUser = getCurrentUser<User>();

View File

@ -23,12 +23,14 @@ export function templateExistsWhenEnteringAdmin(): CanActivateFn {
const defaultColorsService = inject(DefaultColorsService); const defaultColorsService = inject(DefaultColorsService);
const watermarksService = inject(WatermarkService); const watermarksService = inject(WatermarkService);
const router = inject(Router); const router = inject(Router);
const rulesService = inject(RulesService);
const isDocumine = getConfig().IS_DOCUMINE; const isDocumine = getConfig().IS_DOCUMINE;
const dossierTemplate = inject(DossierTemplateStatsService).get(dossierTemplateId); const dossierTemplate = inject(DossierTemplateStatsService).get(dossierTemplateId);
await firstValueFrom(fileAttributesService.loadFileAttributesConfig(dossierTemplateId)); await firstValueFrom(fileAttributesService.loadFileAttributesConfig(dossierTemplateId));
await firstValueFrom(dictionaryService.loadDictionaryDataForDossierTemplate(dossierTemplateId)); await firstValueFrom(dictionaryService.loadDictionaryDataForDossierTemplate(dossierTemplateId));
await firstValueFrom(defaultColorsService.loadForDossierTemplate(dossierTemplateId)); await firstValueFrom(defaultColorsService.loadForDossierTemplate(dossierTemplateId));
await firstValueFrom(rulesService.getFor(dossierTemplateId));
if (!isDocumine) { if (!isDocumine) {
await firstValueFrom(watermarksService.loadForDossierTemplate(dossierTemplateId)); await firstValueFrom(watermarksService.loadForDossierTemplate(dossierTemplateId));
} }

View File

@ -40,7 +40,7 @@ export class AnnotationWrapper implements IListable {
typeLabel?: string; typeLabel?: string;
color: string; color: string;
numberOfComments = 0; numberOfComments = 0;
firstTopLeftPoint: IPoint; firstBottomLeftPoint: IPoint;
shortContent: string; shortContent: string;
content: AnnotationContent; content: AnnotationContent;
value: string; value: string;
@ -84,7 +84,10 @@ export class AnnotationWrapper implements IListable {
} }
get isRedactedImageHint() { get isRedactedImageHint() {
return this.IMAGE_HINT && this.superType === SuperTypes.Redaction; return (
(this.IMAGE_HINT && this.superType === SuperTypes.Redaction) ||
(this.IMAGE_HINT && this.superType === SuperTypes.ManualRedaction)
);
} }
get isSkippedImageHint() { get isSkippedImageHint() {
@ -196,11 +199,11 @@ export class AnnotationWrapper implements IListable {
} }
get x() { get x() {
return this.firstTopLeftPoint.x; return this.firstBottomLeftPoint.x;
} }
get y() { get y() {
return this.firstTopLeftPoint.y; return this.firstBottomLeftPoint.y;
} }
get legalBasis() { get legalBasis() {
@ -225,7 +228,7 @@ export class AnnotationWrapper implements IListable {
annotationWrapper.value = 'Imported'; annotationWrapper.value = 'Imported';
annotationWrapper.color = earmark.hexColor; annotationWrapper.color = earmark.hexColor;
annotationWrapper.positions = earmark.positions; annotationWrapper.positions = earmark.positions;
annotationWrapper.firstTopLeftPoint = earmark.positions[0]?.topLeft; annotationWrapper.firstBottomLeftPoint = earmark.positions[0]?.topLeft;
annotationWrapper.superTypeLabel = annotationTypesTranslations[annotationWrapper.superType]; annotationWrapper.superTypeLabel = annotationTypesTranslations[annotationWrapper.superType];
return annotationWrapper; return annotationWrapper;
@ -246,7 +249,7 @@ export class AnnotationWrapper implements IListable {
annotationWrapper.isChangeLogEntry = logEntry.state === EntryStates.REMOVED || !!changeLogType; annotationWrapper.isChangeLogEntry = logEntry.state === EntryStates.REMOVED || !!changeLogType;
annotationWrapper.type = logEntry.type; annotationWrapper.type = logEntry.type;
annotationWrapper.value = logEntry.value; annotationWrapper.value = logEntry.value;
annotationWrapper.firstTopLeftPoint = { x: logEntry.positions[0].rectangle[0], y: logEntry.positions[0].rectangle[1] }; annotationWrapper.firstBottomLeftPoint = { x: logEntry.positions[0].rectangle[0], y: logEntry.positions[0].rectangle[1] };
annotationWrapper.pageNumber = logEntry.positions[0].pageNumber; annotationWrapper.pageNumber = logEntry.positions[0].pageNumber;
annotationWrapper.positions = logEntry.positions.map(p => ({ annotationWrapper.positions = logEntry.positions.map(p => ({
page: p.pageNumber, page: p.pageNumber,
@ -375,7 +378,7 @@ export class AnnotationWrapper implements IListable {
static #getShortContent(annotationWrapper: AnnotationWrapper, legalBasisList: ILegalBasis[]) { static #getShortContent(annotationWrapper: AnnotationWrapper, legalBasisList: ILegalBasis[]) {
if (annotationWrapper.legalBasis) { if (annotationWrapper.legalBasis) {
const lb = legalBasisList.find(lbm => lbm.reason?.toLowerCase().includes(annotationWrapper.legalBasis.toLowerCase())); const lb = legalBasisList.find(lbm => lbm.technicalName?.toLowerCase().includes(annotationWrapper.legalBasis.toLowerCase()));
if (lb) { if (lb) {
return lb.name; return lb.name;
} }

View File

@ -21,7 +21,6 @@ interface NavItem {
templateUrl: './account-side-nav.component.html', templateUrl: './account-side-nav.component.html',
styleUrls: ['./account-side-nav.component.scss'], styleUrls: ['./account-side-nav.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [SideNavComponent, TranslateModule, NgForOf, NgIf, RouterLinkActive, RouterLink], imports: [SideNavComponent, TranslateModule, NgForOf, NgIf, RouterLinkActive, RouterLink],
}) })
export class AccountSideNavComponent { export class AccountSideNavComponent {

View File

@ -8,10 +8,11 @@
<div class="content-container full-height"> <div class="content-container full-height">
<div class="overlay-shadow"></div> <div class="overlay-shadow"></div>
<div [ngClass]="!isWarningsScreen && 'dialog'"> <div [ngClass]="!isWarningsScreen && 'dialog'">
<div *ngIf="!isWarningsScreen" class="dialog-header"> @if (!isWarningsScreen) {
<div class="heading-l" [translate]="translations[path]"></div> <div class="dialog-header">
</div> <div class="heading-l" [translate]="translations[path]"></div>
</div>
}
<router-outlet></router-outlet> <router-outlet></router-outlet>
</div> </div>
</div> </div>

View File

@ -10,7 +10,6 @@ import { TranslateModule } from '@ngx-translate/core';
templateUrl: './base-account-screen-component.html', templateUrl: './base-account-screen-component.html',
styleUrls: ['./base-account-screen-component.scss'], styleUrls: ['./base-account-screen-component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [NgClass, NgIf, RouterOutlet, AccountSideNavComponent, TranslateModule], imports: [NgClass, NgIf, RouterOutlet, AccountSideNavComponent, TranslateModule],
}) })
export class BaseAccountScreenComponent implements OnInit { export class BaseAccountScreenComponent implements OnInit {

View File

@ -25,7 +25,6 @@ const RSS_EXCLUDED_SETTINGS = ['USER_PROMOTED_TO_APPROVER', 'USER_DEGRADED_TO_RE
templateUrl: './notifications-screen.component.html', templateUrl: './notifications-screen.component.html',
styleUrls: ['./notifications-screen.component.scss'], styleUrls: ['./notifications-screen.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [ReactiveFormsModule, NgForOf, MatSlideToggle, TranslateModule, NgIf, MatCheckbox, IconButtonComponent], imports: [ReactiveFormsModule, NgForOf, MatSlideToggle, TranslateModule, NgIf, MatCheckbox, IconButtonComponent],
}) })
export class NotificationsScreenComponent extends BaseFormComponent implements OnInit { export class NotificationsScreenComponent extends BaseFormComponent implements OnInit {

View File

@ -41,7 +41,6 @@ interface DefaultOptionsForm {
selector: 'redaction-dialog-defaults', selector: 'redaction-dialog-defaults',
templateUrl: './dialog-defaults.component.html', templateUrl: './dialog-defaults.component.html',
styleUrl: './dialog-defaults.component.scss', styleUrl: './dialog-defaults.component.scss',
standalone: true,
imports: [ReactiveFormsModule, TranslateModule, MatFormField, MatSelect, MatOption, NgForOf, MatCheckbox, NgIf, IconButtonComponent], imports: [ReactiveFormsModule, TranslateModule, MatFormField, MatSelect, MatOption, NgForOf, MatCheckbox, NgIf, IconButtonComponent],
}) })
export class DialogDefaultsComponent extends BaseFormComponent { export class DialogDefaultsComponent extends BaseFormComponent {

View File

@ -44,7 +44,6 @@ const Screens = {
templateUrl: './preferences.component.html', templateUrl: './preferences.component.html',
styleUrls: ['./preferences.component.scss'], styleUrls: ['./preferences.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [ imports: [
DialogDefaultsComponent, DialogDefaultsComponent,
NgClass, NgClass,

View File

@ -10,7 +10,6 @@ interface FormType {
@Component({ @Component({
templateUrl: './confirm-password-dialog.component.html', templateUrl: './confirm-password-dialog.component.html',
standalone: true,
imports: [ReactiveFormsModule, IconButtonComponent, TranslateModule, CircleButtonComponent], imports: [ReactiveFormsModule, IconButtonComponent, TranslateModule, CircleButtonComponent],
}) })
export class ConfirmPasswordDialogComponent extends BaseDialogComponent { export class ConfirmPasswordDialogComponent extends BaseDialogComponent {

View File

@ -16,14 +16,16 @@
<input formControlName="lastName" name="lastName" type="text" /> <input formControlName="lastName" name="lastName" type="text" />
</div> </div>
<div *ngIf="devMode" class="iqser-input-group"> <div class="iqser-input-group">
<label [translate]="'top-bar.navigation-items.my-account.children.language.label'"></label> <label [translate]="'top-bar.navigation-items.my-account.children.language.label'"></label>
<mat-form-field> <mat-form-field>
<mat-select formControlName="language"> <mat-select formControlName="language">
<mat-select-trigger>{{ languageSelectLabel() | translate }}</mat-select-trigger> <mat-select-trigger>{{ languageSelectLabel() | translate }}</mat-select-trigger>
<mat-option *ngFor="let language of languages" [value]="language"> @for (language of languages; track language) {
{{ translations[language] | translate }} <mat-option [value]="language">
</mat-option> {{ translations[language] | translate }}
</mat-option>
}
</mat-select> </mat-select>
</mat-form-field> </mat-form-field>
</div> </div>
@ -32,11 +34,13 @@
<a (click)="resetPassword()" target="_blank"> {{ 'user-profile-screen.actions.change-password' | translate }}</a> <a (click)="resetPassword()" target="_blank"> {{ 'user-profile-screen.actions.change-password' | translate }}</a>
</div> </div>
<div *ngIf="devMode" class="iqser-input-group"> @if (devMode) {
<mat-slide-toggle color="primary" formControlName="darkTheme"> <div class="iqser-input-group">
{{ 'user-profile-screen.form.dark-theme' | translate }} <mat-slide-toggle color="primary" formControlName="darkTheme">
</mat-slide-toggle> {{ 'user-profile-screen.form.dark-theme' | translate }}
</div> </mat-slide-toggle>
</div>
}
</div> </div>
</div> </div>

View File

@ -37,7 +37,6 @@ interface UserProfileForm {
templateUrl: './user-profile-screen.component.html', templateUrl: './user-profile-screen.component.html',
styleUrls: ['./user-profile-screen.component.scss'], styleUrls: ['./user-profile-screen.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [ imports: [
ReactiveFormsModule, ReactiveFormsModule,
NgIf, NgIf,

View File

@ -5,7 +5,6 @@ import { RouterOutlet } from '@angular/router';
@Component({ @Component({
templateUrl: './base-admin-screen.component.html', templateUrl: './base-admin-screen.component.html',
styleUrls: ['./base-admin-screen.component.scss'], styleUrls: ['./base-admin-screen.component.scss'],
standalone: true,
imports: [AdminSideNavComponent, RouterOutlet], imports: [AdminSideNavComponent, RouterOutlet],
}) })
export class BaseAdminScreenComponent {} export class BaseAdminScreenComponent {}

View File

@ -9,7 +9,6 @@ import { AdminSideNavComponent } from '../shared/components/admin-side-nav/admin
@Component({ @Component({
templateUrl: './base-dossier-template-screen.component.html', templateUrl: './base-dossier-template-screen.component.html',
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [ imports: [
DossierTemplateBreadcrumbsComponent, DossierTemplateBreadcrumbsComponent,
DossierTemplateActionsComponent, DossierTemplateActionsComponent,

View File

@ -18,7 +18,6 @@ import { AdminSideNavComponent } from '../shared/components/admin-side-nav/admin
@Component({ @Component({
templateUrl: './base-entity-screen.component.html', templateUrl: './base-entity-screen.component.html',
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [ imports: [
DossierTemplateBreadcrumbsComponent, DossierTemplateBreadcrumbsComponent,
CircleButtonComponent, CircleButtonComponent,

View File

@ -8,7 +8,6 @@ import { DonutChartComponent } from '@shared/components/donut-chart/donut-chart.
selector: 'redaction-users-stats', selector: 'redaction-users-stats',
templateUrl: './users-stats.component.html', templateUrl: './users-stats.component.html',
styleUrls: ['./users-stats.component.scss'], styleUrls: ['./users-stats.component.scss'],
standalone: true,
imports: [CircleButtonComponent, TranslateModule, DonutChartComponent], imports: [CircleButtonComponent, TranslateModule, DonutChartComponent],
}) })
export class UsersStatsComponent { export class UsersStatsComponent {

View File

@ -16,7 +16,6 @@ export interface CloneTemplateData {
@Component({ @Component({
templateUrl: './add-clone-dossier-template-dialog.component.html', templateUrl: './add-clone-dossier-template-dialog.component.html',
styleUrls: ['./add-clone-dossier-template-dialog.component.scss'], styleUrls: ['./add-clone-dossier-template-dialog.component.scss'],
standalone: true,
imports: [TranslateModule, ReactiveFormsModule, IconButtonComponent, CircleButtonComponent], imports: [TranslateModule, ReactiveFormsModule, IconButtonComponent, CircleButtonComponent],
}) })
export class AddCloneDossierTemplateDialogComponent extends BaseDialogComponent { export class AddCloneDossierTemplateDialogComponent extends BaseDialogComponent {

View File

@ -8,7 +8,6 @@ import { UserDetailsComponent } from './user-details/user-details.component';
@Component({ @Component({
selector: 'redaction-add-edit-user-dialog', selector: 'redaction-add-edit-user-dialog',
templateUrl: './add-edit-user-dialog.component.html', templateUrl: './add-edit-user-dialog.component.html',
standalone: true,
imports: [UserDetailsComponent, ResetPasswordComponent, CircleButtonComponent], imports: [UserDetailsComponent, ResetPasswordComponent, CircleButtonComponent],
}) })
export class AddEditUserDialogComponent extends BaseDialogComponent { export class AddEditUserDialogComponent extends BaseDialogComponent {

View File

@ -10,7 +10,6 @@ import { NamePipe } from '@common-ui/users/name.pipe';
@Component({ @Component({
selector: 'redaction-reset-password', selector: 'redaction-reset-password',
templateUrl: './reset-password.component.html', templateUrl: './reset-password.component.html',
standalone: true,
imports: [TranslateModule, NamePipe, ReactiveFormsModule, IconButtonComponent], imports: [TranslateModule, NamePipe, ReactiveFormsModule, IconButtonComponent],
}) })
export class ResetPasswordComponent { export class ResetPasswordComponent {

View File

@ -32,7 +32,7 @@
[formControlName]="role" [formControlName]="role"
color="primary" color="primary"
> >
{{ translations[role] | translate }} {{ translations[role] | translate: { count: 1 } }}
</mat-checkbox> </mat-checkbox>
</div> </div>
</div> </div>

View File

@ -3,10 +3,8 @@ import { ReactiveFormsModule, UntypedFormBuilder, UntypedFormGroup, Validators }
import { AdminDialogService } from '../../../services/admin-dialog.service'; import { AdminDialogService } from '../../../services/admin-dialog.service';
import { BaseFormComponent, IconButtonComponent, LoadingService, Toaster } from '@iqser/common-ui'; import { BaseFormComponent, IconButtonComponent, LoadingService, Toaster } from '@iqser/common-ui';
import { rolesTranslations } from '@translations/roles-translations'; import { rolesTranslations } from '@translations/roles-translations';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { User } from '@red/domain'; import { User } from '@red/domain';
import { UserService } from '@users/user.service'; import { UserService } from '@users/user.service';
import { HttpStatusCode } from '@angular/common/http';
import { firstValueFrom } from 'rxjs'; import { firstValueFrom } from 'rxjs';
import { IProfileUpdateRequest } from '@iqser/common-ui/lib/users'; import { IProfileUpdateRequest } from '@iqser/common-ui/lib/users';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
@ -17,7 +15,6 @@ import { NgForOf, NgIf } from '@angular/common';
selector: 'redaction-user-details', selector: 'redaction-user-details',
templateUrl: './user-details.component.html', templateUrl: './user-details.component.html',
styleUrls: ['./user-details.component.scss'], styleUrls: ['./user-details.component.scss'],
standalone: true,
imports: [TranslateModule, ReactiveFormsModule, MatCheckbox, NgForOf, IconButtonComponent, NgIf], imports: [TranslateModule, ReactiveFormsModule, MatCheckbox, NgForOf, IconButtonComponent, NgIf],
}) })
export class UserDetailsComponent extends BaseFormComponent implements OnInit { export class UserDetailsComponent extends BaseFormComponent implements OnInit {

View File

@ -19,7 +19,6 @@ interface DialogData {
@Component({ @Component({
templateUrl: './add-entity-dialog.component.html', templateUrl: './add-entity-dialog.component.html',
styleUrls: ['./add-entity-dialog.component.scss'], styleUrls: ['./add-entity-dialog.component.scss'],
standalone: true,
imports: [AddEditEntityComponent, TranslateModule, IconButtonComponent, NgIf, CircleButtonComponent, HelpButtonComponent], imports: [AddEditEntityComponent, TranslateModule, IconButtonComponent, NgIf, CircleButtonComponent, HelpButtonComponent],
}) })
export class AddEntityDialogComponent extends BaseDialogComponent { export class AddEntityDialogComponent extends BaseDialogComponent {

View File

@ -16,7 +16,6 @@ type OrderFn = (a: KeyValue<string, string>, b: KeyValue<string, string>) => num
templateUrl: './audit-info-dialog.component.html', templateUrl: './audit-info-dialog.component.html',
styleUrls: ['./audit-info-dialog.component.scss'], styleUrls: ['./audit-info-dialog.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [TranslateModule, NgForOf, KeyValuePipe, HumanizePipe, CircleButtonComponent, JsonPipe], imports: [TranslateModule, NgForOf, KeyValuePipe, HumanizePipe, CircleButtonComponent, JsonPipe],
}) })
export class AuditInfoDialogComponent extends BaseDialogComponent { export class AuditInfoDialogComponent extends BaseDialogComponent {

View File

@ -20,7 +20,6 @@ const KMS_SIGNATURE_DIALOG_WIDTH = '810px';
@Component({ @Component({
templateUrl: './configure-certificate-dialog.component.html', templateUrl: './configure-certificate-dialog.component.html',
styleUrls: ['./configure-certificate-dialog.component.scss'], styleUrls: ['./configure-certificate-dialog.component.scss'],
standalone: true,
imports: [ imports: [
DetailsRadioComponent, DetailsRadioComponent,
NgIf, NgIf,

View File

@ -13,7 +13,6 @@ import { TranslateModule } from '@ngx-translate/core';
templateUrl: './kms-signature-configuration.component.html', templateUrl: './kms-signature-configuration.component.html',
styleUrls: ['./kms-signature-configuration.component.scss'], styleUrls: ['./kms-signature-configuration.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [UploadFileComponent, ReactiveFormsModule, NgIf, TranslateModule], imports: [UploadFileComponent, ReactiveFormsModule, NgIf, TranslateModule],
}) })
export class KmsSignatureConfigurationComponent extends BaseSignatureConfigurationComponent implements OnInit { export class KmsSignatureConfigurationComponent extends BaseSignatureConfigurationComponent implements OnInit {

View File

@ -14,7 +14,6 @@ import { TranslateModule } from '@ngx-translate/core';
templateUrl: './pkcs-signature-configuration.component.html', templateUrl: './pkcs-signature-configuration.component.html',
styleUrls: ['./pkcs-signature-configuration.component.scss'], styleUrls: ['./pkcs-signature-configuration.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [UploadFileComponent, ReactiveFormsModule, NgIf, TranslateModule], imports: [UploadFileComponent, ReactiveFormsModule, NgIf, TranslateModule],
}) })
export class PkcsSignatureConfigurationComponent extends BaseSignatureConfigurationComponent implements OnInit { export class PkcsSignatureConfigurationComponent extends BaseSignatureConfigurationComponent implements OnInit {

View File

@ -20,7 +20,6 @@ interface IEditColorData {
@Component({ @Component({
templateUrl: './edit-color-dialog.component.html', templateUrl: './edit-color-dialog.component.html',
styleUrls: ['./edit-color-dialog.component.scss'], styleUrls: ['./edit-color-dialog.component.scss'],
standalone: true,
imports: [ReactiveFormsModule, TranslateModule, ColorPickerModule, MatIcon, NgIf, IconButtonComponent, CircleButtonComponent], imports: [ReactiveFormsModule, TranslateModule, ColorPickerModule, MatIcon, NgIf, IconButtonComponent, CircleButtonComponent],
}) })
export class EditColorDialogComponent extends BaseDialogComponent { export class EditColorDialogComponent extends BaseDialogComponent {

View File

@ -9,7 +9,6 @@ import { TranslateModule } from '@ngx-translate/core';
@Component({ @Component({
selector: 'redaction-smtp-auth-dialog', selector: 'redaction-smtp-auth-dialog',
templateUrl: './smtp-auth-dialog.component.html', templateUrl: './smtp-auth-dialog.component.html',
standalone: true,
imports: [ReactiveFormsModule, TranslateModule, IconButtonComponent, CircleButtonComponent, MatDialogClose], imports: [ReactiveFormsModule, TranslateModule, IconButtonComponent, CircleButtonComponent, MatDialogClose],
}) })
export class SmtpAuthDialogComponent extends BaseDialogComponent { export class SmtpAuthDialogComponent extends BaseDialogComponent {

View File

@ -7,7 +7,6 @@ import { TranslateModule } from '@ngx-translate/core';
templateUrl: './upload-dictionary-dialog.component.html', templateUrl: './upload-dictionary-dialog.component.html',
styleUrls: ['./upload-dictionary-dialog.component.scss'], styleUrls: ['./upload-dictionary-dialog.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [IconButtonComponent, TranslateModule], imports: [IconButtonComponent, TranslateModule],
}) })
export class UploadDictionaryDialogComponent { export class UploadDictionaryDialogComponent {

View File

@ -36,7 +36,6 @@ const PAGE_SIZE = 50;
templateUrl: './audit-screen.component.html', templateUrl: './audit-screen.component.html',
styleUrls: ['./audit-screen.component.scss'], styleUrls: ['./audit-screen.component.scss'],
providers: listingProvidersFactory(AuditScreenComponent), providers: listingProvidersFactory(AuditScreenComponent),
standalone: true,
imports: [ imports: [
IqserListingModule, IqserListingModule,
TranslateModule, TranslateModule,

View File

@ -18,7 +18,6 @@ import { AdminDialogService } from '../../services/admin-dialog.service';
templateUrl: './component-definitions.component.html', templateUrl: './component-definitions.component.html',
styleUrls: ['./component-definitions.component.scss'], styleUrls: ['./component-definitions.component.scss'],
providers: listingProvidersFactory(ComponentDefinitionsComponent), providers: listingProvidersFactory(ComponentDefinitionsComponent),
standalone: true,
imports: [ imports: [
IconButtonComponent, IconButtonComponent,
InputWithActionComponent, InputWithActionComponent,

View File

@ -31,7 +31,6 @@ interface DialogResult {
@Component({ @Component({
templateUrl: './add-edit-component-mapping-dialog.component.html', templateUrl: './add-edit-component-mapping-dialog.component.html',
styleUrls: ['./add-edit-component-mapping-dialog.component.scss'], styleUrls: ['./add-edit-component-mapping-dialog.component.scss'],
standalone: true,
imports: [ imports: [
TranslateModule, TranslateModule,
ReactiveFormsModule, ReactiveFormsModule,

View File

@ -36,7 +36,6 @@ import { MatTooltip } from '@angular/material/tooltip';
templateUrl: './component-mappings-screen.component.html', templateUrl: './component-mappings-screen.component.html',
styleUrls: ['./component-mappings-screen.component.scss'], styleUrls: ['./component-mappings-screen.component.scss'],
providers: listingProvidersFactory(ComponentMappingsScreenComponent), providers: listingProvidersFactory(ComponentMappingsScreenComponent),
standalone: true,
imports: [ imports: [
DossierTemplateBreadcrumbsComponent, DossierTemplateBreadcrumbsComponent,
AsyncPipe, AsyncPipe,

View File

@ -33,7 +33,6 @@ interface ListItem extends IListable {
styleUrls: ['./default-colors-screen.component.scss'], styleUrls: ['./default-colors-screen.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
providers: listingProvidersFactory(DefaultColorsScreenComponent), providers: listingProvidersFactory(DefaultColorsScreenComponent),
standalone: true,
imports: [IqserListingModule, NgStyle, CircleButtonComponent, IqserAllowDirective, TranslateModule, AsyncPipe, NgIf], imports: [IqserListingModule, NgStyle, CircleButtonComponent, IqserAllowDirective, TranslateModule, AsyncPipe, NgIf],
}) })
export class DefaultColorsScreenComponent extends ListingComponent<ListItem> implements OnInit { export class DefaultColorsScreenComponent extends ListingComponent<ListItem> implements OnInit {

View File

@ -25,7 +25,6 @@ import { DigitalSignatureService } from '../../services/digital-signature.servic
selector: 'redaction-digital-signature-screen', selector: 'redaction-digital-signature-screen',
templateUrl: './digital-signature-screen.component.html', templateUrl: './digital-signature-screen.component.html',
styleUrls: ['./digital-signature-screen.component.scss'], styleUrls: ['./digital-signature-screen.component.scss'],
standalone: true,
imports: [ imports: [
IqserListingModule, IqserListingModule,
EmptyStateComponent, EmptyStateComponent,

View File

@ -20,7 +20,6 @@ export interface AddEditDossierAttributeDialogData {
@Component({ @Component({
templateUrl: './add-edit-dossier-attribute-dialog.component.html', templateUrl: './add-edit-dossier-attribute-dialog.component.html',
styleUrls: ['./add-edit-dossier-attribute-dialog.component.scss'], styleUrls: ['./add-edit-dossier-attribute-dialog.component.scss'],
standalone: true,
imports: [ imports: [
TranslateModule, TranslateModule,
ReactiveFormsModule, ReactiveFormsModule,

View File

@ -35,7 +35,6 @@ import { TableItemComponent } from './table-item/table-item.component';
entitiesService: DossierAttributesService, entitiesService: DossierAttributesService,
component: DossierAttributesListingScreenComponent, component: DossierAttributesListingScreenComponent,
}), }),
standalone: true,
imports: [ imports: [
IqserListingModule, IqserListingModule,
TranslateModule, TranslateModule,

View File

@ -10,7 +10,6 @@ import { NgIf } from '@angular/common';
selector: 'redaction-table-item [attribute] [canEditDossierAttributes]', selector: 'redaction-table-item [attribute] [canEditDossierAttributes]',
templateUrl: './table-item.component.html', templateUrl: './table-item.component.html',
styleUrls: ['./table-item.component.scss'], styleUrls: ['./table-item.component.scss'],
standalone: true,
imports: [MatTooltip, TranslateModule, CircleButtonComponent, NgIf], imports: [MatTooltip, TranslateModule, CircleButtonComponent, NgIf],
}) })
export class TableItemComponent { export class TableItemComponent {

View File

@ -18,7 +18,6 @@ export interface AddEditDossierStateDialogData {
@Component({ @Component({
templateUrl: './add-edit-dossier-state-dialog.component.html', templateUrl: './add-edit-dossier-state-dialog.component.html',
styleUrls: ['./add-edit-dossier-state-dialog.component.scss'], styleUrls: ['./add-edit-dossier-state-dialog.component.scss'],
standalone: true,
imports: [TranslateModule, ReactiveFormsModule, ColorPickerModule, MatIcon, NgIf, IconButtonComponent, CircleButtonComponent], imports: [TranslateModule, ReactiveFormsModule, ColorPickerModule, MatIcon, NgIf, IconButtonComponent, CircleButtonComponent],
}) })
export class AddEditDossierStateDialogComponent extends BaseDialogComponent { export class AddEditDossierStateDialogComponent extends BaseDialogComponent {

View File

@ -23,7 +23,6 @@ export interface ConfirmDeleteDossierStateDialogData {
@Component({ @Component({
templateUrl: './confirm-delete-dossier-state-dialog.component.html', templateUrl: './confirm-delete-dossier-state-dialog.component.html',
styleUrls: ['./confirm-delete-dossier-state-dialog.component.scss'], styleUrls: ['./confirm-delete-dossier-state-dialog.component.scss'],
standalone: true,
imports: [ imports: [
TranslateModule, TranslateModule,
ReactiveFormsModule, ReactiveFormsModule,

View File

@ -33,7 +33,6 @@ import { DossierStatesTableItemComponent } from '../dossier-states-table-item/do
templateUrl: './dossier-states-listing-screen.component.html', templateUrl: './dossier-states-listing-screen.component.html',
styleUrls: ['./dossier-states-listing-screen.component.scss'], styleUrls: ['./dossier-states-listing-screen.component.scss'],
providers: listingProvidersFactory(DossierStatesListingScreenComponent), providers: listingProvidersFactory(DossierStatesListingScreenComponent),
standalone: true,
imports: [ imports: [
IqserListingModule, IqserListingModule,
DonutChartComponent, DonutChartComponent,

View File

@ -20,7 +20,6 @@ import { SnakeCasePipe } from '@common-ui/pipes/snake-case.pipe';
selector: 'redaction-dossier-states-table-item', selector: 'redaction-dossier-states-table-item',
templateUrl: './dossier-states-table-item.component.html', templateUrl: './dossier-states-table-item.component.html',
styleUrls: ['./dossier-states-table-item.component.scss'], styleUrls: ['./dossier-states-table-item.component.scss'],
standalone: true,
imports: [MatTooltip, CircleButtonComponent, TranslateModule, NgIf, SnakeCasePipe], imports: [MatTooltip, CircleButtonComponent, TranslateModule, NgIf, SnakeCasePipe],
}) })
export class DossierStatesTableItemComponent { export class DossierStatesTableItemComponent {

View File

@ -33,7 +33,6 @@ import { TableItemComponent } from '../table-item/table-item.component';
entitiesService: DossierTemplatesService, entitiesService: DossierTemplatesService,
component: DossierTemplatesListingScreenComponent, component: DossierTemplatesListingScreenComponent,
}), }),
standalone: true,
imports: [ imports: [
IqserListingModule, IqserListingModule,
TranslateModule, TranslateModule,

View File

@ -17,7 +17,6 @@ import { DatePipe } from '@shared/pipes/date.pipe';
templateUrl: './table-item.component.html', templateUrl: './table-item.component.html',
styleUrls: ['./table-item.component.scss'], styleUrls: ['./table-item.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [MatTooltip, NgIf, AsyncPipe, MatIcon, TranslateModule, DatePipe, DossierTemplateActionsComponent, InitialsAvatarComponent], imports: [MatTooltip, NgIf, AsyncPipe, MatIcon, TranslateModule, DatePipe, DossierTemplateActionsComponent, InitialsAvatarComponent],
}) })
export class TableItemComponent implements OnChanges { export class TableItemComponent implements OnChanges {

View File

@ -87,6 +87,7 @@
[routerLink]="dict.routerLink" [routerLink]="dict.routerLink"
[tooltip]="'entities-listing.action.edit' | translate" [tooltip]="'entities-listing.action.edit' | translate"
icon="iqser:edit" icon="iqser:edit"
iqserStopPropagation
></iqser-circle-button> ></iqser-circle-button>
</div> </div>
</div> </div>

View File

@ -11,6 +11,7 @@ import {
ListingComponent, ListingComponent,
listingProvidersFactory, listingProvidersFactory,
LoadingService, LoadingService,
StopPropagationDirective,
TableColumnConfig, TableColumnConfig,
} from '@iqser/common-ui'; } from '@iqser/common-ui';
import { getParam } from '@iqser/common-ui/lib/utils'; import { getParam } from '@iqser/common-ui/lib/utils';
@ -29,7 +30,6 @@ import { AdminDialogService } from '../../services/admin-dialog.service';
templateUrl: './entities-listing-screen.component.html', templateUrl: './entities-listing-screen.component.html',
styleUrls: ['./entities-listing-screen.component.scss'], styleUrls: ['./entities-listing-screen.component.scss'],
providers: listingProvidersFactory(EntitiesListingScreenComponent), providers: listingProvidersFactory(EntitiesListingScreenComponent),
standalone: true,
imports: [ imports: [
IqserListingModule, IqserListingModule,
TranslateModule, TranslateModule,
@ -41,6 +41,7 @@ import { AdminDialogService } from '../../services/admin-dialog.service';
AnnotationIconComponent, AnnotationIconComponent,
AsyncPipe, AsyncPipe,
RouterLink, RouterLink,
StopPropagationDirective,
], ],
}) })
export class EntitiesListingScreenComponent extends ListingComponent<Dictionary> implements OnInit { export class EntitiesListingScreenComponent extends ListingComponent<Dictionary> implements OnInit {

View File

@ -16,7 +16,6 @@ import { AsyncPipe } from '@angular/common';
templateUrl: './dictionary-screen.component.html', templateUrl: './dictionary-screen.component.html',
styleUrls: ['./dictionary-screen.component.scss'], styleUrls: ['./dictionary-screen.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [AsyncPipe, DictionaryManagerComponent], imports: [AsyncPipe, DictionaryManagerComponent],
}) })
export class DictionaryScreenComponent implements OnInit { export class DictionaryScreenComponent implements OnInit {

View File

@ -17,7 +17,6 @@ import { TranslateModule } from '@ngx-translate/core';
templateUrl: './entity-info.component.html', templateUrl: './entity-info.component.html',
styleUrls: ['./entity-info.component.scss'], styleUrls: ['./entity-info.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [ imports: [
HasScrollbarDirective, HasScrollbarDirective,
MatIcon, MatIcon,

View File

@ -22,7 +22,6 @@ export interface AddEditFileAttributeDialogData {
@Component({ @Component({
templateUrl: './add-edit-file-attribute-dialog.component.html', templateUrl: './add-edit-file-attribute-dialog.component.html',
styleUrls: ['./add-edit-file-attribute-dialog.component.scss'], styleUrls: ['./add-edit-file-attribute-dialog.component.scss'],
standalone: true,
imports: [ imports: [
ReactiveFormsModule, ReactiveFormsModule,
TranslateModule, TranslateModule,

View File

@ -13,7 +13,6 @@ import { MatSlideToggleModule } from '@angular/material/slide-toggle';
@Component({ @Component({
templateUrl: './file-attributes-configurations-dialog.component.html', templateUrl: './file-attributes-configurations-dialog.component.html',
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [ imports: [
ReactiveFormsModule, ReactiveFormsModule,
MatSlideToggleModule, MatSlideToggleModule,

View File

@ -19,7 +19,6 @@ import { fileAttributeTypesTranslations } from '@translations/file-attribute-typ
templateUrl: './active-fields-listing.component.html', templateUrl: './active-fields-listing.component.html',
styleUrls: ['./active-fields-listing.component.scss'], styleUrls: ['./active-fields-listing.component.scss'],
providers: listingProvidersFactory(ActiveFieldsListingComponent), providers: listingProvidersFactory(ActiveFieldsListingComponent),
standalone: true,
imports: [ imports: [
IqserListingModule, IqserListingModule,
CircleButtonComponent, CircleButtonComponent,

View File

@ -38,7 +38,6 @@ export interface IFileAttributesCSVImportData {
styleUrls: ['./file-attributes-csv-import-dialog.component.scss'], styleUrls: ['./file-attributes-csv-import-dialog.component.scss'],
providers: listingProvidersFactory(), providers: listingProvidersFactory(),
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [ imports: [
ReactiveFormsModule, ReactiveFormsModule,
MatFormField, MatFormField,

View File

@ -46,7 +46,6 @@ import {
templateUrl: './file-attributes-listing-screen.component.html', templateUrl: './file-attributes-listing-screen.component.html',
styleUrls: ['./file-attributes-listing-screen.component.scss'], styleUrls: ['./file-attributes-listing-screen.component.scss'],
providers: listingProvidersFactory(FileAttributesListingScreenComponent), providers: listingProvidersFactory(FileAttributesListingScreenComponent),
standalone: true,
imports: [ imports: [
IqserListingModule, IqserListingModule,
NgForOf, NgForOf,

View File

@ -13,7 +13,6 @@ import { MatSlideToggle } from '@angular/material/slide-toggle';
@Component({ @Component({
selector: 'redaction-general-config-form', selector: 'redaction-general-config-form',
templateUrl: './general-config-form.component.html', templateUrl: './general-config-form.component.html',
standalone: true,
imports: [ReactiveFormsModule, TranslateModule, NgIf, MatSlideToggle, IconButtonComponent], imports: [ReactiveFormsModule, TranslateModule, NgIf, MatSlideToggle, IconButtonComponent],
}) })
export class GeneralConfigFormComponent extends BaseFormComponent implements OnInit { export class GeneralConfigFormComponent extends BaseFormComponent implements OnInit {

View File

@ -13,7 +13,6 @@ import { ILicenseFeature } from '@red/domain';
selector: 'redaction-general-config-screen', selector: 'redaction-general-config-screen',
templateUrl: './general-config-screen.component.html', templateUrl: './general-config-screen.component.html',
styleUrls: ['./general-config-screen.component.scss'], styleUrls: ['./general-config-screen.component.scss'],
standalone: true,
imports: [IqserListingModule, GeneralConfigFormComponent, SystemPreferencesFormComponent, SmtpFormComponent, TranslateModule], imports: [IqserListingModule, GeneralConfigFormComponent, SystemPreferencesFormComponent, SmtpFormComponent, TranslateModule],
}) })
export class GeneralConfigScreenComponent extends BaseFormComponent implements AfterViewInit { export class GeneralConfigScreenComponent extends BaseFormComponent implements AfterViewInit {

View File

@ -21,7 +21,6 @@ import { NgIf } from '@angular/common';
@Component({ @Component({
selector: 'redaction-smtp-form', selector: 'redaction-smtp-form',
templateUrl: './smtp-form.component.html', templateUrl: './smtp-form.component.html',
standalone: true,
imports: [ReactiveFormsModule, TranslateModule, MatSlideToggle, IconButtonComponent, NgIf], imports: [ReactiveFormsModule, TranslateModule, MatSlideToggle, IconButtonComponent, NgIf],
}) })
export class SmtpFormComponent extends BaseFormComponent implements OnInit { export class SmtpFormComponent extends BaseFormComponent implements OnInit {

View File

@ -15,7 +15,6 @@ export type ValueType = 'number' | 'string' | 'boolean';
@Component({ @Component({
selector: 'redaction-system-preferences-form', selector: 'redaction-system-preferences-form',
templateUrl: './system-preferences-form.component.html', templateUrl: './system-preferences-form.component.html',
standalone: true,
imports: [NgIf, ReactiveFormsModule, NgForOf, TranslateModule, MatSlideToggle, IconButtonComponent], imports: [NgIf, ReactiveFormsModule, NgForOf, TranslateModule, MatSlideToggle, IconButtonComponent],
}) })
export class SystemPreferencesFormComponent extends BaseFormComponent { export class SystemPreferencesFormComponent extends BaseFormComponent {

View File

@ -34,6 +34,20 @@
<span [innerHTML]="'dossier-template-info-screen.created-on' | translate: { date: createdOn }"></span> <span [innerHTML]="'dossier-template-info-screen.created-on' | translate: { date: createdOn }"></span>
</div> </div>
<div *ngIf="areRulesLocked()">
<mat-icon
(click)="resetRules()"
[matTooltip]="
currentUser.isAdmin
? ('dossier-template-info-screen.rules-reset.tooltip' | translate)
: ('dossier-template-info-screen.rules-reset.disabled-action' | translate)
"
[class.action-icon]="currentUser.isAdmin"
svgIcon="iqser:alert-circle"
></mat-icon>
<span class="error">{{ 'dossier-template-info-screen.rules-reset.label' | translate }}</span>
</div>
<div> <div>
<mat-icon svgIcon="red:entries"></mat-icon> <mat-icon svgIcon="red:entries"></mat-icon>
{{ 'dossier-template-info-screen.entries' | translate: { count: ctx.stats.numberOfEntries } }} {{ 'dossier-template-info-screen.entries' | translate: { count: ctx.stats.numberOfEntries } }}

View File

@ -18,3 +18,11 @@
padding-right: 24px; padding-right: 24px;
margin-right: 24px; margin-right: 24px;
} }
.error {
color: var(--iqser-primary);
}
.action-icon {
cursor: pointer;
}

View File

@ -1,4 +1,4 @@
import { Component, Input, OnInit } from '@angular/core'; import { Component, computed, Input, OnInit } from '@angular/core';
import { ContextComponent } from '@iqser/common-ui/lib/utils'; import { ContextComponent } from '@iqser/common-ui/lib/utils';
import { type DossierTemplate, type DossierTemplateStats } from '@red/domain'; import { type DossierTemplate, type DossierTemplateStats } from '@red/domain';
import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service';
@ -9,6 +9,12 @@ import { MatIcon } from '@angular/material/icon';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { InitialsAvatarComponent } from '@common-ui/users'; import { InitialsAvatarComponent } from '@common-ui/users';
import { DatePipe } from '@shared/pipes/date.pipe'; import { DatePipe } from '@shared/pipes/date.pipe';
import { RulesService } from '../../../services/rules.service';
import { Toaster } from '@iqser/common-ui';
import { MatTooltip } from '@angular/material/tooltip';
import { firstValueFrom } from 'rxjs';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { getCurrentUser } from '@users/user.service';
interface Context { interface Context {
readonly dossierTemplate: DossierTemplate; readonly dossierTemplate: DossierTemplate;
@ -19,17 +25,21 @@ interface Context {
selector: 'redaction-dossier-template-details', selector: 'redaction-dossier-template-details',
templateUrl: './dossier-template-details.component.html', templateUrl: './dossier-template-details.component.html',
styleUrls: ['./dossier-template-details.component.scss'], styleUrls: ['./dossier-template-details.component.scss'],
standalone: true, imports: [NgIf, AsyncPipe, MatIcon, TranslateModule, DatePipe, InitialsAvatarComponent, MatTooltip],
imports: [NgIf, AsyncPipe, MatIcon, TranslateModule, DatePipe, InitialsAvatarComponent],
}) })
export class DossierTemplateDetailsComponent extends ContextComponent<Context> implements OnInit { export class DossierTemplateDetailsComponent extends ContextComponent<Context> implements OnInit {
readonly translations = dossierTemplateStatusTranslations; readonly translations = dossierTemplateStatusTranslations;
@Input({ required: true }) dossierTemplateId: string; @Input({ required: true }) dossierTemplateId: string;
readonly areRulesLocked = computed(() => {
return this._rulesService.currentTemplateRules().timeoutDetected;
});
readonly currentUser = getCurrentUser();
constructor( constructor(
private readonly _dossierTemplatesService: DossierTemplatesService, private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _dossierTemplateStatsService: DossierTemplateStatsService, private readonly _dossierTemplateStatsService: DossierTemplateStatsService,
private readonly _rulesService: RulesService,
private readonly _toaster: Toaster,
) { ) {
super(); super();
} }
@ -40,4 +50,15 @@ export class DossierTemplateDetailsComponent extends ContextComponent<Context> i
stats: this._dossierTemplateStatsService.watch$(this.dossierTemplateId), stats: this._dossierTemplateStatsService.watch$(this.dossierTemplateId),
}); });
} }
async resetRules() {
if (!this.currentUser.isAdmin) return;
try {
await firstValueFrom(this._rulesService.reset(this.dossierTemplateId));
this._toaster.success(_('dossier-template-info-screen.rules-reset.success'));
await firstValueFrom(this._rulesService.getFor(this.dossierTemplateId));
} catch (error) {
this._toaster.rawError(error.error.message);
}
}
} }

View File

@ -36,7 +36,6 @@ const downloadTypes = ['ORIGINAL', 'PREVIEW', 'OPTIMIZED_PREVIEW', 'DELTA_PREVIE
@Component({ @Component({
templateUrl: './dossier-template-info-screen.component.html', templateUrl: './dossier-template-info-screen.component.html',
styleUrls: ['./dossier-template-info-screen.component.scss'], styleUrls: ['./dossier-template-info-screen.component.scss'],
standalone: true,
imports: [ imports: [
HasScrollbarDirective, HasScrollbarDirective,
ReactiveFormsModule, ReactiveFormsModule,

View File

@ -17,7 +17,6 @@ interface DialogData {
@Component({ @Component({
templateUrl: './add-edit-justification-dialog.component.html', templateUrl: './add-edit-justification-dialog.component.html',
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [TranslateModule, ReactiveFormsModule, IconButtonComponent, CircleButtonComponent, HasScrollbarDirective], imports: [TranslateModule, ReactiveFormsModule, IconButtonComponent, CircleButtonComponent, HasScrollbarDirective],
}) })
export class AddEditJustificationDialogComponent extends BaseDialogComponent { export class AddEditJustificationDialogComponent extends BaseDialogComponent {

View File

@ -33,7 +33,6 @@ import { TranslateModule } from '@ngx-translate/core';
}), }),
JustificationsDialogService, JustificationsDialogService,
], ],
standalone: true,
imports: [IqserListingModule, CircleButtonComponent, NgIf, TableItemComponent, TranslateModule, AsyncPipe, IconButtonComponent], imports: [IqserListingModule, CircleButtonComponent, NgIf, TableItemComponent, TranslateModule, AsyncPipe, IconButtonComponent],
}) })
export default class JustificationsScreenComponent extends ListingComponent<Justification> implements OnInit { export default class JustificationsScreenComponent extends ListingComponent<Justification> implements OnInit {

View File

@ -12,7 +12,6 @@ import { TranslateModule } from '@ngx-translate/core';
selector: 'redaction-table-item', selector: 'redaction-table-item',
templateUrl: './table-item.component.html', templateUrl: './table-item.component.html',
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [MatTooltip, CircleButtonComponent, NgIf, TranslateModule], imports: [MatTooltip, CircleButtonComponent, NgIf, TranslateModule],
}) })
export class TableItemComponent { export class TableItemComponent {

View File

@ -6,7 +6,6 @@ import { BaseChartDirective, provideCharts, withDefaultRegisterables } from 'ng2
selector: 'redaction-chart', selector: 'redaction-chart',
templateUrl: './chart.component.html', templateUrl: './chart.component.html',
styleUrls: ['./chart.component.scss'], styleUrls: ['./chart.component.scss'],
standalone: true,
imports: [BaseChartDirective], imports: [BaseChartDirective],
providers: [provideCharts(withDefaultRegisterables())], providers: [provideCharts(withDefaultRegisterables())],
}) })

View File

@ -16,7 +16,6 @@ import { ChartComponent } from '../chart/chart.component';
selector: 'red-license-analysis-capacity-usage', selector: 'red-license-analysis-capacity-usage',
templateUrl: './license-analysis-capacity-usage.component.html', templateUrl: './license-analysis-capacity-usage.component.html',
styleUrls: ['./license-analysis-capacity-usage.component.scss'], styleUrls: ['./license-analysis-capacity-usage.component.scss'],
standalone: true,
imports: [SizePipe, DecimalPipe, ChartComponent, AsyncPipe, NgIf, TranslateModule], imports: [SizePipe, DecimalPipe, ChartComponent, AsyncPipe, NgIf, TranslateModule],
}) })
export class LicenseAnalysisCapacityUsageComponent { export class LicenseAnalysisCapacityUsageComponent {

View File

@ -14,7 +14,6 @@ import { ChartComponent } from '../chart/chart.component';
selector: 'red-license-page-usage', selector: 'red-license-page-usage',
templateUrl: './license-page-usage.component.html', templateUrl: './license-page-usage.component.html',
styleUrls: ['./license-page-usage.component.scss'], styleUrls: ['./license-page-usage.component.scss'],
standalone: true,
imports: [DecimalPipe, TranslateModule, ChartComponent, NgIf, AsyncPipe], imports: [DecimalPipe, TranslateModule, ChartComponent, NgIf, AsyncPipe],
}) })
export class LicensePageUsageComponent { export class LicensePageUsageComponent {

View File

@ -17,7 +17,6 @@ import { ChartComponent } from '../chart/chart.component';
selector: 'red-license-retention-capacity', selector: 'red-license-retention-capacity',
templateUrl: './license-retention-capacity.component.html', templateUrl: './license-retention-capacity.component.html',
styleUrls: ['./license-retention-capacity.component.scss'], styleUrls: ['./license-retention-capacity.component.scss'],
standalone: true,
imports: [SizePipe, DecimalPipe, NgIf, DonutChartComponent, AsyncPipe, ChartComponent, TranslateModule], imports: [SizePipe, DecimalPipe, NgIf, DonutChartComponent, AsyncPipe, ChartComponent, TranslateModule],
}) })
export class LicenseRetentionCapacityComponent { export class LicenseRetentionCapacityComponent {

View File

@ -6,7 +6,7 @@
</mat-select-trigger> </mat-select-trigger>
<mat-option *ngFor="let license of licenses" [value]="license"> <mat-option *ngFor="let license of licenses" [value]="license">
<ng-container *ngTemplateOutlet="licenseInfo; context: { license: this.license }"></ng-container> <ng-container *ngTemplateOutlet="licenseInfo; context: { license: license }"></ng-container>
</mat-option> </mat-option>
</mat-select> </mat-select>
</mat-form-field> </mat-form-field>

View File

@ -19,7 +19,6 @@ const translations = {
selector: 'redaction-license-select', selector: 'redaction-license-select',
templateUrl: './license-select.component.html', templateUrl: './license-select.component.html',
styleUrls: ['./license-select.component.scss'], styleUrls: ['./license-select.component.scss'],
standalone: true,
imports: [ imports: [
AsyncPipe, AsyncPipe,
NgIf, NgIf,

View File

@ -16,7 +16,6 @@ import { DatePipe } from '@shared/pipes/date.pipe';
@Component({ @Component({
templateUrl: './license-screen.component.html', templateUrl: './license-screen.component.html',
styleUrls: ['./license-screen.component.scss'], styleUrls: ['./license-screen.component.scss'],
standalone: true,
imports: [ imports: [
IqserListingModule, IqserListingModule,
TranslateModule, TranslateModule,

View File

@ -30,7 +30,6 @@ import { TranslateModule } from '@ngx-translate/core';
templateUrl: './permissions-screen.component.html', templateUrl: './permissions-screen.component.html',
styleUrls: ['./permissions-screen.component.scss'], styleUrls: ['./permissions-screen.component.scss'],
providers: listingProvidersFactory(PermissionsScreenComponent), providers: listingProvidersFactory(PermissionsScreenComponent),
standalone: true,
imports: [IqserListingModule, NgIf, NgForOf, MatSlideToggle, AsyncPipe, TranslateModule], imports: [IqserListingModule, NgIf, NgForOf, MatSlideToggle, AsyncPipe, TranslateModule],
}) })
export default class PermissionsScreenComponent extends ListingComponent<PermissionsMapping> implements OnInit { export default class PermissionsScreenComponent extends ListingComponent<PermissionsMapping> implements OnInit {

View File

@ -41,7 +41,6 @@ const placeholderTypes: PlaceholderType[] = ['generalPlaceholders', 'fileAttribu
templateUrl: './reports-screen.component.html', templateUrl: './reports-screen.component.html',
styleUrls: ['./reports-screen.component.scss'], styleUrls: ['./reports-screen.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [HasScrollbarDirective, AsyncPipe, TranslateModule, CircleButtonComponent, IqserAllowDirective, SnakeCasePipe], imports: [HasScrollbarDirective, AsyncPipe, TranslateModule, CircleButtonComponent, IqserAllowDirective, SnakeCasePipe],
}) })
export default class ReportsScreenComponent implements OnInit { export default class ReportsScreenComponent implements OnInit {

View File

@ -59,7 +59,6 @@ const RULE_VALIDATION_TIMEOUT = 2000;
templateUrl: './rules-screen.component.html', templateUrl: './rules-screen.component.html',
styleUrls: ['./rules-screen.component.scss'], styleUrls: ['./rules-screen.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [ imports: [
MonacoEditorModule, MonacoEditorModule,
MatIcon, MatIcon,
@ -67,11 +66,11 @@ const RULE_VALIDATION_TIMEOUT = 2000;
IconButtonComponent, IconButtonComponent,
NgIf, NgIf,
TranslateModule, TranslateModule,
NgTemplateOutlet,
CircleButtonComponent, CircleButtonComponent,
DatePipe,
InputWithActionComponent, InputWithActionComponent,
MatTooltip, MatTooltip,
NgTemplateOutlet,
DatePipe,
], ],
}) })
export default class RulesScreenComponent implements OnInit, ComponentCanDeactivate { export default class RulesScreenComponent implements OnInit, ComponentCanDeactivate {

View File

@ -46,7 +46,6 @@ function configToFilter({ key, label }: DonutChartConfig) {
entitiesService: UserService, entitiesService: UserService,
component: UserListingScreenComponent, component: UserListingScreenComponent,
}), }),
standalone: true,
imports: [ imports: [
IqserListingModule, IqserListingModule,
TranslateModule, TranslateModule,
@ -126,7 +125,7 @@ export class UserListingScreenComponent extends ListingComponent<User> implement
getDisplayRoles(user: User) { getDisplayRoles(user: User) {
const oldRedRoles = user.roles.filter(role => role.startsWith('RED_')); const oldRedRoles = user.roles.filter(role => role.startsWith('RED_'));
const translatedRoles = oldRedRoles.map(role => this._translateService.instant(this.translations[role])); const translatedRoles = oldRedRoles.map(role => this._translateService.instant(this.translations[role], { count: 1 }));
return translatedRoles.join(', ') || this._translateService.instant(this.translations['NO_ROLE']); return translatedRoles.join(', ') || this._translateService.instant(this.translations['NO_ROLE']);
} }

View File

@ -6,7 +6,6 @@ import { TranslateModule } from '@ngx-translate/core';
selector: 'redaction-paginator', selector: 'redaction-paginator',
templateUrl: './paginator.component.html', templateUrl: './paginator.component.html',
styleUrls: ['./paginator.component.scss'], styleUrls: ['./paginator.component.scss'],
standalone: true,
imports: [MatIcon, TranslateModule], imports: [MatIcon, TranslateModule],
}) })
export class PaginatorComponent { export class PaginatorComponent {

View File

@ -74,7 +74,6 @@ interface WatermarkForm {
@Component({ @Component({
templateUrl: './watermark-screen.component.html', templateUrl: './watermark-screen.component.html',
styleUrls: ['./watermark-screen.component.scss'], styleUrls: ['./watermark-screen.component.scss'],
standalone: true,
imports: [ imports: [
PaginatorComponent, PaginatorComponent,
NgIf, NgIf,
@ -249,7 +248,7 @@ export class WatermarkScreenComponent implements OnInit {
this.instance = await WebViewer.Iframe( this.instance = await WebViewer.Iframe(
{ {
licenseKey: this._licenseService.activeLicenseKey, licenseKey: this._licenseService.activeLicenseKey,
path: this.#convertPath('/assets/wv-resources/11.0.0'), path: this.#convertPath('/assets/wv-resources/11.1.0'),
css: this.#convertPath('/assets/pdftron/stylesheet.css'), css: this.#convertPath('/assets/pdftron/stylesheet.css'),
fullAPI: true, fullAPI: true,
isReadOnly: true, isReadOnly: true,

View File

@ -31,7 +31,6 @@ import { DatePipe } from '@shared/pipes/date.pipe';
templateUrl: './watermarks-listing-screen.component.html', templateUrl: './watermarks-listing-screen.component.html',
styleUrls: ['./watermarks-listing-screen.component.scss'], styleUrls: ['./watermarks-listing-screen.component.scss'],
providers: listingProvidersFactory(WatermarksListingScreenComponent), providers: listingProvidersFactory(WatermarksListingScreenComponent),
standalone: true,
imports: [ imports: [
IqserListingModule, IqserListingModule,
TranslateModule, TranslateModule,

View File

@ -1,11 +1,25 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { GenericService, QueryParam } from '@iqser/common-ui'; import { EntitiesService, QueryParam } from '@iqser/common-ui';
import { IRules } from '@red/domain'; import { IRules, Rules } from '@red/domain';
import { Observable } from 'rxjs'; import { map, Observable, tap } from 'rxjs';
import { List } from '@common-ui/utils'; import { List } from '@common-ui/utils';
import { toSignal } from '@angular/core/rxjs-interop';
import { distinctUntilChanged, filter } from 'rxjs/operators';
@Injectable({ providedIn: 'root' }) @Injectable({ providedIn: 'root' })
export class RulesService extends GenericService<IRules> { export class RulesService extends EntitiesService<IRules, Rules> {
readonly currentTemplateRules = toSignal(
this.all$.pipe(
filter(all => !!all.length),
map(rules => rules[0]),
distinctUntilChanged(
(prev, curr) =>
prev.rules === curr.rules &&
prev.timeoutDetected === curr.timeoutDetected &&
prev.dossierTemplateId === curr.dossierTemplateId,
),
),
);
protected readonly _defaultModelPath = 'rules'; protected readonly _defaultModelPath = 'rules';
download(dossierTemplateId: string, ruleFileType: IRules['ruleFileType'] = 'ENTITY') { download(dossierTemplateId: string, ruleFileType: IRules['ruleFileType'] = 'ENTITY') {
@ -17,6 +31,10 @@ export class RulesService extends GenericService<IRules> {
} }
getFor<R = IRules>(entityId: string, queryParams?: List<QueryParam>): Observable<R> { getFor<R = IRules>(entityId: string, queryParams?: List<QueryParam>): Observable<R> {
return super.getFor(entityId, queryParams); return super.getFor<R>(entityId, queryParams).pipe(tap(rules => this.setEntities([rules as Rules])));
}
reset(dossierTemplateId: string, ruleFileType: IRules['ruleFileType'] = 'ENTITY') {
return this._put(null, `${this._defaultModelPath}/${dossierTemplateId}/${ruleFileType}/reset`);
} }
} }

View File

@ -21,7 +21,6 @@ interface NavItem {
selector: 'redaction-admin-side-nav [type]', selector: 'redaction-admin-side-nav [type]',
templateUrl: './admin-side-nav.component.html', templateUrl: './admin-side-nav.component.html',
styleUrls: ['./admin-side-nav.component.scss'], styleUrls: ['./admin-side-nav.component.scss'],
standalone: true,
imports: [TranslateModule, NgIf, RouterLink, RouterLinkActive, NgForOf, SideNavComponent], imports: [TranslateModule, NgIf, RouterLink, RouterLinkActive, NgForOf, SideNavComponent],
}) })
export class AdminSideNavComponent implements OnInit { export class AdminSideNavComponent implements OnInit {

View File

@ -13,7 +13,6 @@ import { AdminDialogService } from '../../../services/admin-dialog.service';
selector: 'redaction-dossier-template-actions', selector: 'redaction-dossier-template-actions',
templateUrl: './dossier-template-actions.component.html', templateUrl: './dossier-template-actions.component.html',
styleUrls: ['./dossier-template-actions.component.scss'], styleUrls: ['./dossier-template-actions.component.scss'],
standalone: true,
imports: [NgIf, CircleButtonComponent, TranslateModule, RouterLink], imports: [NgIf, CircleButtonComponent, TranslateModule, RouterLink],
}) })
export class DossierTemplateActionsComponent implements OnInit { export class DossierTemplateActionsComponent implements OnInit {

View File

@ -13,7 +13,6 @@ import { TranslateModule } from '@ngx-translate/core';
selector: 'redaction-dossier-template-breadcrumbs', selector: 'redaction-dossier-template-breadcrumbs',
templateUrl: './dossier-template-breadcrumbs.component.html', templateUrl: './dossier-template-breadcrumbs.component.html',
styleUrls: ['./dossier-template-breadcrumbs.component.scss'], styleUrls: ['./dossier-template-breadcrumbs.component.scss'],
standalone: true,
imports: [NgIf, AsyncPipe, RouterLink, MatIconModule, TranslateModule, RouterLinkActive], imports: [NgIf, AsyncPipe, RouterLink, MatIconModule, TranslateModule, RouterLinkActive],
}) })
export class DossierTemplateBreadcrumbsComponent { export class DossierTemplateBreadcrumbsComponent {

View File

@ -14,7 +14,6 @@ import { DatePipe } from '@shared/pipes/date.pipe';
selector: 'redaction-table-item [dossier]', selector: 'redaction-table-item [dossier]',
templateUrl: './table-item.component.html', templateUrl: './table-item.component.html',
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [ imports: [
DossierNameColumnComponent, DossierNameColumnComponent,
InitialsAvatarComponent, InitialsAvatarComponent,

View File

@ -17,7 +17,6 @@ import { AsyncPipe, NgIf } from '@angular/common';
templateUrl: './archived-dossiers-screen.component.html', templateUrl: './archived-dossiers-screen.component.html',
providers: listingProvidersFactory(ArchivedDossiersScreenComponent), providers: listingProvidersFactory(ArchivedDossiersScreenComponent),
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [IqserListingModule, DossiersTypeSwitchComponent, TranslateModule, TableItemComponent, NgIf, AsyncPipe], imports: [IqserListingModule, DossiersTypeSwitchComponent, TranslateModule, TableItemComponent, NgIf, AsyncPipe],
}) })
export class ArchivedDossiersScreenComponent extends ListingComponent<Dossier> implements OnInit, OnAttach { export class ArchivedDossiersScreenComponent extends ListingComponent<Dossier> implements OnInit, OnAttach {

View File

@ -16,7 +16,6 @@ import { SnakeCasePipe } from '@common-ui/pipes/snake-case.pipe';
selector: 'redaction-template-stats [stats]', selector: 'redaction-template-stats [stats]',
templateUrl: './template-stats.component.html', templateUrl: './template-stats.component.html',
styleUrls: ['./template-stats.component.scss'], styleUrls: ['./template-stats.component.scss'],
standalone: true,
imports: [NgIf, RouterLink, MatIcon, TranslateModule, DonutChartComponent, IconButtonComponent, SnakeCasePipe], imports: [NgIf, RouterLink, MatIcon, TranslateModule, DonutChartComponent, IconButtonComponent, SnakeCasePipe],
}) })
export class TemplateStatsComponent { export class TemplateStatsComponent {

Some files were not shown because too many files have changed in this diff Show More