Merge branch 'RED-9321' into 'master'

Migrate to lazy load routes

See merge request redactmanager/red-ui!464
This commit is contained in:
Dan Percic 2024-06-20 09:37:16 +02:00
commit ab550a2831
253 changed files with 3394 additions and 2520 deletions

View File

@ -8,7 +8,7 @@ import { DossierFilesGuard } from '@guards/dossier-files-guard';
import { templateExistsWhenEnteringDossierList } from '@guards/dossier-template-exists.guard';
import { DossierTemplatesGuard } from '@guards/dossier-templates.guard';
import { loadActiveDossiersGuard, loadAllDossiersGuard, loadArchivedDossiersGuard } from '@guards/dossiers.guard';
import { editAttributeGuard } from '@guards/edit-attribute.guard';
import { isNotEditingFileAttributeGuard } from '@guards/file-attribute.guard';
import { FeaturesGuard } from '@guards/features-guard.service';
import { ifLoggedIn } from '@guards/if-logged-in.guard';
import { TrashGuard } from '@guards/trash.guard';
@ -38,7 +38,7 @@ const dossierTemplateIdRoutes: IqserRoutes = [
{
path: `:${DOSSIER_ID}`,
canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
canDeactivate: [editAttributeGuard],
canDeactivate: [isNotEditingFileAttributeGuard],
data: {
routeGuards: [DossierFilesGuard],
breadcrumbs: [BreadcrumbTypes.dossierTemplate, BreadcrumbTypes.dossier],
@ -49,7 +49,7 @@ const dossierTemplateIdRoutes: IqserRoutes = [
},
skeleton: 'dossier',
},
loadChildren: () => import('./modules/dossier-overview/dossier-overview.module').then(m => m.DossierOverviewModule),
loadChildren: () => import('./modules/dossier-overview/dossier-overview.routes'),
},
{
path: `:${DOSSIER_ID}/file/:${FILE_ID}`,
@ -63,12 +63,12 @@ const dossierTemplateIdRoutes: IqserRoutes = [
redirectTo: '/auth-error',
},
},
loadChildren: () => import('./modules/file-preview/file-preview.module').then(m => m.FilePreviewModule),
loadChildren: () => import('./modules/file-preview/file-preview.routes'),
},
{
path: '',
pathMatch: 'full',
loadChildren: () => import('./modules/dossiers-listing/dossiers-listing.module').then(m => m.DossiersListingModule),
loadChildren: () => import('./modules/dossiers-listing/dossiers-listing.routes'),
data: {
breadcrumbs: [BreadcrumbTypes.dossierTemplate],
},
@ -77,7 +77,7 @@ const dossierTemplateIdRoutes: IqserRoutes = [
},
{
path: `${ARCHIVE_ROUTE}`,
loadChildren: () => import('./modules/archive/archive.module').then(m => m.ArchiveModule),
loadChildren: () => import('./modules/archive/archive.routes'),
canActivate: [CompositeRouteGuard, webViewerLoadedGuard(), loadArchivedDossiersGuard()],
data: {
routeGuards: [FeaturesGuard],
@ -99,16 +99,16 @@ const mainRoutes: IqserRoutes = [
},
{
path: 'account',
loadChildren: () => import('./modules/account/account.module').then(m => m.AccountModule),
loadChildren: () => import('./modules/account/account.routes'),
},
{
path: 'admin',
loadChildren: () => import('./modules/admin/admin.module').then(m => m.AdminModule),
loadChildren: () => import('./modules/admin/admin.routes'),
canActivate: [RedRoleGuard],
},
{
path: 'dashboard',
loadChildren: () => import('./modules/dashboard/dashboard.module').then(m => m.DashboardModule),
loadChildren: () => import('./modules/dashboard/dashboard.routes'),
canActivate: [CompositeRouteGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard, IqserPermissionsGuard, DossierTemplatesGuard, DashboardGuard],
@ -147,7 +147,7 @@ const mainRoutes: IqserRoutes = [
},
{
path: 'search',
loadChildren: () => import('./modules/search/search.module').then(m => m.SearchModule),
loadComponent: () => import('./modules/search/search-screen/search-screen.component'),
canActivate: [CompositeRouteGuard, IqserPermissionsGuard, loadAllDossiersGuard()],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
@ -159,7 +159,7 @@ const mainRoutes: IqserRoutes = [
},
{
path: 'trash',
loadChildren: () => import('./modules/trash/trash.module').then(m => m.TrashModule),
loadChildren: () => import('./modules/trash/trash.routes'),
canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard, TrashGuard],

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 { MAT_TOOLTIP_DEFAULT_OPTIONS } from '@angular/material/tooltip';
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';
@ -24,13 +29,13 @@ import {
ChevronButtonComponent,
CircleButtonComponent,
EmptyStateComponent,
HelpModeKey,
HelpButtonComponent,
HelpModeComponent,
HiddenActionDirective,
IconButtonComponent,
InputWithActionComponent,
IqserAllowDirective,
IqserDenyDirective,
IqserHelpModeModule,
IqserListingModule,
IqserLoadingModule,
IqserTranslateModule,
@ -42,9 +47,10 @@ 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 { IqserUsersModule } from '@iqser/common-ui/lib/users';
import { InitialsAvatarComponent, IqserUsersModule } from '@iqser/common-ui/lib/users';
import { MonacoEditorModule } from '@materia-ui/ngx-monaco-editor';
import { MissingTranslationHandler } from '@ngx-translate/core';
import { AppConfig, ILoggerConfig } from '@red/domain';
@ -53,9 +59,8 @@ 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 { SharedModule } from '@shared/shared.module';
import { FileUploadDownloadModule } from '@upload-download/file-upload-download.module';
import { RedRoleGuard } from '@users/red-role.guard';
import { UserPreferenceService } from '@users/user-preference.service';
import { UserService } from '@users/user.service';
@ -66,9 +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';
export const appModuleFactory = (config: AppConfig) => {
@NgModule({
@ -90,8 +95,6 @@ export const appModuleFactory = (config: AppConfig) => {
imports: [
BrowserModule,
BrowserAnimationsModule,
SharedModule,
FileUploadDownloadModule,
AppRoutingModule,
MonacoEditorModule,
CommonUiModule.forRoot({
@ -104,7 +107,6 @@ export const appModuleFactory = (config: AppConfig) => {
existingRoleGuard: RedRoleGuard,
}),
CachingModule.forRoot(UI_CACHES),
IqserHelpModeModule.forRoot(helpModeKeys as HelpModeKey[]),
PdfViewerModule,
ToastrModule.forRoot({
closeButton: true,
@ -186,6 +188,17 @@ export const appModuleFactory = (config: AppConfig) => {
IconButtonComponent,
MatDividerModule,
ChevronButtonComponent,
InitialsAvatarComponent,
HelpModeComponent,
HelpButtonComponent,
MatMenuTrigger,
MatMenuItem,
MatIcon,
MatMenu,
MatMenuContent,
MatTooltip,
MatProgressSpinner,
IconsModule,
],
providers: [
{
@ -249,6 +262,8 @@ export const appModuleFactory = (config: AppConfig) => {
},
BaseDatePipe,
DatePipe,
...provideCustomDateFormatter(),
...provideHelpMode(helpModeKeys as HelpModeKey[]),
],
bootstrap: [AppComponent],
})

View File

@ -1,8 +0,0 @@
import { inject } from '@angular/core';
import { CanDeactivateFn } from '@angular/router';
import { FileAttributesService } from '@services/entity-services/file-attributes.service';
import { DossierOverviewScreenComponent } from '../modules/dossier-overview/screen/dossier-overview-screen.component';
// TODO: rename to something like "isNotEditingFileAttributeGuard"
export const editAttributeGuard: CanDeactivateFn<DossierOverviewScreenComponent> = () =>
!inject(FileAttributesService).isEditingFileAttribute();

View File

@ -0,0 +1,7 @@
import { inject } from '@angular/core';
import { CanDeactivateFn } from '@angular/router';
import { FileAttributesService } from '@services/entity-services/file-attributes.service';
import DossierOverviewScreenComponent from '../modules/dossier-overview/screen/dossier-overview-screen.component';
export const isNotEditingFileAttributeGuard: CanDeactivateFn<DossierOverviewScreenComponent> = () =>
!inject(FileAttributesService).isEditingFileAttribute();

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

@ -4,6 +4,10 @@ import { IqserPermissionsService } from '@iqser/common-ui';
import { Roles } from '@users/roles';
import { User } from '@red/domain';
import { getCurrentUser } from '@iqser/common-ui/lib/users';
import { SideNavComponent } from '@common-ui/shared';
import { TranslateModule } from '@ngx-translate/core';
import { NgForOf, NgIf } from '@angular/common';
import { RouterLink, RouterLinkActive } from '@angular/router';
interface NavItem {
readonly label: string;
@ -17,6 +21,8 @@ interface NavItem {
templateUrl: './account-side-nav.component.html',
styleUrls: ['./account-side-nav.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [SideNavComponent, TranslateModule, NgForOf, NgIf, RouterLinkActive, RouterLink],
})
export class AccountSideNavComponent {
readonly currentUser = getCurrentUser<User>();

View File

@ -1,28 +0,0 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { SharedModule } from '@shared/shared.module';
import { AccountRoutingModule } from './account-routing.module';
import { AccountSideNavComponent } from './account-side-nav/account-side-nav.component';
import { BaseAccountScreenComponent } from './base-account-screen/base-account-screen-component';
import { NotificationPreferencesService } from './services/notification-preferences.service';
import { TranslateModule } from '@ngx-translate/core';
import { IconButtonComponent, IqserAllowDirective, IqserHelpModeModule } from '@iqser/common-ui';
import { PreferencesComponent } from './screens/preferences/preferences.component';
import { SideNavComponent } from '@iqser/common-ui/lib/shared';
import { DialogDefaultsComponent } from './screens/preferences/dialog-defaults/dialog-defaults.component';
@NgModule({
declarations: [AccountSideNavComponent, BaseAccountScreenComponent, PreferencesComponent, DialogDefaultsComponent],
imports: [
CommonModule,
SharedModule,
AccountRoutingModule,
TranslateModule,
IqserHelpModeModule,
IconButtonComponent,
SideNavComponent,
IqserAllowDirective,
],
providers: [NotificationPreferencesService],
})
export class AccountModule {}

View File

@ -1,13 +1,13 @@
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { CompositeRouteGuard, IqserPermissionsGuard, IqserRoutes } from '@iqser/common-ui';
import { RedRoleGuard } from '@users/red-role.guard';
import { BaseAccountScreenComponent } from './base-account-screen/base-account-screen-component';
import { PreferencesComponent } from './screens/preferences/preferences.component';
import { Roles } from '@users/roles';
import { IqserAuthGuard } from '@iqser/common-ui/lib/users';
import { PendingChangesGuard } from '@guards/can-deactivate.guard';
import { NotificationPreferencesService } from './services/notification-preferences.service';
const routes: IqserRoutes = [
export default [
{ path: '', redirectTo: 'user-profile', pathMatch: 'full' },
{
path: 'user-profile',
@ -16,12 +16,13 @@ const routes: IqserRoutes = [
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
loadChildren: () => import('./screens/user-profile/user-profile.module').then(m => m.UserProfileModule),
loadChildren: () => import('./screens/user-profile/user-profile.routes'),
},
{
path: 'notifications',
component: BaseAccountScreenComponent,
canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
canDeactivate: [PendingChangesGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
permissions: {
@ -29,7 +30,8 @@ const routes: IqserRoutes = [
redirectTo: '/',
},
},
loadChildren: () => import('./screens/notifications/notifications.module').then(m => m.NotificationsModule),
providers: [NotificationPreferencesService],
loadChildren: () => import('./screens/notifications/notifications.routes'),
},
{
path: 'preferences',
@ -61,10 +63,4 @@ const routes: IqserRoutes = [
},
],
},
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule],
})
export class AccountRoutingModule {}
] satisfies IqserRoutes;

View File

@ -1,12 +1,17 @@
import { ChangeDetectionStrategy, Component, OnInit, ViewContainerRef } from '@angular/core';
import { Router } from '@angular/router';
import { Router, RouterOutlet } from '@angular/router';
import { accountTranslations } from '@translations/account-translations';
import { NgClass, NgIf } from '@angular/common';
import { AccountSideNavComponent } from '../account-side-nav/account-side-nav.component';
import { TranslateModule } from '@ngx-translate/core';
@Component({
selector: 'redaction-base-account-screen',
templateUrl: './base-account-screen-component.html',
styleUrls: ['./base-account-screen-component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [NgClass, NgIf, RouterOutlet, AccountSideNavComponent, TranslateModule],
})
export class BaseAccountScreenComponent implements OnInit {
readonly translations = accountTranslations;

View File

@ -1,7 +1,7 @@
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, inject, OnInit } from '@angular/core';
import { UntypedFormBuilder } from '@angular/forms';
import { ReactiveFormsModule, UntypedFormBuilder } from '@angular/forms';
import { NotificationPreferencesService } from '../../../services/notification-preferences.service';
import { BaseFormComponent, getConfig, LoadingService, Toaster } from '@iqser/common-ui';
import { BaseFormComponent, getConfig, IconButtonComponent, LoadingService, Toaster } from '@iqser/common-ui';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import {
DocumentNotificationsTypes,
@ -14,6 +14,10 @@ import {
import { firstValueFrom } from 'rxjs';
import { notificationsSettingsTranslations } from '@translations/notifications-settings-translations';
import { getCurrentUser } from '@iqser/common-ui/lib/users';
import { NgForOf, NgIf } from '@angular/common';
import { MatSlideToggle } from '@angular/material/slide-toggle';
import { TranslateModule } from '@ngx-translate/core';
import { MatCheckbox } from '@angular/material/checkbox';
const RSS_EXCLUDED_SETTINGS = ['USER_PROMOTED_TO_APPROVER', 'USER_DEGRADED_TO_REVIEWER', 'ASSIGN_REVIEWER'];
@ -21,6 +25,8 @@ const RSS_EXCLUDED_SETTINGS = ['USER_PROMOTED_TO_APPROVER', 'USER_DEGRADED_TO_RE
templateUrl: './notifications-screen.component.html',
styleUrls: ['./notifications-screen.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [ReactiveFormsModule, NgForOf, MatSlideToggle, TranslateModule, NgIf, MatCheckbox, IconButtonComponent],
})
export class NotificationsScreenComponent extends BaseFormComponent implements OnInit {
readonly #toaster = inject(Toaster);

View File

@ -1,16 +0,0 @@
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { CommonModule } from '@angular/common';
import { SharedModule } from '@shared/shared.module';
import { NotificationsScreenComponent } from './notifications-screen/notifications-screen.component';
import { PendingChangesGuard } from '@guards/can-deactivate.guard';
import { TranslateModule } from '@ngx-translate/core';
import { IconButtonComponent } from '@iqser/common-ui';
const routes = [{ path: '', component: NotificationsScreenComponent, canDeactivate: [PendingChangesGuard] }];
@NgModule({
declarations: [NotificationsScreenComponent],
imports: [RouterModule.forChild(routes), CommonModule, SharedModule, TranslateModule, IconButtonComponent],
})
export class NotificationsModule {}

View File

@ -0,0 +1,11 @@
import { NotificationsScreenComponent } from './notifications-screen/notifications-screen.component';
import { PendingChangesGuard } from '@guards/can-deactivate.guard';
import { IqserRoutes } from '@iqser/common-ui';
export default [
{
path: '',
component: NotificationsScreenComponent,
canDeactivate: [PendingChangesGuard],
},
] satisfies IqserRoutes;

View File

@ -1,14 +1,20 @@
import { NgForOf, NgIf } from '@angular/common';
import { ChangeDetectorRef, Component, inject } from '@angular/core';
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 { FormBuilder, FormGroup } from '@angular/forms';
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,
@ -35,6 +41,8 @@ interface DefaultOptionsForm {
selector: 'redaction-dialog-defaults',
templateUrl: './dialog-defaults.component.html',
styleUrl: './dialog-defaults.component.scss',
standalone: true,
imports: [ReactiveFormsModule, TranslateModule, MatFormField, MatSelect, MatOption, NgForOf, MatCheckbox, NgIf, IconButtonComponent],
})
export class DialogDefaultsComponent extends BaseFormComponent {
readonly #formBuilder = inject(FormBuilder);
@ -60,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;
}
@ -84,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,10 +1,24 @@
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup } from '@angular/forms';
import { FormBuilder, FormGroup, ReactiveFormsModule } from '@angular/forms';
import { ActivatedRoute } from '@angular/router';
import { BaseFormComponent, getConfig, IqserPermissionsService, isIqserDevMode, KEYS, LoadingService } from '@iqser/common-ui';
import {
BaseFormComponent,
getConfig,
IconButtonComponent,
IqserAllowDirective,
IqserPermissionsService,
isIqserDevMode,
KEYS,
LoadingService,
} from '@iqser/common-ui';
import { AsControl } from '@iqser/common-ui/lib/utils';
import { Roles } from '@users/roles';
import { PreferencesKeys, UserPreferenceService } from '@users/user-preference.service';
import { DialogDefaultsComponent } from './dialog-defaults/dialog-defaults.component';
import { NgClass, NgIf } from '@angular/common';
import { MatSlideToggle } from '@angular/material/slide-toggle';
import { TranslateModule } from '@ngx-translate/core';
import { MatCheckbox } from '@angular/material/checkbox';
interface PreferencesForm {
// preferences
@ -30,6 +44,18 @@ const Screens = {
templateUrl: './preferences.component.html',
styleUrls: ['./preferences.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [
DialogDefaultsComponent,
NgClass,
NgIf,
ReactiveFormsModule,
MatSlideToggle,
TranslateModule,
IqserAllowDirective,
MatCheckbox,
IconButtonComponent,
],
})
export class PreferencesComponent extends BaseFormComponent implements OnInit {
readonly form: FormGroup<AsControl<PreferencesForm>>;

View File

@ -1,7 +1,8 @@
import { Component } from '@angular/core';
import { BaseDialogComponent } from '@iqser/common-ui';
import { BaseDialogComponent, CircleButtonComponent, IconButtonComponent } from '@iqser/common-ui';
import { MatDialogRef } from '@angular/material/dialog';
import { AbstractControl, FormGroup, Validators } from '@angular/forms';
import { AbstractControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';
import { TranslateModule } from '@ngx-translate/core';
interface FormType {
password: AbstractControl<string>;
@ -9,6 +10,8 @@ interface FormType {
@Component({
templateUrl: './confirm-password-dialog.component.html',
standalone: true,
imports: [ReactiveFormsModule, IconButtonComponent, TranslateModule, CircleButtonComponent],
})
export class ConfirmPasswordDialogComponent extends BaseDialogComponent {
constructor(protected readonly _dialogRef: MatDialogRef<ConfirmPasswordDialogComponent>) {

View File

@ -1,8 +1,15 @@
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core';
import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
import { ReactiveFormsModule, UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { BaseFormComponent, IqserPermissionsService, LanguageService, LoadingService, Toaster } from '@iqser/common-ui';
import { TranslateService } from '@ngx-translate/core';
import {
BaseFormComponent,
IconButtonComponent,
IqserPermissionsService,
LanguageService,
LoadingService,
Toaster,
} from '@iqser/common-ui';
import { TranslateModule, TranslateService } from '@ngx-translate/core';
import { IProfile } from '@red/domain';
import { languagesTranslations } from '@translations/languages-translations';
import { Roles } from '@users/roles';
@ -10,11 +17,17 @@ import { UserPreferenceService } from '@users/user-preference.service';
import { UserService } from '@users/user.service';
import { firstValueFrom } from 'rxjs';
import { UserProfileDialogService } from '../services/user-profile-dialog.service';
import { NgForOf, NgIf } from '@angular/common';
import { MatFormField } from '@angular/material/form-field';
import { MatOption, MatSelect } from '@angular/material/select';
import { MatSlideToggle } from '@angular/material/slide-toggle';
@Component({
templateUrl: './user-profile-screen.component.html',
styleUrls: ['./user-profile-screen.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [ReactiveFormsModule, NgIf, MatFormField, MatSelect, MatOption, NgForOf, TranslateModule, MatSlideToggle, IconButtonComponent],
})
export class UserProfileScreenComponent extends BaseFormComponent implements OnInit {
#profileModel: IProfile;

View File

@ -1,19 +0,0 @@
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { CommonModule } from '@angular/common';
import { SharedModule } from '@shared/shared.module';
import { UserProfileScreenComponent } from './user-profile-screen/user-profile-screen.component';
import { PendingChangesGuard } from '@guards/can-deactivate.guard';
import { TranslateModule } from '@ngx-translate/core';
import { ConfirmPasswordDialogComponent } from './confirm-password-dialog/confirm-password-dialog.component';
import { UserProfileDialogService } from './services/user-profile-dialog.service';
import { CircleButtonComponent, IconButtonComponent } from '@iqser/common-ui';
const routes = [{ path: '', component: UserProfileScreenComponent, canDeactivate: [PendingChangesGuard] }];
@NgModule({
declarations: [UserProfileScreenComponent, ConfirmPasswordDialogComponent],
imports: [RouterModule.forChild(routes), CommonModule, SharedModule, TranslateModule, IconButtonComponent, CircleButtonComponent],
providers: [UserProfileDialogService],
})
export class UserProfileModule {}

View File

@ -0,0 +1,8 @@
import { UserProfileScreenComponent } from './user-profile-screen/user-profile-screen.component';
import { PendingChangesGuard } from '@guards/can-deactivate.guard';
import { UserProfileDialogService } from './services/user-profile-dialog.service';
import { IqserRoutes } from '@iqser/common-ui';
export default [
{ path: '', component: UserProfileScreenComponent, canDeactivate: [PendingChangesGuard], providers: [UserProfileDialogService] },
] satisfies IqserRoutes;

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,291 +0,0 @@
import { NgModule } from '@angular/core';
import { CompositeRouteGuard, IqserPermissionsGuard, IqserRoutes } from '@iqser/common-ui';
import { RedRoleGuard } from '@users/red-role.guard';
import { EntitiesListingScreenComponent } from './screens/entities-listing/entities-listing-screen.component';
import { PendingChangesGuard } from '@guards/can-deactivate.guard';
import { DefaultColorsScreenComponent } from './screens/default-colors/default-colors-screen.component';
import { UserListingScreenComponent } from './screens/user-listing/user-listing-screen.component';
import { DigitalSignatureScreenComponent } from './screens/digital-signature/digital-signature-screen.component';
import { AuditScreenComponent } from './screens/audit/audit-screen.component';
import { RouterModule } from '@angular/router';
import { GeneralConfigScreenComponent } from './screens/general-config/general-config-screen.component';
import { BaseAdminScreenComponent } from './base-admin-screen/base-admin-screen.component';
import { BaseDossierTemplateScreenComponent } from './base-dossier-templates-screen/base-dossier-template-screen.component';
import { DossierTemplatesGuard } from '@guards/dossier-templates.guard';
import { DOSSIER_TEMPLATE_ID, ENTITY_TYPE } from '@red/domain';
import { templateExistsWhenEnteringAdmin } from '@guards/dossier-template-exists.guard';
import { entityExistsGuard } from '@guards/entity-exists-guard.service';
import { BaseEntityScreenComponent } from './base-entity-screen/base-entity-screen.component';
import { PermissionsGuard } from '@guards/permissions-guard';
import { Roles } from '@users/roles';
import { IqserAuthGuard } from '@iqser/common-ui/lib/users';
import { ComponentMappingsScreenComponent } from './screens/component-mappings/component-mappings-screen.component';
const dossierTemplateIdRoutes: IqserRoutes = [
{
path: 'info',
component: BaseDossierTemplateScreenComponent,
loadChildren: () => import('./screens/info/dossier-template-info.module').then(m => m.DossierTemplateInfoModule),
},
{
path: 'entities',
children: [
{
path: '',
component: EntitiesListingScreenComponent,
canActivate: [CompositeRouteGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
},
{
path: `:${ENTITY_TYPE}`,
component: BaseEntityScreenComponent,
canActivate: [CompositeRouteGuard, entityExistsGuard()],
loadChildren: () => import('./screens/entities/entities.module').then(m => m.EntitiesModule),
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
},
],
},
{
path: 'entity-rules',
component: BaseDossierTemplateScreenComponent,
canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
permissions: {
allow: [Roles.rules.read],
redirectTo: 'info',
},
type: 'ENTITY',
},
loadChildren: () => import('./screens/rules/rules.module').then(m => m.RulesModule),
},
{
path: 'component-rules',
component: BaseDossierTemplateScreenComponent,
canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
permissions: {
allow: [Roles.rules.read],
redirectTo: 'info',
},
type: 'COMPONENT',
},
loadChildren: () => import('./screens/rules/rules.module').then(m => m.RulesModule),
},
{
path: 'component-mappings',
component: ComponentMappingsScreenComponent,
canActivate: [CompositeRouteGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
},
{
path: 'file-attributes',
component: BaseDossierTemplateScreenComponent,
loadChildren: () =>
import('./screens/file-attributes-listing/file-attributes-listing.module').then(m => m.FileAttributesListingModule),
canActivate: [CompositeRouteGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
},
{
path: 'watermarks',
component: BaseDossierTemplateScreenComponent,
loadChildren: () => import('./screens/watermark/watermark.module').then(m => m.WatermarkModule),
},
{
path: 'reports',
component: BaseDossierTemplateScreenComponent,
loadChildren: () => import('./screens/reports/reports.module').then(m => m.ReportsModule),
canActivate: [IqserAuthGuard, IqserPermissionsGuard],
data: {
permissions: {
allow: [Roles.reportTemplates.read],
redirectTo: '/auth-error',
},
},
},
{
path: 'dossier-attributes',
component: BaseDossierTemplateScreenComponent,
loadChildren: () =>
import('./screens/dossier-attributes-listing/dossier-attributes-listing.module').then(m => m.DossierAttributesListingModule),
canActivate: [CompositeRouteGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
},
{
path: 'dossier-states',
component: BaseDossierTemplateScreenComponent,
loadChildren: () =>
import('./screens/dossier-states-listing/dossier-states-listing.module').then(m => m.DossierStatesListingModule),
canActivate: [CompositeRouteGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
},
{
path: 'default-colors',
component: DefaultColorsScreenComponent,
canActivate: [CompositeRouteGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
},
{
path: 'justifications',
component: BaseDossierTemplateScreenComponent,
loadChildren: () => import('./screens/justifications/justifications.module').then(m => m.JustificationsModule),
canActivate: [IqserPermissionsGuard],
data: {
permissions: {
allow: [Roles.legalBasis.read],
redirectTo: '/auth-error',
},
},
},
{ path: '', redirectTo: 'info', pathMatch: 'full' },
];
const dossierTemplatesRoutes: IqserRoutes = [
{
path: '',
component: BaseAdminScreenComponent,
canActivate: [IqserAuthGuard],
loadChildren: () =>
import('./screens/dossier-templates-listing/dossier-templates-listing.module').then(m => m.DossierTemplatesListingModule),
},
{
path: `:${DOSSIER_TEMPLATE_ID}`,
children: dossierTemplateIdRoutes,
canActivate: [templateExistsWhenEnteringAdmin()],
},
];
const routes: IqserRoutes = [
{ path: '', redirectTo: 'dossier-templates', pathMatch: 'full' },
{
path: 'dossier-templates',
children: dossierTemplatesRoutes,
canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard, DossierTemplatesGuard],
requiredRoles: ['RED_MANAGER', 'RED_ADMIN'],
permissions: {
allow: [Roles.templates.read],
redirectTo: '/',
},
},
},
{
path: 'users',
component: BaseAdminScreenComponent,
children: [
{
path: '',
component: UserListingScreenComponent,
},
],
canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
permissions: {
allow: [Roles.users.read, 'RED_USER_ADMIN'],
redirectTo: '/',
},
},
},
{
path: 'dossier-permissions',
component: BaseAdminScreenComponent,
canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard, PermissionsGuard],
permissionsObject: 'Dossier',
permissions: {
allow: [Roles.manageAclPermissions, 'RED_ADMIN'],
redirectTo: '/',
},
},
loadChildren: () => import('./screens/permissions/permissions.module').then(m => m.PermissionsModule),
},
{
path: 'license-info',
component: BaseAdminScreenComponent,
canActivate: [IqserAuthGuard, IqserPermissionsGuard, RedRoleGuard],
data: {
permissions: {
allow: [Roles.license.readReport, 'RED_ADMIN'],
redirectTo: '/',
},
},
loadChildren: () => import('./screens/license/license.module').then(m => m.LicenseModule),
},
{
path: 'digital-signature',
component: BaseAdminScreenComponent,
children: [
{
path: '',
component: DigitalSignatureScreenComponent,
},
],
canActivate: [IqserAuthGuard, IqserPermissionsGuard, RedRoleGuard],
data: {
permissions: {
allow: [Roles.digitalSignature.read, 'RED_ADMIN'],
redirectTo: '/',
},
},
},
{
path: 'audit',
component: BaseAdminScreenComponent,
children: [
{
path: '',
component: AuditScreenComponent,
},
],
canActivate: [IqserAuthGuard, IqserPermissionsGuard, RedRoleGuard],
data: {
permissions: {
allow: [Roles.searchAudit, 'RED_ADMIN'],
redirectTo: '/',
},
},
},
{
path: 'general-config',
component: BaseAdminScreenComponent,
children: [
{
path: '',
component: GeneralConfigScreenComponent,
},
],
canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
canDeactivate: [PendingChangesGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
permissions: {
allow: [Roles.generalConfiguration.read, Roles.smtp.read, 'RED_ADMIN'],
redirectTo: '/',
},
},
},
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule],
})
export class AdminRoutingModule {}

View File

@ -1,132 +0,0 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { AdminRoutingModule } from './admin-routing.module';
import { SharedModule } from '@shared/shared.module';
import { AuditScreenComponent } from './screens/audit/audit-screen.component';
import { DefaultColorsScreenComponent } from './screens/default-colors/default-colors-screen.component';
import { EntitiesListingScreenComponent } from './screens/entities-listing/entities-listing-screen.component';
import { DigitalSignatureScreenComponent } from './screens/digital-signature/digital-signature-screen.component';
import { UserListingScreenComponent } from './screens/user-listing/user-listing-screen.component';
import { DossierTemplateBreadcrumbsComponent } from './shared/components/dossier-template-breadcrumbs/dossier-template-breadcrumbs.component';
import { AddEntityDialogComponent } from './dialogs/add-entity-dialog/add-entity-dialog.component';
import { EditColorDialogComponent } from './dialogs/edit-color-dialog/edit-color-dialog.component';
import { AdminDialogService } from './services/admin-dialog.service';
import { GeneralConfigScreenComponent } from './screens/general-config/general-config-screen.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 { UsersStatsComponent } from './components/users-stats/users-stats.component';
import { ResetPasswordComponent } from './dialogs/add-edit-user-dialog/reset-password/reset-password.component';
import { UserDetailsComponent } from './dialogs/add-edit-user-dialog/user-details/user-details.component';
import { AuditService } from './services/audit.service';
import { DigitalSignatureService } from './services/digital-signature.service';
import { BaseAdminScreenComponent } from './base-admin-screen/base-admin-screen.component';
import { RulesService } from './services/rules.service';
import { SmtpConfigService } from './services/smtp-config.service';
import { UploadDictionaryDialogComponent } from './dialogs/upload-dictionary-dialog/upload-dictionary-dialog.component';
import { GeneralConfigFormComponent } from './screens/general-config/general-config-form/general-config-form.component';
import { SmtpFormComponent } from './screens/general-config/smtp-form/smtp-form.component';
import { BaseDossierTemplateScreenComponent } from './base-dossier-templates-screen/base-dossier-template-screen.component';
import { A11yModule } from '@angular/cdk/a11y';
import { BaseEntityScreenComponent } from './base-entity-screen/base-entity-screen.component';
import { AdminSideNavComponent } from './shared/components/admin-side-nav/admin-side-nav.component';
import { SystemPreferencesFormComponent } from './screens/general-config/system-preferences-form/system-preferences-form.component';
import { ConfigureCertificateDialogComponent } from './dialogs/configure-digital-signature-dialog/configure-certificate-dialog.component';
import { PkcsSignatureConfigurationComponent } from './dialogs/configure-digital-signature-dialog/form/pkcs-signature-configuration/pkcs-signature-configuration.component';
import { KmsSignatureConfigurationComponent } from './dialogs/configure-digital-signature-dialog/form/kms-signature-configuration/kms-signature-configuration.component';
import {
ChevronButtonComponent,
CircleButtonComponent,
DetailsRadioComponent,
EditableInputComponent,
EmptyStateComponent,
HasScrollbarDirective,
HumanizePipe,
IconButtonComponent,
InputWithActionComponent,
IqserAllowDirective,
IqserDenyDirective,
IqserHelpModeModule,
IqserListingModule,
IqserUploadFileModule,
RoundCheckboxComponent,
} from '@iqser/common-ui';
import { TranslateModule } from '@ngx-translate/core';
import { AuditInfoDialogComponent } from './dialogs/audit-info-dialog/audit-info-dialog.component';
import { DossierTemplateActionsComponent } from './shared/components/dossier-template-actions/dossier-template-actions.component';
import { IqserUsersModule } from '@iqser/common-ui/lib/users';
import { SelectComponent } from '@shared/components/select/select.component';
import { PaginationComponent } from '@common-ui/pagination/pagination.component';
import { AddCloneDossierTemplateDialogComponent } from './dialogs/add-clone-dossier-template-dialog/add-clone-dossier-template-dialog.component';
import { ComponentMappingsScreenComponent } from './screens/component-mappings/component-mappings-screen.component';
const dialogs = [
AddCloneDossierTemplateDialogComponent,
AddEntityDialogComponent,
EditColorDialogComponent,
SmtpAuthDialogComponent,
AddEditUserDialogComponent,
UploadDictionaryDialogComponent,
ConfigureCertificateDialogComponent,
AuditInfoDialogComponent,
];
const screens = [
AuditScreenComponent,
DefaultColorsScreenComponent,
EntitiesListingScreenComponent,
DigitalSignatureScreenComponent,
UserListingScreenComponent,
GeneralConfigScreenComponent,
ComponentMappingsScreenComponent,
];
const components = [
UsersStatsComponent,
ResetPasswordComponent,
UserDetailsComponent,
BaseAdminScreenComponent,
BaseDossierTemplateScreenComponent,
BaseEntityScreenComponent,
GeneralConfigFormComponent,
SmtpFormComponent,
SystemPreferencesFormComponent,
PkcsSignatureConfigurationComponent,
KmsSignatureConfigurationComponent,
...dialogs,
...screens,
];
@NgModule({
declarations: [...components],
providers: [AdminDialogService, AuditService, DigitalSignatureService, RulesService, SmtpConfigService],
imports: [
CommonModule,
SharedModule,
AdminRoutingModule,
A11yModule,
IqserUsersModule,
TranslateModule,
HumanizePipe,
IqserListingModule,
IqserUploadFileModule,
IqserHelpModeModule,
AdminSideNavComponent,
DossierTemplateActionsComponent,
DossierTemplateBreadcrumbsComponent,
IconButtonComponent,
CircleButtonComponent,
ChevronButtonComponent,
EmptyStateComponent,
HasScrollbarDirective,
RoundCheckboxComponent,
InputWithActionComponent,
EditableInputComponent,
DetailsRadioComponent,
IqserAllowDirective,
IqserDenyDirective,
SelectComponent,
PaginationComponent,
],
})
export class AdminModule {}

View File

@ -0,0 +1,282 @@
import { CompositeRouteGuard, IqserPermissionsGuard, IqserRoutes } from '@iqser/common-ui';
import { RedRoleGuard } from '@users/red-role.guard';
import { EntitiesListingScreenComponent } from './screens/entities-listing/entities-listing-screen.component';
import { PendingChangesGuard } from '@guards/can-deactivate.guard';
import { DefaultColorsScreenComponent } from './screens/default-colors/default-colors-screen.component';
import { UserListingScreenComponent } from './screens/user-listing/user-listing-screen.component';
import { DigitalSignatureScreenComponent } from './screens/digital-signature/digital-signature-screen.component';
import { AuditScreenComponent } from './screens/audit/audit-screen.component';
import { GeneralConfigScreenComponent } from './screens/general-config/general-config-screen.component';
import { BaseAdminScreenComponent } from './base-admin-screen/base-admin-screen.component';
import { BaseDossierTemplateScreenComponent } from './base-dossier-templates-screen/base-dossier-template-screen.component';
import { DossierTemplatesGuard } from '@guards/dossier-templates.guard';
import { DOSSIER_TEMPLATE_ID, ENTITY_TYPE } from '@red/domain';
import { templateExistsWhenEnteringAdmin } from '@guards/dossier-template-exists.guard';
import { entityExistsGuard } from '@guards/entity-exists-guard.service';
import { BaseEntityScreenComponent } from './base-entity-screen/base-entity-screen.component';
import { PermissionsGuard } from '@guards/permissions-guard';
import { Roles } from '@users/roles';
import { IqserAuthGuard } from '@iqser/common-ui/lib/users';
import { ComponentMappingsScreenComponent } from './screens/component-mappings/component-mappings-screen.component';
import { AdminDialogService } from './services/admin-dialog.service';
import { AuditService } from './services/audit.service';
import { DigitalSignatureService } from './services/digital-signature.service';
import { RulesService } from './services/rules.service';
import { SmtpConfigService } from './services/smtp-config.service';
const entityRoutes: IqserRoutes = [
{
path: '',
component: BaseDossierTemplateScreenComponent,
children: [{ path: '', component: EntitiesListingScreenComponent }],
canActivate: [CompositeRouteGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
},
{
path: `:${ENTITY_TYPE}`,
component: BaseEntityScreenComponent,
canActivate: [CompositeRouteGuard, entityExistsGuard()],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
loadChildren: () => import('./screens/entities/entities.routes'),
},
];
const dossierTemplateIdRoutes: IqserRoutes = [
{ path: '', redirectTo: 'info', pathMatch: 'full' },
{
path: 'entities',
children: entityRoutes,
},
{
path: '',
component: BaseDossierTemplateScreenComponent,
children: [
{
path: 'info',
loadComponent: () => import('./screens/info/dossier-template-info-screen/dossier-template-info-screen.component'),
canDeactivate: [PendingChangesGuard],
},
{
path: 'entity-rules',
loadComponent: () => import('./screens/rules/rules-screen/rules-screen.component'),
canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
canDeactivate: [PendingChangesGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
permissions: {
allow: [Roles.rules.read],
redirectTo: 'info',
},
type: 'ENTITY',
},
providers: [RulesService],
},
{
path: 'component-rules',
loadComponent: () => import('./screens/rules/rules-screen/rules-screen.component'),
canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
canDeactivate: [PendingChangesGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
permissions: {
allow: [Roles.rules.read],
redirectTo: 'info',
},
type: 'COMPONENT',
},
providers: [RulesService],
},
{
path: 'component-mappings',
component: ComponentMappingsScreenComponent,
canActivate: [CompositeRouteGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
},
{
path: 'file-attributes',
loadComponent: () => import('./screens/file-attributes-listing/file-attributes-listing-screen.component'),
canActivate: [CompositeRouteGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
},
{
path: 'watermarks',
loadChildren: () => import('./screens/watermark/watermark.routes'),
},
{
path: 'reports',
loadComponent: () => import('./screens/reports/reports-screen/reports-screen.component'),
canActivate: [IqserAuthGuard, IqserPermissionsGuard],
data: {
permissions: {
allow: [Roles.reportTemplates.read],
redirectTo: '/auth-error',
},
},
},
{
path: 'dossier-attributes',
loadComponent: () => import('./screens/dossier-attributes-listing/dossier-attributes-listing-screen.component'),
canActivate: [CompositeRouteGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
},
{
path: 'dossier-states',
loadComponent: () =>
import('./screens/dossier-states-listing/dossier-states-listing-screen/dossier-states-listing-screen.component'),
canActivate: [CompositeRouteGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
},
{
path: 'default-colors',
component: DefaultColorsScreenComponent,
canActivate: [CompositeRouteGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
},
{
path: 'justifications',
loadComponent: () => import('./screens/justifications/justifications-screen/justifications-screen.component'),
canActivate: [IqserPermissionsGuard],
data: {
permissions: {
allow: [Roles.legalBasis.read],
redirectTo: '/auth-error',
},
},
},
],
},
];
const dossierTemplatesRoutes: IqserRoutes = [
{
path: '',
component: BaseAdminScreenComponent,
children: [
{
path: '',
loadComponent: () =>
import(
'./screens/dossier-templates-listing/dossier-templates-listing-screen/dossier-templates-listing-screen.component'
),
},
],
canActivate: [IqserAuthGuard],
},
{
path: `:${DOSSIER_TEMPLATE_ID}`,
children: dossierTemplateIdRoutes,
canActivate: [templateExistsWhenEnteringAdmin()],
},
];
export default [
{ path: '', redirectTo: 'dossier-templates', pathMatch: 'full' },
{
path: 'dossier-templates',
children: dossierTemplatesRoutes,
canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard, DossierTemplatesGuard],
requiredRoles: ['RED_MANAGER', 'RED_ADMIN'],
permissions: {
allow: [Roles.templates.read],
redirectTo: '/',
},
},
},
{
path: '',
component: BaseAdminScreenComponent,
providers: [AdminDialogService],
children: [
{
path: 'users',
component: UserListingScreenComponent,
canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
permissions: {
allow: [Roles.users.read, 'RED_USER_ADMIN'],
redirectTo: '/',
},
},
},
{
path: 'dossier-permissions',
loadComponent: () => import('./screens/permissions/permissions-screen/permissions-screen.component'),
canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard, PermissionsGuard],
permissionsObject: 'Dossier',
permissions: {
allow: [Roles.manageAclPermissions, 'RED_ADMIN'],
redirectTo: '/',
},
},
},
{
path: 'license-info',
loadChildren: () => import('./screens/license/license.routes'),
canActivate: [IqserAuthGuard, IqserPermissionsGuard, RedRoleGuard],
data: {
permissions: {
allow: [Roles.license.readReport, 'RED_ADMIN'],
redirectTo: '/',
},
},
},
{
path: 'digital-signature',
component: DigitalSignatureScreenComponent,
canActivate: [IqserAuthGuard, IqserPermissionsGuard, RedRoleGuard],
data: {
permissions: {
allow: [Roles.digitalSignature.read, 'RED_ADMIN'],
redirectTo: '/',
},
},
providers: [DigitalSignatureService],
},
{
path: 'audit',
component: AuditScreenComponent,
canActivate: [IqserAuthGuard, IqserPermissionsGuard, RedRoleGuard],
data: {
permissions: {
allow: [Roles.searchAudit, 'RED_ADMIN'],
redirectTo: '/',
},
},
providers: [AuditService],
},
{
path: 'general-config',
component: GeneralConfigScreenComponent,
canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
canDeactivate: [PendingChangesGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
permissions: {
allow: [Roles.generalConfiguration.read, Roles.smtp.read, 'RED_ADMIN'],
redirectTo: '/',
},
},
providers: [SmtpConfigService],
},
],
},
] satisfies IqserRoutes;

View File

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

View File

@ -1,5 +1,3 @@
<!--TODO: Use this for all dossier template screens -->
<section>
<div class="page-header">
<redaction-dossier-template-breadcrumbs class="flex-1"></redaction-dossier-template-breadcrumbs>

View File

@ -1,7 +1,23 @@
import { ChangeDetectionStrategy, Component } from '@angular/core';
import { DossierTemplateBreadcrumbsComponent } from '../shared/components/dossier-template-breadcrumbs/dossier-template-breadcrumbs.component';
import { DossierTemplateActionsComponent } from '../shared/components/dossier-template-actions/dossier-template-actions.component';
import { CircleButtonComponent } from '@iqser/common-ui';
import { RouterLink, RouterOutlet } from '@angular/router';
import { TranslateModule } from '@ngx-translate/core';
import { AdminSideNavComponent } from '../shared/components/admin-side-nav/admin-side-nav.component';
@Component({
templateUrl: './base-dossier-template-screen.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [
DossierTemplateBreadcrumbsComponent,
DossierTemplateActionsComponent,
CircleButtonComponent,
RouterLink,
TranslateModule,
AdminSideNavComponent,
RouterOutlet,
],
})
export class BaseDossierTemplateScreenComponent {}

View File

@ -1,19 +1,34 @@
import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';
import { DOSSIER_TEMPLATE_ID, ENTITY_TYPE } from '@red/domain';
import { Router } from '@angular/router';
import { Router, RouterLink, RouterOutlet } from '@angular/router';
import { firstValueFrom, Observable } from 'rxjs';
import { AdminDialogService } from '../services/admin-dialog.service';
import { DictionaryService } from '@services/entity-services/dictionary.service';
import { LoadingService } from '@iqser/common-ui';
import { CircleButtonComponent, LoadingService } from '@iqser/common-ui';
import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service';
import { DictionariesMapService } from '@services/entity-services/dictionaries-map.service';
import { map } from 'rxjs/operators';
import { PermissionsService } from '@services/permissions.service';
import { getParam } from '@iqser/common-ui/lib/utils';
import { DossierTemplateBreadcrumbsComponent } from '../shared/components/dossier-template-breadcrumbs/dossier-template-breadcrumbs.component';
import { AsyncPipe, NgIf } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core';
import { AdminSideNavComponent } from '../shared/components/admin-side-nav/admin-side-nav.component';
@Component({
templateUrl: './base-entity-screen.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [
DossierTemplateBreadcrumbsComponent,
CircleButtonComponent,
NgIf,
AsyncPipe,
TranslateModule,
RouterLink,
AdminSideNavComponent,
RouterOutlet,
],
})
export class BaseEntityScreenComponent implements OnInit {
readonly disabledItems$: Observable<string[]>;

View File

@ -1,10 +1,15 @@
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { DonutChartConfig } from '@red/domain';
import { CircleButtonComponent } from '@iqser/common-ui';
import { TranslateModule } from '@ngx-translate/core';
import { DonutChartComponent } from '@shared/components/donut-chart/donut-chart.component';
@Component({
selector: 'redaction-users-stats',
templateUrl: './users-stats.component.html',
styleUrls: ['./users-stats.component.scss'],
standalone: true,
imports: [CircleButtonComponent, TranslateModule, DonutChartComponent],
})
export class UsersStatsComponent {
@Output() toggleCollapse = new EventEmitter();

View File

@ -1,12 +1,13 @@
import { HttpStatusCode } from '@angular/common/http';
import { Component, Inject } from '@angular/core';
import { Validators } from '@angular/forms';
import { ReactiveFormsModule, Validators } from '@angular/forms';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { BaseDialogComponent, getConfig, SaveOptions } from '@iqser/common-ui';
import { BaseDialogComponent, CircleButtonComponent, getConfig, IconButtonComponent, SaveOptions } from '@iqser/common-ui';
import { DossierTemplate } from '@red/domain';
import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service';
import { Router } from '@angular/router';
import { TranslateModule } from '@ngx-translate/core';
export interface CloneTemplateData {
dossierTemplateId?: string;
@ -15,6 +16,8 @@ export interface CloneTemplateData {
@Component({
templateUrl: './add-clone-dossier-template-dialog.component.html',
styleUrls: ['./add-clone-dossier-template-dialog.component.scss'],
standalone: true,
imports: [TranslateModule, ReactiveFormsModule, IconButtonComponent, CircleButtonComponent],
})
export class AddCloneDossierTemplateDialogComponent extends BaseDialogComponent {
readonly dossierTemplate?: DossierTemplate;

View File

@ -1,18 +1,24 @@
import { Component, Inject, ViewChild } from '@angular/core';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { BaseDialogComponent, CircleButtonComponent } from '@iqser/common-ui';
import { User } from '@red/domain';
import { ResetPasswordComponent } from './reset-password/reset-password.component';
import { UserDetailsComponent } from './user-details/user-details.component';
import { BaseDialogComponent } from '@iqser/common-ui';
@Component({
selector: 'redaction-add-edit-user-dialog',
templateUrl: './add-edit-user-dialog.component.html',
standalone: true,
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>, @Inject(MAT_DIALOG_DATA) readonly user: User) {
constructor(
protected readonly _dialogRef: MatDialogRef<AddEditUserDialogComponent>,
@Inject(MAT_DIALOG_DATA) readonly user: User,
) {
super(_dialogRef, !!user);
}

View File

@ -1,13 +1,17 @@
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
import { ReactiveFormsModule, UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
import { UserService } from '@users/user.service';
import { IconButtonTypes, LoadingService } from '@iqser/common-ui';
import { IconButtonComponent, IconButtonTypes, LoadingService } from '@iqser/common-ui';
import { User } from '@red/domain';
import { firstValueFrom } from 'rxjs';
import { TranslateModule } from '@ngx-translate/core';
import { NamePipe } from '@common-ui/users/name.pipe';
@Component({
selector: 'redaction-reset-password',
templateUrl: './reset-password.component.html',
standalone: true,
imports: [TranslateModule, NamePipe, ReactiveFormsModule, IconButtonComponent],
})
export class ResetPasswordComponent {
readonly iconButtonTypes = IconButtonTypes;

View File

@ -1,7 +1,7 @@
import { Component, EventEmitter, Input, OnChanges, Output } from '@angular/core';
import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
import { ReactiveFormsModule, UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
import { AdminDialogService } from '../../../services/admin-dialog.service';
import { BaseFormComponent, LoadingService, Toaster } from '@iqser/common-ui';
import { BaseFormComponent, IconButtonComponent, LoadingService, Toaster } from '@iqser/common-ui';
import { rolesTranslations } from '@translations/roles-translations';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { User } from '@red/domain';
@ -9,11 +9,16 @@ import { UserService } from '@users/user.service';
import { HttpStatusCode } from '@angular/common/http';
import { firstValueFrom } from 'rxjs';
import { IProfileUpdateRequest } from '@iqser/common-ui/lib/users';
import { TranslateModule } from '@ngx-translate/core';
import { MatCheckbox } from '@angular/material/checkbox';
import { NgForOf, NgIf } from '@angular/common';
@Component({
selector: 'redaction-user-details',
templateUrl: './user-details.component.html',
styleUrls: ['./user-details.component.scss'],
standalone: true,
imports: [TranslateModule, ReactiveFormsModule, MatCheckbox, NgForOf, IconButtonComponent, NgIf],
})
export class UserDetailsComponent extends BaseFormComponent implements OnChanges {
/** e.g. a RED_ADMIN is automatically a RED_USER_ADMIN => can't disable RED_USER_ADMIN as long as RED_ADMIN is checked */

View File

@ -1,7 +1,16 @@
import { Component, inject, ViewChild } from '@angular/core';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { BaseDialogComponent, getConfig, IconButtonTypes } from '@iqser/common-ui';
import {
BaseDialogComponent,
CircleButtonComponent,
getConfig,
HelpButtonComponent,
IconButtonComponent,
IconButtonTypes,
} from '@iqser/common-ui';
import { AddEditEntityComponent } from '@shared/components/add-edit-entity/add-edit-entity.component';
import { TranslateModule } from '@ngx-translate/core';
import { NgIf } from '@angular/common';
interface DialogData {
readonly dossierTemplateId: string;
@ -10,6 +19,8 @@ interface DialogData {
@Component({
templateUrl: './add-entity-dialog.component.html',
styleUrls: ['./add-entity-dialog.component.scss'],
standalone: true,
imports: [AddEditEntityComponent, TranslateModule, IconButtonComponent, NgIf, CircleButtonComponent, HelpButtonComponent],
})
export class AddEntityDialogComponent extends BaseDialogComponent {
@ViewChild(AddEditEntityComponent, { static: true }) private readonly _addEditEntityComponent: AddEditEntityComponent;

View File

@ -1,8 +1,9 @@
import { KeyValue } from '@angular/common';
import { KeyValue, KeyValuePipe, NgForOf } from '@angular/common';
import { ChangeDetectionStrategy, Component, Inject } from '@angular/core';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { BaseDialogComponent } from '@iqser/common-ui';
import { BaseDialogComponent, CircleButtonComponent, HumanizePipe } from '@iqser/common-ui';
import { IAudit } from '@red/domain';
import { TranslateModule } from '@ngx-translate/core';
interface DialogData {
readonly auditEntry: IAudit;
@ -15,6 +16,8 @@ type OrderFn = (a: KeyValue<string, string>, b: KeyValue<string, string>) => num
templateUrl: './audit-info-dialog.component.html',
styleUrls: ['./audit-info-dialog.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [TranslateModule, NgForOf, KeyValuePipe, HumanizePipe, CircleButtonComponent],
})
export class AuditInfoDialogComponent extends BaseDialogComponent {
constructor(

View File

@ -1,12 +1,22 @@
import { ChangeDetectorRef, Component, ViewChild } from '@angular/core';
import { digitalSignatureDialogTranslations } from '../../translations/digital-signature-dialog-translations';
import { BaseDialogComponent, DetailsRadioOption } from '@iqser/common-ui';
import { MatDialogRef } from '@angular/material/dialog';
import {
BaseDialogComponent,
CircleButtonComponent,
DetailsRadioComponent,
DetailsRadioOption,
IconButtonComponent,
} from '@iqser/common-ui';
import { MatDialogClose, MatDialogRef } from '@angular/material/dialog';
import { PkcsSignatureConfigurationComponent } from './form/pkcs-signature-configuration/pkcs-signature-configuration.component';
import { KmsSignatureConfigurationComponent } from './form/kms-signature-configuration/kms-signature-configuration.component';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { HttpStatusCode } from '@angular/common/http';
import { DigitalSignatureOption, DigitalSignatureOptions } from '@red/domain';
import { NgIf } from '@angular/common';
import { ReactiveFormsModule } from '@angular/forms';
import { TranslateModule } from '@ngx-translate/core';
import { DigitalSignatureService } from '../../services/digital-signature.service';
const DEFAULT_DIALOG_WIDTH = '662px';
const KMS_SIGNATURE_DIALOG_WIDTH = '810px';
@ -14,6 +24,19 @@ const KMS_SIGNATURE_DIALOG_WIDTH = '810px';
@Component({
templateUrl: './configure-certificate-dialog.component.html',
styleUrls: ['./configure-certificate-dialog.component.scss'],
standalone: true,
imports: [
DetailsRadioComponent,
NgIf,
ReactiveFormsModule,
TranslateModule,
PkcsSignatureConfigurationComponent,
KmsSignatureConfigurationComponent,
IconButtonComponent,
MatDialogClose,
CircleButtonComponent,
],
providers: [DigitalSignatureService],
})
export class ConfigureCertificateDialogComponent extends BaseDialogComponent {
@ViewChild(PkcsSignatureConfigurationComponent) pkcsSignatureConfigurationComponent: PkcsSignatureConfigurationComponent;

View File

@ -1,20 +1,28 @@
import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core';
import { UntypedFormBuilder, Validators } from '@angular/forms';
import { ReactiveFormsModule, UntypedFormBuilder, Validators } from '@angular/forms';
import { BaseSignatureConfigurationComponent } from '../base-signature-configuration-component';
import { DigitalSignatureOptions, IKmsDigitalSignature, IKmsDigitalSignatureRequest } from '@red/domain';
import { firstValueFrom } from 'rxjs';
import { DigitalSignatureService } from '../../../../services/digital-signature.service';
import { UploadFileComponent } from '@iqser/common-ui';
import { NgIf } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core';
@Component({
selector: 'redaction-kms-signature-configuration',
templateUrl: './kms-signature-configuration.component.html',
styleUrls: ['./kms-signature-configuration.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [UploadFileComponent, ReactiveFormsModule, NgIf, TranslateModule],
})
export class KmsSignatureConfigurationComponent extends BaseSignatureConfigurationComponent implements OnInit {
@Input() digitalSignature!: IKmsDigitalSignatureRequest;
constructor(protected readonly _digitalSignatureService: DigitalSignatureService, private readonly _formBuilder: UntypedFormBuilder) {
constructor(
protected readonly _digitalSignatureService: DigitalSignatureService,
private readonly _formBuilder: UntypedFormBuilder,
) {
super(_digitalSignatureService, DigitalSignatureOptions.KMS);
}

View File

@ -1,16 +1,21 @@
import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core';
import { UntypedFormBuilder, Validators } from '@angular/forms';
import { ReactiveFormsModule, UntypedFormBuilder, Validators } from '@angular/forms';
import { DigitalSignatureOptions, IPkcsDigitalSignature, IPkcsDigitalSignatureRequest } from '@red/domain';
import { lastIndexOfEnd } from '@utils/functions';
import { firstValueFrom } from 'rxjs';
import { DigitalSignatureService } from '../../../../services/digital-signature.service';
import { BaseSignatureConfigurationComponent } from '../base-signature-configuration-component';
import { UploadFileComponent } from '@iqser/common-ui';
import { NgIf } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core';
@Component({
selector: 'redaction-pkcs-signature-configuration',
templateUrl: './pkcs-signature-configuration.component.html',
styleUrls: ['./pkcs-signature-configuration.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [UploadFileComponent, ReactiveFormsModule, NgIf, TranslateModule],
})
export class PkcsSignatureConfigurationComponent extends BaseSignatureConfigurationComponent implements OnInit {
@Input() digitalSignature!: IPkcsDigitalSignatureRequest;

View File

@ -1,12 +1,16 @@
import { Component, Inject } from '@angular/core';
import { DefaultColorType } from '@red/domain';
import { BaseDialogComponent, IconButtonTypes } from '@iqser/common-ui';
import { UntypedFormGroup, Validators } from '@angular/forms';
import { BaseDialogComponent, CircleButtonComponent, IconButtonComponent, IconButtonTypes } from '@iqser/common-ui';
import { ReactiveFormsModule, UntypedFormGroup, Validators } from '@angular/forms';
import { defaultColorsTranslations } from '@translations/default-colors-translations';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { firstValueFrom } from 'rxjs';
import { DefaultColorsService } from '@services/entity-services/default-colors.service';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { TranslateModule } from '@ngx-translate/core';
import { ColorPickerModule } from 'ngx-color-picker';
import { MatIcon } from '@angular/material/icon';
import { NgIf } from '@angular/common';
interface IEditColorData {
colorKey: DefaultColorType;
@ -16,6 +20,8 @@ interface IEditColorData {
@Component({
templateUrl: './edit-color-dialog.component.html',
styleUrls: ['./edit-color-dialog.component.scss'],
standalone: true,
imports: [ReactiveFormsModule, TranslateModule, ColorPickerModule, MatIcon, NgIf, IconButtonComponent, CircleButtonComponent],
})
export class EditColorDialogComponent extends BaseDialogComponent {
readonly iconButtonTypes = IconButtonTypes;

View File

@ -1,13 +1,16 @@
import { Component, Inject } from '@angular/core';
import { Validators } from '@angular/forms';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { BaseDialogComponent } from '@iqser/common-ui';
import { ReactiveFormsModule, Validators } from '@angular/forms';
import { MAT_DIALOG_DATA, MatDialogClose, MatDialogRef } from '@angular/material/dialog';
import { BaseDialogComponent, CircleButtonComponent, IconButtonComponent } from '@iqser/common-ui';
import { ISmtpConfiguration } from '@red/domain';
import { getCurrentUser } from '@users/user.service';
import { TranslateModule } from '@ngx-translate/core';
@Component({
selector: 'redaction-smtp-auth-dialog',
templateUrl: './smtp-auth-dialog.component.html',
standalone: true,
imports: [ReactiveFormsModule, TranslateModule, IconButtonComponent, CircleButtonComponent, MatDialogClose],
})
export class SmtpAuthDialogComponent extends BaseDialogComponent {
readonly #currentUser = getCurrentUser();

View File

@ -1,11 +1,14 @@
import { ChangeDetectionStrategy, Component } from '@angular/core';
import { MatDialogRef } from '@angular/material/dialog';
import { IconButtonTypes } from '@iqser/common-ui';
import { IconButtonComponent, IconButtonTypes } from '@iqser/common-ui';
import { TranslateModule } from '@ngx-translate/core';
@Component({
templateUrl: './upload-dictionary-dialog.component.html',
styleUrls: ['./upload-dictionary-dialog.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [IconButtonComponent, TranslateModule],
})
export class UploadDictionaryDialogComponent {
readonly iconButtonTypes = IconButtonTypes;

View File

@ -1,8 +1,17 @@
import { Component, inject, OnDestroy, OnInit } from '@angular/core';
import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';
import { ReactiveFormsModule, UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { IqserPermissionsService, ListingComponent, listingProvidersFactory, LoadingService, TableColumnConfig } from '@iqser/common-ui';
import { getCurrentUser } from '@iqser/common-ui/lib/users';
import {
CircleButtonComponent,
HumanizePipe,
IqserListingModule,
IqserPermissionsService,
ListingComponent,
listingProvidersFactory,
LoadingService,
TableColumnConfig,
} from '@iqser/common-ui';
import { getCurrentUser, InitialsAvatarComponent } from '@iqser/common-ui/lib/users';
import { Audit, IAudit, IAuditResponse, IAuditSearchRequest, User } from '@red/domain';
import { RouterHistoryService } from '@services/router-history.service';
import { auditCategoriesTranslations } from '@translations/audit-categories-translations';
@ -12,6 +21,14 @@ import { Dayjs } from 'dayjs';
import { firstValueFrom } from 'rxjs';
import { AdminDialogService } from '../../services/admin-dialog.service';
import { AuditService } from '../../services/audit.service';
import { TranslateModule } from '@ngx-translate/core';
import { PaginationComponent } from '@common-ui/pagination';
import { MatFormField, MatSuffix } from '@angular/material/form-field';
import { MatOption, MatSelect, MatSelectTrigger } from '@angular/material/select';
import { AsyncPipe, NgForOf, NgIf } from '@angular/common';
import { MatDatepickerModule } from '@angular/material/datepicker';
import { MatIcon } from '@angular/material/icon';
import { DatePipe } from '@shared/pipes/date.pipe';
const PAGE_SIZE = 50;
@ -19,6 +36,27 @@ const PAGE_SIZE = 50;
templateUrl: './audit-screen.component.html',
styleUrls: ['./audit-screen.component.scss'],
providers: listingProvidersFactory(AuditScreenComponent),
standalone: true,
imports: [
IqserListingModule,
TranslateModule,
PaginationComponent,
ReactiveFormsModule,
MatFormField,
MatOption,
NgForOf,
InitialsAvatarComponent,
NgIf,
MatIcon,
MatSuffix,
AsyncPipe,
DatePipe,
HumanizePipe,
CircleButtonComponent,
MatSelectTrigger,
MatSelect,
MatDatepickerModule,
],
})
export class AuditScreenComponent extends ListingComponent<Audit> implements OnInit, OnDestroy {
private _previousFrom: Dayjs;
@ -26,7 +64,7 @@ export class AuditScreenComponent extends ListingComponent<Audit> implements OnI
readonly ALL_CATEGORIES = 'allCategories';
readonly ALL_USERS = _('audit-screen.all-users');
readonly translations = auditCategoriesTranslations;
readonly form: UntypedFormGroup = this._getForm();
readonly form: UntypedFormGroup = this.#getForm();
readonly routerHistoryService = inject(RouterHistoryService);
readonly permissionsService = inject(IqserPermissionsService);
readonly roles = Roles;
@ -59,17 +97,17 @@ export class AuditScreenComponent extends ListingComponent<Audit> implements OnI
}
async pageChanged(page: number) {
await this._fetchData(page);
await this.#fetchData(page);
}
async ngOnInit() {
this.sortingService.setSortingOption({ column: 'recordDate', order: 'desc' });
await this._fetchData();
await this.#fetchData();
}
async filterChange() {
if (!this._updateDateFilters(this.form.value)) {
await this._fetchData();
if (!this.#updateDateFilters(this.form.value)) {
await this.#fetchData();
}
}
@ -77,7 +115,7 @@ export class AuditScreenComponent extends ListingComponent<Audit> implements OnI
this._dialogService.openDialog('auditInfo', { auditEntry: log });
}
private _getForm(): UntypedFormGroup {
#getForm(): UntypedFormGroup {
return this._formBuilder.group({
category: [this.ALL_CATEGORIES],
userId: [this.ALL_USERS],
@ -86,7 +124,7 @@ export class AuditScreenComponent extends ListingComponent<Audit> implements OnI
});
}
private _updateDateFilters(value): boolean {
#updateDateFilters(value): boolean {
if (applyIntervalConstraints(value, this._previousFrom, this._previousTo, this.form, 'from', 'to')) {
return true;
}
@ -96,7 +134,7 @@ export class AuditScreenComponent extends ListingComponent<Audit> implements OnI
return false;
}
private async _fetchData(page?: number) {
async #fetchData(page?: number) {
this._loadingService.start();
const promises = [];
const category = this.form.get('category').value;

View File

@ -1,13 +1,13 @@
import { Component, OnInit } from '@angular/core';
import { CircleButtonComponent, IconButtonComponent, IconButtonTypes, IqserDialogComponent, IqserUploadFileModule } from '@iqser/common-ui';
import { CircleButtonComponent, IconButtonComponent, IconButtonTypes, IqserDialogComponent, UploadFileComponent } from '@iqser/common-ui';
import { FileAttributeEncodingTypes, IComponentMapping } from '@red/domain';
import { FormBuilder, ReactiveFormsModule, UntypedFormGroup, Validators } from '@angular/forms';
import { TranslateModule } from '@ngx-translate/core';
import { NgForOf, NgIf } from '@angular/common';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatDialogClose } from '@angular/material/dialog';
import { MatDialogModule } from '@angular/material/dialog';
import { MatOption } from '@angular/material/autocomplete';
import { MatSelect } from '@angular/material/select';
import { MatSelect, MatSelectTrigger } from '@angular/material/select';
import { fileAttributeEncodingTypesTranslations } from '@translations/file-attribute-encoding-types-translations';
import { firstValueFrom } from 'rxjs';
import { ComponentMappingsService } from '@services/entity-services/component-mappings.service';
@ -35,11 +35,12 @@ interface DialogResult {
MatFormFieldModule,
NgForOf,
CircleButtonComponent,
MatDialogClose,
IqserUploadFileModule,
MatDialogModule,
MatOption,
MatSelectTrigger,
MatSelect,
IconButtonComponent,
UploadFileComponent,
],
})
export class AddEditComponentMappingDialogComponent

View File

@ -6,6 +6,11 @@ import {
LoadingService,
IconButtonTypes,
IqserDialog,
CircleButtonComponent,
IqserListingModule,
InputWithActionComponent,
IconButtonComponent,
IqserAllowDirective,
} from '@iqser/common-ui';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { defaultColorsTranslations } from '@translations/default-colors-translations';
@ -19,11 +24,32 @@ import { map, tap } from 'rxjs/operators';
import { AddEditComponentMappingDialogComponent } from './add-edit-component-mapping-dialog/add-edit-component-mapping-dialog.component';
import { AdminDialogService } from '../../services/admin-dialog.service';
import { getParam } from '@common-ui/utils';
import { DossierTemplateBreadcrumbsComponent } from '../../shared/components/dossier-template-breadcrumbs/dossier-template-breadcrumbs.component';
import { AsyncPipe, NgIf } from '@angular/common';
import { DossierTemplateActionsComponent } from '../../shared/components/dossier-template-actions/dossier-template-actions.component';
import { TranslateModule } from '@ngx-translate/core';
import { RouterLink } from '@angular/router';
import { AdminSideNavComponent } from '../../shared/components/admin-side-nav/admin-side-nav.component';
@Component({
templateUrl: './component-mappings-screen.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
providers: listingProvidersFactory(ComponentMappingsScreenComponent),
standalone: true,
imports: [
DossierTemplateBreadcrumbsComponent,
AsyncPipe,
NgIf,
DossierTemplateActionsComponent,
CircleButtonComponent,
TranslateModule,
RouterLink,
AdminSideNavComponent,
IqserListingModule,
InputWithActionComponent,
IconButtonComponent,
IqserAllowDirective,
],
})
export class ComponentMappingsScreenComponent extends ListingComponent<ComponentMapping> implements OnInit {
tableColumnConfigs: readonly TableColumnConfig<ComponentMapping>[] = [

View File

@ -1,29 +1,6 @@
<section *ngIf="context$ | async as context">
<div class="page-header">
<redaction-dossier-template-breadcrumbs class="flex-1"></redaction-dossier-template-breadcrumbs>
<div class="flex-1 actions">
<redaction-dossier-template-actions></redaction-dossier-template-actions>
<iqser-circle-button
[routerLink]="['../..']"
[tooltip]="'common.close' | translate"
icon="iqser:close"
tooltipPosition="below"
></iqser-circle-button>
</div>
</div>
<div class="content-inner">
<div class="overlay-shadow"></div>
<redaction-admin-side-nav type="dossierTemplates"></redaction-admin-side-nav>
<div class="content-container">
<div class="content-container" *ngIf="context$ | async as context">
<iqser-table [itemSize]="80" [tableColumnConfigs]="tableColumnConfigs" emptyColumnWidth="2fr"></iqser-table>
</div>
</div>
</section>
<ng-template #tableItemTemplate let-entity="entity">
<div>

View File

@ -1,6 +1,16 @@
import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { getConfig, IListable, ListingComponent, listingProvidersFactory, LoadingService, TableColumnConfig } from '@iqser/common-ui';
import {
CircleButtonComponent,
getConfig,
IListable,
IqserAllowDirective,
IqserListingModule,
ListingComponent,
listingProvidersFactory,
LoadingService,
TableColumnConfig,
} from '@iqser/common-ui';
import { getCurrentUser } from '@iqser/common-ui/lib/users';
import { getParam } from '@iqser/common-ui/lib/utils';
import { DefaultColorTypes, DOSSIER_TEMPLATE_ID, User } from '@red/domain';
@ -10,6 +20,8 @@ import { Roles } from '@users/roles';
import { combineLatest } from 'rxjs';
import { map, tap } from 'rxjs/operators';
import { AdminDialogService } from '../../services/admin-dialog.service';
import { AsyncPipe, NgIf, NgStyle } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core';
interface ListItem extends IListable {
readonly key: string;
@ -21,6 +33,8 @@ interface ListItem extends IListable {
styleUrls: ['./default-colors-screen.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
providers: listingProvidersFactory(DefaultColorsScreenComponent),
standalone: true,
imports: [IqserListingModule, NgStyle, CircleButtonComponent, IqserAllowDirective, TranslateModule, AsyncPipe, NgIf],
})
export class DefaultColorsScreenComponent extends ListingComponent<ListItem> implements OnInit {
readonly #dossierTemplateId = getParam(DOSSIER_TEMPLATE_ID);

View File

@ -1,5 +1,13 @@
import { ChangeDetectorRef, Component, computed, OnInit, ViewChild } from '@angular/core';
import { IconButtonTypes, IqserPermissionsService, LoadingService, Toaster } from '@iqser/common-ui';
import {
EmptyStateComponent,
IconButtonComponent,
IconButtonTypes,
IqserListingModule,
IqserPermissionsService,
LoadingService,
Toaster,
} from '@iqser/common-ui';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { RouterHistoryService } from '@services/router-history.service';
import { DigitalSignatureService } from '../../services/digital-signature.service';
@ -10,11 +18,24 @@ import { KmsSignatureConfigurationComponent } from '../../dialogs/configure-digi
import { DigitalSignatureOptions, IKmsDigitalSignatureRequest, IPkcsDigitalSignatureRequest, User } from '@red/domain';
import { Roles } from '@users/roles';
import { getCurrentUser } from '@iqser/common-ui/lib/users';
import { AsyncPipe, NgIf } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core';
@Component({
selector: 'redaction-digital-signature-screen',
templateUrl: './digital-signature-screen.component.html',
styleUrls: ['./digital-signature-screen.component.scss'],
standalone: true,
imports: [
IqserListingModule,
EmptyStateComponent,
NgIf,
TranslateModule,
AsyncPipe,
PkcsSignatureConfigurationComponent,
KmsSignatureConfigurationComponent,
IconButtonComponent,
],
})
export class DigitalSignatureScreenComponent implements OnInit {
@ViewChild(PkcsSignatureConfigurationComponent) pkcsSignatureConfigurationComponent: PkcsSignatureConfigurationComponent;

View File

@ -2,8 +2,12 @@ import { Component, OnInit, TemplateRef, ViewChild } from '@angular/core';
import { MatDialog } from '@angular/material/dialog';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import {
CircleButtonComponent,
defaultDialogConfig,
IconButtonComponent,
IconButtonTypes,
InputWithActionComponent,
IqserListingModule,
ListingComponent,
listingProvidersFactory,
LoadingService,
@ -20,6 +24,9 @@ import {
AddEditDossierAttributeDialogComponent,
AddEditDossierAttributeDialogData,
} from './add-edit-dossier-attribute-dialog/add-edit-dossier-attribute-dialog.component';
import { TranslateModule } from '@ngx-translate/core';
import { AsyncPipe, NgForOf, NgIf } from '@angular/common';
import { TableItemComponent } from './table-item/table-item.component';
@Component({
templateUrl: './dossier-attributes-listing-screen.component.html',
@ -28,8 +35,20 @@ import {
entitiesService: DossierAttributesService,
component: DossierAttributesListingScreenComponent,
}),
standalone: true,
imports: [
IqserListingModule,
TranslateModule,
CircleButtonComponent,
AsyncPipe,
NgIf,
InputWithActionComponent,
IconButtonComponent,
NgForOf,
TableItemComponent,
],
})
export class DossierAttributesListingScreenComponent extends ListingComponent<DossierAttributeConfig> implements OnInit {
export default class DossierAttributesListingScreenComponent extends ListingComponent<DossierAttributeConfig> implements OnInit {
readonly #dossierTemplateId = getParam(DOSSIER_TEMPLATE_ID);
readonly iconButtonTypes = IconButtonTypes;
readonly currentUser = getCurrentUser<User>();

View File

@ -1,38 +0,0 @@
import { NgModule } from '@angular/core';
import { DossierAttributesListingScreenComponent } from './dossier-attributes-listing-screen.component';
import { CommonModule } from '@angular/common';
import {
CircleButtonComponent,
IconButtonComponent,
InputWithActionComponent,
IqserHelpModeModule,
IqserListingModule,
IqserRoutes,
} from '@iqser/common-ui';
import { RouterModule } from '@angular/router';
import { TranslateModule } from '@ngx-translate/core';
import { MatTooltipModule } from '@angular/material/tooltip';
import { TableItemComponent } from './table-item/table-item.component';
const routes: IqserRoutes = [
{
path: '',
component: DossierAttributesListingScreenComponent,
},
];
@NgModule({
declarations: [DossierAttributesListingScreenComponent, TableItemComponent],
imports: [
CommonModule,
RouterModule.forChild(routes),
TranslateModule,
CircleButtonComponent,
InputWithActionComponent,
IconButtonComponent,
IqserHelpModeModule,
MatTooltipModule,
IqserListingModule,
],
})
export class DossierAttributesListingModule {}

View File

@ -1,11 +1,17 @@
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { DossierAttributeConfig, IDossierAttributeConfig } from '@red/domain';
import { dossierAttributeTypesTranslations } from '@translations/dossier-attribute-types-translations';
import { MatTooltip } from '@angular/material/tooltip';
import { TranslateModule } from '@ngx-translate/core';
import { CircleButtonComponent } from '@iqser/common-ui';
import { NgIf } from '@angular/common';
@Component({
selector: 'redaction-table-item [attribute] [canEditDossierAttributes]',
templateUrl: './table-item.component.html',
styleUrls: ['./table-item.component.scss'],
standalone: true,
imports: [MatTooltip, TranslateModule, CircleButtonComponent, NgIf],
})
export class TableItemComponent {
readonly translations = dossierAttributeTypesTranslations;

View File

@ -1,10 +1,14 @@
import { Component, Inject } from '@angular/core';
import { BaseDialogComponent } from '@iqser/common-ui';
import { Validators } from '@angular/forms';
import { BaseDialogComponent, CircleButtonComponent, IconButtonComponent } from '@iqser/common-ui';
import { ReactiveFormsModule, Validators } from '@angular/forms';
import { IDossierState } from '@red/domain';
import { DossierStatesService } from '@services/entity-services/dossier-states.service';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { TranslateModule } from '@ngx-translate/core';
import { ColorPickerModule } from 'ngx-color-picker';
import { MatIcon } from '@angular/material/icon';
import { NgIf } from '@angular/common';
export interface AddEditDossierStateDialogData {
readonly dossierState?: IDossierState;
@ -14,6 +18,8 @@ export interface AddEditDossierStateDialogData {
@Component({
templateUrl: './add-edit-dossier-state-dialog.component.html',
styleUrls: ['./add-edit-dossier-state-dialog.component.scss'],
standalone: true,
imports: [TranslateModule, ReactiveFormsModule, ColorPickerModule, MatIcon, NgIf, IconButtonComponent, CircleButtonComponent],
})
export class AddEditDossierStateDialogComponent extends BaseDialogComponent {
readonly type = this.data.dossierState ? 'edit' : 'create';

View File

@ -1,13 +1,18 @@
import { Component, Inject } from '@angular/core';
import { DossierState } from '@red/domain';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { FormBuilder } from '@angular/forms';
import { FormBuilder, ReactiveFormsModule } from '@angular/forms';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { combineLatest, firstValueFrom } from 'rxjs';
import { DossierStatesService } from '@services/entity-services/dossier-states.service';
import { IconButtonTypes, LoadingService, Toaster } from '@iqser/common-ui';
import { CircleButtonComponent, IconButtonComponent, IconButtonTypes, LoadingService, Toaster } from '@iqser/common-ui';
import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service';
import { ArchivedDossiersService } from '@services/dossiers/archived-dossiers.service';
import { TranslateModule } from '@ngx-translate/core';
import { MatCheckbox } from '@angular/material/checkbox';
import { MatFormField } from '@angular/material/form-field';
import { MatOption, MatSelect, MatSelectTrigger } from '@angular/material/select';
import { NgForOf, NgIf } from '@angular/common';
export interface ConfirmDeleteDossierStateDialogData {
readonly toBeDeletedState: DossierState;
@ -18,6 +23,20 @@ export interface ConfirmDeleteDossierStateDialogData {
@Component({
templateUrl: './confirm-delete-dossier-state-dialog.component.html',
styleUrls: ['./confirm-delete-dossier-state-dialog.component.scss'],
standalone: true,
imports: [
TranslateModule,
ReactiveFormsModule,
MatCheckbox,
MatFormField,
MatSelectTrigger,
MatSelect,
MatOption,
NgForOf,
IconButtonComponent,
CircleButtonComponent,
NgIf,
],
})
export class ConfirmDeleteDossierStateDialogComponent {
readonly iconButtonTypes = IconButtonTypes;

View File

@ -1,7 +1,10 @@
import { Component, OnDestroy, OnInit } from '@angular/core';
import {
defaultDialogConfig,
IconButtonComponent,
IconButtonTypes,
InputWithActionComponent,
IqserListingModule,
ListingComponent,
listingProvidersFactory,
LoadingService,
@ -21,13 +24,28 @@ import {
} from '../add-edit-dossier-state-dialog/add-edit-dossier-state-dialog.component';
import { SortingOrders } from '@iqser/common-ui/lib/sorting';
import { getParam } from '@iqser/common-ui/lib/utils';
import { DonutChartComponent } from '@shared/components/donut-chart/donut-chart.component';
import { AsyncPipe, NgIf } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core';
import { DossierStatesTableItemComponent } from '../dossier-states-table-item/dossier-states-table-item.component';
@Component({
templateUrl: './dossier-states-listing-screen.component.html',
styleUrls: ['./dossier-states-listing-screen.component.scss'],
providers: listingProvidersFactory(DossierStatesListingScreenComponent),
standalone: true,
imports: [
IqserListingModule,
DonutChartComponent,
AsyncPipe,
NgIf,
TranslateModule,
InputWithActionComponent,
IconButtonComponent,
DossierStatesTableItemComponent,
],
})
export class DossierStatesListingScreenComponent extends ListingComponent<DossierState> implements OnInit, OnDestroy {
export default class DossierStatesListingScreenComponent extends ListingComponent<DossierState> implements OnInit, OnDestroy {
readonly #dossierTemplateId = getParam(DOSSIER_TEMPLATE_ID);
readonly iconButtonTypes = IconButtonTypes;
readonly tableHeaderLabel = _('dossier-states-listing.table-header.title');

View File

@ -1,62 +0,0 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { DossierStatesListingScreenComponent } from './dossier-states-listing-screen/dossier-states-listing-screen.component';
import { DossierStatesTableItemComponent } from './dossier-states-table-item/dossier-states-table-item.component';
import { RouterModule } from '@angular/router';
import {
CircleButtonComponent,
IconButtonComponent,
InputWithActionComponent,
IqserHelpModeModule,
IqserListingModule,
} from '@iqser/common-ui';
import { MatTooltipModule } from '@angular/material/tooltip';
import { TranslateModule } from '@ngx-translate/core';
import { DonutChartComponent } from '@shared/components/donut-chart/donut-chart.component';
import { AdminSideNavComponent } from '../../shared/components/admin-side-nav/admin-side-nav.component';
import { DossierTemplateActionsComponent } from '../../shared/components/dossier-template-actions/dossier-template-actions.component';
import { DossierTemplateBreadcrumbsComponent } from '../../shared/components/dossier-template-breadcrumbs/dossier-template-breadcrumbs.component';
import { AddEditDossierStateDialogComponent } from './add-edit-dossier-state-dialog/add-edit-dossier-state-dialog.component';
import { ReactiveFormsModule } from '@angular/forms';
import { ColorPickerModule } from 'ngx-color-picker';
import { MatIconModule } from '@angular/material/icon';
import { ConfirmDeleteDossierStateDialogComponent } from './confirm-delete-dossier-state-dialog/confirm-delete-dossier-state-dialog.component';
import { MatSelectModule } from '@angular/material/select';
import { MatDialogModule } from '@angular/material/dialog';
import { MatCheckboxModule } from '@angular/material/checkbox';
@NgModule({
declarations: [
DossierStatesListingScreenComponent,
DossierStatesTableItemComponent,
AddEditDossierStateDialogComponent,
ConfirmDeleteDossierStateDialogComponent,
],
imports: [
CommonModule,
RouterModule.forChild([
{
path: '',
component: DossierStatesListingScreenComponent,
},
]),
MatDialogModule,
CircleButtonComponent,
IqserHelpModeModule,
MatTooltipModule,
IconButtonComponent,
TranslateModule,
IqserListingModule,
DonutChartComponent,
AdminSideNavComponent,
DossierTemplateActionsComponent,
InputWithActionComponent,
DossierTemplateBreadcrumbsComponent,
ReactiveFormsModule,
ColorPickerModule,
MatIconModule,
MatCheckboxModule,
MatSelectModule,
],
})
export class DossierStatesListingModule {}

View File

@ -1,6 +1,6 @@
import { Component, inject, Input } from '@angular/core';
import { MatDialog } from '@angular/material/dialog';
import { defaultDialogConfig, EntitiesService } from '@iqser/common-ui';
import { CircleButtonComponent, defaultDialogConfig, EntitiesService } from '@iqser/common-ui';
import { DossierState, IDossierState } from '@red/domain';
import { PermissionsService } from '@services/permissions.service';
import {
@ -11,11 +11,16 @@ import {
ConfirmDeleteDossierStateDialogComponent,
ConfirmDeleteDossierStateDialogData,
} from '../confirm-delete-dossier-state-dialog/confirm-delete-dossier-state-dialog.component';
import { MatTooltip } from '@angular/material/tooltip';
import { TranslateModule } from '@ngx-translate/core';
import { NgIf } from '@angular/common';
@Component({
selector: 'redaction-dossier-states-table-item',
templateUrl: './dossier-states-table-item.component.html',
styleUrls: ['./dossier-states-table-item.component.scss'],
standalone: true,
imports: [MatTooltip, CircleButtonComponent, TranslateModule, NgIf],
})
export class DossierStatesTableItemComponent {
readonly #dialog = inject(MatDialog);

View File

@ -1,7 +1,12 @@
import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import {
CircleButtonComponent,
IconButtonComponent,
IconButtonTypes,
InputWithActionComponent,
IqserAllowDirective,
IqserListingModule,
IqserPermissionsService,
ListingComponent,
listingProvidersFactory,
@ -16,6 +21,9 @@ import { Roles } from '@users/roles';
import { UserPreferenceService } from '@users/user-preference.service';
import { firstValueFrom } from 'rxjs';
import { AdminDialogService } from '../../../services/admin-dialog.service';
import { TranslateModule } from '@ngx-translate/core';
import { AsyncPipe } from '@angular/common';
import { TableItemComponent } from '../table-item/table-item.component';
@Component({
templateUrl: './dossier-templates-listing-screen.component.html',
@ -25,8 +33,19 @@ import { AdminDialogService } from '../../../services/admin-dialog.service';
entitiesService: DossierTemplatesService,
component: DossierTemplatesListingScreenComponent,
}),
standalone: true,
imports: [
IqserListingModule,
TranslateModule,
AsyncPipe,
CircleButtonComponent,
IqserAllowDirective,
InputWithActionComponent,
IconButtonComponent,
TableItemComponent,
],
})
export class DossierTemplatesListingScreenComponent extends ListingComponent<DossierTemplate> implements OnInit {
export default class DossierTemplatesListingScreenComponent extends ListingComponent<DossierTemplate> implements OnInit {
readonly iconButtonTypes = IconButtonTypes;
readonly roles = Roles;
readonly currentUser = getCurrentUser<User>();
@ -58,7 +77,7 @@ export class DossierTemplatesListingScreenComponent extends ListingComponent<Dos
openBulkDeleteTemplatesDialog() {
return this._dialogService.openDialog('confirm', null, () => {
this._loadingService.loadWhile(this._deleteTemplates());
this._loadingService.loadWhile(this.#deleteTemplates());
});
}
@ -66,7 +85,7 @@ export class DossierTemplatesListingScreenComponent extends ListingComponent<Dos
this._dialogService.openDialog('addCloneDossierTemplate', {});
}
private async _deleteTemplates(templateIds = this.listingService.selected.map(d => d.dossierTemplateId)) {
async #deleteTemplates(templateIds = this.listingService.selected.map(d => d.dossierTemplateId)) {
await firstValueFrom(this._dossierTemplatesService.delete(templateIds));
}
}

View File

@ -1,39 +0,0 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RouterModule } from '@angular/router';
import { SharedModule } from '@shared/shared.module';
import { TableItemComponent } from './table-item/table-item.component';
import { DossierTemplatesListingScreenComponent } from './dossier-templates-listing-screen/dossier-templates-listing-screen.component';
import {
CircleButtonComponent,
IconButtonComponent,
InputWithActionComponent,
IqserAllowDirective,
IqserHelpModeModule,
IqserListingModule,
IqserRoutes,
} from '@iqser/common-ui';
import { TranslateModule } from '@ngx-translate/core';
import { DossierTemplateActionsComponent } from '../../shared/components/dossier-template-actions/dossier-template-actions.component';
import { IqserUsersModule } from '@iqser/common-ui/lib/users';
const routes: IqserRoutes = [{ path: '', component: DossierTemplatesListingScreenComponent }];
@NgModule({
declarations: [TableItemComponent, DossierTemplatesListingScreenComponent],
imports: [
RouterModule.forChild(routes),
CommonModule,
SharedModule,
IqserUsersModule,
TranslateModule,
IqserListingModule,
IqserHelpModeModule,
DossierTemplateActionsComponent,
CircleButtonComponent,
IconButtonComponent,
InputWithActionComponent,
IqserAllowDirective,
],
})
export class DossierTemplatesListingModule {}

View File

@ -4,12 +4,21 @@ import { BehaviorSubject, Observable } from 'rxjs';
import { DossierTemplateStatsService } from '@services/entity-services/dossier-template-stats.service';
import { switchMap } from 'rxjs/operators';
import { dossierTemplateStatusTranslations } from '@translations/dossier-template-status-translations';
import { MatTooltip } from '@angular/material/tooltip';
import { AsyncPipe, NgIf } from '@angular/common';
import { MatIcon } from '@angular/material/icon';
import { TranslateModule } from '@ngx-translate/core';
import { DossierTemplateActionsComponent } from '../../../shared/components/dossier-template-actions/dossier-template-actions.component';
import { InitialsAvatarComponent } from '@common-ui/users';
import { DatePipe } from '@shared/pipes/date.pipe';
@Component({
selector: 'redaction-table-item [dossierTemplate]',
templateUrl: './table-item.component.html',
styleUrls: ['./table-item.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [MatTooltip, NgIf, AsyncPipe, MatIcon, TranslateModule, DatePipe, DossierTemplateActionsComponent, InitialsAvatarComponent],
})
export class TableItemComponent implements OnChanges {
@Input() dossierTemplate!: DossierTemplate;

View File

@ -1,24 +1,3 @@
<section>
<div class="page-header">
<redaction-dossier-template-breadcrumbs class="flex-1"></redaction-dossier-template-breadcrumbs>
<div class="flex-1 actions">
<redaction-dossier-template-actions></redaction-dossier-template-actions>
<iqser-circle-button
[routerLink]="['../..']"
[tooltip]="'common.close' | translate"
icon="iqser:close"
tooltipPosition="below"
></iqser-circle-button>
</div>
</div>
<div class="content-inner">
<div class="overlay-shadow"></div>
<redaction-admin-side-nav type="dossierTemplates"></redaction-admin-side-nav>
<div class="content-container">
<iqser-table
(noDataAction)="openAddEntityDialog()"
@ -34,8 +13,6 @@
noDataIcon="red:dictionary"
></iqser-table>
</div>
</div>
</section>
<ng-template #bulkActions>
<iqser-circle-button

View File

@ -1,6 +1,16 @@
import { Component, OnInit } from '@angular/core';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { IconButtonTypes, ListingComponent, listingProvidersFactory, LoadingService, TableColumnConfig } from '@iqser/common-ui';
import {
CircleButtonComponent,
IconButtonComponent,
IconButtonTypes,
InputWithActionComponent,
IqserListingModule,
ListingComponent,
listingProvidersFactory,
LoadingService,
TableColumnConfig,
} from '@iqser/common-ui';
import { getParam } from '@iqser/common-ui/lib/utils';
import { Dictionary, DOSSIER_TEMPLATE_ID, DossierTemplateStats } from '@red/domain';
import { DictionariesMapService } from '@services/entity-services/dictionaries-map.service';
@ -10,11 +20,28 @@ import { PermissionsService } from '@services/permissions.service';
import { firstValueFrom, Observable } from 'rxjs';
import { tap } from 'rxjs/operators';
import { AdminDialogService } from '../../services/admin-dialog.service';
import { TranslateModule } from '@ngx-translate/core';
import { AsyncPipe, NgIf, NgStyle } from '@angular/common';
import { AnnotationIconComponent } from '@shared/components/annotation-icon/annotation-icon.component';
import { RouterLink } from '@angular/router';
@Component({
templateUrl: './entities-listing-screen.component.html',
styleUrls: ['./entities-listing-screen.component.scss'],
providers: listingProvidersFactory(EntitiesListingScreenComponent),
standalone: true,
imports: [
IqserListingModule,
TranslateModule,
CircleButtonComponent,
NgIf,
InputWithActionComponent,
IconButtonComponent,
NgStyle,
AnnotationIconComponent,
AsyncPipe,
RouterLink,
],
})
export class EntitiesListingScreenComponent extends ListingComponent<Dictionary> implements OnInit {
readonly #dossierTemplateId = getParam(DOSSIER_TEMPLATE_ID);

View File

@ -1,50 +0,0 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RouterModule, Routes } from '@angular/router';
import { SharedModule } from '@shared/shared.module';
import { DictionaryScreenComponent } from './screens/dictionary/dictionary-screen.component';
import { PendingChangesGuard } from '@guards/can-deactivate.guard';
import { EntityInfoComponent } from './screens/entity-info/entity-info.component';
import { MonacoEditorModule } from '@materia-ui/ngx-monaco-editor';
import { TranslateModule } from '@ngx-translate/core';
import { HasScrollbarDirective, IconButtonComponent, IqserDenyDirective, IqserHelpModeModule } from '@iqser/common-ui';
const routes: Routes = [
{ path: '', redirectTo: 'info', pathMatch: 'full' },
{
path: 'info',
component: EntityInfoComponent,
canDeactivate: [PendingChangesGuard],
},
{
path: 'dictionary',
component: DictionaryScreenComponent,
canDeactivate: [PendingChangesGuard],
},
{
path: 'false-positive',
component: DictionaryScreenComponent,
canDeactivate: [PendingChangesGuard],
},
{
path: 'false-recommendations',
component: DictionaryScreenComponent,
canDeactivate: [PendingChangesGuard],
},
];
@NgModule({
declarations: [DictionaryScreenComponent, EntityInfoComponent],
imports: [
RouterModule.forChild(routes),
CommonModule,
SharedModule,
MonacoEditorModule,
TranslateModule,
IqserHelpModeModule,
IconButtonComponent,
HasScrollbarDirective,
IqserDenyDirective,
],
})
export class EntitiesModule {}

View File

@ -0,0 +1,28 @@
import { IqserRoutes } from '@iqser/common-ui';
import { EntityInfoComponent } from './screens/entity-info/entity-info.component';
import { PendingChangesGuard } from '@guards/can-deactivate.guard';
import { DictionaryScreenComponent } from './screens/dictionary/dictionary-screen.component';
export default [
{ path: '', redirectTo: 'info', pathMatch: 'full' },
{
path: 'info',
component: EntityInfoComponent,
canDeactivate: [PendingChangesGuard],
},
{
path: 'dictionary',
component: DictionaryScreenComponent,
canDeactivate: [PendingChangesGuard],
},
{
path: 'false-positive',
component: DictionaryScreenComponent,
canDeactivate: [PendingChangesGuard],
},
{
path: 'false-recommendations',
component: DictionaryScreenComponent,
canDeactivate: [PendingChangesGuard],
},
] satisfies IqserRoutes;

View File

@ -10,11 +10,14 @@ import { Roles } from '@users/roles';
import { NGXLogger } from 'ngx-logger';
import { getCurrentUser } from '@iqser/common-ui/lib/users';
import { getParam, List } from '@iqser/common-ui/lib/utils';
import { AsyncPipe } from '@angular/common';
@Component({
templateUrl: './dictionary-screen.component.html',
styleUrls: ['./dictionary-screen.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [AsyncPipe, DictionaryManagerComponent],
})
export class DictionaryScreenComponent implements OnInit {
protected readonly currentUser = getCurrentUser<User>();

View File

@ -1,6 +1,6 @@
import { ChangeDetectionStrategy, Component, HostListener, ViewChild } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { getConfig, IconButtonTypes } from '@iqser/common-ui';
import { getConfig, HasScrollbarDirective, HelpButtonComponent, IconButtonComponent, IconButtonTypes } from '@iqser/common-ui';
import { IqserEventTarget } from '@iqser/common-ui/lib/utils';
import { Dictionary, DOSSIER_TEMPLATE_ID, ENTITY_TYPE } from '@red/domain';
import { DictionariesMapService } from '@services/entity-services/dictionaries-map.service';
@ -8,12 +8,26 @@ import { PermissionsService } from '@services/permissions.service';
import { AddEditEntityComponent } from '@shared/components/add-edit-entity/add-edit-entity.component';
import { getCurrentUser } from '@users/user.service';
import { Observable } from 'rxjs';
import { MatIcon } from '@angular/material/icon';
import { AsyncPipe, NgIf } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core';
@Component({
selector: 'redaction-entity-info',
templateUrl: './entity-info.component.html',
styleUrls: ['./entity-info.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [
HasScrollbarDirective,
MatIcon,
NgIf,
TranslateModule,
AsyncPipe,
IconButtonComponent,
AddEditEntityComponent,
HelpButtonComponent,
],
})
export class EntityInfoComponent {
@ViewChild(AddEditEntityComponent) private readonly _addEditEntityComponent: AddEditEntityComponent;

View File

@ -3,7 +3,7 @@ import { ReactiveFormsModule, Validators } from '@angular/forms';
import { FileAttributeConfigTypes, IFileAttributeConfig } from '@red/domain';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { fileAttributeTypesTranslations } from '@translations/file-attribute-types-translations';
import { BaseDialogComponent, CircleButtonComponent, getConfig, IconButtonComponent, IqserHelpModeModule } from '@iqser/common-ui';
import { BaseDialogComponent, CircleButtonComponent, getConfig, HelpButtonComponent, IconButtonComponent } from '@iqser/common-ui';
import { TranslateModule } from '@ngx-translate/core';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatSelectModule } from '@angular/material/select';
@ -34,8 +34,8 @@ export interface AddEditFileAttributeDialogData {
MatTooltipModule,
IconButtonComponent,
CircleButtonComponent,
IqserHelpModeModule,
NgIf,
HelpButtonComponent,
],
})
export class AddEditFileAttributeDialogComponent extends BaseDialogComponent {

View File

@ -1,14 +1,50 @@
import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from '@angular/core';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { ListingComponent, listingProvidersFactory, TableColumnConfig } from '@iqser/common-ui';
import {
ChevronButtonComponent,
CircleButtonComponent,
EditableInputComponent,
IqserListingModule,
ListingComponent,
listingProvidersFactory,
RoundCheckboxComponent,
TableColumnConfig,
} from '@iqser/common-ui';
import { FileAttributeConfigTypes, IField } from '@red/domain';
import { fileAttributeTypesTranslations } from '@translations/file-attribute-types-translations';
import { MatMenu, MatMenuTrigger } from '@angular/material/menu';
import { TranslateModule } from '@ngx-translate/core';
import { AsyncPipe, NgForOf, NgIf } from '@angular/common';
import { MatFormField } from '@angular/material/form-field';
import { MatOption, MatSelect, MatSelectTrigger } from '@angular/material/select';
import { FormsModule } from '@angular/forms';
import { MatSlideToggle } from '@angular/material/slide-toggle';
@Component({
selector: 'redaction-active-fields-listing',
templateUrl: './active-fields-listing.component.html',
styleUrls: ['./active-fields-listing.component.scss'],
providers: listingProvidersFactory(ActiveFieldsListingComponent),
standalone: true,
imports: [
IqserListingModule,
CircleButtonComponent,
MatMenuTrigger,
TranslateModule,
AsyncPipe,
ChevronButtonComponent,
MatMenu,
EditableInputComponent,
MatFormField,
MatSelectTrigger,
MatSelect,
MatOption,
FormsModule,
MatSlideToggle,
RoundCheckboxComponent,
NgForOf,
NgIf,
],
})
export class ActiveFieldsListingComponent extends ListingComponent<IField> implements OnChanges {
readonly translations = fileAttributeTypesTranslations;

View File

@ -1,15 +1,30 @@
import { ChangeDetectionStrategy, Component, Inject } from '@angular/core';
import { AbstractControl, UntypedFormBuilder, UntypedFormGroup, ValidatorFn, Validators } from '@angular/forms';
import { AbstractControl, ReactiveFormsModule, UntypedFormBuilder, UntypedFormGroup, ValidatorFn, Validators } from '@angular/forms';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import * as Papa from 'papaparse';
import { firstValueFrom, Observable } from 'rxjs';
import { map, startWith } from 'rxjs/operators';
import { IconButtonTypes, ListingComponent, listingProvidersFactory, TableColumnConfig, Toaster } from '@iqser/common-ui';
import {
CircleButtonComponent,
IconButtonComponent,
IconButtonTypes,
InputWithActionComponent,
IqserTranslateModule,
ListingComponent,
listingProvidersFactory,
TableColumnConfig,
Toaster,
} from '@iqser/common-ui';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { FileAttributeConfig, FileAttributeConfigTypes, FileAttributeEncodingTypes, IField, IFileAttributesConfig } from '@red/domain';
import { FileAttributesService } from '@services/entity-services/file-attributes.service';
import { fileAttributeEncodingTypesTranslations } from '@translations/file-attribute-encoding-types-translations';
import { trackByFactory } from '@iqser/common-ui/lib/utils';
import { MatFormField } from '@angular/material/form-field';
import { MatAutocomplete, MatAutocompleteTrigger, MatOption } from '@angular/material/autocomplete';
import { AsyncPipe, NgForOf, NgIf } from '@angular/common';
import { MatSelect, MatSelectTrigger } from '@angular/material/select';
import { ActiveFieldsListingComponent } from './active-fields-listing/active-fields-listing.component';
export interface IFileAttributesCSVImportData {
readonly csv: File;
@ -22,6 +37,24 @@ export interface IFileAttributesCSVImportData {
styleUrls: ['./file-attributes-csv-import-dialog.component.scss'],
providers: listingProvidersFactory(),
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [
IqserTranslateModule,
ReactiveFormsModule,
MatFormField,
MatAutocompleteTrigger,
MatAutocomplete,
AsyncPipe,
MatOption,
MatSelectTrigger,
MatSelect,
CircleButtonComponent,
NgIf,
InputWithActionComponent,
IconButtonComponent,
NgForOf,
ActiveFieldsListingComponent,
],
})
export class FileAttributesCsvImportDialogComponent extends ListingComponent<IField> {
readonly iconButtonTypes = IconButtonTypes;
@ -49,7 +82,7 @@ export class FileAttributesCsvImportDialogComponent extends ListingComponent<IFi
@Inject(MAT_DIALOG_DATA) readonly data: IFileAttributesCSVImportData,
) {
super();
this.form = this._getForm();
this.form = this.#getForm();
this.readFile();
}
@ -85,7 +118,7 @@ export class FileAttributesCsvImportDialogComponent extends ListingComponent<IFi
this.parseResult.meta.fields = Object.keys(this.parseResult.data[0]);
}
this.entitiesService.setEntities(this.parseResult.meta.fields.map(field => this._buildAttribute(field)));
this.entitiesService.setEntities(this.parseResult.meta.fields.map(field => this.#buildAttribute(field)));
this.activeFields = [];
for (const entity of this.allEntities) {
@ -123,7 +156,7 @@ export class FileAttributesCsvImportDialogComponent extends ListingComponent<IFi
encoding: this.form.get('encoding').value,
};
});
reader.readAsText(this.data.csv, this._mapEncoding(this.form.get('encoding').value));
reader.readAsText(this.data.csv, this.#mapEncoding(this.form.get('encoding').value));
}
getSample(csvColumn: string) {
@ -213,15 +246,15 @@ export class FileAttributesCsvImportDialogComponent extends ListingComponent<IFi
}, 0);
}
private _getForm(): UntypedFormGroup {
#getForm(): UntypedFormGroup {
return this._formBuilder.group({
filenameMappingColumnHeaderName: ['', [Validators.required, this._autocompleteStringValidator()]],
filenameMappingColumnHeaderName: ['', [Validators.required, this.#autocompleteStringValidator()]],
delimiter: [undefined, Validators.required],
encoding: [this.data.existingConfiguration?.encoding, Validators.required],
});
}
private _autocompleteStringValidator(): ValidatorFn {
#autocompleteStringValidator(): ValidatorFn {
return (control: AbstractControl): { [key: string]: any } | null => {
if ((this.parseResult?.meta?.fields || []).indexOf(control.value) !== -1) {
return null; /* valid option selected */
@ -230,7 +263,7 @@ export class FileAttributesCsvImportDialogComponent extends ListingComponent<IFi
};
}
private _buildAttribute(csvColumn: string): IField {
#buildAttribute(csvColumn: string): IField {
const sample = this.getSample(csvColumn);
const isNumber = sample && !isNaN(sample);
return {
@ -244,7 +277,7 @@ export class FileAttributesCsvImportDialogComponent extends ListingComponent<IFi
};
}
private _mapEncoding(encoding: string) {
#mapEncoding(encoding: string) {
if (!encoding) {
return 'UTF-8';
}

View File

@ -1,47 +0,0 @@
import { NgModule } from '@angular/core';
import { FileAttributesCsvImportDialogComponent } from './file-attributes-csv-import-dialog.component';
import { ActiveFieldsListingComponent } from './active-fields-listing/active-fields-listing.component';
import {
ChevronButtonComponent,
CircleButtonComponent,
EditableInputComponent,
IconButtonComponent,
InputWithActionComponent,
IqserListingModule,
RoundCheckboxComponent,
} from '@iqser/common-ui';
import { CommonModule } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core';
import { MatDialogModule } from '@angular/material/dialog';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatSelectModule } from '@angular/material/select';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { MatAutocompleteModule } from '@angular/material/autocomplete';
import { MatInputModule } from '@angular/material/input';
import { MatMenuModule } from '@angular/material/menu';
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
@NgModule({
declarations: [FileAttributesCsvImportDialogComponent, ActiveFieldsListingComponent],
imports: [
CommonModule,
CircleButtonComponent,
TranslateModule,
MatDialogModule,
IconButtonComponent,
InputWithActionComponent,
MatFormFieldModule,
MatSelectModule,
ReactiveFormsModule,
MatAutocompleteModule,
MatInputModule,
IqserListingModule,
MatMenuModule,
ChevronButtonComponent,
EditableInputComponent,
FormsModule,
MatSlideToggleModule,
RoundCheckboxComponent,
],
})
export class FileAttributesCsvImportDialogModule {}

View File

@ -3,12 +3,18 @@ import { Component, ElementRef, OnDestroy, OnInit, TemplateRef, ViewChild } from
import { MatDialog } from '@angular/material/dialog';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import {
CircleButtonComponent,
defaultDialogConfig,
IconButtonComponent,
IconButtonTypes,
InputWithActionComponent,
IqserAllowDirective,
IqserListingModule,
largeDialogConfig,
ListingComponent,
listingProvidersFactory,
LoadingService,
RoundCheckboxComponent,
TableColumnConfig,
Toaster,
} from '@iqser/common-ui';
@ -31,13 +37,32 @@ import {
FileAttributesCsvImportDialogComponent,
IFileAttributesCSVImportData,
} from './file-attributes-csv-import-dialog/file-attributes-csv-import-dialog.component';
import { AsyncPipe, NgForOf, NgIf } from '@angular/common';
import { MatIcon } from '@angular/material/icon';
import { MatTooltip } from '@angular/material/tooltip';
import { TranslateModule } from '@ngx-translate/core';
@Component({
templateUrl: './file-attributes-listing-screen.component.html',
styleUrls: ['./file-attributes-listing-screen.component.scss'],
providers: listingProvidersFactory(FileAttributesListingScreenComponent),
standalone: true,
imports: [
IqserListingModule,
NgForOf,
TranslateModule,
CircleButtonComponent,
NgIf,
AsyncPipe,
InputWithActionComponent,
IqserAllowDirective,
IconButtonComponent,
MatIcon,
MatTooltip,
RoundCheckboxComponent,
],
})
export class FileAttributesListingScreenComponent extends ListingComponent<FileAttributeConfig> implements OnInit, OnDestroy {
export default class FileAttributesListingScreenComponent extends ListingComponent<FileAttributeConfig> implements OnInit, OnDestroy {
@ViewChild('impactedTemplates') private readonly _impactedTemplatesRef: TemplateRef<unknown>;
#existingConfiguration: IFileAttributesConfig;
@ViewChild('fileInput') private _fileInput: ElementRef;

View File

@ -1,43 +0,0 @@
import { NgModule } from '@angular/core';
import { FileAttributesListingScreenComponent } from './file-attributes-listing-screen.component';
import { RouterModule } from '@angular/router';
import {
CircleButtonComponent,
IconButtonComponent,
InputWithActionComponent,
IqserAllowDirective,
IqserHelpModeModule,
IqserListingModule,
IqserRoutes,
RoundCheckboxComponent,
} from '@iqser/common-ui';
import { CommonModule } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core';
import { MatIconModule } from '@angular/material/icon';
import { MatTooltipModule } from '@angular/material/tooltip';
const routes: IqserRoutes = [
{
path: '',
component: FileAttributesListingScreenComponent,
},
];
@NgModule({
declarations: [FileAttributesListingScreenComponent],
imports: [
CommonModule,
RouterModule.forChild(routes),
IqserListingModule,
TranslateModule,
CircleButtonComponent,
InputWithActionComponent,
IqserHelpModeModule,
IqserAllowDirective,
IconButtonComponent,
MatIconModule,
MatTooltipModule,
RoundCheckboxComponent,
],
})
export class FileAttributesListingModule {}

View File

@ -1,15 +1,20 @@
import { Component, OnInit } from '@angular/core';
import { BaseFormComponent, IqserPermissionsService, LoadingService } from '@iqser/common-ui';
import { BaseFormComponent, IconButtonComponent, IqserPermissionsService, LoadingService } from '@iqser/common-ui';
import { GeneralSettingsService } from '@services/general-settings.service';
import { IGeneralConfiguration } from '@red/domain';
import { ConfigService } from '@services/config.service';
import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';
import { ReactiveFormsModule, UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';
import { firstValueFrom } from 'rxjs';
import { Roles } from '@users/roles';
import { TranslateModule } from '@ngx-translate/core';
import { NgIf } from '@angular/common';
import { MatSlideToggle } from '@angular/material/slide-toggle';
@Component({
selector: 'redaction-general-config-form',
templateUrl: './general-config-form.component.html',
standalone: true,
imports: [ReactiveFormsModule, TranslateModule, NgIf, MatSlideToggle, IconButtonComponent],
})
export class GeneralConfigFormComponent extends BaseFormComponent implements OnInit {
private _initialConfiguration: IGeneralConfiguration;

View File

@ -2,14 +2,17 @@ import { AfterViewInit, Component, inject, ViewChild } from '@angular/core';
import { UserService } from '@users/user.service';
import { GeneralConfigFormComponent } from './general-config-form/general-config-form.component';
import { SmtpFormComponent } from './smtp-form/smtp-form.component';
import { BaseFormComponent } from '@iqser/common-ui';
import { BaseFormComponent, IqserListingModule } from '@iqser/common-ui';
import { SystemPreferencesFormComponent } from './system-preferences-form/system-preferences-form.component';
import { RouterHistoryService } from '../../../../services/router-history.service';
import { RouterHistoryService } from '@services/router-history.service';
import { TranslateModule } from '@ngx-translate/core';
@Component({
selector: 'redaction-general-config-screen',
templateUrl: './general-config-screen.component.html',
styleUrls: ['./general-config-screen.component.scss'],
standalone: true,
imports: [IqserListingModule, GeneralConfigFormComponent, SystemPreferencesFormComponent, SmtpFormComponent, TranslateModule],
})
export class GeneralConfigScreenComponent extends BaseFormComponent implements AfterViewInit {
readonly currentUser = inject(UserService).currentUser;

View File

@ -1,16 +1,28 @@
import { Component, OnInit } from '@angular/core';
import { FormBuilder, Validators } from '@angular/forms';
import { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { BaseFormComponent, IconButtonTypes, IqserPermissionsService, LoadingService, Toaster } from '@iqser/common-ui';
import {
BaseFormComponent,
IconButtonComponent,
IconButtonTypes,
IqserPermissionsService,
LoadingService,
Toaster,
} from '@iqser/common-ui';
import { ISmtpConfiguration } from '@red/domain';
import { Roles } from '@users/roles';
import { firstValueFrom } from 'rxjs';
import { AdminDialogService } from '../../../services/admin-dialog.service';
import { SmtpConfigService } from '../../../services/smtp-config.service';
import { TranslateModule } from '@ngx-translate/core';
import { MatSlideToggle } from '@angular/material/slide-toggle';
import { NgIf } from '@angular/common';
@Component({
selector: 'redaction-smtp-form',
templateUrl: './smtp-form.component.html',
standalone: true,
imports: [ReactiveFormsModule, TranslateModule, MatSlideToggle, IconButtonComponent, NgIf],
})
export class SmtpFormComponent extends BaseFormComponent implements OnInit {
#initialConfiguration: ISmtpConfiguration;

View File

@ -1,17 +1,22 @@
import { Component } from '@angular/core';
import { UntypedFormBuilder, Validators } from '@angular/forms';
import { ReactiveFormsModule, UntypedFormBuilder, Validators } from '@angular/forms';
import { SystemPreferences } from '@red/domain';
import { BaseFormComponent, IqserPermissionsService, LoadingService } from '@iqser/common-ui';
import { BaseFormComponent, IconButtonComponent, IqserPermissionsService, LoadingService } from '@iqser/common-ui';
import { SystemPreferencesService } from '@services/system-preferences.service';
import { systemPreferencesTranslations } from '@translations/system-preferences-translations';
import { Roles } from '@users/roles';
import { KeysOf } from '@iqser/common-ui/lib/utils';
import { NgForOf, NgIf } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core';
import { MatSlideToggle } from '@angular/material/slide-toggle';
export type ValueType = 'number' | 'string' | 'boolean';
@Component({
selector: 'redaction-system-preferences-form',
templateUrl: './system-preferences-form.component.html',
standalone: true,
imports: [NgIf, ReactiveFormsModule, NgForOf, TranslateModule, MatSlideToggle, IconButtonComponent],
})
export class SystemPreferencesFormComponent extends BaseFormComponent {
#initialConfiguration: SystemPreferences;

View File

@ -4,6 +4,11 @@ import { type DossierTemplate, type DossierTemplateStats } from '@red/domain';
import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service';
import { DossierTemplateStatsService } from '@services/entity-services/dossier-template-stats.service';
import { dossierTemplateStatusTranslations } from '@translations/dossier-template-status-translations';
import { AsyncPipe, NgIf } from '@angular/common';
import { MatIcon } from '@angular/material/icon';
import { TranslateModule } from '@ngx-translate/core';
import { InitialsAvatarComponent } from '@common-ui/users';
import { DatePipe } from '@shared/pipes/date.pipe';
interface Context {
readonly dossierTemplate: DossierTemplate;
@ -14,6 +19,8 @@ interface Context {
selector: 'redaction-dossier-template-details',
templateUrl: './dossier-template-details.component.html',
styleUrls: ['./dossier-template-details.component.scss'],
standalone: true,
imports: [NgIf, AsyncPipe, MatIcon, TranslateModule, DatePipe, InitialsAvatarComponent],
})
export class DossierTemplateDetailsComponent extends ContextComponent<Context> implements OnInit {
readonly translations = dossierTemplateStatusTranslations;

View File

@ -1,5 +1,13 @@
import { Component, OnInit, signal, untracked, WritableSignal } from '@angular/core';
import { BaseFormComponent, getConfig, IconButtonTypes, LoadingService, Toaster } from '@iqser/common-ui';
import {
BaseFormComponent,
getConfig,
HasScrollbarDirective,
IconButtonComponent,
IconButtonTypes,
LoadingService,
Toaster,
} from '@iqser/common-ui';
import { getParam } from '@iqser/common-ui/lib/utils';
import { DOSSIER_TEMPLATE_ID, type DossierTemplate, IDossierTemplate } from '@red/domain';
import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service';
@ -8,9 +16,16 @@ import dayjs, { Dayjs } from 'dayjs';
import { HttpStatusCode } from '@angular/common/http';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { applyIntervalConstraints } from '@utils/date-inputs-utils';
import { AbstractControl, UntypedFormBuilder, Validators } from '@angular/forms';
import { AbstractControl, ReactiveFormsModule, UntypedFormBuilder, Validators } from '@angular/forms';
import { downloadTypesTranslations } from '@translations/download-types-translations';
import { Observable } from 'rxjs';
import { DossierTemplateDetailsComponent } from '../dossier-template-details/dossier-template-details.component';
import { TranslateModule } from '@ngx-translate/core';
import { MatCheckbox } from '@angular/material/checkbox';
import { NgIf } from '@angular/common';
import { MatDatepickerModule } from '@angular/material/datepicker';
import { MatIcon } from '@angular/material/icon';
import { SelectComponent } from '@shared/components/select/select.component';
const downloadTypes = ['ORIGINAL', 'PREVIEW', 'DELTA_PREVIEW', 'REDACTED'].map(type => ({
key: type,
@ -20,8 +35,21 @@ const downloadTypes = ['ORIGINAL', 'PREVIEW', 'DELTA_PREVIEW', 'REDACTED'].map(t
@Component({
templateUrl: './dossier-template-info-screen.component.html',
styleUrls: ['./dossier-template-info-screen.component.scss'],
standalone: true,
imports: [
HasScrollbarDirective,
ReactiveFormsModule,
DossierTemplateDetailsComponent,
TranslateModule,
MatCheckbox,
NgIf,
MatDatepickerModule,
SelectComponent,
IconButtonComponent,
MatIcon,
],
})
export class DossierTemplateInfoScreenComponent extends BaseFormComponent implements OnInit {
export default class DossierTemplateInfoScreenComponent extends BaseFormComponent implements OnInit {
readonly translations = dossierTemplateStatusTranslations;
readonly iconButtonTypes = IconButtonTypes;
readonly isDocumine = getConfig().IS_DOCUMINE;
@ -31,10 +59,14 @@ export class DossierTemplateInfoScreenComponent extends BaseFormComponent implem
readonly dossierTemplateId = getParam(DOSSIER_TEMPLATE_ID);
readonly hasValidFrom: WritableSignal<boolean>;
readonly hasValidTo: WritableSignal<boolean>;
private _previousValidFrom: Dayjs;
private _previousValidTo: Dayjs;
private _lastValidFrom: Dayjs;
private _lastValidTo: Dayjs;
#previousValidFrom: Dayjs;
#previousValidTo: Dayjs;
#lastValidFrom: Dayjs;
#lastValidTo: Dayjs;
get disabled(): boolean {
return !this.valid || !this.changed;
}
constructor(
private readonly _dossierTemplatesService: DossierTemplatesService,
@ -50,8 +82,8 @@ export class DossierTemplateInfoScreenComponent extends BaseFormComponent implem
this.hasValidFrom = signal(!!this.form.get('validFrom').value);
this.hasValidTo = signal(!!this.form.get('validTo').value);
this._previousValidFrom = this._lastValidFrom = this.form.get('validFrom').value;
this._previousValidTo = this._lastValidTo = this.form.get('validTo').value;
this.#previousValidFrom = this.#lastValidFrom = this.form.get('validFrom').value;
this.#previousValidTo = this.#lastValidTo = this.form.get('validTo').value;
}
ngOnInit() {
@ -62,11 +94,11 @@ export class DossierTemplateInfoScreenComponent extends BaseFormComponent implem
if (extremity === 'from') {
const prevValue = untracked(this.hasValidFrom);
this.hasValidFrom.set(!prevValue);
this.form.controls['validFrom'].setValue(!prevValue ? this._lastValidFrom : null);
this.form.controls['validFrom'].setValue(!prevValue ? this.#lastValidFrom : null);
} else {
const prevValue = untracked(this.hasValidTo);
this.hasValidTo.set(!prevValue);
this.form.controls['validTo'].setValue(!prevValue ? this._lastValidTo : null);
this.form.controls['validTo'].setValue(!prevValue ? this.#lastValidTo : null);
}
this.applyValidityIntervalConstraints();
}
@ -95,12 +127,12 @@ export class DossierTemplateInfoScreenComponent extends BaseFormComponent implem
applyValidityIntervalConstraints(): void {
const formValue = this.form.value;
applyIntervalConstraints(formValue, this._previousValidFrom, this._previousValidTo, this.form, 'validFrom', 'validTo');
applyIntervalConstraints(formValue, this.#previousValidFrom, this.#previousValidTo, this.form, 'validFrom', 'validTo');
this._previousValidFrom = this.form.get('validFrom').value;
this._previousValidTo = this.form.get('validTo').value;
this._lastValidFrom = this._previousValidFrom || this._lastValidFrom;
this._lastValidTo = this._previousValidTo || this._lastValidTo;
this.#previousValidFrom = this.form.get('validFrom').value;
this.#previousValidTo = this.form.get('validTo').value;
this.#lastValidFrom = this.#previousValidFrom || this.#lastValidFrom;
this.#lastValidTo = this.#previousValidTo || this.#lastValidTo;
}
#getForm(dossierTemplate: DossierTemplate) {

View File

@ -1,36 +0,0 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { DossierTemplateInfoScreenComponent } from './dossier-template-info-screen/dossier-template-info-screen.component';
import { RouterModule } from '@angular/router';
import { SharedModule } from '@shared/shared.module';
import { CircleButtonComponent, HasScrollbarDirective, IconButtonComponent, IqserHelpModeModule } from '@iqser/common-ui';
import { TranslateModule } from '@ngx-translate/core';
import { IqserUsersModule } from '@iqser/common-ui/lib/users';
import { SelectComponent } from '@shared/components/select/select.component';
import { DossierTemplateDetailsComponent } from './dossier-template-details/dossier-template-details.component';
import { PendingChangesGuard } from '@guards/can-deactivate.guard';
const routes = [
{
path: '',
component: DossierTemplateInfoScreenComponent,
canDeactivate: [PendingChangesGuard],
},
];
@NgModule({
declarations: [DossierTemplateInfoScreenComponent, DossierTemplateDetailsComponent],
imports: [
RouterModule.forChild(routes),
CommonModule,
SharedModule,
IqserUsersModule,
TranslateModule,
IqserHelpModeModule,
HasScrollbarDirective,
CircleButtonComponent,
IconButtonComponent,
SelectComponent,
],
})
export class DossierTemplateInfoModule {}

View File

@ -1,10 +1,11 @@
import { ChangeDetectionStrategy, Component, Inject } from '@angular/core';
import { UntypedFormGroup, Validators } from '@angular/forms';
import { ReactiveFormsModule, UntypedFormGroup, Validators } from '@angular/forms';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { Justification } from '@red/domain';
import { JustificationsService } from '@services/entity-services/justifications.service';
import { BaseDialogComponent } from '@iqser/common-ui';
import { BaseDialogComponent, CircleButtonComponent, IconButtonComponent } from '@iqser/common-ui';
import { firstValueFrom } from 'rxjs';
import { TranslateModule } from '@ngx-translate/core';
interface DialogData {
justification?: Justification;
@ -14,6 +15,8 @@ interface DialogData {
@Component({
templateUrl: './add-edit-justification-dialog.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [TranslateModule, ReactiveFormsModule, IconButtonComponent, CircleButtonComponent],
})
export class AddEditJustificationDialogComponent extends BaseDialogComponent {
constructor(

View File

@ -1,26 +1,42 @@
import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { IconButtonTypes, ListingComponent, listingProvidersFactory, LoadingService, TableColumnConfig } from '@iqser/common-ui';
import {
CircleButtonComponent,
IconButtonComponent,
IconButtonTypes,
IqserListingModule,
ListingComponent,
listingProvidersFactory,
LoadingService,
TableColumnConfig,
} from '@iqser/common-ui';
import { SortingOrders } from '@iqser/common-ui/lib/sorting';
import { getParam } from '@iqser/common-ui/lib/utils';
import { DOSSIER_TEMPLATE_ID, Justification } from '@red/domain';
import { JustificationsService } from '@services/entity-services/justifications.service';
import { PermissionsService } from '@services/permissions.service';
import { UserPreferenceService } from '@users/user-preference.service';
import { firstValueFrom } from 'rxjs';
import { JustificationsDialogService } from '../justifications-dialog.service';
import { AsyncPipe, NgIf } from '@angular/common';
import { TableItemComponent } from '../table-item/table-item.component';
import { TranslateModule } from '@ngx-translate/core';
@Component({
selector: 'redaction-justifications-screen',
templateUrl: './justifications-screen.component.html',
styleUrls: ['./justifications-screen.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
providers: listingProvidersFactory<Justification>({
providers: [
...listingProvidersFactory<Justification>({
entitiesService: JustificationsService,
component: JustificationsScreenComponent,
}),
JustificationsDialogService,
],
standalone: true,
imports: [IqserListingModule, CircleButtonComponent, NgIf, TableItemComponent, TranslateModule, AsyncPipe, IconButtonComponent],
})
export class JustificationsScreenComponent extends ListingComponent<Justification> implements OnInit {
export default class JustificationsScreenComponent extends ListingComponent<Justification> implements OnInit {
readonly #dossierTemplateId = getParam(DOSSIER_TEMPLATE_ID);
readonly iconButtonTypes = IconButtonTypes;
readonly tableHeaderLabel = _('justifications-listing.table-header');
@ -35,7 +51,6 @@ export class JustificationsScreenComponent extends ListingComponent<Justificatio
private readonly _justificationService: JustificationsService,
private readonly _loadingService: LoadingService,
private readonly _dialogService: JustificationsDialogService,
readonly userPreferenceService: UserPreferenceService,
readonly permissionsService: PermissionsService,
) {
super();

View File

@ -1,28 +0,0 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { JustificationsScreenComponent } from './justifications-screen/justifications-screen.component';
import { RouterModule } from '@angular/router';
import { SharedModule } from '@shared/shared.module';
import { TableItemComponent } from './table-item/table-item.component';
import { JustificationsDialogService } from './justifications-dialog.service';
import { AddEditJustificationDialogComponent } from './add-edit-justification-dialog/add-edit-justification-dialog.component';
import { TranslateModule } from '@ngx-translate/core';
import { CircleButtonComponent, HasScrollbarDirective, IconButtonComponent, IqserListingModule } from '@iqser/common-ui';
const routes = [{ path: '', component: JustificationsScreenComponent }];
@NgModule({
declarations: [JustificationsScreenComponent, TableItemComponent, AddEditJustificationDialogComponent],
imports: [
RouterModule.forChild(routes),
CommonModule,
SharedModule,
TranslateModule,
IqserListingModule,
IconButtonComponent,
CircleButtonComponent,
HasScrollbarDirective,
],
providers: [JustificationsDialogService],
})
export class JustificationsModule {}

View File

@ -3,11 +3,17 @@ import { getParam } from '@iqser/common-ui/lib/utils';
import { DOSSIER_TEMPLATE_ID, Justification } from '@red/domain';
import { PermissionsService } from '@services/permissions.service';
import { JustificationsDialogService } from '../justifications-dialog.service';
import { MatTooltip } from '@angular/material/tooltip';
import { CircleButtonComponent } from '@iqser/common-ui';
import { NgIf } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core';
@Component({
selector: 'redaction-table-item',
templateUrl: './table-item.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [MatTooltip, CircleButtonComponent, NgIf, TranslateModule],
})
export class TableItemComponent {
readonly #dossierTemplateId = getParam(DOSSIER_TEMPLATE_ID);

View File

@ -1,10 +1,14 @@
import { Component, Input, OnChanges } from '@angular/core';
import { ChartConfiguration, ChartDataset } from 'chart.js';
import { BaseChartDirective, provideCharts, withDefaultRegisterables } from 'ng2-charts';
@Component({
selector: 'redaction-chart',
templateUrl: './chart.component.html',
styleUrls: ['./chart.component.scss'],
standalone: true,
imports: [BaseChartDirective],
providers: [provideCharts(withDefaultRegisterables())],
})
export class ChartComponent implements OnChanges {
@Input({ required: true }) datasets: ChartDataset[];

View File

@ -8,11 +8,16 @@ import { TranslateService } from '@ngx-translate/core';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { size } from '@iqser/common-ui/lib/utils';
import { ILicenseData } from '@red/domain';
import { SizePipe } from '@common-ui/pipes';
import { AsyncPipe, DecimalPipe, NgIf } from '@angular/common';
import { ChartComponent } from '../chart/chart.component';
@Component({
selector: 'red-license-analysis-capacity-usage',
templateUrl: './license-analysis-capacity-usage.component.html',
styleUrls: ['./license-analysis-capacity-usage.component.scss'],
standalone: true,
imports: [SizePipe, DecimalPipe, ChartComponent, AsyncPipe, NgIf],
})
export class LicenseAnalysisCapacityUsageComponent {
readonly data$ = this.licenseService.selectedLicense$.pipe(map(() => this.#getData()));

View File

@ -4,14 +4,18 @@ import { map } from 'rxjs/operators';
import { ChartDataset } from 'chart.js';
import { ChartBlue, ChartGreen, ChartRed } from '../../utils/constants';
import { getDataUntilCurrentMonth, getLabelsFromLicense, getLineConfig, isCurrentMonthAndYear } from '../../utils/functions';
import { TranslateService } from '@ngx-translate/core';
import { TranslateModule, TranslateService } from '@ngx-translate/core';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { ILicenseData } from '@red/domain';
import { AsyncPipe, DecimalPipe, NgIf } from '@angular/common';
import { ChartComponent } from '../chart/chart.component';
@Component({
selector: 'red-license-page-usage',
templateUrl: './license-page-usage.component.html',
styleUrls: ['./license-page-usage.component.scss'],
standalone: true,
imports: [DecimalPipe, TranslateModule, ChartComponent, NgIf, AsyncPipe],
})
export class LicensePageUsageComponent {
readonly data$ = this.licenseService.selectedLicense$.pipe(map(() => this.#getData()));

View File

@ -1,5 +1,5 @@
import { Component } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
import { TranslateModule, TranslateService } from '@ngx-translate/core';
import { size } from '@iqser/common-ui/lib/utils';
import { LicenseService } from '@services/license.service';
import { map } from 'rxjs/operators';
@ -8,11 +8,17 @@ import { ChartDataset } from 'chart.js';
import { ChartBlack, ChartBlue, ChartGreen, ChartGrey, ChartRed } from '../../utils/constants';
import { getDataUntilCurrentMonth, getLabelsFromLicense, getLineConfig } from '../../utils/functions';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { SizePipe } from '@common-ui/pipes';
import { AsyncPipe, DecimalPipe, NgIf } from '@angular/common';
import { DonutChartComponent } from '@shared/components/donut-chart/donut-chart.component';
import { ChartComponent } from '../chart/chart.component';
@Component({
selector: 'red-license-retention-capacity',
templateUrl: './license-retention-capacity.component.html',
styleUrls: ['./license-retention-capacity.component.scss'],
standalone: true,
imports: [SizePipe, DecimalPipe, NgIf, DonutChartComponent, AsyncPipe, ChartComponent, TranslateModule],
})
export class LicenseRetentionCapacityComponent {
readonly formatSize = size;

View File

@ -4,6 +4,11 @@ import { ILicense } from '@red/domain';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { map, tap } from 'rxjs/operators';
import { LoadingService } from '@iqser/common-ui';
import { AsyncPipe, NgForOf, NgIf, NgTemplateOutlet, UpperCasePipe } from '@angular/common';
import { MatFormField } from '@angular/material/form-field';
import { MatOption, MatSelect, MatSelectTrigger } from '@angular/material/select';
import { FormsModule } from '@angular/forms';
import { TranslateModule } from '@ngx-translate/core';
const translations = {
active: _('license-info-screen.status.active'),
@ -14,6 +19,20 @@ const translations = {
selector: 'redaction-license-select',
templateUrl: './license-select.component.html',
styleUrls: ['./license-select.component.scss'],
standalone: true,
imports: [
AsyncPipe,
NgIf,
MatFormField,
MatSelect,
MatSelectTrigger,
FormsModule,
NgTemplateOutlet,
MatOption,
NgForOf,
TranslateModule,
UpperCasePipe,
],
})
export class LicenseSelectComponent {
value: ILicense;

View File

@ -1,16 +1,36 @@
import { Component } from '@angular/core';
import { getConfig, IqserPermissionsService } from '@iqser/common-ui';
import { getConfig, IqserListingModule, IqserPermissionsService, SizePipe } from '@iqser/common-ui';
import { getCurrentUser } from '@iqser/common-ui/lib/users';
import type { AppConfig, User } from '@red/domain';
import { LicenseService } from '@services/license.service';
import { RouterHistoryService } from '@services/router-history.service';
import { Roles } from '@users/roles';
import { TranslateModule } from '@ngx-translate/core';
import { AsyncPipe, NgIf } from '@angular/common';
import { LicenseSelectComponent } from '../components/license-select/license-select.component';
import { LicensePageUsageComponent } from '../components/license-page-usage/license-page-usage.component';
import { LicenseAnalysisCapacityUsageComponent } from '../components/license-analysis-capacity-usage/license-analysis-capacity-usage.component';
import { LicenseRetentionCapacityComponent } from '../components/license-retention-capacity-usage/license-retention-capacity.component';
import { DatePipe } from '@shared/pipes/date.pipe';
@Component({
templateUrl: './license-screen.component.html',
styleUrls: ['./license-screen.component.scss'],
standalone: true,
imports: [
IqserListingModule,
TranslateModule,
AsyncPipe,
LicenseSelectComponent,
NgIf,
DatePipe,
SizePipe,
LicensePageUsageComponent,
LicenseAnalysisCapacityUsageComponent,
LicenseRetentionCapacityComponent,
],
})
export class LicenseScreenComponent {
export default class LicenseScreenComponent {
protected readonly config = getConfig<AppConfig>();
protected readonly roles = Roles;
protected readonly currentUser = getCurrentUser<User>();

View File

@ -1,51 +0,0 @@
import { CommonModule } from '@angular/common';
import { inject, NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { MatSelectModule } from '@angular/material/select';
import { RouterModule, Routes } from '@angular/router';
import { IqserHelpModeModule, IqserListingModule, SizePipe } from '@iqser/common-ui';
import { TranslateModule } from '@ngx-translate/core';
import { LicenseService } from '@services/license.service';
import { DonutChartComponent } from '@shared/components/donut-chart/donut-chart.component';
import { BaseChartDirective, provideCharts, withDefaultRegisterables } from 'ng2-charts';
import { ChartComponent } from './components/chart/chart.component';
import { LicenseAnalysisCapacityUsageComponent } from './components/license-analysis-capacity-usage/license-analysis-capacity-usage.component';
import { LicensePageUsageComponent } from './components/license-page-usage/license-page-usage.component';
import { LicenseRetentionCapacityComponent } from './components/license-retention-capacity-usage/license-retention-capacity.component';
import { LicenseSelectComponent } from './components/license-select/license-select.component';
import { LicenseScreenComponent } from './license-screen/license-screen.component';
const routes: Routes = [
{
path: '',
component: LicenseScreenComponent,
resolve: {
licenseData: () => inject(LicenseService).loadLicenseData(),
},
},
];
@NgModule({
declarations: [
LicenseScreenComponent,
LicenseSelectComponent,
ChartComponent,
LicenseRetentionCapacityComponent,
LicensePageUsageComponent,
LicenseAnalysisCapacityUsageComponent,
],
imports: [
RouterModule.forChild(routes),
CommonModule,
TranslateModule,
MatSelectModule,
FormsModule,
IqserListingModule,
IqserHelpModeModule,
SizePipe,
DonutChartComponent,
BaseChartDirective,
],
providers: [provideCharts(withDefaultRegisterables())],
})
export class LicenseModule {}

View File

@ -0,0 +1,14 @@
import { IqserRoutes } from '@iqser/common-ui';
import LicenseScreenComponent from './license-screen/license-screen.component';
import { inject } from '@angular/core';
import { LicenseService } from '@services/license.service';
export default [
{
path: '',
component: LicenseScreenComponent,
resolve: {
licenseData: () => inject(LicenseService).loadLicenseData(),
},
},
] satisfies IqserRoutes;

View File

@ -1,6 +1,7 @@
import { Component, OnInit } from '@angular/core';
import {
getConfig,
IqserListingModule,
IqserPermissionsService,
ListingComponent,
listingProvidersFactory,
@ -21,13 +22,18 @@ import { Roles } from '@users/roles';
import { getCurrentUser } from '@iqser/common-ui/lib/users';
import { SortingOrders } from '@iqser/common-ui/lib/sorting';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { AsyncPipe, NgForOf, NgIf } from '@angular/common';
import { MatSlideToggle } from '@angular/material/slide-toggle';
import { TranslateModule } from '@ngx-translate/core';
@Component({
templateUrl: './permissions-screen.component.html',
styleUrls: ['./permissions-screen.component.scss'],
providers: listingProvidersFactory(PermissionsScreenComponent),
standalone: true,
imports: [IqserListingModule, NgIf, NgForOf, MatSlideToggle, AsyncPipe, TranslateModule],
})
export class PermissionsScreenComponent extends ListingComponent<PermissionsMapping> implements OnInit {
export default class PermissionsScreenComponent extends ListingComponent<PermissionsMapping> implements OnInit {
readonly #config = getConfig();
readonly roles = Roles;
readonly currentUser = getCurrentUser<User>();

View File

@ -1,15 +0,0 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RouterModule } from '@angular/router';
import { PermissionsScreenComponent } from './permissions-screen/permissions-screen.component';
import { TranslateModule } from '@ngx-translate/core';
import { IqserHelpModeModule, IqserListingModule } from '@iqser/common-ui';
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
const routes = [{ path: '', component: PermissionsScreenComponent }];
@NgModule({
declarations: [PermissionsScreenComponent],
imports: [RouterModule.forChild(routes), CommonModule, TranslateModule, IqserListingModule, IqserHelpModeModule, MatSlideToggleModule],
})
export class PermissionsModule {}

View File

@ -1,7 +1,15 @@
import { ChangeDetectionStrategy, Component, ElementRef, OnInit, ViewChild } from '@angular/core';
import { DOSSIER_TEMPLATE_ID, IPlaceholdersResponse, IReportTemplate, User } from '@red/domain';
import { download } from '@utils/file-download-utils';
import { getConfig, IConfirmationDialogData, LoadingService, Toaster } from '@iqser/common-ui';
import {
CircleButtonComponent,
getConfig,
HasScrollbarDirective,
IConfirmationDialogData,
IqserAllowDirective,
LoadingService,
Toaster,
} from '@iqser/common-ui';
import { PermissionsService } from '@services/permissions.service';
import {
generalPlaceholdersDescriptionsTranslations,
@ -15,6 +23,8 @@ import { BehaviorSubject, firstValueFrom } from 'rxjs';
import { Roles } from '@users/roles';
import { getCurrentUser } from '@iqser/common-ui/lib/users';
import { getParam } from '@iqser/common-ui/lib/utils';
import { AsyncPipe, NgForOf, NgIf } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core';
interface Placeholder {
placeholder: string;
@ -30,8 +40,10 @@ const placeholderTypes: PlaceholderType[] = ['generalPlaceholders', 'fileAttribu
templateUrl: './reports-screen.component.html',
styleUrls: ['./reports-screen.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [HasScrollbarDirective, NgIf, NgForOf, AsyncPipe, TranslateModule, CircleButtonComponent, IqserAllowDirective],
})
export class ReportsScreenComponent implements OnInit {
export default class ReportsScreenComponent implements OnInit {
@ViewChild('fileInput') private readonly _fileInput: ElementRef;
readonly placeholders$ = new BehaviorSubject<Placeholder[]>([]);
readonly availableTemplates$ = new BehaviorSubject<IReportTemplate[]>([]);

View File

@ -1,22 +0,0 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RouterModule } from '@angular/router';
import { ReportsScreenComponent } from './reports-screen/reports-screen.component';
import { TranslateModule } from '@ngx-translate/core';
import { CircleButtonComponent, HasScrollbarDirective, IqserAllowDirective, IqserHelpModeModule, IqserRoutes } from '@iqser/common-ui';
const routes: IqserRoutes = [{ path: '', component: ReportsScreenComponent }];
@NgModule({
declarations: [ReportsScreenComponent],
imports: [
RouterModule.forChild(routes),
CommonModule,
TranslateModule,
IqserHelpModeModule,
CircleButtonComponent,
HasScrollbarDirective,
IqserAllowDirective,
],
})
export class ReportsModule {}

View File

@ -1,6 +1,6 @@
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, computed, OnChanges, OnInit, signal, SimpleChanges } from '@angular/core';
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, computed, OnInit, signal } from '@angular/core';
import { PermissionsService } from '@services/permissions.service';
import { IconButtonTypes, LoadingService, Toaster } from '@iqser/common-ui';
import { IconButtonComponent, IconButtonTypes, IqserTranslateModule, LoadingService, Toaster } from '@iqser/common-ui';
import { RulesService } from '../../../services/rules.service';
import { firstValueFrom } from 'rxjs';
import { DOSSIER_TEMPLATE_ID, DroolsKeywords, IRules } from '@red/domain';
@ -12,6 +12,10 @@ import { rulesScreenTranslations } from '../../../translations/rules-screen-tran
import ICodeEditor = monaco.editor.ICodeEditor;
import IModelDeltaDecoration = monaco.editor.IModelDeltaDecoration;
import IStandaloneEditorConstructionOptions = monaco.editor.IStandaloneEditorConstructionOptions;
import { MonacoEditorModule } from '@materia-ui/ngx-monaco-editor';
import { MatIcon } from '@angular/material/icon';
import { FormsModule } from '@angular/forms';
import { NgIf } from '@angular/common';
interface SyntaxError {
line: number;
@ -32,8 +36,10 @@ const RULE_VALIDATION_TIMEOUT = 2000;
templateUrl: './rules-screen.component.html',
styleUrls: ['./rules-screen.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [MonacoEditorModule, MatIcon, FormsModule, IqserTranslateModule, IconButtonComponent, NgIf],
})
export class RulesScreenComponent implements OnInit, ComponentCanDeactivate {
export default class RulesScreenComponent implements OnInit, ComponentCanDeactivate {
readonly translations = rulesScreenTranslations;
readonly iconButtonTypes = IconButtonTypes;

View File

@ -1,26 +0,0 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RouterModule } from '@angular/router';
import { RulesScreenComponent } from './rules-screen/rules-screen.component';
import { MonacoEditorModule } from '@materia-ui/ngx-monaco-editor';
import { PendingChangesGuard } from '@guards/can-deactivate.guard';
import { TranslateModule } from '@ngx-translate/core';
import { IconButtonComponent } from '@iqser/common-ui';
import { FormsModule } from '@angular/forms';
import { MatIconModule } from '@angular/material/icon';
const routes = [{ path: '', component: RulesScreenComponent, canDeactivate: [PendingChangesGuard] }];
@NgModule({
declarations: [RulesScreenComponent],
imports: [
RouterModule.forChild(routes),
CommonModule,
MonacoEditorModule,
TranslateModule,
IconButtonComponent,
FormsModule,
MatIconModule,
],
})
export class RulesModule {}

View File

@ -1,8 +1,16 @@
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,
HasScrollbarDirective,
IconButtonTypes,
IqserAllowDirective,
IqserListingModule,
ListingComponent,
listingProvidersFactory,
LoadingService,
@ -10,7 +18,7 @@ import {
TableColumnConfig,
} from '@iqser/common-ui';
import { NestedFilter } from '@iqser/common-ui/lib/filtering';
import { TranslateService } from '@ngx-translate/core';
import { TranslateModule, TranslateService } from '@ngx-translate/core';
import { DonutChartConfig, User, UserTypes } from '@red/domain';
import { RouterHistoryService } from '@services/router-history.service';
import { TranslateChartService } from '@services/translate-chart.service';
@ -20,6 +28,8 @@ import { UserService } from '@users/user.service';
import { firstValueFrom, Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { userTypeChecker, userTypeFilters } from '../../../../utils';
import { UsersStatsComponent } from '../../components/users-stats/users-stats.component';
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) {
@ -36,6 +46,21 @@ function configToFilter({ key, label }: DonutChartConfig) {
entitiesService: UserService,
component: UserListingScreenComponent,
}),
standalone: true,
imports: [
IqserListingModule,
TranslateModule,
UsersStatsComponent,
CircleButtonComponent,
HasScrollbarDirective,
NgIf,
AsyncPipe,
InitialsAvatarComponent,
MatSlideToggle,
MatIcon,
NgClass,
IqserAllowDirective,
],
})
export class UserListingScreenComponent extends ListingComponent<User> implements OnInit {
readonly routerHistoryService = inject(RouterHistoryService);
@ -88,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,12 @@
import { Component, EventEmitter, Output } from '@angular/core';
import { MatIcon } from '@angular/material/icon';
@Component({
selector: 'redaction-paginator',
templateUrl: './paginator.component.html',
styleUrls: ['./paginator.component.scss'],
standalone: true,
imports: [MatIcon],
})
export class PaginatorComponent {
@Output() readonly changePage = new EventEmitter<number>();

View File

@ -1,10 +1,18 @@
import { HttpClient } from '@angular/common/http';
import { ChangeDetectorRef, Component, ElementRef, inject, OnInit, ViewChild } from '@angular/core';
import { FormBuilder, FormGroup } from '@angular/forms';
import { FormBuilder, FormGroup, ReactiveFormsModule } from '@angular/forms';
import { Router } from '@angular/router';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { environment } from '@environments/environment';
import { getConfig, IconButtonTypes, IqserPermissionsService, LoadingService, Toaster } from '@iqser/common-ui';
import {
getConfig,
HasScrollbarDirective,
IconButtonComponent,
IconButtonTypes,
IqserPermissionsService,
LoadingService,
Toaster,
} from '@iqser/common-ui';
import { getCurrentUser } from '@iqser/common-ui/lib/users';
import { AsControl, Debounce, getParam, trackByFactory, UI_ROOT_PATH_FN } from '@iqser/common-ui/lib/utils';
import WebViewer, { WebViewerInstance } from '@pdftron/webviewer';
@ -31,6 +39,13 @@ import { UserPreferenceService } from '@users/user-preference.service';
import { stampPDFPage } from '@utils/page-stamper';
import { BehaviorSubject, firstValueFrom, Observable, of } from 'rxjs';
import { tap } from 'rxjs/operators';
import { PaginatorComponent } from '../paginator/paginator.component';
import { AsyncPipe, NgClass, NgForOf, NgIf } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core';
import { MatTooltip } from '@angular/material/tooltip';
import { MatIcon } from '@angular/material/icon';
import { MatSlider, MatSliderThumb } from '@angular/material/slider';
import { ColorPickerModule } from 'ngx-color-picker';
export const DEFAULT_WATERMARK: Partial<IWatermark> = {
text: 'Watermark',
@ -59,6 +74,23 @@ interface WatermarkForm {
@Component({
templateUrl: './watermark-screen.component.html',
styleUrls: ['./watermark-screen.component.scss'],
standalone: true,
imports: [
PaginatorComponent,
NgIf,
IconButtonComponent,
TranslateModule,
AsyncPipe,
ReactiveFormsModule,
HasScrollbarDirective,
NgForOf,
NgClass,
MatTooltip,
MatIcon,
MatSlider,
ColorPickerModule,
MatSliderThumb,
],
})
export class WatermarkScreenComponent implements OnInit {
readonly iconButtonTypes = IconButtonTypes;

View File

@ -1,77 +0,0 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RouterModule } from '@angular/router';
import { WatermarkScreenComponent } from './watermark-screen/watermark-screen.component';
import { WatermarksListingScreenComponent } from './watermarks-listing/watermarks-listing-screen.component';
import {
CircleButtonComponent,
CompositeRouteGuard,
HasScrollbarDirective,
IconButtonComponent,
IqserAllowDirective,
IqserHelpModeModule,
IqserListingModule,
IqserRoutes,
} from '@iqser/common-ui';
import { RedRoleGuard } from '@users/red-role.guard';
import { WATERMARK_ID } from '@red/domain';
import { watermarkExistsGuard } from '@guards/watermark-exists.guard';
import { TranslateModule } from '@ngx-translate/core';
import { PaginatorComponent } from './paginator/paginator.component';
import { MatIconModule } from '@angular/material/icon';
import { ReactiveFormsModule } from '@angular/forms';
import { MatSliderModule } from '@angular/material/slider';
import { ColorPickerModule } from 'ngx-color-picker';
import { MatTooltipModule } from '@angular/material/tooltip';
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
import { IqserAuthGuard, IqserUsersModule } from '@iqser/common-ui/lib/users';
const routes: IqserRoutes = [
{
path: '',
component: WatermarksListingScreenComponent,
canActivate: [CompositeRouteGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
},
{
path: 'create',
component: WatermarkScreenComponent,
canActivate: [CompositeRouteGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
},
{
path: `:${WATERMARK_ID}`,
component: WatermarkScreenComponent,
canActivate: [CompositeRouteGuard, watermarkExistsGuard()],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
},
];
@NgModule({
declarations: [WatermarkScreenComponent, WatermarksListingScreenComponent, PaginatorComponent],
imports: [
RouterModule.forChild(routes),
CommonModule,
IqserUsersModule,
TranslateModule,
IqserListingModule,
IqserHelpModeModule,
MatIconModule,
IconButtonComponent,
ReactiveFormsModule,
MatSliderModule,
ColorPickerModule,
MatSlideToggleModule,
CircleButtonComponent,
HasScrollbarDirective,
IqserAllowDirective,
MatTooltipModule,
],
})
export class WatermarkModule {}

View File

@ -0,0 +1,34 @@
import { WatermarksListingScreenComponent } from './watermarks-listing/watermarks-listing-screen.component';
import { CompositeRouteGuard, IqserRoutes } from '@iqser/common-ui';
import { IqserAuthGuard } from '@common-ui/users';
import { RedRoleGuard } from '@users/red-role.guard';
import { WatermarkScreenComponent } from './watermark-screen/watermark-screen.component';
import { WATERMARK_ID } from '@red/domain';
import { watermarkExistsGuard } from '@guards/watermark-exists.guard';
export default [
{
path: '',
component: WatermarksListingScreenComponent,
canActivate: [CompositeRouteGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
},
{
path: 'create',
component: WatermarkScreenComponent,
canActivate: [CompositeRouteGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
},
{
path: `:${WATERMARK_ID}`,
component: WatermarkScreenComponent,
canActivate: [CompositeRouteGuard, watermarkExistsGuard()],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
},
] satisfies IqserRoutes;

View File

@ -1,8 +1,12 @@
import { Component, OnInit } from '@angular/core';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import {
CircleButtonComponent,
IconButtonComponent,
IconButtonTypes,
IConfirmationDialogData,
IqserAllowDirective,
IqserListingModule,
IqserPermissionsService,
ListingComponent,
listingProvidersFactory,
@ -10,18 +14,36 @@ import {
TableColumnConfig,
Toaster,
} from '@iqser/common-ui';
import { getCurrentUser } from '@iqser/common-ui/lib/users';
import { getCurrentUser, InitialsAvatarComponent } from '@iqser/common-ui/lib/users';
import { getParam } from '@iqser/common-ui/lib/utils';
import { DOSSIER_TEMPLATE_ID, User, Watermark } from '@red/domain';
import { WatermarkService } from '@services/entity-services/watermark.service';
import { WatermarksMapService } from '@services/entity-services/watermarks-map.service';
import { Roles } from '@users/roles';
import { AdminDialogService } from '../../../services/admin-dialog.service';
import { TranslateModule } from '@ngx-translate/core';
import { RouterLink } from '@angular/router';
import { MatSlideToggle } from '@angular/material/slide-toggle';
import { AsyncPipe } from '@angular/common';
import { DatePipe } from '@shared/pipes/date.pipe';
@Component({
templateUrl: './watermarks-listing-screen.component.html',
styleUrls: ['./watermarks-listing-screen.component.scss'],
providers: listingProvidersFactory(WatermarksListingScreenComponent),
standalone: true,
imports: [
IqserListingModule,
TranslateModule,
IconButtonComponent,
IqserAllowDirective,
RouterLink,
MatSlideToggle,
InitialsAvatarComponent,
CircleButtonComponent,
AsyncPipe,
DatePipe,
],
})
export class WatermarksListingScreenComponent extends ListingComponent<Watermark> implements OnInit {
readonly #dossierTemplateId = getParam(DOSSIER_TEMPLATE_ID);

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,29 +10,30 @@ 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'
| 'uploadDictionary'
| 'configureCertificate';
@Injectable()
@Injectable({ providedIn: 'root' })
export class AdminDialogService extends DialogService<DialogType> {
protected readonly _config: DialogConfig<DialogType> = {
confirm: {
@ -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 },

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