RED-9321: refactored submodules of admin to standalone components.

This commit is contained in:
Nicoleta Panaghiu 2024-06-10 20:35:03 +03:00 committed by Dan Percic
parent 5cd5c39916
commit 3d7dca1f43
40 changed files with 593 additions and 720 deletions

View File

@ -1,4 +1,4 @@
import { NgModule } from '@angular/core';
import { inject, 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';
@ -20,148 +20,157 @@ 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 { LicenseService } from '@services/license.service';
const entityRoutes: IqserRoutes = [
{
path: '',
component: BaseDossierTemplateScreenComponent,
children: [{ path: '', component: EntitiesListingScreenComponent }],
canActivate: [CompositeRouteGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
},
{
path: `:${ENTITY_TYPE}`,
loadChildren: () => import('./screens/entities/entities.module').then(m => m.EntitiesModule),
component: BaseEntityScreenComponent,
canActivate: [CompositeRouteGuard, entityExistsGuard()],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
},
];
const dossierTemplateIdRoutes: IqserRoutes = [
{
path: 'info',
component: BaseDossierTemplateScreenComponent,
loadChildren: () => import('./screens/info/dossier-template-info.module').then(m => m.DossierTemplateInfoModule),
path: 'entities',
children: entityRoutes,
},
{
path: 'entities',
path: '',
component: BaseDossierTemplateScreenComponent,
children: [
{
path: '',
component: EntitiesListingScreenComponent,
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',
},
},
{
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',
},
},
{
path: 'component-mappings',
component: ComponentMappingsScreenComponent,
canActivate: [CompositeRouteGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
},
{
path: `:${ENTITY_TYPE}`,
component: BaseEntityScreenComponent,
canActivate: [CompositeRouteGuard, entityExistsGuard()],
loadChildren: () => import('./screens/entities/entities.module').then(m => m.EntitiesModule),
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.module').then(m => m.WatermarkModule),
},
{
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',
},
},
},
{ path: '', redirectTo: 'info', pathMatch: 'full' },
],
},
{
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,
children: [
{
path: '',
loadComponent: () =>
import(
'./screens/dossier-templates-listing/dossier-templates-listing-screen/dossier-templates-listing-screen.component'
),
},
],
canActivate: [IqserAuthGuard],
loadChildren: () =>
import('./screens/dossier-templates-listing/dossier-templates-listing.module').then(m => m.DossierTemplatesListingModule),
},
{
path: `:${DOSSIER_TEMPLATE_ID}`,
@ -171,7 +180,6 @@ const dossierTemplatesRoutes: IqserRoutes = [
];
const routes: IqserRoutes = [
{ path: '', redirectTo: 'dossier-templates', pathMatch: 'full' },
{
path: 'dossier-templates',
children: dossierTemplatesRoutes,
@ -186,101 +194,85 @@ const routes: IqserRoutes = [
},
},
{
path: 'users',
path: '',
component: BaseAdminScreenComponent,
children: [
{
path: '',
path: 'users',
component: UserListingScreenComponent,
canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
permissions: {
allow: [Roles.users.read, 'RED_USER_ADMIN'],
redirectTo: '/',
},
},
},
],
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: '',
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',
loadComponent: () => import('./screens/license/license-screen/license-screen.component'),
canActivate: [IqserAuthGuard, IqserPermissionsGuard, RedRoleGuard],
data: {
permissions: {
allow: [Roles.license.readReport, 'RED_ADMIN'],
redirectTo: '/',
},
},
resolve: {
licenseData: () => inject(LicenseService).loadLicenseData(),
},
},
{
path: 'digital-signature',
component: DigitalSignatureScreenComponent,
canActivate: [IqserAuthGuard, IqserPermissionsGuard, RedRoleGuard],
data: {
permissions: {
allow: [Roles.digitalSignature.read, 'RED_ADMIN'],
redirectTo: '/',
},
},
},
],
canActivate: [IqserAuthGuard, IqserPermissionsGuard, RedRoleGuard],
data: {
permissions: {
allow: [Roles.digitalSignature.read, 'RED_ADMIN'],
redirectTo: '/',
},
},
},
{
path: 'audit',
component: BaseAdminScreenComponent,
children: [
{
path: '',
path: 'audit',
component: AuditScreenComponent,
canActivate: [IqserAuthGuard, IqserPermissionsGuard, RedRoleGuard],
data: {
permissions: {
allow: [Roles.searchAudit, 'RED_ADMIN'],
redirectTo: '/',
},
},
},
],
canActivate: [IqserAuthGuard, IqserPermissionsGuard, RedRoleGuard],
data: {
permissions: {
allow: [Roles.searchAudit, 'RED_ADMIN'],
redirectTo: '/',
},
},
},
{
path: 'general-config',
component: BaseAdminScreenComponent,
children: [
{
path: '',
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: '/',
},
},
},
{ path: '', redirectTo: 'dossier-templates', pathMatch: 'full' },
],
canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
canDeactivate: [PendingChangesGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
permissions: {
allow: [Roles.generalConfiguration.read, Roles.smtp.read, 'RED_ADMIN'],
redirectTo: '/',
},
},
},
];

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">
<iqser-table [itemSize]="80" [tableColumnConfigs]="tableColumnConfigs" emptyColumnWidth="2fr"></iqser-table>
</div>
</div>
</section>
<div class="content-container" *ngIf="context$ | async as context">
<iqser-table [itemSize]="80" [tableColumnConfigs]="tableColumnConfigs" emptyColumnWidth="2fr"></iqser-table>
</div>
<ng-template #tableItemTemplate let-entity="entity">
<div>

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 } from '@angular/material/select';
import { NgForOf, NgIf } from '@angular/common';
export interface ConfirmDeleteDossierStateDialogData {
readonly toBeDeletedState: DossierState;
@ -18,6 +23,19 @@ 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,
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,20 @@ 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, DatePipe, NgIf } from '@angular/common';
import { MatIcon } from '@angular/material/icon';
import { TranslateModule } from '@ngx-translate/core';
import { IqserUsersModule } from '@common-ui/users';
import { DossierTemplateActionsComponent } from '../../../shared/components/dossier-template-actions/dossier-template-actions.component';
@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, IqserUsersModule, DatePipe, DossierTemplateActionsComponent],
})
export class TableItemComponent implements OnChanges {
@Input() dossierTemplate!: DossierTemplate;

View File

@ -1,41 +1,18 @@
<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()"
[bulkActions]="bulkActions"
[headerTemplate]="headerTemplate"
[itemSize]="80"
[noDataButtonIcon]="'iqser:plus'"
[noDataButtonLabel]="'entities-listing.no-data.action' | translate"
[noDataText]="'entities-listing.no-data.title' | translate"
[noMatchText]="'entities-listing.no-match.title' | translate"
[showNoDataButton]="permissionsService.canEditEntities()"
[tableColumnConfigs]="tableColumnConfigs"
noDataIcon="red:dictionary"
></iqser-table>
</div>
</div>
</section>
<div class="content-container">
<iqser-table
(noDataAction)="openAddEntityDialog()"
[bulkActions]="bulkActions"
[headerTemplate]="headerTemplate"
[itemSize]="80"
[noDataButtonIcon]="'iqser:plus'"
[noDataButtonLabel]="'entities-listing.no-data.action' | translate"
[noDataText]="'entities-listing.no-data.title' | translate"
[noMatchText]="'entities-listing.no-match.title' | translate"
[showNoDataButton]="permissionsService.canEditEntities()"
[tableColumnConfigs]="tableColumnConfigs"
noDataIcon="red:dictionary"
></iqser-table>
</div>
<ng-template #bulkActions>
<iqser-circle-button

View File

@ -1,14 +1,49 @@
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 } 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,
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 } from '@angular/material/select';
import { ActiveFieldsListingComponent } from './active-fields-listing/active-fields-listing.component';
export interface IFileAttributesCSVImportData {
readonly csv: File;
@ -22,6 +37,23 @@ 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,
MatSelect,
CircleButtonComponent,
NgIf,
InputWithActionComponent,
IconButtonComponent,
NgForOf,
ActiveFieldsListingComponent,
],
})
export class FileAttributesCsvImportDialogComponent extends ListingComponent<IField> {
readonly iconButtonTypes = IconButtonTypes;

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

@ -4,7 +4,7 @@ import { GeneralConfigFormComponent } from './general-config-form/general-config
import { SmtpFormComponent } from './smtp-form/smtp-form.component';
import { BaseFormComponent } 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';
@Component({
selector: 'redaction-general-config-screen',

View File

@ -4,6 +4,10 @@ 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, DatePipe, NgIf } from '@angular/common';
import { IqserUsersModule } from '@common-ui/users';
import { MatIcon } from '@angular/material/icon';
import { TranslateModule } from '@ngx-translate/core';
interface Context {
readonly dossierTemplate: DossierTemplate;
@ -14,6 +18,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, IqserUsersModule, MatIcon, TranslateModule, DatePipe],
})
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>({
entitiesService: JustificationsService,
component: JustificationsScreenComponent,
}),
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,35 @@
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, DatePipe, 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';
@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

@ -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 {}