diff --git a/angular.json b/angular.json
index d0f02141e..74a38dc98 100644
--- a/angular.json
+++ b/angular.json
@@ -50,7 +50,7 @@
{
"glob": "**/*",
"input": "node_modules/@pdftron/webviewer/public/",
- "output": "/assets/wv-resources/"
+ "output": "/assets/wv-resources/10.10.1/"
},
{
"glob": "**/*",
diff --git a/apps/red-ui/src/app/app-routing.module.ts b/apps/red-ui/src/app/app-routing.module.ts
index 82e164ea3..a6dbcb214 100644
--- a/apps/red-ui/src/app/app-routing.module.ts
+++ b/apps/red-ui/src/app/app-routing.module.ts
@@ -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],
diff --git a/apps/red-ui/src/app/app.module.ts b/apps/red-ui/src/app/app.module.ts
index 90d3d1daa..6b88ae96c 100644
--- a/apps/red-ui/src/app/app.module.ts
+++ b/apps/red-ui/src/app/app.module.ts
@@ -2,11 +2,18 @@ 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 { InputWithActionComponent } from '@common-ui/inputs/input-with-action/input-with-action.component';
+import { RoundCheckboxComponent } from '@common-ui/inputs/round-checkbox/round-checkbox.component';
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,27 +31,26 @@ import {
ChevronButtonComponent,
CircleButtonComponent,
EmptyStateComponent,
- HelpModeKey,
+ HelpButtonComponent,
+ HelpModeComponent,
HiddenActionDirective,
IconButtonComponent,
- InputWithActionComponent,
IqserAllowDirective,
IqserDenyDirective,
- IqserHelpModeModule,
IqserListingModule,
IqserLoadingModule,
IqserTranslateModule,
LanguageService,
MAX_RETRIES_ON_SERVER_ERROR,
- RoundCheckboxComponent,
SERVER_ERROR_SKIP_PATHS,
ServerErrorInterceptor,
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],
})
diff --git a/apps/red-ui/src/app/components/notifications/notifications.component.html b/apps/red-ui/src/app/components/notifications/notifications.component.html
index 5f2b7e66b..0d0652faf 100644
--- a/apps/red-ui/src/app/components/notifications/notifications.component.html
+++ b/apps/red-ui/src/app/components/notifications/notifications.component.html
@@ -32,19 +32,18 @@
-
{{ notification.creationDate | date : 'exactDate' }}
+
{{ notification.creationDate | date: 'exactDate' }}
diff --git a/apps/red-ui/src/app/components/notifications/notifications.component.ts b/apps/red-ui/src/app/components/notifications/notifications.component.ts
index 743dcda00..70992bb6f 100644
--- a/apps/red-ui/src/app/components/notifications/notifications.component.ts
+++ b/apps/red-ui/src/app/components/notifications/notifications.component.ts
@@ -58,6 +58,15 @@ export class NotificationsComponent {
await this._notificationsService.toggleNotificationRead(notificationsIds, isRead);
}
+ async handleMarkReadEvent(event: MouseEvent, notifications: Notification[] = this._notificationsService.all, isRead = true) {
+ if (!(event.target as HTMLBaseElement).href) {
+ event.stopPropagation();
+ event.preventDefault();
+ }
+
+ await this.markRead(notifications, isRead);
+ }
+
#groupNotifications(notifications: Notification[]): NotificationsGroup[] {
const todayTranslation = this._translateService.instant('today');
const groupedMap = notifications.groupBy(n => {
diff --git a/apps/red-ui/src/app/guards/edit-attribute.guard.ts b/apps/red-ui/src/app/guards/edit-attribute.guard.ts
deleted file mode 100644
index 654ef1588..000000000
--- a/apps/red-ui/src/app/guards/edit-attribute.guard.ts
+++ /dev/null
@@ -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 = () =>
- !inject(FileAttributesService).isEditingFileAttribute();
diff --git a/apps/red-ui/src/app/guards/file-attribute.guard.ts b/apps/red-ui/src/app/guards/file-attribute.guard.ts
new file mode 100644
index 000000000..a5832cbc6
--- /dev/null
+++ b/apps/red-ui/src/app/guards/file-attribute.guard.ts
@@ -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 = () =>
+ !inject(FileAttributesService).isEditingFileAttribute();
diff --git a/apps/red-ui/src/app/guards/permissions-guard.ts b/apps/red-ui/src/app/guards/permissions-guard.ts
index a53249937..6744f0cbe 100644
--- a/apps/red-ui/src/app/guards/permissions-guard.ts
+++ b/apps/red-ui/src/app/guards/permissions-guard.ts
@@ -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 {
diff --git a/apps/red-ui/src/app/models/file/annotation.wrapper.ts b/apps/red-ui/src/app/models/file/annotation.wrapper.ts
index e1985d7bd..5a19d4356 100644
--- a/apps/red-ui/src/app/models/file/annotation.wrapper.ts
+++ b/apps/red-ui/src/app/models/file/annotation.wrapper.ts
@@ -77,6 +77,10 @@ export class AnnotationWrapper implements IListable {
return this.engines.includes(LogEntryEngines.DICTIONARY);
}
+ get isRedactedImageHint() {
+ return this.IMAGE_HINT && this.superType === SuperTypes.Redaction;
+ }
+
get searchKey(): string {
return this.id;
}
@@ -291,7 +295,10 @@ export class AnnotationWrapper implements IListable {
} else {
const colorKey = annotationEntityColorConfig[annotationWrapper.superType];
const defaultColor = annotationDefaultColorConfig[annotationWrapper.superType];
- annotationWrapper.color = dictionary ? (dictionary[colorKey] as string) : (defaultColors[defaultColor] as string);
+ annotationWrapper.color =
+ dictionary && !annotationWrapper.isRedactedImageHint
+ ? (dictionary[colorKey] as string)
+ : (defaultColors[defaultColor] as string);
}
annotationWrapper.entry = logEntry;
diff --git a/apps/red-ui/src/app/modules/account/account-side-nav/account-side-nav.component.ts b/apps/red-ui/src/app/modules/account/account-side-nav/account-side-nav.component.ts
index bebf6d1a1..71f58143c 100644
--- a/apps/red-ui/src/app/modules/account/account-side-nav/account-side-nav.component.ts
+++ b/apps/red-ui/src/app/modules/account/account-side-nav/account-side-nav.component.ts
@@ -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();
diff --git a/apps/red-ui/src/app/modules/account/account.module.ts b/apps/red-ui/src/app/modules/account/account.module.ts
deleted file mode 100644
index 20f4f6bf0..000000000
--- a/apps/red-ui/src/app/modules/account/account.module.ts
+++ /dev/null
@@ -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 {}
diff --git a/apps/red-ui/src/app/modules/account/account-routing.module.ts b/apps/red-ui/src/app/modules/account/account.routes.ts
similarity index 85%
rename from apps/red-ui/src/app/modules/account/account-routing.module.ts
rename to apps/red-ui/src/app/modules/account/account.routes.ts
index 086dd3c89..c6ec83179 100644
--- a/apps/red-ui/src/app/modules/account/account-routing.module.ts
+++ b/apps/red-ui/src/app/modules/account/account.routes.ts
@@ -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;
diff --git a/apps/red-ui/src/app/modules/account/base-account-screen/base-account-screen-component.ts b/apps/red-ui/src/app/modules/account/base-account-screen/base-account-screen-component.ts
index 3305fc65f..ccfa31ad0 100644
--- a/apps/red-ui/src/app/modules/account/base-account-screen/base-account-screen-component.ts
+++ b/apps/red-ui/src/app/modules/account/base-account-screen/base-account-screen-component.ts
@@ -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;
diff --git a/apps/red-ui/src/app/modules/account/screens/notifications/notifications-screen/notifications-screen.component.ts b/apps/red-ui/src/app/modules/account/screens/notifications/notifications-screen/notifications-screen.component.ts
index 1f80c321c..c9b92f288 100644
--- a/apps/red-ui/src/app/modules/account/screens/notifications/notifications-screen/notifications-screen.component.ts
+++ b/apps/red-ui/src/app/modules/account/screens/notifications/notifications-screen/notifications-screen.component.ts
@@ -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);
diff --git a/apps/red-ui/src/app/modules/account/screens/notifications/notifications.module.ts b/apps/red-ui/src/app/modules/account/screens/notifications/notifications.module.ts
deleted file mode 100644
index 5cdaf8a16..000000000
--- a/apps/red-ui/src/app/modules/account/screens/notifications/notifications.module.ts
+++ /dev/null
@@ -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 {}
diff --git a/apps/red-ui/src/app/modules/account/screens/notifications/notifications.routes.ts b/apps/red-ui/src/app/modules/account/screens/notifications/notifications.routes.ts
new file mode 100644
index 000000000..fc7f8195b
--- /dev/null
+++ b/apps/red-ui/src/app/modules/account/screens/notifications/notifications.routes.ts
@@ -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;
diff --git a/apps/red-ui/src/app/modules/account/screens/preferences/dialog-defaults/dialog-defaults.component.ts b/apps/red-ui/src/app/modules/account/screens/preferences/dialog-defaults/dialog-defaults.component.ts
index 0039b8f8a..85ff67c63 100644
--- a/apps/red-ui/src/app/modules/account/screens/preferences/dialog-defaults/dialog-defaults.component.ts
+++ b/apps/red-ui/src/app/modules/account/screens/preferences/dialog-defaults/dialog-defaults.component.ts
@@ -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 {
const formValue = this.form.value;
diff --git a/apps/red-ui/src/app/modules/account/screens/preferences/preferences.component.ts b/apps/red-ui/src/app/modules/account/screens/preferences/preferences.component.ts
index c33a60f26..269fe712f 100644
--- a/apps/red-ui/src/app/modules/account/screens/preferences/preferences.component.ts
+++ b/apps/red-ui/src/app/modules/account/screens/preferences/preferences.component.ts
@@ -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>;
diff --git a/apps/red-ui/src/app/modules/account/screens/user-profile/confirm-password-dialog/confirm-password-dialog.component.ts b/apps/red-ui/src/app/modules/account/screens/user-profile/confirm-password-dialog/confirm-password-dialog.component.ts
index 5eafcfc2e..bfe0ce506 100644
--- a/apps/red-ui/src/app/modules/account/screens/user-profile/confirm-password-dialog/confirm-password-dialog.component.ts
+++ b/apps/red-ui/src/app/modules/account/screens/user-profile/confirm-password-dialog/confirm-password-dialog.component.ts
@@ -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;
@@ -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) {
diff --git a/apps/red-ui/src/app/modules/account/screens/user-profile/user-profile-screen/user-profile-screen.component.ts b/apps/red-ui/src/app/modules/account/screens/user-profile/user-profile-screen/user-profile-screen.component.ts
index f1a736a95..c8f055e13 100644
--- a/apps/red-ui/src/app/modules/account/screens/user-profile/user-profile-screen/user-profile-screen.component.ts
+++ b/apps/red-ui/src/app/modules/account/screens/user-profile/user-profile-screen/user-profile-screen.component.ts
@@ -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;
diff --git a/apps/red-ui/src/app/modules/account/screens/user-profile/user-profile.module.ts b/apps/red-ui/src/app/modules/account/screens/user-profile/user-profile.module.ts
deleted file mode 100644
index 72f352ea7..000000000
--- a/apps/red-ui/src/app/modules/account/screens/user-profile/user-profile.module.ts
+++ /dev/null
@@ -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 {}
diff --git a/apps/red-ui/src/app/modules/account/screens/user-profile/user-profile.routes.ts b/apps/red-ui/src/app/modules/account/screens/user-profile/user-profile.routes.ts
new file mode 100644
index 000000000..c3711b2dd
--- /dev/null
+++ b/apps/red-ui/src/app/modules/account/screens/user-profile/user-profile.routes.ts
@@ -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;
diff --git a/apps/red-ui/src/app/modules/account/utils/dialog-defaults.ts b/apps/red-ui/src/app/modules/account/utils/dialog-defaults.ts
index e91793bff..a723d5878 100644
--- a/apps/red-ui/src/app/modules/account/utils/dialog-defaults.ts
+++ b/apps/red-ui/src/app/modules/account/utils/dialog-defaults.ts
@@ -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,
diff --git a/apps/red-ui/src/app/modules/admin/admin-routing.module.ts b/apps/red-ui/src/app/modules/admin/admin-routing.module.ts
deleted file mode 100644
index 3d4098c35..000000000
--- a/apps/red-ui/src/app/modules/admin/admin-routing.module.ts
+++ /dev/null
@@ -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 {}
diff --git a/apps/red-ui/src/app/modules/admin/admin.module.ts b/apps/red-ui/src/app/modules/admin/admin.module.ts
deleted file mode 100644
index f41dbc11b..000000000
--- a/apps/red-ui/src/app/modules/admin/admin.module.ts
+++ /dev/null
@@ -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 {}
diff --git a/apps/red-ui/src/app/modules/admin/admin.routes.ts b/apps/red-ui/src/app/modules/admin/admin.routes.ts
new file mode 100644
index 000000000..27e2ed7a6
--- /dev/null
+++ b/apps/red-ui/src/app/modules/admin/admin.routes.ts
@@ -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;
diff --git a/apps/red-ui/src/app/modules/admin/base-admin-screen/base-admin-screen.component.ts b/apps/red-ui/src/app/modules/admin/base-admin-screen/base-admin-screen.component.ts
index 6da915279..f0917f16c 100644
--- a/apps/red-ui/src/app/modules/admin/base-admin-screen/base-admin-screen.component.ts
+++ b/apps/red-ui/src/app/modules/admin/base-admin-screen/base-admin-screen.component.ts
@@ -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 {}
diff --git a/apps/red-ui/src/app/modules/admin/base-dossier-templates-screen/base-dossier-template-screen.component.html b/apps/red-ui/src/app/modules/admin/base-dossier-templates-screen/base-dossier-template-screen.component.html
index 84f9dc06e..df547aa94 100644
--- a/apps/red-ui/src/app/modules/admin/base-dossier-templates-screen/base-dossier-template-screen.component.html
+++ b/apps/red-ui/src/app/modules/admin/base-dossier-templates-screen/base-dossier-template-screen.component.html
@@ -1,5 +1,3 @@
-
-
diff --git a/apps/red-ui/src/app/modules/file-preview/components/annotation-card/annotation-card.component.ts b/apps/red-ui/src/app/modules/file-preview/components/annotation-card/annotation-card.component.ts
index 20c573ffd..60d8a9d39 100644
--- a/apps/red-ui/src/app/modules/file-preview/components/annotation-card/annotation-card.component.ts
+++ b/apps/red-ui/src/app/modules/file-preview/components/annotation-card/annotation-card.component.ts
@@ -1,14 +1,20 @@
+import { NgIf, UpperCasePipe } from '@angular/common';
import { Component, Input } from '@angular/core';
+import { RoundCheckboxComponent } from '@common-ui/inputs/round-checkbox/round-checkbox.component';
+import { getConfig, IqserDenyDirective } from '@iqser/common-ui';
import { AnnotationWrapper } from '@models/file/annotation.wrapper';
-import { MultiSelectService } from '../../services/multi-select.service';
+import { TranslateModule } from '@ngx-translate/core';
+import { AnnotationIconComponent } from '@shared/components/annotation-icon/annotation-icon.component';
import { annotationTypesTranslations } from '@translations/annotation-types-translations';
import { Roles } from '@users/roles';
-import { getConfig } from '@iqser/common-ui';
+import { MultiSelectService } from '../../services/multi-select.service';
@Component({
selector: 'redaction-annotation-card',
templateUrl: './annotation-card.component.html',
styleUrls: ['./annotation-card.component.scss'],
+ standalone: true,
+ imports: [AnnotationIconComponent, TranslateModule, IqserDenyDirective, NgIf, RoundCheckboxComponent, UpperCasePipe],
})
export class AnnotationCardComponent {
protected readonly roles = Roles;
diff --git a/apps/red-ui/src/app/modules/file-preview/components/annotation-details/annotation-details.component.ts b/apps/red-ui/src/app/modules/file-preview/components/annotation-details/annotation-details.component.ts
index d06824982..4d44b6ad4 100644
--- a/apps/red-ui/src/app/modules/file-preview/components/annotation-details/annotation-details.component.ts
+++ b/apps/red-ui/src/app/modules/file-preview/components/annotation-details/annotation-details.component.ts
@@ -3,10 +3,14 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { KeysOf } from '@iqser/common-ui/lib/utils';
import { AnnotationWrapper } from '@models/file/annotation.wrapper';
import { ListItem } from '@models/file/list-item';
-import { TranslateService } from '@ngx-translate/core';
+import { TranslateModule, TranslateService } from '@ngx-translate/core';
import { annotationChangesTranslations } from '@translations/annotation-changes-translations';
import { MultiSelectService } from '../../services/multi-select.service';
import { LogEntryEngine, LogEntryEngines } from '@red/domain';
+import { NgForOf, NgIf } from '@angular/common';
+import { MatTooltip } from '@angular/material/tooltip';
+import { MatIcon } from '@angular/material/icon';
+import { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';
interface Engine {
readonly icon: string;
@@ -32,6 +36,8 @@ const changesProperties: KeysOf[] = [
selector: 'redaction-annotation-details [annotation]',
templateUrl: './annotation-details.component.html',
styleUrls: ['./annotation-details.component.scss'],
+ standalone: true,
+ imports: [NgIf, MatTooltip, MatIcon, CdkOverlayOrigin, NgForOf, CdkConnectedOverlay, TranslateModule],
})
export class AnnotationDetailsComponent implements OnChanges {
@Input() annotation: ListItem;
diff --git a/apps/red-ui/src/app/modules/file-preview/components/annotation-reference/annotation-reference.component.ts b/apps/red-ui/src/app/modules/file-preview/components/annotation-reference/annotation-reference.component.ts
index 1d0f135b1..aae15c3cc 100644
--- a/apps/red-ui/src/app/modules/file-preview/components/annotation-reference/annotation-reference.component.ts
+++ b/apps/red-ui/src/app/modules/file-preview/components/annotation-reference/annotation-reference.component.ts
@@ -3,10 +3,14 @@ import { AnnotationWrapper } from '@models/file/annotation.wrapper';
import { BehaviorSubject, filter, Subscription } from 'rxjs';
import { switchMap, tap } from 'rxjs/operators';
import { AnnotationsListingService } from '../../services/annotations-listing.service';
+import { AnnotationCardComponent } from '../annotation-card/annotation-card.component';
+import { AnnotationReferencesPageIndicatorComponent } from '../annotation-references-page-indicator/annotation-references-page-indicator.component';
@Component({
selector: 'redaction-annotation-reference [annotation]',
templateUrl: './annotation-reference.component.html',
+ standalone: true,
+ imports: [AnnotationCardComponent, AnnotationReferencesPageIndicatorComponent],
})
export class AnnotationReferenceComponent implements OnChanges, OnDestroy {
@Input() annotation: AnnotationWrapper;
@@ -14,7 +18,10 @@ export class AnnotationReferenceComponent implements OnChanges, OnDestroy {
readonly #annotationChanged$ = new BehaviorSubject(undefined);
readonly #subscription: Subscription;
- constructor(private readonly _listingService: AnnotationsListingService, private readonly _changeRef: ChangeDetectorRef) {
+ constructor(
+ private readonly _listingService: AnnotationsListingService,
+ private readonly _changeRef: ChangeDetectorRef,
+ ) {
const annotationsChanged$ = this.#annotationChanged$.pipe(
filter(annotation => !!annotation),
switchMap(annotation => this._listingService.isSelected$(annotation)),
diff --git a/apps/red-ui/src/app/modules/file-preview/components/annotation-references-list/annotation-references-list.component.ts b/apps/red-ui/src/app/modules/file-preview/components/annotation-references-list/annotation-references-list.component.ts
index 85abfc36b..de69cafc8 100644
--- a/apps/red-ui/src/app/modules/file-preview/components/annotation-references-list/annotation-references-list.component.ts
+++ b/apps/red-ui/src/app/modules/file-preview/components/annotation-references-list/annotation-references-list.component.ts
@@ -5,11 +5,28 @@ import { Observable, switchMap } from 'rxjs';
import { AnnotationsListingService } from '../../services/annotations-listing.service';
import { filter } from 'rxjs/operators';
import { toObservable } from '@angular/core/rxjs-interop';
+import { AsyncPipe, NgForOf, NgIf } from '@angular/common';
+import { TranslateModule } from '@ngx-translate/core';
+import { CircleButtonComponent } from '@iqser/common-ui';
+import { AnnotationCardComponent } from '../annotation-card/annotation-card.component';
+import { AnnotationReferencesPageIndicatorComponent } from '../annotation-references-page-indicator/annotation-references-page-indicator.component';
+import { AnnotationReferenceComponent } from '../annotation-reference/annotation-reference.component';
@Component({
selector: 'redaction-annotation-references-list',
templateUrl: './annotation-references-list.component.html',
styleUrls: ['./annotation-references-list.component.scss'],
+ standalone: true,
+ imports: [
+ NgIf,
+ TranslateModule,
+ CircleButtonComponent,
+ AsyncPipe,
+ AnnotationCardComponent,
+ AnnotationReferencesPageIndicatorComponent,
+ AnnotationReferenceComponent,
+ NgForOf,
+ ],
})
export class AnnotationReferencesListComponent {
@Output() readonly referenceClicked = new EventEmitter();
diff --git a/apps/red-ui/src/app/modules/file-preview/components/annotation-references-page-indicator/annotation-references-page-indicator.component.ts b/apps/red-ui/src/app/modules/file-preview/components/annotation-references-page-indicator/annotation-references-page-indicator.component.ts
index 4b1ee0e31..d4a0531da 100644
--- a/apps/red-ui/src/app/modules/file-preview/components/annotation-references-page-indicator/annotation-references-page-indicator.component.ts
+++ b/apps/red-ui/src/app/modules/file-preview/components/annotation-references-page-indicator/annotation-references-page-indicator.component.ts
@@ -1,9 +1,12 @@
import { Component, Input } from '@angular/core';
+import { MatIcon } from '@angular/material/icon';
@Component({
selector: 'redaction-annotation-references-page-indicator',
templateUrl: './annotation-references-page-indicator.component.html',
styleUrls: ['./annotation-references-page-indicator.component.scss'],
+ standalone: true,
+ imports: [MatIcon],
})
export class AnnotationReferencesPageIndicatorComponent {
@Input() number: number;
diff --git a/apps/red-ui/src/app/modules/file-preview/components/annotation-wrapper/annotation-wrapper.component.ts b/apps/red-ui/src/app/modules/file-preview/components/annotation-wrapper/annotation-wrapper.component.ts
index 33f94a0ec..49ea32325 100644
--- a/apps/red-ui/src/app/modules/file-preview/components/annotation-wrapper/annotation-wrapper.component.ts
+++ b/apps/red-ui/src/app/modules/file-preview/components/annotation-wrapper/annotation-wrapper.component.ts
@@ -1,15 +1,35 @@
import { Component, HostBinding, inject, Input, OnChanges } from '@angular/core';
-import { getConfig } from '@iqser/common-ui';
+import { getConfig, StopPropagationDirective } from '@iqser/common-ui';
import { AnnotationWrapper } from '@models/file/annotation.wrapper';
import { ListItem } from '@models/file/list-item';
import { MultiSelectService } from '../../services/multi-select.service';
import { PdfProxyService } from '../../services/pdf-proxy.service';
import { ActionsHelpModeKeys } from '../../utils/constants';
+import { AnnotationCardComponent } from '../annotation-card/annotation-card.component';
+import { NgIf } from '@angular/common';
+import { MatTooltip } from '@angular/material/tooltip';
+import { TranslateModule } from '@ngx-translate/core';
+import { MatIcon } from '@angular/material/icon';
+import { AnnotationActionsComponent } from '../annotation-actions/annotation-actions.component';
+import { CommentsComponent } from '../comments/comments.component';
+import { AnnotationDetailsComponent } from '../annotation-details/annotation-details.component';
@Component({
selector: 'redaction-annotation-wrapper',
templateUrl: './annotation-wrapper.component.html',
styleUrls: ['./annotation-wrapper.component.scss'],
+ standalone: true,
+ imports: [
+ AnnotationCardComponent,
+ NgIf,
+ MatTooltip,
+ TranslateModule,
+ StopPropagationDirective,
+ MatIcon,
+ AnnotationActionsComponent,
+ CommentsComponent,
+ AnnotationDetailsComponent,
+ ],
})
export class AnnotationWrapperComponent implements OnChanges {
readonly #isDocumine = getConfig().IS_DOCUMINE;
diff --git a/apps/red-ui/src/app/modules/file-preview/components/annotations-list/annotations-list.component.ts b/apps/red-ui/src/app/modules/file-preview/components/annotations-list/annotations-list.component.ts
index 0ef4a6d48..a6827d447 100644
--- a/apps/red-ui/src/app/modules/file-preview/components/annotations-list/annotations-list.component.ts
+++ b/apps/red-ui/src/app/modules/file-preview/components/annotations-list/annotations-list.component.ts
@@ -11,11 +11,17 @@ import { AnnotationReferencesService } from '../../services/annotation-reference
import { AnnotationsListingService } from '../../services/annotations-listing.service';
import { MultiSelectService } from '../../services/multi-select.service';
import { ViewModeService } from '../../services/view-mode.service';
+import { NgForOf, NgIf } from '@angular/common';
+import { HighlightsSeparatorComponent } from '../highlights-separator/highlights-separator.component';
+import { AnnotationWrapperComponent } from '../annotation-wrapper/annotation-wrapper.component';
+import { AnnotationReferencesListComponent } from '../annotation-references-list/annotation-references-list.component';
@Component({
selector: 'redaction-annotations-list',
templateUrl: './annotations-list.component.html',
styleUrls: ['./annotations-list.component.scss'],
+ standalone: true,
+ imports: [NgForOf, NgIf, HighlightsSeparatorComponent, AnnotationWrapperComponent, AnnotationReferencesListComponent],
})
export class AnnotationsListComponent extends HasScrollbarDirective {
@Input({ required: true }) annotations: ListItem[];
diff --git a/apps/red-ui/src/app/modules/file-preview/components/comments/comments.component.ts b/apps/red-ui/src/app/modules/file-preview/components/comments/comments.component.ts
index 4e19920cd..2efefebad 100644
--- a/apps/red-ui/src/app/modules/file-preview/components/comments/comments.component.ts
+++ b/apps/red-ui/src/app/modules/file-preview/components/comments/comments.component.ts
@@ -1,11 +1,17 @@
+import { NgForOf, NgIf } from '@angular/common';
import { Component, inject, Input, OnChanges, signal, SimpleChanges, ViewChild } from '@angular/core';
-import { InputWithActionComponent, LoadingService } from '@iqser/common-ui';
+import { MatTooltip } from '@angular/material/tooltip';
+import { InputWithActionComponent } from '@common-ui/inputs/input-with-action/input-with-action.component';
+import { NamePipe } from '@common-ui/users/name.pipe';
+import { CircleButtonComponent, LoadingService } from '@iqser/common-ui';
import { getCurrentUser } from '@iqser/common-ui/lib/users';
import { trackByFactory } from '@iqser/common-ui/lib/utils';
import { AnnotationWrapper } from '@models/file/annotation.wrapper';
+import { TranslateModule } from '@ngx-translate/core';
import type { IComment, User } from '@red/domain';
import { CommentsApiService } from '@services/comments-api.service';
import { PermissionsService } from '@services/permissions.service';
+import { DatePipe } from '@shared/pipes/date.pipe';
import { NGXLogger } from 'ngx-logger';
import { FilePreviewStateService } from '../../services/file-preview-state.service';
@@ -13,6 +19,8 @@ import { FilePreviewStateService } from '../../services/file-preview-state.servi
selector: 'redaction-comments',
templateUrl: './comments.component.html',
styleUrls: ['./comments.component.scss'],
+ standalone: true,
+ imports: [NgForOf, MatTooltip, NamePipe, DatePipe, CircleButtonComponent, NgIf, InputWithActionComponent, TranslateModule],
})
export class CommentsComponent implements OnChanges {
readonly #commentsApiService = inject(CommentsApiService);
diff --git a/apps/red-ui/src/app/modules/file-preview/components/document-info/document-info.component.ts b/apps/red-ui/src/app/modules/file-preview/components/document-info/document-info.component.ts
index 1d7ad17b4..fe3d55f0c 100644
--- a/apps/red-ui/src/app/modules/file-preview/components/document-info/document-info.component.ts
+++ b/apps/red-ui/src/app/modules/file-preview/components/document-info/document-info.component.ts
@@ -9,6 +9,11 @@ import { FileAttributesService } from '@services/entity-services/file-attributes
import { ContextComponent } from '@iqser/common-ui/lib/utils';
import { toSignal } from '@angular/core/rxjs-interop';
import { setLocalStorageDataByFileId } from '@utils/local-storage';
+import { CircleButtonComponent, HasScrollbarDirective } from '@iqser/common-ui';
+import { NgForOf, NgIf } from '@angular/common';
+import { TranslateModule } from '@ngx-translate/core';
+import { MatIcon } from '@angular/material/icon';
+import { DatePipe } from '@shared/pipes/date.pipe';
interface FileAttribute {
label: string;
@@ -24,6 +29,8 @@ interface Context {
selector: 'redaction-document-info',
templateUrl: './document-info.component.html',
styleUrls: ['./document-info.component.scss'],
+ standalone: true,
+ imports: [CircleButtonComponent, NgIf, TranslateModule, HasScrollbarDirective, NgForOf, DatePipe, MatIcon],
})
export class DocumentInfoComponent extends ContextComponent {
protected readonly _state = inject(FilePreviewStateService);
diff --git a/apps/red-ui/src/app/modules/file-preview/components/documine-export/documine-export.component.ts b/apps/red-ui/src/app/modules/file-preview/components/documine-export/documine-export.component.ts
index f4e5ad2cb..2a412ffb4 100644
--- a/apps/red-ui/src/app/modules/file-preview/components/documine-export/documine-export.component.ts
+++ b/apps/red-ui/src/app/modules/file-preview/components/documine-export/documine-export.component.ts
@@ -2,10 +2,15 @@ import { Component, Input } from '@angular/core';
import { firstValueFrom } from 'rxjs';
import { Dossier } from '@red/domain';
import { ComponentLogService } from '@services/files/component-log.service';
+import { MatTooltip } from '@angular/material/tooltip';
+import { TranslateModule } from '@ngx-translate/core';
+import { MatMenu, MatMenuItem, MatMenuTrigger } from '@angular/material/menu';
@Component({
selector: 'redaction-documine-export',
templateUrl: './documine-export.component.html',
+ standalone: true,
+ imports: [MatTooltip, TranslateModule, MatMenuTrigger, MatMenu, MatMenuItem],
})
export class DocumineExportComponent {
@Input() dossier: Dossier;
diff --git a/apps/red-ui/src/app/modules/file-preview/components/file-header/file-header.component.html b/apps/red-ui/src/app/modules/file-preview/components/file-header/file-header.component.html
index 95882b63c..a18228626 100644
--- a/apps/red-ui/src/app/modules/file-preview/components/file-header/file-header.component.html
+++ b/apps/red-ui/src/app/modules/file-preview/components/file-header/file-header.component.html
@@ -6,8 +6,8 @@
-
-
+
-
+
@@ -33,8 +33,8 @@
[file]="file"
[helpModeKeyPrefix]="'editor'"
[minWidth]="width"
- type="file-preview"
iqserDisableStopPropagation
+ type="file-preview"
>
();
- displayedPages: number[] = [];
- pagesPanelActive = true;
protected readonly iconButtonTypes = IconButtonTypes;
protected readonly circleButtonTypes = CircleButtonTypes;
protected readonly displayedAnnotations$: Observable[]>>;
@@ -51,6 +88,9 @@ export class FileWorkloadComponent extends AutoUnsubscribe implements OnInit, On
protected readonly currentPageIsExcluded = computed(() => this.state.file().excludedPages.includes(this.pdf.currentPage()));
protected readonly translations = workloadTranslations;
protected readonly isDocumine = getConfig().IS_DOCUMINE;
+ displayedAnnotations = new Map();
+ displayedPages: number[] = [];
+ pagesPanelActive = true;
constructor(
readonly filterService: FilterService,
@@ -117,6 +157,11 @@ export class FileWorkloadComponent extends AutoUnsubscribe implements OnInit, On
return this.displayedAnnotations.get(this.pdf.currentPage()) || [];
}
+ get showAnalysisDisabledBanner() {
+ const file = this.state.file();
+ return this.isDocumine && file.excludedFromAutomaticAnalysis && file.workflowStatus !== WorkflowFileStatuses.APPROVED;
+ }
+
private get _firstSelectedAnnotation() {
return this.listingService.selected.length ? this.listingService.selected[0] : null;
}
@@ -473,9 +518,4 @@ export class FileWorkloadComponent extends AutoUnsubscribe implements OnInit, On
});
return listItemsMap;
}
-
- get showAnalysisDisabledBanner() {
- const file = this.state.file();
- return this.isDocumine && file.excludedFromAutomaticAnalysis && file.workflowStatus !== WorkflowFileStatuses.APPROVED;
- }
}
diff --git a/apps/red-ui/src/app/modules/file-preview/components/highlights-separator/highlights-separator.component.html b/apps/red-ui/src/app/modules/file-preview/components/highlights-separator/highlights-separator.component.html
index b494daab8..9ed12907b 100644
--- a/apps/red-ui/src/app/modules/file-preview/components/highlights-separator/highlights-separator.component.html
+++ b/apps/red-ui/src/app/modules/file-preview/components/highlights-separator/highlights-separator.component.html
@@ -9,8 +9,8 @@
*allow="roles.highlights.convert"
[icon]="'red:convert'"
[size]="28"
- [tooltipPosition]="'above'"
[tooltip]="'file-preview.highlights.convert' | translate"
+ tooltipPosition="above"
class="mr-2"
>
@@ -19,7 +19,7 @@
*allow="roles.highlights.delete"
[icon]="'iqser:trash'"
[size]="28"
- [tooltipPosition]="'above'"
[tooltip]="'file-preview.highlights.remove' | translate"
+ tooltipPosition="above"
>
diff --git a/apps/red-ui/src/app/modules/file-preview/components/highlights-separator/highlights-separator.component.ts b/apps/red-ui/src/app/modules/file-preview/components/highlights-separator/highlights-separator.component.ts
index 541030a9b..e392836d7 100644
--- a/apps/red-ui/src/app/modules/file-preview/components/highlights-separator/highlights-separator.component.ts
+++ b/apps/red-ui/src/app/modules/file-preview/components/highlights-separator/highlights-separator.component.ts
@@ -6,11 +6,17 @@ import { FileDataService } from '../../services/file-data.service';
import { FilePreviewDialogService } from '../../services/file-preview-dialog.service';
import { FilePreviewStateService } from '../../services/file-preview-state.service';
import { MultiSelectService } from '../../services/multi-select.service';
+import { AnnotationIconComponent } from '@shared/components/annotation-icon/annotation-icon.component';
+import { TranslateModule } from '@ngx-translate/core';
+import { CircleButtonComponent, IqserAllowDirective } from '@iqser/common-ui';
+import { NgIf } from '@angular/common';
@Component({
selector: 'redaction-highlights-separator',
templateUrl: './highlights-separator.component.html',
styleUrls: ['./highlights-separator.component.scss'],
+ standalone: true,
+ imports: [AnnotationIconComponent, TranslateModule, CircleButtonComponent, NgIf, IqserAllowDirective],
})
export class HighlightsSeparatorComponent {
@Input({ required: true }) highlightGroup: EarmarkGroup;
diff --git a/apps/red-ui/src/app/modules/file-preview/components/page-exclusion/page-exclusion.component.ts b/apps/red-ui/src/app/modules/file-preview/components/page-exclusion/page-exclusion.component.ts
index 261994079..fad8d2dc1 100644
--- a/apps/red-ui/src/app/modules/file-preview/components/page-exclusion/page-exclusion.component.ts
+++ b/apps/red-ui/src/app/modules/file-preview/components/page-exclusion/page-exclusion.component.ts
@@ -1,18 +1,24 @@
+import { NgForOf, NgIf } from '@angular/common';
import { Component, computed, ViewChild } from '@angular/core';
-import { PermissionsService } from '@services/permissions.service';
-import { InputWithActionComponent, LoadingService, Toaster } from '@iqser/common-ui';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
+import { InputWithActionComponent } from '@common-ui/inputs/input-with-action/input-with-action.component';
+import { CircleButtonComponent, HasScrollbarDirective, LoadingService, Toaster } from '@iqser/common-ui';
+import { TranslateModule } from '@ngx-translate/core';
import { IPageRange } from '@red/domain';
+import { PermissionsService } from '@services/permissions.service';
import { ReanalysisService } from '@services/reanalysis.service';
-import { FilePreviewStateService } from '../../services/file-preview-state.service';
import { extractPageRanges } from '@utils/page-ranges-mapper';
+import { FilePreviewStateService } from '../../services/file-preview-state.service';
@Component({
selector: 'redaction-page-exclusion',
templateUrl: './page-exclusion.component.html',
styleUrls: ['./page-exclusion.component.scss'],
+ standalone: true,
+ imports: [InputWithActionComponent, TranslateModule, NgIf, HasScrollbarDirective, NgForOf, CircleButtonComponent],
})
export class PageExclusionComponent {
+ @ViewChild(InputWithActionComponent) private readonly _inputComponent: InputWithActionComponent;
readonly excludedRanges = computed(() => {
const file = this._state.file();
const sorted = [...file.excludedPages].sort((p1, p2) => p1 - p2);
@@ -20,7 +26,6 @@ export class PageExclusionComponent {
});
readonly canExcludePages = computed(() => this.permissionsService.canExcludePages(this._state.file(), this._state.dossier()));
readonly noExcludedAndCantExclude = computed(() => !this.canExcludePages() && !this.excludedRanges().length);
- @ViewChild(InputWithActionComponent) private readonly _inputComponent: InputWithActionComponent;
constructor(
readonly permissionsService: PermissionsService,
@@ -52,6 +57,17 @@ export class PageExclusionComponent {
this._loadingService.stop();
}
+ flattenPageRanges(ranges: IPageRange[]) {
+ const flattenedPages = [];
+ ranges.forEach(range => {
+ for (let page = range.startPage; page <= range.endPage; page++) {
+ flattenedPages.push(page);
+ }
+ });
+
+ return flattenedPages;
+ }
+
private _toPageRange(pages: number[]) {
return pages.reduce((ranges: IPageRange[], page) => {
if (!ranges.length) {
@@ -66,15 +82,4 @@ export class PageExclusionComponent {
return ranges;
}, []);
}
-
- flattenPageRanges(ranges: IPageRange[]) {
- const flattenedPages = [];
- ranges.forEach(range => {
- for (let page = range.startPage; page <= range.endPage; page++) {
- flattenedPages.push(page);
- }
- });
-
- return flattenedPages;
- }
}
diff --git a/apps/red-ui/src/app/modules/file-preview/components/page-indicator/page-indicator.component.ts b/apps/red-ui/src/app/modules/file-preview/components/page-indicator/page-indicator.component.ts
index 752751ea1..47002e55c 100644
--- a/apps/red-ui/src/app/modules/file-preview/components/page-indicator/page-indicator.component.ts
+++ b/apps/red-ui/src/app/modules/file-preview/components/page-indicator/page-indicator.component.ts
@@ -10,11 +10,15 @@ import { ViewedPagesMapService } from '@services/files/viewed-pages-map.service'
import { Observable, pairwise } from 'rxjs';
import { PdfViewer } from '../../../pdf-viewer/services/pdf-viewer.service';
import { NGXLogger } from 'ngx-logger';
+import { AsyncPipe, NgIf } from '@angular/common';
+import { MatIcon } from '@angular/material/icon';
@Component({
selector: 'redaction-page-indicator',
templateUrl: './page-indicator.component.html',
styleUrls: ['./page-indicator.component.scss'],
+ standalone: true,
+ imports: [NgIf, AsyncPipe, MatIcon],
})
export class PageIndicatorComponent implements OnChanges {
readonly #config = getConfig
();
diff --git a/apps/red-ui/src/app/modules/file-preview/components/pages/pages.component.ts b/apps/red-ui/src/app/modules/file-preview/components/pages/pages.component.ts
index 99e5dfd88..bdc67d705 100644
--- a/apps/red-ui/src/app/modules/file-preview/components/pages/pages.component.ts
+++ b/apps/red-ui/src/app/modules/file-preview/components/pages/pages.component.ts
@@ -3,16 +3,19 @@ import { List } from '@iqser/common-ui/lib/utils';
import { PdfViewer } from '../../../pdf-viewer/services/pdf-viewer.service';
import { MultiSelectService } from '../../services/multi-select.service';
import { AnnotationsListingService } from '../../services/annotations-listing.service';
-import { AnnotationWrapper } from '@models/file/annotation.wrapper';
import { FilePreviewStateService } from '../../services/file-preview-state.service';
import { ViewedPagesMapService } from '@services/files/viewed-pages-map.service';
import { ViewedPage } from '@red/domain';
import scrollIntoView from 'scroll-into-view-if-needed';
+import { PageIndicatorComponent } from '../page-indicator/page-indicator.component';
+import { AsyncPipe, NgForOf, NgIf } from '@angular/common';
@Component({
selector: 'redaction-pages',
templateUrl: './pages.component.html',
styleUrls: ['./pages.component.scss'],
+ standalone: true,
+ imports: [PageIndicatorComponent, AsyncPipe, NgForOf, NgIf],
})
export class PagesComponent implements AfterViewInit {
readonly #state = inject(FilePreviewStateService);
diff --git a/apps/red-ui/src/app/modules/file-preview/components/readonly-banner/readonly-banner.component.ts b/apps/red-ui/src/app/modules/file-preview/components/readonly-banner/readonly-banner.component.ts
index db1926487..c3387da3a 100644
--- a/apps/red-ui/src/app/modules/file-preview/components/readonly-banner/readonly-banner.component.ts
+++ b/apps/red-ui/src/app/modules/file-preview/components/readonly-banner/readonly-banner.component.ts
@@ -1,10 +1,17 @@
import { Component, inject, Input } from '@angular/core';
import { FilePreviewStateService } from '../../services/file-preview-state.service';
+import { OcrProgressBarComponent } from '@shared/components/ocr-progress-bar/ocr-progress-bar.component';
+import { NgIf } from '@angular/common';
+import { MatProgressBar } from '@angular/material/progress-bar';
+import { MatIcon } from '@angular/material/icon';
+import { TranslateModule } from '@ngx-translate/core';
@Component({
selector: 'redaction-readonly-banner',
templateUrl: './readonly-banner.component.html',
styleUrls: ['./readonly-banner.component.scss'],
+ standalone: true,
+ imports: [OcrProgressBarComponent, NgIf, MatProgressBar, MatIcon, TranslateModule],
})
export class ReadonlyBannerComponent {
protected readonly _state = inject(FilePreviewStateService);
diff --git a/apps/red-ui/src/app/modules/file-preview/components/right-container/file-preview-right-container.component.ts b/apps/red-ui/src/app/modules/file-preview/components/right-container/file-preview-right-container.component.ts
index 3be19f097..bcfc72924 100644
--- a/apps/red-ui/src/app/modules/file-preview/components/right-container/file-preview-right-container.component.ts
+++ b/apps/red-ui/src/app/modules/file-preview/components/right-container/file-preview-right-container.component.ts
@@ -1,19 +1,24 @@
import { Component } from '@angular/core';
import { DocumentInfoService } from '../../services/document-info.service';
-import { ExcludedPagesService } from '../../services/excluded-pages.service';
import { PdfViewer } from '../../../pdf-viewer/services/pdf-viewer.service';
import { FilePreviewStateService } from '../../services/file-preview-state.service';
+import { EmptyStateComponent } from '@iqser/common-ui';
+import { NgIf } from '@angular/common';
+import { TranslateModule } from '@ngx-translate/core';
+import { DocumentInfoComponent } from '../document-info/document-info.component';
+import { FileWorkloadComponent } from '../file-workload/file-workload.component';
@Component({
selector: 'redaction-file-preview-right-container',
templateUrl: './file-preview-right-container.component.html',
styleUrls: ['./file-preview-right-container.component.scss'],
+ standalone: true,
+ imports: [EmptyStateComponent, NgIf, TranslateModule, DocumentInfoComponent, FileWorkloadComponent],
})
export class FilePreviewRightContainerComponent {
constructor(
readonly pdf: PdfViewer,
readonly state: FilePreviewStateService,
readonly documentInfoService: DocumentInfoService,
- readonly excludedPagesService: ExcludedPagesService,
) {}
}
diff --git a/apps/red-ui/src/app/modules/file-preview/components/structured-component-management/structured-component-management.component.ts b/apps/red-ui/src/app/modules/file-preview/components/structured-component-management/structured-component-management.component.ts
index 5ca3f7b24..4cc3bb5bf 100644
--- a/apps/red-ui/src/app/modules/file-preview/components/structured-component-management/structured-component-management.component.ts
+++ b/apps/red-ui/src/app/modules/file-preview/components/structured-component-management/structured-component-management.component.ts
@@ -1,20 +1,24 @@
import { Component, Input, OnInit, signal, ViewChildren } from '@angular/core';
-import { toObservable } from '@angular/core/rxjs-interop';
-import { FilterService } from '@common-ui/filtering';
import { List } from '@common-ui/utils';
import { IconButtonTypes, LoadingService } from '@iqser/common-ui';
import { ComponentLogEntry, Dictionary, File, IComponentLogEntry, WorkflowFileStatuses } from '@red/domain';
import { ComponentLogService } from '@services/files/component-log.service';
import { UserPreferenceService } from '@users/user-preference.service';
import { combineLatest, firstValueFrom, Observable } from 'rxjs';
-import { map } from 'rxjs/operators';
-import { ComponentLogFilterService } from '../../services/component-log-filter.service';
import { EditableStructuredComponentValueComponent } from '../editable-structured-component-value/editable-structured-component-value.component';
+import { FilterService, PopupFilterComponent } from '@common-ui/filtering';
+import { ComponentLogFilterService } from '../../services/component-log-filter.service';
+import { map } from 'rxjs/operators';
+import { toObservable } from '@angular/core/rxjs-interop';
+import { AsyncPipe, NgForOf, NgIf } from '@angular/common';
+import { TranslateModule } from '@ngx-translate/core';
@Component({
selector: 'redaction-structured-component-management',
templateUrl: './structured-component-management.component.html',
styleUrls: ['./structured-component-management.component.scss'],
+ standalone: true,
+ imports: [PopupFilterComponent, NgIf, AsyncPipe, TranslateModule, NgForOf, EditableStructuredComponentValueComponent],
})
export class StructuredComponentManagementComponent implements OnInit {
protected readonly componentLogData = signal(undefined);
diff --git a/apps/red-ui/src/app/modules/file-preview/components/user-management/user-management.component.ts b/apps/red-ui/src/app/modules/file-preview/components/user-management/user-management.component.ts
index 3a9b8ac46..00253a922 100644
--- a/apps/red-ui/src/app/modules/file-preview/components/user-management/user-management.component.ts
+++ b/apps/red-ui/src/app/modules/file-preview/components/user-management/user-management.component.ts
@@ -1,7 +1,7 @@
import { Component, computed, HostListener, NgZone, OnDestroy, OnInit } from '@angular/core';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
-import { LoadingService, Toaster } from '@iqser/common-ui';
-import { getCurrentUser } from '@iqser/common-ui/lib/users';
+import { CircleButtonComponent, LoadingService, StopPropagationDirective, Toaster } from '@iqser/common-ui';
+import { getCurrentUser, InitialsAvatarComponent } from '@iqser/common-ui/lib/users';
import { File, User } from '@red/domain';
import { FilesService } from '@services/files/files.service';
import { PermissionsService } from '@services/permissions.service';
@@ -12,11 +12,25 @@ import { FileAssignService } from '../../../shared-dossiers/services/file-assign
import { FilePreviewStateService } from '../../services/file-preview-state.service';
import { PdfViewer } from '../../../pdf-viewer/services/pdf-viewer.service';
import { Bind } from '@common-ui/utils';
+import { AssignUserDropdownComponent } from '@shared/components/assign-user-dropdown/assign-user-dropdown.component';
+import { NgIf } from '@angular/common';
+import { StatusBarComponent } from '@common-ui/shared';
+import { TranslateModule } from '@ngx-translate/core';
@Component({
selector: 'redaction-user-management',
templateUrl: './user-management.component.html',
styleUrls: ['./user-management.component.scss'],
+ standalone: true,
+ imports: [
+ AssignUserDropdownComponent,
+ NgIf,
+ StopPropagationDirective,
+ InitialsAvatarComponent,
+ StatusBarComponent,
+ TranslateModule,
+ CircleButtonComponent,
+ ],
})
export class UserManagementComponent implements OnInit, OnDestroy {
protected readonly _canAssignToSelf = computed(() => this.permissionsService.canAssignToSelf(this.state.file(), this.state.dossier()));
diff --git a/apps/red-ui/src/app/modules/file-preview/components/view-switch/view-switch.component.ts b/apps/red-ui/src/app/modules/file-preview/components/view-switch/view-switch.component.ts
index 78efc6d3d..21cc039be 100644
--- a/apps/red-ui/src/app/modules/file-preview/components/view-switch/view-switch.component.ts
+++ b/apps/red-ui/src/app/modules/file-preview/components/view-switch/view-switch.component.ts
@@ -4,12 +4,16 @@ import { Roles } from '@users/roles';
import { FileDataService } from '../../services/file-data.service';
import { FilePreviewStateService } from '../../services/file-preview-state.service';
import { ViewModeService } from '../../services/view-mode.service';
-import { getConfig } from '@iqser/common-ui';
+import { getConfig, IqserDenyDirective } from '@iqser/common-ui';
+import { MatTooltip } from '@angular/material/tooltip';
+import { TranslateModule } from '@ngx-translate/core';
@Component({
selector: 'redaction-view-switch',
templateUrl: './view-switch.component.html',
styleUrls: ['./view-switch.component.scss'],
+ standalone: true,
+ imports: [MatTooltip, TranslateModule, IqserDenyDirective],
})
export class ViewSwitchComponent {
protected readonly isDocumine = getConfig().IS_DOCUMINE;
diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/add-hint-dialog/add-hint-dialog.component.ts b/apps/red-ui/src/app/modules/file-preview/dialogs/add-hint-dialog/add-hint-dialog.component.ts
index d0015fa32..07234fb4c 100644
--- a/apps/red-ui/src/app/modules/file-preview/dialogs/add-hint-dialog/add-hint-dialog.component.ts
+++ b/apps/red-ui/src/app/modules/file-preview/dialogs/add-hint-dialog/add-hint-dialog.component.ts
@@ -1,21 +1,54 @@
+import { NgIf } from '@angular/common';
import { Component, OnInit } from '@angular/core';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
-import { FormBuilder, UntypedFormGroup } from '@angular/forms';
-import { DetailsRadioOption, IconButtonTypes, IqserDialogComponent, IqserPermissionsService } from '@iqser/common-ui';
+import { FormBuilder, ReactiveFormsModule, UntypedFormGroup } from '@angular/forms';
+import { MatDialogClose } from '@angular/material/dialog';
+import { MatFormField } from '@angular/material/form-field';
+import { MatOption, MatSelect, MatSelectTrigger } from '@angular/material/select';
+import { MatTooltip } from '@angular/material/tooltip';
+import { DetailsRadioOption } from '@common-ui/inputs/details-radio/details-radio-option';
+import { DetailsRadioComponent } from '@common-ui/inputs/details-radio/details-radio.component';
+import {
+ CircleButtonComponent,
+ HasScrollbarDirective,
+ IconButtonComponent,
+ IconButtonTypes,
+ IqserDenyDirective,
+ IqserDialogComponent,
+ IqserPermissionsService,
+} from '@iqser/common-ui';
+import { TranslateModule } from '@ngx-translate/core';
import { Dictionary, Dossier, IAddRedactionRequest } from '@red/domain';
import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service';
import { DictionaryService } from '@services/entity-services/dictionary.service';
import { Roles } from '@users/roles';
-import { tap } from 'rxjs/operators';
-import { getRedactOrHintOptions, RedactOrHintOption, RedactOrHintOptions } from '../../utils/dialog-options';
-import { AddHintData, AddHintResult } from '../../utils/dialog-types';
import { UserPreferenceService } from '@users/user-preference.service';
-import { SystemDefaultOption, SystemDefaults } from '../../../account/utils/dialog-defaults';
import { stringToBoolean } from '@utils/functions';
+import { tap } from 'rxjs/operators';
+import { SystemDefaultOption, SystemDefaults } from '../../../account/utils/dialog-defaults';
+import { getRedactOrHintOptions } from '../../utils/dialog-options';
+import { AddHintData, AddHintResult, RedactOrHintOption, RedactOrHintOptions } from '../../utils/dialog-types';
@Component({
templateUrl: './add-hint-dialog.component.html',
styleUrls: ['./add-hint-dialog.component.scss'],
+ standalone: true,
+ imports: [
+ ReactiveFormsModule,
+ DetailsRadioComponent,
+ IqserDenyDirective,
+ MatFormField,
+ MatSelectTrigger,
+ MatSelect,
+ MatOption,
+ MatTooltip,
+ NgIf,
+ HasScrollbarDirective,
+ IconButtonComponent,
+ TranslateModule,
+ CircleButtonComponent,
+ MatDialogClose,
+ ],
})
export class AddHintDialogComponent extends IqserDialogComponent implements OnInit {
#applyToAllDossiers: boolean;
diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/change-legal-basis-dialog/change-legal-basis-dialog.component.ts b/apps/red-ui/src/app/modules/file-preview/dialogs/change-legal-basis-dialog/change-legal-basis-dialog.component.ts
index b67fec10a..dccb2181d 100644
--- a/apps/red-ui/src/app/modules/file-preview/dialogs/change-legal-basis-dialog/change-legal-basis-dialog.component.ts
+++ b/apps/red-ui/src/app/modules/file-preview/dialogs/change-legal-basis-dialog/change-legal-basis-dialog.component.ts
@@ -1,11 +1,16 @@
import { Component, Inject, OnInit } from '@angular/core';
-import { UntypedFormGroup, Validators } from '@angular/forms';
-import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
-import { BaseDialogComponent } from '@iqser/common-ui';
+import { ReactiveFormsModule, UntypedFormGroup, Validators } from '@angular/forms';
+import { MAT_DIALOG_DATA, MatDialogClose, MatDialogRef } from '@angular/material/dialog';
+import { BaseDialogComponent, CircleButtonComponent, HasScrollbarDirective, IconButtonComponent } from '@iqser/common-ui';
import { AnnotationWrapper } from '@models/file/annotation.wrapper';
import { Dossier } from '@red/domain';
import { JustificationsService } from '@services/entity-services/justifications.service';
import { firstValueFrom } from 'rxjs';
+import { MatFormField } from '@angular/material/form-field';
+import { MatOption, MatSelect, MatSelectTrigger } from '@angular/material/select';
+import { NgForOf, NgIf } from '@angular/common';
+import { MatTooltip } from '@angular/material/tooltip';
+import { TranslateModule } from '@ngx-translate/core';
export interface LegalBasisOption {
label?: string;
@@ -15,6 +20,22 @@ export interface LegalBasisOption {
@Component({
templateUrl: './change-legal-basis-dialog.component.html',
+ standalone: true,
+ imports: [
+ ReactiveFormsModule,
+ MatFormField,
+ MatSelectTrigger,
+ MatSelect,
+ MatOption,
+ NgForOf,
+ MatTooltip,
+ HasScrollbarDirective,
+ IconButtonComponent,
+ MatDialogClose,
+ TranslateModule,
+ CircleButtonComponent,
+ NgIf,
+ ],
})
export class ChangeLegalBasisDialogComponent extends BaseDialogComponent implements OnInit {
legalOptions: LegalBasisOption[] = [];
diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/docu-mine/add-annotation-dialog/add-annotation-dialog.component.ts b/apps/red-ui/src/app/modules/file-preview/dialogs/docu-mine/add-annotation-dialog/add-annotation-dialog.component.ts
index f2e596777..15dad1a7a 100644
--- a/apps/red-ui/src/app/modules/file-preview/dialogs/docu-mine/add-annotation-dialog/add-annotation-dialog.component.ts
+++ b/apps/red-ui/src/app/modules/file-preview/dialogs/docu-mine/add-annotation-dialog/add-annotation-dialog.component.ts
@@ -1,13 +1,34 @@
import { Component, inject, OnInit } from '@angular/core';
-import { FormBuilder } from '@angular/forms';
-import { IconButtonTypes, IqserDialogComponent } from '@iqser/common-ui';
+import { FormBuilder, ReactiveFormsModule } from '@angular/forms';
+import { CircleButtonComponent, HasScrollbarDirective, IconButtonComponent, IconButtonTypes, IqserDialogComponent } from '@iqser/common-ui';
import { Dictionary, IAddRedactionRequest } from '@red/domain';
import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service';
import { DictionaryService } from '@services/entity-services/dictionary.service';
import { AddAnnotationData, AddAnnotationResult } from '../../../utils/dialog-types';
+import { MatFormField } from '@angular/material/form-field';
+import { MatOption, MatSelect, MatSelectTrigger } from '@angular/material/select';
+import { NgForOf } from '@angular/common';
+import { MatTooltip } from '@angular/material/tooltip';
+import { TranslateModule } from '@ngx-translate/core';
+import { MatDialogClose } from '@angular/material/dialog';
@Component({
templateUrl: './add-annotation-dialog.component.html',
+ standalone: true,
+ imports: [
+ ReactiveFormsModule,
+ MatFormField,
+ MatSelectTrigger,
+ MatSelect,
+ MatOption,
+ NgForOf,
+ MatTooltip,
+ HasScrollbarDirective,
+ IconButtonComponent,
+ TranslateModule,
+ CircleButtonComponent,
+ MatDialogClose,
+ ],
})
export class AddAnnotationDialogComponent
extends IqserDialogComponent
diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/docu-mine/edit-annotation-dialog/edit-annotation-dialog.component.ts b/apps/red-ui/src/app/modules/file-preview/dialogs/docu-mine/edit-annotation-dialog/edit-annotation-dialog.component.ts
index d70a3e4cf..624e3728e 100644
--- a/apps/red-ui/src/app/modules/file-preview/dialogs/docu-mine/edit-annotation-dialog/edit-annotation-dialog.component.ts
+++ b/apps/red-ui/src/app/modules/file-preview/dialogs/docu-mine/edit-annotation-dialog/edit-annotation-dialog.component.ts
@@ -1,16 +1,39 @@
import { Component, OnInit } from '@angular/core';
-import { FormBuilder, UntypedFormGroup } from '@angular/forms';
-import { IconButtonTypes, IqserDialogComponent, IqserPermissionsService } from '@iqser/common-ui';
+import { FormBuilder, ReactiveFormsModule, UntypedFormGroup } from '@angular/forms';
+import { CircleButtonComponent, HasScrollbarDirective, IconButtonComponent, IconButtonTypes, IqserDialogComponent } from '@iqser/common-ui';
import { Dictionary, Dossier, SuperTypes } from '@red/domain';
import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service';
import { DictionaryService } from '@services/entity-services/dictionary.service';
-import { JustificationsService } from '@services/entity-services/justifications.service';
import { Roles } from '@users/roles';
import { EditRedactionData, EditRedactResult } from '../../../utils/dialog-types';
+import { SelectedAnnotationsListComponent } from '../../../components/selected-annotations-list/selected-annotations-list.component';
+import { NgForOf, NgIf } from '@angular/common';
+import { MatFormField } from '@angular/material/form-field';
+import { MatOption, MatSelect, MatSelectTrigger } from '@angular/material/select';
+import { MatTooltip } from '@angular/material/tooltip';
+import { TranslateModule } from '@ngx-translate/core';
+import { MatDialogClose } from '@angular/material/dialog';
@Component({
templateUrl: 'edit-annotation-dialog.component.html',
styleUrls: ['edit-annotation-dialog.component.scss'],
+ standalone: true,
+ imports: [
+ ReactiveFormsModule,
+ SelectedAnnotationsListComponent,
+ NgIf,
+ MatFormField,
+ MatSelectTrigger,
+ MatSelect,
+ MatOption,
+ NgForOf,
+ MatTooltip,
+ HasScrollbarDirective,
+ TranslateModule,
+ IconButtonComponent,
+ CircleButtonComponent,
+ MatDialogClose,
+ ],
})
export class EditAnnotationDialogComponent
extends IqserDialogComponent
@@ -24,10 +47,8 @@ export class EditAnnotationDialogComponent
form: UntypedFormGroup;
constructor(
- private readonly _justificationsService: JustificationsService,
private readonly _activeDossiersService: ActiveDossiersService,
private readonly _dictionaryService: DictionaryService,
- private readonly _iqserPermissionsService: IqserPermissionsService,
private readonly _formBuilder: FormBuilder,
) {
super();
diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/docu-mine/remove-annotation-dialog/remove-annotation-dialog.component.ts b/apps/red-ui/src/app/modules/file-preview/dialogs/docu-mine/remove-annotation-dialog/remove-annotation-dialog.component.ts
index d9061c729..58ffe7ace 100644
--- a/apps/red-ui/src/app/modules/file-preview/dialogs/docu-mine/remove-annotation-dialog/remove-annotation-dialog.component.ts
+++ b/apps/red-ui/src/app/modules/file-preview/dialogs/docu-mine/remove-annotation-dialog/remove-annotation-dialog.component.ts
@@ -1,12 +1,34 @@
+import { CdkFixedSizeVirtualScroll, CdkVirtualForOf } from '@angular/cdk/scrolling';
+import { NgIf, NgStyle } from '@angular/common';
import { Component } from '@angular/core';
-import { DetailsRadioOption, IconButtonTypes, IqserDialogComponent } from '@iqser/common-ui';
-import { FormBuilder, UntypedFormGroup } from '@angular/forms';
-import { RemoveAnnotationData, RemoveAnnotationResult } from '../../../utils/dialog-types';
-import { getRemoveRedactionOptions, RemoveAnnotationOption, RemoveAnnotationOptions } from '../../../utils/dialog-options';
+import { FormBuilder, ReactiveFormsModule, UntypedFormGroup } from '@angular/forms';
+import { MatDialogClose } from '@angular/material/dialog';
+import { DetailsRadioOption } from '@common-ui/inputs/details-radio/details-radio-option';
+import { DetailsRadioComponent } from '@common-ui/inputs/details-radio/details-radio.component';
+import { ReplaceNbspPipe } from '@common-ui/pipes/replace-nbsp.pipe';
+import { CircleButtonComponent, HasScrollbarDirective, IconButtonComponent, IconButtonTypes, IqserDialogComponent } from '@iqser/common-ui';
+import { TranslateModule } from '@ngx-translate/core';
+import { getRemoveRedactionOptions } from '../../../utils/dialog-options';
+import { RemoveAnnotationData, RemoveAnnotationOption, RemoveAnnotationOptions, RemoveAnnotationResult } from '../../../utils/dialog-types';
@Component({
templateUrl: 'remove-annotation-dialog.component.html',
styleUrls: ['remove-annotation-dialog.component.scss'],
+ standalone: true,
+ imports: [
+ ReactiveFormsModule,
+ TranslateModule,
+ CdkFixedSizeVirtualScroll,
+ NgStyle,
+ CdkVirtualForOf,
+ ReplaceNbspPipe,
+ DetailsRadioComponent,
+ HasScrollbarDirective,
+ IconButtonComponent,
+ CircleButtonComponent,
+ MatDialogClose,
+ NgIf,
+ ],
})
export class RemoveAnnotationDialogComponent extends IqserDialogComponent<
RemoveAnnotationDialogComponent,
@@ -19,6 +41,13 @@ export class RemoveAnnotationDialogComponent extends IqserDialogComponent<
form!: UntypedFormGroup;
+ constructor(private readonly _formBuilder: FormBuilder) {
+ super();
+ this.options = getRemoveRedactionOptions(this.data, this.data.applyToAllDossiers, true);
+ this.redactedTexts = this.data.redactions.map(annotation => annotation.value);
+ this.form = this.#getForm();
+ }
+
get isFalsePositive(): boolean {
return this.form.get('option').value.value === RemoveAnnotationOptions.FALSE_POSITIVE;
}
@@ -28,13 +57,6 @@ export class RemoveAnnotationDialogComponent extends IqserDialogComponent<
return selectedOption === RemoveAnnotationOptions.IN_DOSSIER || selectedOption === RemoveAnnotationOptions.FALSE_POSITIVE;
}
- constructor(private readonly _formBuilder: FormBuilder) {
- super();
- this.options = getRemoveRedactionOptions(this.data, this.data.applyToAllDossiers, true);
- this.redactedTexts = this.data.redactions.map(annotation => annotation.value);
- this.form = this.#getForm();
- }
-
save(): void {
this.dialogRef.close({ ...this.form.getRawValue(), applyToAllDossiers: this.#applyToAllDossiers });
}
diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/document-info-dialog/document-info-dialog.component.ts b/apps/red-ui/src/app/modules/file-preview/dialogs/document-info-dialog/document-info-dialog.component.ts
index a2c6e5484..8bcb142ac 100644
--- a/apps/red-ui/src/app/modules/file-preview/dialogs/document-info-dialog/document-info-dialog.component.ts
+++ b/apps/red-ui/src/app/modules/file-preview/dialogs/document-info-dialog/document-info-dialog.component.ts
@@ -1,23 +1,27 @@
+import { NgForOf, NgIf } from '@angular/common';
import { Component, Inject, OnInit } from '@angular/core';
-import { UntypedFormGroup } from '@angular/forms';
-import { Dossier, File, IFileAttributeConfig } from '@red/domain';
+import { ReactiveFormsModule, UntypedFormGroup } from '@angular/forms';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
-import { FileAttributesService } from '@services/entity-services/file-attributes.service';
+import { DynamicInputComponent } from '@common-ui/inputs/dynamic-input/dynamic-input.component';
+import { BaseDialogComponent, CircleButtonComponent, IconButtonComponent } from '@iqser/common-ui';
+import { TranslateModule } from '@ngx-translate/core';
+import { Dossier, File, IFileAttributeConfig } from '@red/domain';
import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service';
+import { FileAttributesService } from '@services/entity-services/file-attributes.service';
import { FilesService } from '@services/files/files.service';
-import { BaseDialogComponent } from '@iqser/common-ui';
-import { firstValueFrom } from 'rxjs';
import dayjs from 'dayjs';
+import { firstValueFrom } from 'rxjs';
@Component({
templateUrl: './document-info-dialog.component.html',
+ standalone: true,
+ imports: [ReactiveFormsModule, NgIf, NgForOf, DynamicInputComponent, IconButtonComponent, TranslateModule, CircleButtonComponent],
})
export class DocumentInfoDialogComponent extends BaseDialogComponent implements OnInit {
+ private readonly _dossier: Dossier;
form: UntypedFormGroup;
attributes: IFileAttributeConfig[];
- private readonly _dossier: Dossier;
-
constructor(
activeDossiersService: ActiveDossiersService,
private readonly _fileAttributesService: FileAttributesService,
diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/edit-redaction-dialog/edit-redaction-dialog.component.ts b/apps/red-ui/src/app/modules/file-preview/dialogs/edit-redaction-dialog/edit-redaction-dialog.component.ts
index ef7b870ef..865517d61 100644
--- a/apps/red-ui/src/app/modules/file-preview/dialogs/edit-redaction-dialog/edit-redaction-dialog.component.ts
+++ b/apps/red-ui/src/app/modules/file-preview/dialogs/edit-redaction-dialog/edit-redaction-dialog.component.ts
@@ -1,17 +1,35 @@
+import { NgForOf, NgIf } from '@angular/common';
import { Component, inject, OnInit } from '@angular/core';
-import { FormControl, FormGroup } from '@angular/forms';
-import { DetailsRadioOption, IconButtonTypes, IqserDialogComponent } from '@iqser/common-ui';
+import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';
+import { MatDialogClose } from '@angular/material/dialog';
+import { MatFormField } from '@angular/material/form-field';
+import { MatOption, MatSelect, MatSelectTrigger } from '@angular/material/select';
+import { MatTooltip } from '@angular/material/tooltip';
+import { DetailsRadioOption } from '@common-ui/inputs/details-radio/details-radio-option';
+import {
+ CircleButtonComponent,
+ HasScrollbarDirective,
+ HelpButtonComponent,
+ IconButtonComponent,
+ IconButtonTypes,
+ IqserDenyDirective,
+ IqserDialogComponent,
+} from '@iqser/common-ui';
+import { TranslateModule } from '@ngx-translate/core';
import { Dictionary, SuperTypes } from '@red/domain';
import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service';
import { DictionaryService } from '@services/entity-services/dictionary.service';
import { JustificationsService } from '@services/entity-services/justifications.service';
-import { firstValueFrom } from 'rxjs';
-import { getEditRedactionOptions, RedactOrHintOption } from '../../utils/dialog-options';
-import { EditRedactionData, EditRedactResult } from '../../utils/dialog-types';
-import { LegalBasisOption } from '../manual-redaction-dialog/manual-annotation-dialog.component';
import { Roles } from '@users/roles';
+import { firstValueFrom } from 'rxjs';
+import {
+ SelectedAnnotationsTableComponent,
+ ValueColumn,
+} from '../../components/selected-annotations-table/selected-annotations-table.component';
import { DialogHelpModeKeys } from '../../utils/constants';
-import { ValueColumn } from '../../components/selected-annotations-table/selected-annotations-table.component';
+import { getEditRedactionOptions } from '../../utils/dialog-options';
+import { EditRedactionData, EditRedactResult, RedactOrHintOption } from '../../utils/dialog-types';
+import { LegalBasisOption } from '../manual-redaction-dialog/manual-annotation-dialog.component';
interface TypeSelectOptions {
type: string;
@@ -22,6 +40,25 @@ interface TypeSelectOptions {
@Component({
templateUrl: './edit-redaction-dialog.component.html',
styleUrls: ['./edit-redaction-dialog.component.scss'],
+ standalone: true,
+ imports: [
+ ReactiveFormsModule,
+ TranslateModule,
+ SelectedAnnotationsTableComponent,
+ MatFormField,
+ NgIf,
+ MatSelectTrigger,
+ MatSelect,
+ MatOption,
+ NgForOf,
+ MatTooltip,
+ IconButtonComponent,
+ IqserDenyDirective,
+ CircleButtonComponent,
+ HelpButtonComponent,
+ MatDialogClose,
+ HasScrollbarDirective,
+ ],
})
export class EditRedactionDialogComponent
extends IqserDialogComponent
@@ -29,6 +66,7 @@ export class EditRedactionDialogComponent
{
readonly #dossier = inject(ActiveDossiersService).find(this.data.dossierId);
readonly #applyToAllDossiers = this.data.applyToAllDossiers;
+ protected readonly roles = Roles;
readonly annotations = this.data.annotations;
readonly iconButtonTypes = IconButtonTypes;
readonly isModifyDictionary = this.annotations.every(annotation => annotation.isModifyDictionary);
@@ -53,8 +91,6 @@ export class EditRedactionDialogComponent
{ label: redaction.value, show: true, bold: true },
{ label: redaction.typeLabel, show: true },
]);
- protected readonly roles = Roles;
-
options: DetailsRadioOption[] | undefined;
legalOptions: LegalBasisOption[] = [];
dictionaries: Dictionary[] = [];
diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/force-redaction-dialog/force-annotation-dialog.component.ts b/apps/red-ui/src/app/modules/file-preview/dialogs/force-redaction-dialog/force-annotation-dialog.component.ts
index 308d24727..28630826d 100644
--- a/apps/red-ui/src/app/modules/file-preview/dialogs/force-redaction-dialog/force-annotation-dialog.component.ts
+++ b/apps/red-ui/src/app/modules/file-preview/dialogs/force-redaction-dialog/force-annotation-dialog.component.ts
@@ -1,14 +1,30 @@
import { Component, Inject, OnInit } 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 { BaseDialogComponent, getConfig } from '@iqser/common-ui';
+import {
+ BaseDialogComponent,
+ CircleButtonComponent,
+ getConfig,
+ HasScrollbarDirective,
+ HelpButtonComponent,
+ IconButtonComponent,
+ IqserDenyDirective,
+} from '@iqser/common-ui';
import { JustificationsService } from '@services/entity-services/justifications.service';
import { Dossier, ILegalBasisChangeRequest } from '@red/domain';
import { firstValueFrom } from 'rxjs';
import { AnnotationWrapper } from '@models/file/annotation.wrapper';
import { Roles } from '@users/roles';
-import { ValueColumn } from '../../components/selected-annotations-table/selected-annotations-table.component';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
+import {
+ SelectedAnnotationsTableComponent,
+ ValueColumn,
+} from '../../components/selected-annotations-table/selected-annotations-table.component';
+import { NgForOf, NgIf } from '@angular/common';
+import { MatFormField } from '@angular/material/form-field';
+import { MatOption, MatSelect, MatSelectTrigger } from '@angular/material/select';
+import { MatTooltip } from '@angular/material/tooltip';
+import { TranslateModule } from '@ngx-translate/core';
export interface LegalBasisOption {
label?: string;
@@ -22,6 +38,24 @@ const DOCUMINE_LEGAL_BASIS = 'n-a.';
selector: 'redaction-force-annotation-dialog',
templateUrl: './force-annotation-dialog.component.html',
styleUrls: ['./force-annotation-dialog.component.scss'],
+ standalone: true,
+ imports: [
+ ReactiveFormsModule,
+ NgIf,
+ SelectedAnnotationsTableComponent,
+ MatFormField,
+ MatSelectTrigger,
+ MatSelect,
+ MatOption,
+ MatTooltip,
+ HasScrollbarDirective,
+ TranslateModule,
+ IconButtonComponent,
+ IqserDenyDirective,
+ CircleButtonComponent,
+ NgForOf,
+ HelpButtonComponent,
+ ],
})
export class ForceAnnotationDialogComponent extends BaseDialogComponent implements OnInit {
readonly isDocumine = getConfig().IS_DOCUMINE;
diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/highlight-action-dialog/highlight-action-dialog.component.ts b/apps/red-ui/src/app/modules/file-preview/dialogs/highlight-action-dialog/highlight-action-dialog.component.ts
index ba03c74e4..b6c1324a6 100644
--- a/apps/red-ui/src/app/modules/file-preview/dialogs/highlight-action-dialog/highlight-action-dialog.component.ts
+++ b/apps/red-ui/src/app/modules/file-preview/dialogs/highlight-action-dialog/highlight-action-dialog.component.ts
@@ -1,13 +1,19 @@
+import { NgIf } from '@angular/common';
import { Component, Inject } from '@angular/core';
-import { UntypedFormGroup, Validators } from '@angular/forms';
-import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
-import { EarmarkOperation, EarmarkOperationPages } from '@red/domain';
-import { BaseDialogComponent, DetailsRadioOption } from '@iqser/common-ui';
-import { EarmarksService } from '@services/files/earmarks.service';
-import { firstValueFrom } from 'rxjs';
+import { ReactiveFormsModule, UntypedFormGroup, Validators } from '@angular/forms';
+import { MatCheckbox } from '@angular/material/checkbox';
+import { MAT_DIALOG_DATA, MatDialogClose, MatDialogRef } from '@angular/material/dialog';
+import { DetailsRadioOption } from '@common-ui/inputs/details-radio/details-radio-option';
+import { DetailsRadioComponent } from '@common-ui/inputs/details-radio/details-radio.component';
+import { BaseDialogComponent, CircleButtonComponent, HelpButtonComponent, IconButtonComponent, IqserDenyDirective } from '@iqser/common-ui';
import { AnnotationWrapper } from '@models/file/annotation.wrapper';
+import { TranslateModule } from '@ngx-translate/core';
+import { EarmarkOperation, EarmarkOperationPages } from '@red/domain';
+import { EarmarksService } from '@services/files/earmarks.service';
import { highlightsTranslations } from '@translations/highlights-translations';
import { Roles } from '@users/roles';
+import { ColorPickerModule } from 'ngx-color-picker';
+import { firstValueFrom } from 'rxjs';
export interface HighlightActionData {
readonly operation: EarmarkOperation;
@@ -21,11 +27,25 @@ export interface HighlightActionData {
@Component({
templateUrl: './highlight-action-dialog.component.html',
+ standalone: true,
+ imports: [
+ ReactiveFormsModule,
+ NgIf,
+ ColorPickerModule,
+ DetailsRadioComponent,
+ MatCheckbox,
+ TranslateModule,
+ IconButtonComponent,
+ IqserDenyDirective,
+ CircleButtonComponent,
+ MatDialogClose,
+ HelpButtonComponent,
+ ],
})
export class HighlightActionDialogComponent extends BaseDialogComponent {
+ readonly #operation = this.data.operation;
readonly translations = highlightsTranslations;
readonly roles = Roles;
- readonly #operation = this.data.operation;
readonly options: DetailsRadioOption[] = [
{
label: highlightsTranslations[this.#operation].options[EarmarkOperationPages.THIS_PAGE].label,
diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/import-redactions-dialog/import-redactions-dialog.ts b/apps/red-ui/src/app/modules/file-preview/dialogs/import-redactions-dialog/import-redactions-dialog.ts
index 85d87c465..97f934b37 100644
--- a/apps/red-ui/src/app/modules/file-preview/dialogs/import-redactions-dialog/import-redactions-dialog.ts
+++ b/apps/red-ui/src/app/modules/file-preview/dialogs/import-redactions-dialog/import-redactions-dialog.ts
@@ -1,6 +1,6 @@
import { Component, ElementRef, Inject, ViewChild } from '@angular/core';
-import { BaseDialogComponent } from '@iqser/common-ui';
-import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
+import { BaseDialogComponent, CircleButtonComponent, IconButtonComponent, UploadFileComponent } from '@iqser/common-ui';
+import { MAT_DIALOG_DATA, MatDialogClose, MatDialogRef } from '@angular/material/dialog';
import { firstValueFrom } from 'rxjs';
import { RedactionImportService } from '@services/files/redaction-import.service';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
@@ -8,6 +8,9 @@ import { HttpStatusCode } from '@angular/common/http';
import { extractPageRanges } from '@utils/page-ranges-mapper';
import { File } from '@red/domain';
import { FileDropOverlayService } from '@upload-download/services/file-drop-overlay.service';
+import { MatCheckbox } from '@angular/material/checkbox';
+import { TranslateModule } from '@ngx-translate/core';
+import { FormsModule } from '@angular/forms';
interface ImportData {
dossierId: string;
@@ -17,6 +20,8 @@ interface ImportData {
@Component({
templateUrl: './import-redactions-dialog.html',
styleUrls: ['./import-redactions-dialog.scss'],
+ standalone: true,
+ imports: [UploadFileComponent, MatCheckbox, TranslateModule, FormsModule, IconButtonComponent, CircleButtonComponent, MatDialogClose],
})
export class ImportRedactionsDialogComponent extends BaseDialogComponent {
@ViewChild('attachFileInput', { static: true }) attachFileInput: ElementRef;
@@ -101,7 +106,7 @@ export class ImportRedactionsDialogComponent extends BaseDialogComponent {
};
}
- close () {
+ close() {
this._fileDropOverlayService.toggleImportingRedactions();
return super.close();
}
diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/manual-redaction-dialog/manual-annotation-dialog.component.ts b/apps/red-ui/src/app/modules/file-preview/dialogs/manual-redaction-dialog/manual-annotation-dialog.component.ts
index eca423650..088f2e38f 100644
--- a/apps/red-ui/src/app/modules/file-preview/dialogs/manual-redaction-dialog/manual-annotation-dialog.component.ts
+++ b/apps/red-ui/src/app/modules/file-preview/dialogs/manual-redaction-dialog/manual-annotation-dialog.component.ts
@@ -1,8 +1,15 @@
import { Component, Inject, OnInit } 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, IqserPermissionsService } from '@iqser/common-ui';
+import {
+ BaseDialogComponent,
+ CircleButtonComponent,
+ HasScrollbarDirective,
+ IconButtonComponent,
+ IqserDenyDirective,
+ IqserPermissionsService,
+} from '@iqser/common-ui';
import { ManualRedactionEntryWrapper } from '@models/file/manual-redaction-entry.wrapper';
import { Dictionary, Dossier, File, IAddRedactionRequest, SuperTypes } from '@red/domain';
import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service';
@@ -12,6 +19,12 @@ import { Roles } from '@users/roles';
import { firstValueFrom } from 'rxjs';
import { ManualRedactionService } from '../../services/manual-redaction.service';
import { REDAnnotationManager } from '../../../pdf-viewer/services/annotation-manager.service';
+import { NgForOf, NgIf } from '@angular/common';
+import { TranslateModule } from '@ngx-translate/core';
+import { MatFormField } from '@angular/material/form-field';
+import { MatOption, MatSelect, MatSelectTrigger } from '@angular/material/select';
+import { MatTooltip } from '@angular/material/tooltip';
+import { MatCheckbox } from '@angular/material/checkbox';
export interface LegalBasisOption {
label?: string;
@@ -22,6 +35,23 @@ export interface LegalBasisOption {
@Component({
templateUrl: './manual-annotation-dialog.component.html',
styleUrls: ['./manual-annotation-dialog.component.scss'],
+ standalone: true,
+ imports: [
+ ReactiveFormsModule,
+ NgIf,
+ CircleButtonComponent,
+ TranslateModule,
+ HasScrollbarDirective,
+ MatFormField,
+ MatSelectTrigger,
+ MatSelect,
+ MatOption,
+ NgForOf,
+ MatTooltip,
+ IqserDenyDirective,
+ MatCheckbox,
+ IconButtonComponent,
+ ],
})
export class ManualAnnotationDialogComponent extends BaseDialogComponent implements OnInit {
readonly #dossier: Dossier;
diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/redact-recommendation-dialog/redact-recommendation-dialog.component.ts b/apps/red-ui/src/app/modules/file-preview/dialogs/redact-recommendation-dialog/redact-recommendation-dialog.component.ts
index fddd4302f..dc50676e2 100644
--- a/apps/red-ui/src/app/modules/file-preview/dialogs/redact-recommendation-dialog/redact-recommendation-dialog.component.ts
+++ b/apps/red-ui/src/app/modules/file-preview/dialogs/redact-recommendation-dialog/redact-recommendation-dialog.component.ts
@@ -1,22 +1,51 @@
+import { NgForOf, NgIf } from '@angular/common';
import { Component, inject, OnInit } from '@angular/core';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
-import { FormBuilder } from '@angular/forms';
-import { DetailsRadioOption, IconButtonTypes, IqserDialogComponent } from '@iqser/common-ui';
+import { FormBuilder, ReactiveFormsModule } from '@angular/forms';
+import { MatDialogClose } from '@angular/material/dialog';
+import { MatFormField } from '@angular/material/form-field';
+import { MatOption, MatSelect, MatSelectTrigger } from '@angular/material/select';
+import { MatTooltip } from '@angular/material/tooltip';
+import { DetailsRadioOption } from '@common-ui/inputs/details-radio/details-radio-option';
+import { DetailsRadioComponent } from '@common-ui/inputs/details-radio/details-radio.component';
+import { CircleButtonComponent, HasScrollbarDirective, IconButtonComponent, IconButtonTypes, IqserDialogComponent } from '@iqser/common-ui';
import { AnnotationWrapper } from '@models/file/annotation.wrapper';
+import { TranslateModule } from '@ngx-translate/core';
import { Dictionary, IAddRedactionRequest, SuperTypes } from '@red/domain';
import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service';
import { DictionaryService } from '@services/entity-services/dictionary.service';
import { JustificationsService } from '@services/entity-services/justifications.service';
import { firstValueFrom } from 'rxjs';
import { tap } from 'rxjs/operators';
-import { getRedactOrHintOptions, RedactOrHintOption, RedactOrHintOptions } from '../../utils/dialog-options';
-import { RedactRecommendationData, RedactRecommendationResult } from '../../utils/dialog-types';
+import {
+ SelectedAnnotationsTableComponent,
+ ValueColumn,
+} from '../../components/selected-annotations-table/selected-annotations-table.component';
+import { getRedactOrHintOptions } from '../../utils/dialog-options';
+import { RedactOrHintOption, RedactOrHintOptions, RedactRecommendationData, RedactRecommendationResult } from '../../utils/dialog-types';
import { LegalBasisOption } from '../manual-redaction-dialog/manual-annotation-dialog.component';
-import { ValueColumn } from '../../components/selected-annotations-table/selected-annotations-table.component';
@Component({
templateUrl: './redact-recommendation-dialog.component.html',
styleUrl: './redact-recommendation-dialog.component.scss',
+ standalone: true,
+ imports: [
+ ReactiveFormsModule,
+ SelectedAnnotationsTableComponent,
+ DetailsRadioComponent,
+ MatFormField,
+ NgIf,
+ MatOption,
+ NgForOf,
+ MatTooltip,
+ HasScrollbarDirective,
+ IconButtonComponent,
+ TranslateModule,
+ CircleButtonComponent,
+ MatDialogClose,
+ MatSelectTrigger,
+ MatSelect,
+ ],
})
export class RedactRecommendationDialogComponent
extends IqserDialogComponent
diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/redact-text-dialog/redact-text-dialog.component.ts b/apps/red-ui/src/app/modules/file-preview/dialogs/redact-text-dialog/redact-text-dialog.component.ts
index 445aa7d34..ceea04f86 100644
--- a/apps/red-ui/src/app/modules/file-preview/dialogs/redact-text-dialog/redact-text-dialog.component.ts
+++ b/apps/red-ui/src/app/modules/file-preview/dialogs/redact-text-dialog/redact-text-dialog.component.ts
@@ -1,31 +1,62 @@
+import { AsyncPipe, NgClass, NgForOf, NgIf, NgStyle } from '@angular/common';
import { Component, inject, OnInit } from '@angular/core';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
-import { FormBuilder, FormGroup, Validators } from '@angular/forms';
-import { DetailsRadioOption, IconButtonTypes, IqserDialogComponent } from '@iqser/common-ui';
+import { FormBuilder, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';
+import { MatDialogClose } from '@angular/material/dialog';
+import { MatFormField } from '@angular/material/form-field';
+import { MatOption, MatSelect, MatSelectTrigger } from '@angular/material/select';
+import { MatTooltip } from '@angular/material/tooltip';
+import { DetailsRadioOption } from '@common-ui/inputs/details-radio/details-radio-option';
+import { DetailsRadioComponent } from '@common-ui/inputs/details-radio/details-radio.component';
+import { CircleButtonComponent, HasScrollbarDirective, IconButtonComponent, IconButtonTypes, IqserDialogComponent } from '@iqser/common-ui';
+import { TranslateModule } from '@ngx-translate/core';
import { Dictionary, IAddRedactionRequest, SuperTypes } from '@red/domain';
import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service';
import { DictionaryService } from '@services/entity-services/dictionary.service';
import { JustificationsService } from '@services/entity-services/justifications.service';
import { Roles } from '@users/roles';
+import { UserPreferenceService } from '@users/user-preference.service';
import { calcTextWidthInPixels, stringToBoolean } from '@utils/functions';
import { firstValueFrom, Observable } from 'rxjs';
import { map, tap } from 'rxjs/operators';
-import { getRedactOrHintOptions, RedactOrHintOption, RedactOrHintOptions } from '../../utils/dialog-options';
-import { RedactTextData, RedactTextResult } from '../../utils/dialog-types';
-import { LegalBasisOption } from '../manual-redaction-dialog/manual-annotation-dialog.component';
-import { UserPreferenceService } from '@users/user-preference.service';
import { SystemDefaultOption, SystemDefaults } from '../../../account/utils/dialog-defaults';
+import { getRedactOrHintOptions } from '../../utils/dialog-options';
+import { RedactOrHintOption, RedactOrHintOptions, RedactTextData, RedactTextResult } from '../../utils/dialog-types';
+import { LegalBasisOption } from '../manual-redaction-dialog/manual-annotation-dialog.component';
const MAXIMUM_TEXT_AREA_WIDTH = 421;
@Component({
templateUrl: './redact-text-dialog.component.html',
styleUrls: ['./redact-text-dialog.component.scss'],
+ standalone: true,
+ imports: [
+ ReactiveFormsModule,
+ NgClass,
+ NgIf,
+ NgStyle,
+ HasScrollbarDirective,
+ CircleButtonComponent,
+ DetailsRadioComponent,
+ MatFormField,
+ MatSelectTrigger,
+ MatSelect,
+ MatOption,
+ NgForOf,
+ MatTooltip,
+ TranslateModule,
+ AsyncPipe,
+ IconButtonComponent,
+ MatDialogClose,
+ ],
})
export class RedactTextDialogComponent
extends IqserDialogComponent
implements OnInit
{
+ readonly #dossier = inject(ActiveDossiersService).find(this.data.dossierId);
+ readonly #manualRedactionTypeExists = inject(DictionaryService).hasManualType(this.#dossier.dossierTemplateId);
+ #applyToAllDossiers = this.applyToAll;
readonly roles = Roles;
readonly iconButtonTypes = IconButtonTypes;
readonly initialText = this.data?.manualRedactionEntryWrapper?.manualRedactionEntry?.value;
@@ -38,36 +69,11 @@ export class RedactTextDialogComponent
selectedTextRows = 1;
readonly options: DetailsRadioOption[];
readonly displayedDictionaryLabel$: Observable;
- readonly #dossier = inject(ActiveDossiersService).find(this.data.dossierId);
- readonly #manualRedactionTypeExists = inject(DictionaryService).hasManualType(this.#dossier.dossierTemplateId);
- #applyToAllDossiers = this.applyToAll;
readonly maximumTextAreaWidth = MAXIMUM_TEXT_AREA_WIDTH;
readonly maximumSelectedTextWidth = 567;
textWidth: number;
- get isSystemDefault(): boolean {
- return this._userPreferences.getAddRedactionDefaultOption() === SystemDefaultOption.SYSTEM_DEFAULT;
- }
-
- get defaultOption() {
- const defaultOption = this.isSystemDefault
- ? this.#getOption(SystemDefaults.ADD_REDACTION_DEFAULT)
- : this.#getOption(this._userPreferences.getAddRedactionDefaultOption() as RedactOrHintOption);
- this.dictionaryRequest = defaultOption.value === RedactOrHintOptions.IN_DOSSIER;
- if (this.dictionaryRequest) {
- this.#setDictionaries();
- return defaultOption;
- }
- return defaultOption ?? this.options[0];
- }
-
- get applyToAll() {
- return this.isSystemDefault || this._userPreferences.getAddRedactionDefaultExtraOption() === 'undefined'
- ? this.data.applyToAllDossiers ?? true
- : stringToBoolean(this._userPreferences.getAddRedactionDefaultExtraOption());
- }
-
constructor(
private readonly _justificationsService: JustificationsService,
private readonly _dictionaryService: DictionaryService,
@@ -103,6 +109,28 @@ export class RedactTextDialogComponent
);
}
+ get isSystemDefault(): boolean {
+ return this._userPreferences.getAddRedactionDefaultOption() === SystemDefaultOption.SYSTEM_DEFAULT;
+ }
+
+ get defaultOption() {
+ const defaultOption = this.isSystemDefault
+ ? this.#getOption(SystemDefaults.ADD_REDACTION_DEFAULT)
+ : this.#getOption(this._userPreferences.getAddRedactionDefaultOption() as RedactOrHintOption);
+ this.dictionaryRequest = defaultOption.value === RedactOrHintOptions.IN_DOSSIER;
+ if (this.dictionaryRequest) {
+ this.#setDictionaries();
+ return defaultOption;
+ }
+ return defaultOption ?? this.options[0];
+ }
+
+ get applyToAll() {
+ return this.isSystemDefault || this._userPreferences.getAddRedactionDefaultExtraOption() === 'undefined'
+ ? this.data.applyToAllDossiers ?? true
+ : stringToBoolean(this._userPreferences.getAddRedactionDefaultExtraOption());
+ }
+
async ngOnInit(): Promise {
const data = await firstValueFrom(this._justificationsService.getForDossierTemplate(this.#dossier.dossierTemplateId));
this.legalOptions = data.map(lbm => ({
diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/remove-redaction-dialog/remove-redaction-dialog.component.ts b/apps/red-ui/src/app/modules/file-preview/dialogs/remove-redaction-dialog/remove-redaction-dialog.component.ts
index 04d209710..431d41fbc 100644
--- a/apps/red-ui/src/app/modules/file-preview/dialogs/remove-redaction-dialog/remove-redaction-dialog.component.ts
+++ b/apps/red-ui/src/app/modules/file-preview/dialogs/remove-redaction-dialog/remove-redaction-dialog.component.ts
@@ -1,32 +1,61 @@
+import { NgStyle } from '@angular/common';
import { Component, computed } from '@angular/core';
-import { FormBuilder, UntypedFormGroup } from '@angular/forms';
-import { DetailsRadioOption, IconButtonTypes, IqserDialogComponent } from '@iqser/common-ui';
-import { getRemoveRedactionOptions, RemoveRedactionOption, RemoveRedactionOptions } from '../../utils/dialog-options';
-import { RemoveRedactionData, RemoveRedactionResult } from '../../utils/dialog-types';
-import { Roles } from '@users/roles';
-import { DialogHelpModeKeys } from '../../utils/constants';
import { toSignal } from '@angular/core/rxjs-interop';
-import { map } from 'rxjs/operators';
-import { ValueColumn } from '../../components/selected-annotations-table/selected-annotations-table.component';
+import { FormBuilder, ReactiveFormsModule, UntypedFormGroup } from '@angular/forms';
+import { MatDialogClose } from '@angular/material/dialog';
+import { DetailsRadioOption } from '@common-ui/inputs/details-radio/details-radio-option';
+import { DetailsRadioComponent } from '@common-ui/inputs/details-radio/details-radio.component';
+import {
+ CircleButtonComponent,
+ HasScrollbarDirective,
+ HelpButtonComponent,
+ IconButtonComponent,
+ IconButtonTypes,
+ IqserDenyDirective,
+ IqserDialogComponent,
+} from '@iqser/common-ui';
+import { TranslateModule } from '@ngx-translate/core';
+import { Roles } from '@users/roles';
import { UserPreferenceService } from '@users/user-preference.service';
-import { SystemDefaultOption, SystemDefaults } from '../../../account/utils/dialog-defaults';
import { stringToBoolean } from '@utils/functions';
+import { map } from 'rxjs/operators';
+import { SystemDefaultOption, SystemDefaults } from '../../../account/utils/dialog-defaults';
+import {
+ SelectedAnnotationsTableComponent,
+ ValueColumn,
+} from '../../components/selected-annotations-table/selected-annotations-table.component';
+import { DialogHelpModeKeys } from '../../utils/constants';
+import { getRemoveRedactionOptions } from '../../utils/dialog-options';
+import { RemoveRedactionData, RemoveRedactionOption, RemoveRedactionOptions, RemoveRedactionResult } from '../../utils/dialog-types';
@Component({
templateUrl: './remove-redaction-dialog.component.html',
styleUrls: ['./remove-redaction-dialog.component.scss'],
+ standalone: true,
+ imports: [
+ ReactiveFormsModule,
+ TranslateModule,
+ NgStyle,
+ SelectedAnnotationsTableComponent,
+ DetailsRadioComponent,
+ IconButtonComponent,
+ CircleButtonComponent,
+ HasScrollbarDirective,
+ MatDialogClose,
+ IqserDenyDirective,
+ HelpButtonComponent,
+ ],
})
export class RemoveRedactionDialogComponent extends IqserDialogComponent<
RemoveRedactionDialogComponent,
RemoveRedactionData,
RemoveRedactionResult
> {
+ protected readonly roles = Roles;
readonly iconButtonTypes = IconButtonTypes;
-
readonly recommendation = this.data.redactions.every(redaction => redaction.isRecommendation);
readonly hint = this.data.redactions.every(redaction => redaction.isHint);
readonly annotationsType = this.hint ? 'hint' : this.recommendation ? 'recommendation' : 'redaction';
-
readonly optionByType = {
recommendation: {
main: this._userPreferences.getRemoveRecommendationDefaultOption(),
@@ -41,7 +70,6 @@ export class RemoveRedactionDialogComponent extends IqserDialogComponent<
extra: this._userPreferences.getRemoveRedactionDefaultExtraOption(),
},
};
-
readonly systemDefaultByType = {
recommendation: {
main: SystemDefaults.REMOVE_RECOMMENDATION_DEFAULT,
@@ -56,24 +84,19 @@ export class RemoveRedactionDialogComponent extends IqserDialogComponent<
extra: false,
},
};
-
+ readonly #applyToAllDossiers = this.systemDefaultByType[this.annotationsType].extra;
readonly isSystemDefault = this.optionByType[this.annotationsType].main === SystemDefaultOption.SYSTEM_DEFAULT;
readonly isExtraOptionSystemDefault = this.optionByType[this.annotationsType].extra === 'undefined';
readonly defaultOptionPreference = this.isSystemDefault
? this.systemDefaultByType[this.annotationsType].main
: this.optionByType[this.annotationsType].main;
readonly extraOptionPreference = stringToBoolean(this.optionByType[this.annotationsType].extra);
-
- readonly #applyToAllDossiers = this.systemDefaultByType[this.annotationsType].extra;
-
readonly options: DetailsRadioOption[] = getRemoveRedactionOptions(
this.data,
this.isSystemDefault || this.isExtraOptionSystemDefault ? this.#applyToAllDossiers : this.extraOptionPreference,
);
readonly skipped = this.data.redactions.some(annotation => annotation.isSkipped);
readonly redactedTexts = this.data.redactions.map(annotation => annotation.value);
-
- protected readonly roles = Roles;
form: UntypedFormGroup = this._formBuilder.group({
comment: [null],
option: [this.defaultOption],
diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/resize-redaction-dialog/resize-redaction-dialog.component.ts b/apps/red-ui/src/app/modules/file-preview/dialogs/resize-redaction-dialog/resize-redaction-dialog.component.ts
index e1e6b3f34..a2f2de68a 100644
--- a/apps/red-ui/src/app/modules/file-preview/dialogs/resize-redaction-dialog/resize-redaction-dialog.component.ts
+++ b/apps/red-ui/src/app/modules/file-preview/dialogs/resize-redaction-dialog/resize-redaction-dialog.component.ts
@@ -1,14 +1,36 @@
+import { NgIf } from '@angular/common';
import { Component, inject } from '@angular/core';
-import { FormBuilder, FormControl, FormGroup } from '@angular/forms';
-import { DetailsRadioOption, IconButtonTypes, IqserDialogComponent } from '@iqser/common-ui';
+import { FormBuilder, FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';
+import { MatDialogClose } from '@angular/material/dialog';
+import { MatFormField } from '@angular/material/form-field';
+import { MatOption, MatSelect, MatSelectTrigger } from '@angular/material/select';
+import { DetailsRadioOption } from '@common-ui/inputs/details-radio/details-radio-option';
+import { DetailsRadioComponent } from '@common-ui/inputs/details-radio/details-radio.component';
+import { CircleButtonComponent, HasScrollbarDirective, IconButtonComponent, IconButtonTypes, IqserDialogComponent } from '@iqser/common-ui';
+import { TranslateModule } from '@ngx-translate/core';
import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service';
import { DictionariesMapService } from '@services/entity-services/dictionaries-map.service';
-import { getResizeRedactionOptions, ResizeOptions, ResizeRedactionOption } from '../../utils/dialog-options';
-import { ResizeRedactionData, ResizeRedactionResult } from '../../utils/dialog-types';
+import { getResizeRedactionOptions } from '../../utils/dialog-options';
+import { ResizeOptions, ResizeRedactionData, ResizeRedactionOption, ResizeRedactionResult } from '../../utils/dialog-types';
@Component({
templateUrl: './resize-redaction-dialog.component.html',
styleUrls: ['./resize-redaction-dialog.component.scss'],
+ standalone: true,
+ imports: [
+ ReactiveFormsModule,
+ TranslateModule,
+ DetailsRadioComponent,
+ MatFormField,
+ MatSelectTrigger,
+ MatSelect,
+ MatOption,
+ IconButtonComponent,
+ CircleButtonComponent,
+ HasScrollbarDirective,
+ MatDialogClose,
+ NgIf,
+ ],
})
export class ResizeRedactionDialogComponent extends IqserDialogComponent<
ResizeRedactionDialogComponent,
diff --git a/apps/red-ui/src/app/modules/file-preview/file-preview-screen.component.ts b/apps/red-ui/src/app/modules/file-preview/file-preview-screen.component.ts
index 8cfc9074c..b80779f13 100644
--- a/apps/red-ui/src/app/modules/file-preview/file-preview-screen.component.ts
+++ b/apps/red-ui/src/app/modules/file-preview/file-preview-screen.component.ts
@@ -1,15 +1,18 @@
+import { ActivatedRouteSnapshot, NavigationExtras, Router, RouterLink } from '@angular/router';
import { ChangeDetectorRef, Component, effect, NgZone, OnDestroy, OnInit, TemplateRef, ViewChild } from '@angular/core';
-import { ActivatedRouteSnapshot, NavigationExtras, Router } from '@angular/router';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { ComponentCanDeactivate } from '@guards/can-deactivate.guard';
import {
+ CircleButtonComponent,
CircleButtonTypes,
ConfirmOption,
ConfirmOptions,
CustomError,
+ DisableStopPropagationDirective,
ErrorService,
getConfig,
IConfirmationDialogData,
+ IqserAllowDirective,
IqserDialog,
LoadingService,
Toaster,
@@ -22,7 +25,6 @@ import { Dictionary, File, ViewModes } from '@red/domain';
import { ConfigService } from '@services/config.service';
import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service';
import { DossiersService } from '@services/dossiers/dossiers.service';
-import { FileManagementService } from '@services/files/file-management.service';
import { FilesMapService } from '@services/files/files-map.service';
import { FilesService } from '@services/files/files.service';
import { PermissionsService } from '@services/permissions.service';
@@ -32,7 +34,7 @@ import { PreferencesKeys, UserPreferenceService } from '@users/user-preference.s
import { NGXLogger } from 'ngx-logger';
import { combineLatest, first, firstValueFrom, Observable, of, pairwise } from 'rxjs';
import { catchError, filter, map, startWith, switchMap, tap } from 'rxjs/operators';
-import { byId, byPage, download, handleFilterDelta, hasChanges } from '../../utils';
+import { byId, byPage, handleFilterDelta, hasChanges } from '../../utils';
import { AnnotationDrawService } from '../pdf-viewer/services/annotation-draw.service';
import { REDAnnotationManager } from '../pdf-viewer/services/annotation-manager.service';
import { REDDocumentViewer } from '../pdf-viewer/services/document-viewer.service';
@@ -57,11 +59,40 @@ import { StampService } from './services/stamp.service';
import { ViewModeService } from './services/view-mode.service';
import { RedactTextData } from './utils/dialog-types';
import { MultiSelectService } from './services/multi-select.service';
+import { NgIf } from '@angular/common';
+import { ViewSwitchComponent } from './components/view-switch/view-switch.component';
+import { ProcessingIndicatorComponent } from '@shared/components/processing-indicator/processing-indicator.component';
+import { UserManagementComponent } from './components/user-management/user-management.component';
+import { TranslateModule } from '@ngx-translate/core';
+import { InitialsAvatarComponent } from '@common-ui/users';
+import { FileActionsComponent } from '../shared-dossiers/components/file-actions/file-actions.component';
+import { FilePreviewRightContainerComponent } from './components/right-container/file-preview-right-container.component';
+import { TypeFilterComponent } from '@shared/components/type-filter/type-filter.component';
+import { FileHeaderComponent } from './components/file-header/file-header.component';
+import { StructuredComponentManagementComponent } from './components/structured-component-management/structured-component-management.component';
@Component({
templateUrl: './file-preview-screen.component.html',
styleUrls: ['./file-preview-screen.component.scss'],
providers: filePreviewScreenProviders,
+ standalone: true,
+ imports: [
+ NgIf,
+ ViewSwitchComponent,
+ ProcessingIndicatorComponent,
+ UserManagementComponent,
+ TranslateModule,
+ InitialsAvatarComponent,
+ CircleButtonComponent,
+ IqserAllowDirective,
+ FileActionsComponent,
+ DisableStopPropagationDirective,
+ RouterLink,
+ FilePreviewRightContainerComponent,
+ TypeFilterComponent,
+ FileHeaderComponent,
+ StructuredComponentManagementComponent,
+ ],
})
export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnInit, OnDestroy, OnAttach, OnDetach, ComponentCanDeactivate {
readonly circleButtonTypes = CircleButtonTypes;
@@ -109,7 +140,6 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni
private readonly _toaster: Toaster,
private readonly _manualRedactionService: ManualRedactionService,
private readonly _filesService: FilesService,
- private readonly _fileManagementService: FileManagementService,
private readonly _readableRedactionsService: ReadableRedactionsService,
private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _multiSelectService: MultiSelectService,
diff --git a/apps/red-ui/src/app/modules/file-preview/file-preview.module.ts b/apps/red-ui/src/app/modules/file-preview/file-preview.module.ts
deleted file mode 100644
index f21e31e81..000000000
--- a/apps/red-ui/src/app/modules/file-preview/file-preview.module.ts
+++ /dev/null
@@ -1,170 +0,0 @@
-import { OverlayModule } from '@angular/cdk/overlay';
-import { CommonModule } from '@angular/common';
-import { NgModule } from '@angular/core';
-import { RouterModule } from '@angular/router';
-import { ReplaceNbspPipe } from '@common-ui/pipes/replace-nbsp.pipe';
-import { PendingChangesGuard } from '@guards/can-deactivate.guard';
-import {
- CapitalizePipe,
- CircleButtonComponent,
- DetailsRadioComponent,
- DisableStopPropagationDirective,
- DynamicInputComponent,
- EditableInputComponent,
- EmptyStateComponent,
- HasScrollbarDirective,
- IconButtonComponent,
- InputWithActionComponent,
- IqserAllowDirective,
- IqserDenyDirective,
- IqserHelpModeModule,
- IqserRoutes,
- IqserUploadFileModule,
- LogPipe,
- PreventDefaultDirective,
- RoundCheckboxComponent,
- StopPropagationDirective,
-} from '@iqser/common-ui';
-import { IqserFiltersModule } from '@iqser/common-ui/lib/filtering';
-import { StatusBarComponent } from '@iqser/common-ui/lib/shared';
-import { IqserUsersModule } from '@iqser/common-ui/lib/users';
-import { TranslateModule } from '@ngx-translate/core';
-import { SharedModule } from '@shared/shared.module';
-import { SharedDossiersModule } from '../shared-dossiers/shared-dossiers.module';
-import { AnnotationActionsComponent } from './components/annotation-actions/annotation-actions.component';
-import { AnnotationCardComponent } from './components/annotation-card/annotation-card.component';
-import { AnnotationDetailsComponent } from './components/annotation-details/annotation-details.component';
-import { AnnotationReferenceComponent } from './components/annotation-reference/annotation-reference.component';
-import { AnnotationReferencesListComponent } from './components/annotation-references-list/annotation-references-list.component';
-import { AnnotationReferencesPageIndicatorComponent } from './components/annotation-references-page-indicator/annotation-references-page-indicator.component';
-import { AnnotationWrapperComponent } from './components/annotation-wrapper/annotation-wrapper.component';
-import { AnnotationsListComponent } from './components/annotations-list/annotations-list.component';
-import { CommentsComponent } from './components/comments/comments.component';
-import { DocumentInfoComponent } from './components/document-info/document-info.component';
-import { FileWorkloadComponent } from './components/file-workload/file-workload.component';
-import { HighlightsSeparatorComponent } from './components/highlights-separator/highlights-separator.component';
-import { PageExclusionComponent } from './components/page-exclusion/page-exclusion.component';
-import { PageIndicatorComponent } from './components/page-indicator/page-indicator.component';
-import { PagesComponent } from './components/pages/pages.component';
-import { ReadonlyBannerComponent } from './components/readonly-banner/readonly-banner.component';
-import { FilePreviewRightContainerComponent } from './components/right-container/file-preview-right-container.component';
-import { UserManagementComponent } from './components/user-management/user-management.component';
-import { ViewSwitchComponent } from './components/view-switch/view-switch.component';
-import { AddHintDialogComponent } from './dialogs/add-hint-dialog/add-hint-dialog.component';
-import { ChangeLegalBasisDialogComponent } from './dialogs/change-legal-basis-dialog/change-legal-basis-dialog.component';
-import { AddAnnotationDialogComponent } from './dialogs/docu-mine/add-annotation-dialog/add-annotation-dialog.component';
-import { EditAnnotationDialogComponent } from './dialogs/docu-mine/edit-annotation-dialog/edit-annotation-dialog.component';
-import { RemoveAnnotationDialogComponent } from './dialogs/docu-mine/remove-annotation-dialog/remove-annotation-dialog.component';
-import { DocumentInfoDialogComponent } from './dialogs/document-info-dialog/document-info-dialog.component';
-import { EditRedactionDialogComponent } from './dialogs/edit-redaction-dialog/edit-redaction-dialog.component';
-import { ForceAnnotationDialogComponent } from './dialogs/force-redaction-dialog/force-annotation-dialog.component';
-import { HighlightActionDialogComponent } from './dialogs/highlight-action-dialog/highlight-action-dialog.component';
-import { ImportRedactionsDialogComponent } from './dialogs/import-redactions-dialog/import-redactions-dialog';
-import { ManualAnnotationDialogComponent } from './dialogs/manual-redaction-dialog/manual-annotation-dialog.component';
-import { RedactRecommendationDialogComponent } from './dialogs/redact-recommendation-dialog/redact-recommendation-dialog.component';
-import { RedactTextDialogComponent } from './dialogs/redact-text-dialog/redact-text-dialog.component';
-import { RemoveRedactionDialogComponent } from './dialogs/remove-redaction-dialog/remove-redaction-dialog.component';
-import { ResizeRedactionDialogComponent } from './dialogs/resize-redaction-dialog/resize-redaction-dialog.component';
-import { FilePreviewScreenComponent } from './file-preview-screen.component';
-import { DocumentUnloadedGuard } from './services/document-unloaded.guard';
-import { FilePreviewDialogService } from './services/file-preview-dialog.service';
-import { ManualRedactionService } from './services/manual-redaction.service';
-import { TablesService } from './services/tables.service';
-import { SelectedAnnotationsTableComponent } from './components/selected-annotations-table/selected-annotations-table.component';
-import { SelectedAnnotationsListComponent } from './components/selected-annotations-list/selected-annotations-list.component';
-import { FileHeaderComponent } from './components/file-header/file-header.component';
-import { DocumineExportComponent } from './components/documine-export/documine-export.component';
-import { StructuredComponentManagementComponent } from './components/structured-component-management/structured-component-management.component';
-import { EditableStructuredComponentValueComponent } from './components/editable-structured-component-value/editable-structured-component-value.component';
-
-const routes: IqserRoutes = [
- {
- path: '',
- component: FilePreviewScreenComponent,
- pathMatch: 'full',
- canDeactivate: [PendingChangesGuard, DocumentUnloadedGuard],
- },
-];
-
-const dialogs = [
- ManualAnnotationDialogComponent,
- ForceAnnotationDialogComponent,
- ResizeRedactionDialogComponent,
- ChangeLegalBasisDialogComponent,
- HighlightActionDialogComponent,
- DocumentInfoDialogComponent,
- ImportRedactionsDialogComponent,
- RedactTextDialogComponent,
- EditRedactionDialogComponent,
- EditAnnotationDialogComponent,
- AddHintDialogComponent,
- RemoveRedactionDialogComponent,
- AddAnnotationDialogComponent,
- RemoveAnnotationDialogComponent,
- RedactRecommendationDialogComponent,
-];
-
-const components = [
- FileWorkloadComponent,
- AnnotationDetailsComponent,
- AnnotationWrapperComponent,
- AnnotationsListComponent,
- PageIndicatorComponent,
- PagesComponent,
- PageExclusionComponent,
- AnnotationActionsComponent,
- CommentsComponent,
- DocumentInfoComponent,
- ViewSwitchComponent,
- UserManagementComponent,
- AnnotationReferencesListComponent,
- AnnotationCardComponent,
- AnnotationReferencesPageIndicatorComponent,
- HighlightsSeparatorComponent,
- AnnotationReferenceComponent,
- FilePreviewScreenComponent,
- FilePreviewRightContainerComponent,
- ReadonlyBannerComponent,
- FileHeaderComponent,
- DocumineExportComponent,
- StructuredComponentManagementComponent,
-];
-
-@NgModule({
- declarations: [...components, ...dialogs],
- imports: [
- RouterModule.forChild(routes),
- CommonModule,
- TranslateModule,
- OverlayModule,
- IqserHelpModeModule,
- IqserUsersModule,
- CapitalizePipe,
- IqserUploadFileModule,
- IqserFiltersModule,
- SharedModule,
- CircleButtonComponent,
- SharedDossiersModule,
- IconButtonComponent,
- EmptyStateComponent,
- StatusBarComponent,
- StopPropagationDirective,
- PreventDefaultDirective,
- HasScrollbarDirective,
- EditableInputComponent,
- DetailsRadioComponent,
- DynamicInputComponent,
- InputWithActionComponent,
- RoundCheckboxComponent,
- IqserAllowDirective,
- IqserDenyDirective,
- LogPipe,
- ReplaceNbspPipe,
- DisableStopPropagationDirective,
- SelectedAnnotationsTableComponent,
- SelectedAnnotationsListComponent,
- EditableStructuredComponentValueComponent,
- ],
- providers: [FilePreviewDialogService, ManualRedactionService, DocumentUnloadedGuard, TablesService],
-})
-export class FilePreviewModule {}
diff --git a/apps/red-ui/src/app/modules/file-preview/file-preview.routes.ts b/apps/red-ui/src/app/modules/file-preview/file-preview.routes.ts
new file mode 100644
index 000000000..ca59f7a45
--- /dev/null
+++ b/apps/red-ui/src/app/modules/file-preview/file-preview.routes.ts
@@ -0,0 +1,18 @@
+import { IqserRoutes } from '@iqser/common-ui';
+import { FilePreviewScreenComponent } from './file-preview-screen.component';
+import { PendingChangesGuard } from '@guards/can-deactivate.guard';
+import { DocumentUnloadedGuard } from './services/document-unloaded.guard';
+import { FilePreviewDialogService } from './services/file-preview-dialog.service';
+import { ManualRedactionService } from './services/manual-redaction.service';
+import { TablesService } from './services/tables.service';
+import { FileAssignService } from '../shared-dossiers/services/file-assign.service';
+
+export default [
+ {
+ path: '',
+ component: FilePreviewScreenComponent,
+ pathMatch: 'full',
+ canDeactivate: [PendingChangesGuard, DocumentUnloadedGuard],
+ providers: [FilePreviewDialogService, ManualRedactionService, DocumentUnloadedGuard, TablesService, FileAssignService],
+ },
+] satisfies IqserRoutes;
diff --git a/apps/red-ui/src/app/modules/file-preview/services/annotation-actions.service.ts b/apps/red-ui/src/app/modules/file-preview/services/annotation-actions.service.ts
index 566b20797..7673762e6 100644
--- a/apps/red-ui/src/app/modules/file-preview/services/annotation-actions.service.ts
+++ b/apps/red-ui/src/app/modules/file-preview/services/annotation-actions.service.ts
@@ -29,11 +29,11 @@ import { EditRedactionDialogComponent } from '../dialogs/edit-redaction-dialog/e
import { RedactRecommendationDialogComponent } from '../dialogs/redact-recommendation-dialog/redact-recommendation-dialog.component';
import { RemoveRedactionDialogComponent } from '../dialogs/remove-redaction-dialog/remove-redaction-dialog.component';
import { ResizeRedactionDialogComponent } from '../dialogs/resize-redaction-dialog/resize-redaction-dialog.component';
-import { RemoveRedactionOptions } from '../utils/dialog-options';
import {
EditRedactionData,
EditRedactResult,
RemoveRedactionData,
+ RemoveRedactionOptions,
RemoveRedactionPermissions,
RemoveRedactionResult,
ResizeRedactionData,
diff --git a/apps/red-ui/src/app/modules/file-preview/services/skipped.service.ts b/apps/red-ui/src/app/modules/file-preview/services/skipped.service.ts
index 7f76753b6..2711ce122 100644
--- a/apps/red-ui/src/app/modules/file-preview/services/skipped.service.ts
+++ b/apps/red-ui/src/app/modules/file-preview/services/skipped.service.ts
@@ -1,10 +1,9 @@
import { effect, Injectable, Signal, signal } from '@angular/core';
import { bool } from '@iqser/common-ui/lib/utils';
-import { REDAnnotationManager } from '../../pdf-viewer/services/annotation-manager.service';
-import { FilePreviewStateService } from './file-preview-state.service';
import { getLocalStorageDataByFileId, setLocalStorageDataByFileId } from '@utils/local-storage';
-
-export const HIDE_SKIPPED = 'hide-skipped';
+import { REDAnnotationManager } from '../../pdf-viewer/services/annotation-manager.service';
+import { HIDE_SKIPPED } from '../utils/constants';
+import { FilePreviewStateService } from './file-preview-state.service';
@Injectable()
export class SkippedService {
diff --git a/apps/red-ui/src/app/modules/file-preview/utils/constants.ts b/apps/red-ui/src/app/modules/file-preview/utils/constants.ts
index ad73a214b..57787e87b 100644
--- a/apps/red-ui/src/app/modules/file-preview/utils/constants.ts
+++ b/apps/red-ui/src/app/modules/file-preview/utils/constants.ts
@@ -53,3 +53,5 @@ export const TextPopups = {
ADD_RECTANGLE: 'add-rectangle',
ADD_FALSE_POSITIVE: 'add-false-positive',
} as const;
+
+export const HIDE_SKIPPED = 'hide-skipped';
diff --git a/apps/red-ui/src/app/modules/file-preview/utils/dialog-options.ts b/apps/red-ui/src/app/modules/file-preview/utils/dialog-options.ts
index a3f00e808..7aff7bccd 100644
--- a/apps/red-ui/src/app/modules/file-preview/utils/dialog-options.ts
+++ b/apps/red-ui/src/app/modules/file-preview/utils/dialog-options.ts
@@ -1,4 +1,4 @@
-import { DetailsRadioOption } from '@iqser/common-ui';
+import { DetailsRadioOption } from '@common-ui/inputs/details-radio/details-radio-option';
import { AnnotationWrapper } from '@models/file/annotation.wrapper';
import { Dossier } from '@red/domain';
import { addHintTranslations } from '@translations/add-hint-translations';
@@ -6,33 +6,20 @@ import { editRedactionTranslations, redactTextTranslations } from '@translations
import { removeAnnotationTranslations } from '@translations/remove-annotation-translations';
import { removeRedactionTranslations } from '@translations/remove-redaction-translations';
import { resizeRedactionTranslations } from '@translations/resize-redaction-translations';
-import { RemoveRedactionData } from './dialog-types';
+import {
+ RedactOrHintOption,
+ RedactOrHintOptions,
+ RemoveRedactionData,
+ RemoveRedactionOption,
+ RemoveRedactionOptions,
+ ResizeOptions,
+ ResizeRedactionOption,
+} from './dialog-types';
const PIN_ICON = 'red:push-pin';
const FOLDER_ICON = 'red:folder';
const REMOVE_FROM_DICT_ICON = 'red:remove-from-dict';
-export const RedactOrHintOptions = {
- ONLY_HERE: 'ONLY_HERE',
- IN_DOSSIER: 'IN_DOSSIER',
-} as const;
-
-export type RedactOrHintOption = keyof typeof RedactOrHintOptions;
-
-export const ResizeOptions = RedactOrHintOptions;
-export type ResizeRedactionOption = RedactOrHintOption;
-
-export const RemoveRedactionOptions = {
- ONLY_HERE: 'ONLY_HERE',
- IN_DOSSIER: 'IN_DOSSIER',
- FALSE_POSITIVE: 'FALSE_POSITIVE',
- DO_NOT_RECOMMEND: 'DO_NOT_RECOMMEND',
-} as const;
-export const RemoveAnnotationOptions = RemoveRedactionOptions;
-
-export type RemoveRedactionOption = keyof typeof RemoveRedactionOptions;
-export type RemoveAnnotationOption = RemoveRedactionOption;
-
export const getEditRedactionOptions = (
dossierName: string,
applyToAllDossiers: boolean,
diff --git a/apps/red-ui/src/app/modules/file-preview/utils/dialog-types.ts b/apps/red-ui/src/app/modules/file-preview/utils/dialog-types.ts
index ff6228d21..8fcac6603 100644
--- a/apps/red-ui/src/app/modules/file-preview/utils/dialog-types.ts
+++ b/apps/red-ui/src/app/modules/file-preview/utils/dialog-types.ts
@@ -1,8 +1,28 @@
-import { DetailsRadioOption } from '@iqser/common-ui';
+import { DetailsRadioOption } from '@common-ui/inputs/details-radio/details-radio-option';
import { AnnotationWrapper } from '@models/file/annotation.wrapper';
import { ManualRedactionEntryWrapper } from '@models/file/manual-redaction-entry.wrapper';
import { Dictionary, Dossier, File, IAddRedactionRequest, IManualRedactionEntry } from '@red/domain';
-import { RemoveRedactionOption } from './dialog-options';
+
+export const RedactOrHintOptions = {
+ ONLY_HERE: 'ONLY_HERE',
+ IN_DOSSIER: 'IN_DOSSIER',
+} as const;
+
+export type RedactOrHintOption = keyof typeof RedactOrHintOptions;
+
+export const ResizeOptions = RedactOrHintOptions;
+export type ResizeRedactionOption = RedactOrHintOption;
+
+export const RemoveRedactionOptions = {
+ ONLY_HERE: 'ONLY_HERE',
+ IN_DOSSIER: 'IN_DOSSIER',
+ FALSE_POSITIVE: 'FALSE_POSITIVE',
+ DO_NOT_RECOMMEND: 'DO_NOT_RECOMMEND',
+} as const;
+export const RemoveAnnotationOptions = RemoveRedactionOptions;
+
+export type RemoveRedactionOption = keyof typeof RemoveRedactionOptions;
+export type RemoveAnnotationOption = RemoveRedactionOption;
export interface RedactTextData {
manualRedactionEntryWrapper: ManualRedactionEntryWrapper;
diff --git a/apps/red-ui/src/app/modules/icons/icons.module.ts b/apps/red-ui/src/app/modules/icons/icons.module.ts
index 1576fccb4..734413438 100644
--- a/apps/red-ui/src/app/modules/icons/icons.module.ts
+++ b/apps/red-ui/src/app/modules/icons/icons.module.ts
@@ -49,9 +49,7 @@ export class IconsModule {
'exclude-pages',
'excluded-page',
'extract',
- 'exit-fullscreen',
'folder',
- 'fullscreen',
'html-file',
'info',
'import_redactions',
diff --git a/apps/red-ui/src/app/modules/pdf-viewer/services/annotation-manager.service.ts b/apps/red-ui/src/app/modules/pdf-viewer/services/annotation-manager.service.ts
index 897fccf87..2d9efa7cd 100644
--- a/apps/red-ui/src/app/modules/pdf-viewer/services/annotation-manager.service.ts
+++ b/apps/red-ui/src/app/modules/pdf-viewer/services/annotation-manager.service.ts
@@ -3,15 +3,15 @@ import { bool, List } from '@iqser/common-ui/lib/utils';
import { AnnotationWrapper } from '@models/file/annotation.wrapper';
import { Core } from '@pdftron/webviewer';
import { getLast, urlFileId } from '@utils/functions';
+import { getLocalStorageDataByFileId } from '@utils/local-storage';
import { NGXLogger } from 'ngx-logger';
import { Subject } from 'rxjs';
+import { HIDE_SKIPPED } from '../../file-preview/utils/constants';
import { AnnotationToolNames } from '../utils/constants';
import { asList, getId, isStringOrWrapper } from '../utils/functions';
import { AnnotationPredicate, DeleteAnnotationsOptions } from '../utils/types';
import AnnotationManager = Core.AnnotationManager;
import Annotation = Core.Annotations.Annotation;
-import { getLocalStorageDataByFileId } from '@utils/local-storage';
-import { HIDE_SKIPPED } from '../../file-preview/services/skipped.service';
const MODIFY_ACTION = 'modify';
const RESIZE_OPTION = 'resize';
diff --git a/apps/red-ui/src/app/modules/pdf-viewer/services/pdf-viewer.service.ts b/apps/red-ui/src/app/modules/pdf-viewer/services/pdf-viewer.service.ts
index 8942e3438..a897f2d20 100644
--- a/apps/red-ui/src/app/modules/pdf-viewer/services/pdf-viewer.service.ts
+++ b/apps/red-ui/src/app/modules/pdf-viewer/services/pdf-viewer.service.ts
@@ -25,6 +25,25 @@ import TextTool = Core.Tools.TextTool;
@Injectable()
export class PdfViewer {
+ #instance: WebViewerInstance;
+ readonly #convertPath = inject(UI_ROOT_PATH_FN);
+ readonly #licenseKey = inject(LicenseService).activeLicenseKey;
+ readonly #config = getConfig();
+ readonly #isCompareMode = signal(false);
+ readonly #isCompareMode$ = toObservable(this.#isCompareMode);
+ readonly #searchButton: IHeaderElement = {
+ type: 'actionButton',
+ img: this.#convertPath('/assets/icons/general/pdftron-action-search.svg'),
+ title: inject(TranslateService).instant(_('pdf-viewer.text-popup.actions.search')),
+ onClick: () => {
+ setTimeout(() => {
+ this.#searchForSelectedText();
+ this.#focusSearch();
+ }, 250);
+ },
+ };
+ readonly #destroyRef = inject(DestroyRef);
+ readonly #totalPages = signal(0);
readonly currentPage$ = inject(ActivatedRoute).queryParamMap.pipe(
map(params => Number(params.get('page') ?? '1')),
shareDistinctLast(),
@@ -45,25 +64,6 @@ export class PdfViewer {
ambientString: true, // return ambient string as part of the result
};
selectedText = '';
- #instance: WebViewerInstance;
- readonly #convertPath = inject(UI_ROOT_PATH_FN);
- readonly #licenseKey = inject(LicenseService).activeLicenseKey;
- readonly #config = getConfig();
- readonly #isCompareMode = signal(false);
- readonly #isCompareMode$ = toObservable(this.#isCompareMode);
- readonly #searchButton: IHeaderElement = {
- type: 'actionButton',
- img: this.#convertPath('/assets/icons/general/pdftron-action-search.svg'),
- title: inject(TranslateService).instant(_('pdf-viewer.text-popup.actions.search')),
- onClick: () => {
- setTimeout(() => {
- this.#searchForSelectedText();
- this.#focusSearch();
- }, 250);
- },
- };
- readonly #destroyRef = inject(DestroyRef);
- readonly #totalPages = signal(0);
constructor(
private readonly _logger: NGXLogger,
@@ -357,7 +357,7 @@ export class PdfViewer {
const options: WebViewerOptions = {
licenseKey: this.#licenseKey,
fullAPI: true,
- path: this.#convertPath('/assets/wv-resources'),
+ path: this.#convertPath('/assets/wv-resources/10.10.1'),
css: this.#convertPath('/assets/pdftron/stylesheet.css'),
backendType: 'ems',
};
diff --git a/apps/red-ui/src/app/modules/search/search-item-template/search-item-template.component.ts b/apps/red-ui/src/app/modules/search/search-item-template/search-item-template.component.ts
index fff7c1e2f..a586590e2 100644
--- a/apps/red-ui/src/app/modules/search/search-item-template/search-item-template.component.ts
+++ b/apps/red-ui/src/app/modules/search/search-item-template/search-item-template.component.ts
@@ -3,11 +3,31 @@ import { workflowFileStatusTranslations } from '@translations/file-status-transl
import { ISearchListItem } from '@red/domain';
import { escapeHtml } from '@iqser/common-ui/lib/utils';
import { getDossierRouterLink } from '@utils/router-links';
+import { MatTooltip } from '@angular/material/tooltip';
+import { NgForOf, NgIf } from '@angular/common';
+import { TranslateModule } from '@ngx-translate/core';
+import { StopPropagationDirective } from '@iqser/common-ui';
+import { InitialsAvatarComponent } from '@common-ui/users';
+import { StatusBarComponent } from '@common-ui/shared';
+import { MatIcon } from '@angular/material/icon';
+import { RouterLink } from '@angular/router';
@Component({
selector: 'redaction-search-item-template',
templateUrl: './search-item-template.component.html',
styleUrls: ['./search-item-template.component.scss'],
+ standalone: true,
+ imports: [
+ MatTooltip,
+ NgIf,
+ TranslateModule,
+ NgForOf,
+ StopPropagationDirective,
+ InitialsAvatarComponent,
+ StatusBarComponent,
+ MatIcon,
+ RouterLink,
+ ],
})
export class SearchItemTemplateComponent implements OnChanges {
@Input() item: ISearchListItem;
diff --git a/apps/red-ui/src/app/modules/search/search-screen/search-screen.component.ts b/apps/red-ui/src/app/modules/search/search-screen/search-screen.component.ts
index 017076a13..75cb6d922 100644
--- a/apps/red-ui/src/app/modules/search/search-screen/search-screen.component.ts
+++ b/apps/red-ui/src/app/modules/search/search-screen/search-screen.component.ts
@@ -1,11 +1,18 @@
import { ChangeDetectionStrategy, Component, OnDestroy } from '@angular/core';
-import { ListingComponent, listingProvidersFactory, LoadingService, SearchPositions, TableColumnConfig } from '@iqser/common-ui';
+import {
+ IqserListingModule,
+ ListingComponent,
+ listingProvidersFactory,
+ LoadingService,
+ SearchPositions,
+ TableColumnConfig,
+} from '@iqser/common-ui';
import { combineLatest, Observable, of } from 'rxjs';
import { debounceTime, map, startWith, switchMap, tap } from 'rxjs/operators';
import { ActivatedRoute, Router } from '@angular/router';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { workflowFileStatusTranslations } from '@translations/file-status-translations';
-import { TranslateService } from '@ngx-translate/core';
+import { TranslateModule, TranslateService } from '@ngx-translate/core';
import { RouterHistoryService } from '@services/router-history.service';
import {
Dossier,
@@ -25,14 +32,18 @@ import { DossierTemplatesService } from '@services/dossier-templates/dossier-tem
import { UserService } from '@users/user.service';
import { IFilterGroup, keyChecker, NestedFilter } from '@iqser/common-ui/lib/filtering';
import { SortingOrders } from '@iqser/common-ui/lib/sorting';
+import { AsyncPipe, NgIf } from '@angular/common';
+import { SearchItemTemplateComponent } from '../search-item-template/search-item-template.component';
@Component({
templateUrl: './search-screen.component.html',
styleUrls: ['./search-screen.component.scss'],
providers: listingProvidersFactory(SearchScreenComponent),
changeDetection: ChangeDetectionStrategy.OnPush,
+ standalone: true,
+ imports: [IqserListingModule, TranslateModule, AsyncPipe, NgIf, SearchItemTemplateComponent],
})
-export class SearchScreenComponent extends ListingComponent implements OnDestroy {
+export default class SearchScreenComponent extends ListingComponent implements OnDestroy {
readonly searchPositions = SearchPositions;
readonly tableHeaderLabel = _('search-screen.table-header');
@@ -46,7 +57,7 @@ export class SearchScreenComponent extends ListingComponent imp
readonly searchResults$ = new Observable();
- readonly dossierTemplates$ = this._dossierTemplateService.loadAll().pipe(tap(templates => this._addTemplateFilter(templates)));
+ readonly dossierTemplates$ = this._dossierTemplateService.loadAll().pipe(tap(templates => this.#addTemplateFilter(templates)));
constructor(
private readonly _router: Router,
@@ -65,10 +76,10 @@ export class SearchScreenComponent extends ListingComponent imp
if (!Object.keys(this._activatedRoute.snapshot.queryParams).length) {
this._router.navigate(['main']).then();
}
- this.searchResults$ = combineLatest([this._queryChanged$, this._filtersChanged$]).pipe(
+ this.searchResults$ = combineLatest([this.#queryChanged$, this.#filtersChanged$]).pipe(
tap(() => this._loadingService.start()),
tap(([query, [dossierIds, workflowStatus, assignee, dossierTemplateIds, onlyActive]]) =>
- this._updateNavigation(query, dossierIds, workflowStatus, assignee, dossierTemplateIds, onlyActive),
+ this.#updateNavigation(query, dossierIds, workflowStatus, assignee, dossierTemplateIds, onlyActive),
),
switchMap(([query, [dossierIds, workflowStatus, assignee, dossierTemplateIds, onlyActive]]) =>
this._platformSearchService.search({
@@ -81,43 +92,43 @@ export class SearchScreenComponent extends ListingComponent imp
includeArchivedDossiers: !onlyActive,
}),
),
- map(searchResult => this._toMatchedDocuments(searchResult)),
- map(docs => this._toListItems(docs)),
+ map(searchResult => this.#toMatchedDocuments(searchResult)),
+ map(docs => this.#toListItems(docs)),
tap(result => this.entitiesService.setEntities(result)),
tap(() => this._loadingService.stop()),
);
this.searchService.skip = true;
this.sortingService.setSortingOption({ column: 'searchKey', order: SortingOrders.desc });
- this._initFilters();
+ this.#initFilters();
}
- private get _routeDossierIds(): string[] {
+ get #routeDossierIds(): string[] {
return this._activatedRoute.snapshot.queryParamMap.get('dossierIds').split(',');
}
- private get _routeDossierTemplateIds(): string[] {
+ get #routeDossierTemplateIds(): string[] {
return this._activatedRoute.snapshot.queryParamMap.get('dossierTemplateIds')?.split(',');
}
- private get _routeStatus(): WorkflowFileStatus {
+ get #routeStatus(): WorkflowFileStatus {
return this._activatedRoute.snapshot.queryParamMap.get('status') as WorkflowFileStatus;
}
- private get _routeAssignee(): string {
+ get #routeAssignee(): string {
return this._activatedRoute.snapshot.queryParamMap.get('assignee');
}
- private get _routeOnlyActive(): boolean {
+ get #routeOnlyActive(): boolean {
return this._activatedRoute.snapshot.queryParamMap.get('onlyActive') === 'true';
}
- private get _routeQuery(): string {
+ get #routeQuery(): string {
return this._activatedRoute.snapshot.queryParamMap.get('query');
}
- private get _queryChanged$(): Observable {
+ get #queryChanged$(): Observable {
return this.searchService.valueChanges$.pipe(
- startWith(this._routeQuery),
+ startWith(this.#routeQuery),
tap(query => (this.searchService.searchValue = query)),
debounceTime(300),
);
@@ -127,7 +138,7 @@ export class SearchScreenComponent extends ListingComponent imp
return this._featuresService.isEnabled(DOSSIERS_ARCHIVE);
}
- private get _filtersChanged$(): Observable<[string[], WorkflowFileStatus, string, string[], boolean]> {
+ get #filtersChanged$(): Observable<[string[], WorkflowFileStatus, string, string[], boolean]> {
const onlyActiveDossiers$ = this.#enabledArchive
? this.filterService.getSingleFilter('onlyActiveDossiers').pipe(map(f => !!f.checked))
: of(true);
@@ -141,11 +152,11 @@ export class SearchScreenComponent extends ListingComponent imp
return [dossierIds, workflowStatus, assignee, dossierTemplateIds, onlyActive];
}),
startWith<[string[], WorkflowFileStatus, string, string[], boolean]>([
- this._routeDossierIds,
- this._routeStatus,
- this._routeAssignee,
- this._routeDossierTemplateIds,
- this._routeOnlyActive,
+ this.#routeDossierIds,
+ this.#routeStatus,
+ this.#routeAssignee,
+ this.#routeDossierTemplateIds,
+ this.#routeOnlyActive,
]),
);
}
@@ -155,8 +166,8 @@ export class SearchScreenComponent extends ListingComponent imp
this.searchService.searchValue = newQuery ?? '';
}
- private _initFilters() {
- const dossierIds = this._routeDossierIds;
+ #initFilters() {
+ const dossierIds = this.#routeDossierIds;
const dossierToFilter = ({ dossierName, id }: Dossier) => {
const checked = dossierIds.includes(id);
return new NestedFilter({ id, label: dossierName, checked });
@@ -170,7 +181,7 @@ export class SearchScreenComponent extends ListingComponent imp
checker: keyChecker('dossierId'),
};
- const status = this._routeStatus;
+ const status = this.#routeStatus;
const statusToFilter = (workflowStatus: WorkflowFileStatus) => {
const checked = status === workflowStatus;
return new NestedFilter({
@@ -188,7 +199,7 @@ export class SearchScreenComponent extends ListingComponent imp
checker: keyChecker('status'),
};
- const assignee = this._routeAssignee;
+ const assignee = this.#routeAssignee;
const assigneeToFilter = (userId: string) => {
const checked = assignee === userId;
return new NestedFilter({ id: userId, label: this._userService.getName(userId), checked });
@@ -215,12 +226,12 @@ export class SearchScreenComponent extends ListingComponent imp
this.filterService.addFilterGroups([dossierNameFilter, workflowStatusFilter, assigneeFilter]);
const onlyActiveLabel = this._translateService.instant('search-screen.filters.only-active');
if (this.#enabledArchive) {
- this.filterService.addSingleFilter({ id: 'onlyActiveDossiers', label: onlyActiveLabel, checked: this._routeOnlyActive });
+ this.filterService.addSingleFilter({ id: 'onlyActiveDossiers', label: onlyActiveLabel, checked: this.#routeOnlyActive });
}
}
- private _addTemplateFilter(templates: DossierTemplate[]) {
- const templatesIds = this._routeDossierTemplateIds;
+ #addTemplateFilter(templates: DossierTemplate[]) {
+ const templatesIds = this.#routeDossierTemplateIds;
const templateToFilter = ({ name, id }: DossierTemplate) => {
const checked = templatesIds?.includes(id);
return new NestedFilter({ id, label: name, checked });
@@ -236,7 +247,7 @@ export class SearchScreenComponent extends ListingComponent imp
this.filterService.addFilterGroups([templateNameFilter]);
}
- private _updateNavigation(
+ #updateNavigation(
query?: string,
dossierIds?: string[],
workflowStatus?: WorkflowFileStatus,
@@ -255,15 +266,15 @@ export class SearchScreenComponent extends ListingComponent imp
return this._router.navigate([], { queryParams, replaceUrl: true });
}
- private _toMatchedDocuments({ matchedDocuments }: ISearchResponse): IMatchedDocument[] {
+ #toMatchedDocuments({ matchedDocuments }: ISearchResponse): IMatchedDocument[] {
return matchedDocuments.filter(doc => doc.score > 0 && doc.matchedTerms.length > 0);
}
- private _toListItems(matchedDocuments: IMatchedDocument[]): ISearchListItem[] {
- return matchedDocuments.map(document => this._toListItem(document)).filter(value => value);
+ #toListItems(matchedDocuments: IMatchedDocument[]): ISearchListItem[] {
+ return matchedDocuments.map(document => this.#toListItem(document)).filter(value => value);
}
- private _toListItem({
+ #toListItem({
dossierId,
fileId,
unmatchedTerms,
diff --git a/apps/red-ui/src/app/modules/search/search.module.ts b/apps/red-ui/src/app/modules/search/search.module.ts
deleted file mode 100644
index e37dc443e..000000000
--- a/apps/red-ui/src/app/modules/search/search.module.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import { NgModule } from '@angular/core';
-import { CommonModule } from '@angular/common';
-import { SearchScreenComponent } from './search-screen/search-screen.component';
-import { RouterModule } from '@angular/router';
-import { IqserListingModule, StopPropagationDirective } from '@iqser/common-ui';
-import { SharedModule } from '@shared/shared.module';
-import { TranslateModule } from '@ngx-translate/core';
-import { SearchItemTemplateComponent } from './search-item-template/search-item-template.component';
-import { IqserUsersModule } from '@iqser/common-ui/lib/users';
-import { StatusBarComponent } from '@iqser/common-ui/lib/shared';
-
-const routes = [{ path: '', component: SearchScreenComponent }];
-
-@NgModule({
- declarations: [SearchScreenComponent, SearchItemTemplateComponent],
- imports: [
- CommonModule,
- RouterModule.forChild(routes),
- SharedModule,
- IqserUsersModule,
- TranslateModule,
- IqserListingModule,
- StatusBarComponent,
- StopPropagationDirective,
- ],
-})
-export class SearchModule {}
diff --git a/apps/red-ui/src/app/modules/shared-dossiers/components/date-column/date-column.component.ts b/apps/red-ui/src/app/modules/shared-dossiers/components/date-column/date-column.component.ts
index 732d72251..2e0e44152 100644
--- a/apps/red-ui/src/app/modules/shared-dossiers/components/date-column/date-column.component.ts
+++ b/apps/red-ui/src/app/modules/shared-dossiers/components/date-column/date-column.component.ts
@@ -1,9 +1,12 @@
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
+import { DatePipe } from '@shared/pipes/date.pipe';
@Component({
selector: 'redaction-date-column [date]',
templateUrl: './date-column.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
+ standalone: true,
+ imports: [DatePipe],
})
export class DateColumnComponent {
@Input() isError = false;
diff --git a/apps/red-ui/src/app/modules/shared-dossiers/components/dossiers-listing-actions/dossiers-listing-actions.component.ts b/apps/red-ui/src/app/modules/shared-dossiers/components/dossiers-listing-actions/dossiers-listing-actions.component.ts
index 6a48cf304..60e39799a 100644
--- a/apps/red-ui/src/app/modules/shared-dossiers/components/dossiers-listing-actions/dossiers-listing-actions.component.ts
+++ b/apps/red-ui/src/app/modules/shared-dossiers/components/dossiers-listing-actions/dossiers-listing-actions.component.ts
@@ -1,18 +1,24 @@
+import { AsyncPipe, NgIf } from '@angular/common';
import { Component, Input, OnChanges } from '@angular/core';
-import { IqserPermissionsService } from '@iqser/common-ui';
+import { CircleButtonComponent, IqserAllowDirective, IqserPermissionsService, largeDialogConfig } from '@iqser/common-ui';
import { getCurrentUser } from '@iqser/common-ui/lib/users';
+import { TranslateModule } from '@ngx-translate/core';
import type { Dossier, File, User } from '@red/domain';
import { FilesMapService } from '@services/files/files-map.service';
import { PermissionsService } from '@services/permissions.service';
import { ReanalysisService } from '@services/reanalysis.service';
-import { LongPressEvent } from '@shared/directives/long-press.directive';
+import { FileDownloadBtnComponent } from '@shared/components/buttons/file-download-btn/file-download-btn.component';
+import { LongPressDirective, LongPressEvent } from '@shared/directives/long-press.directive';
import { Roles } from '@users/roles';
import { UserPreferenceService } from '@users/user-preference.service';
+import { EditDossierDialogComponent } from '../../dialogs/edit-dossier-dialog/edit-dossier-dialog.component';
import { DossiersDialogService } from '../../services/dossiers-dialog.service';
@Component({
selector: 'redaction-dossiers-listing-actions [dossier]',
templateUrl: './dossiers-listing-actions.component.html',
+ standalone: true,
+ imports: [LongPressDirective, CircleButtonComponent, IqserAllowDirective, TranslateModule, NgIf, FileDownloadBtnComponent, AsyncPipe],
})
export class DossiersListingActionsComponent implements OnChanges {
readonly roles = Roles;
@@ -49,7 +55,7 @@ export class DossiersListingActionsComponent implements OnChanges {
}
openEditDossierDialog(dossierId: string): void {
- this._dialogService.openDialog('editDossier', { dossierId });
+ this._dialogService.open(EditDossierDialogComponent, { dossierId }, { ...largeDialogConfig, width: '98vw', maxWidth: '98vw' });
}
async reanalyseDossier(dossier: Dossier): Promise {
diff --git a/apps/red-ui/src/app/modules/shared-dossiers/components/file-actions/file-actions.component.ts b/apps/red-ui/src/app/modules/shared-dossiers/components/file-actions/file-actions.component.ts
index 557356d13..208bc62cf 100644
--- a/apps/red-ui/src/app/modules/shared-dossiers/components/file-actions/file-actions.component.ts
+++ b/apps/red-ui/src/app/modules/shared-dossiers/components/file-actions/file-actions.component.ts
@@ -21,7 +21,7 @@ import { FilesService } from '@services/files/files.service';
import { PermissionsService } from '@services/permissions.service';
import { ReanalysisService, ReanalyzeQueryParams } from '@services/reanalysis.service';
import { ExpandableFileActionsComponent } from '@shared/components/expandable-file-actions/expandable-file-actions.component';
-import { LongPressEvent } from '@shared/directives/long-press.directive';
+import { LongPressDirective, LongPressEvent } from '@shared/directives/long-press.directive';
import { Roles } from '@users/roles';
import { UserPreferenceService } from '@users/user-preference.service';
import { setLocalStorageDataByFileId } from '@utils/local-storage';
@@ -34,11 +34,16 @@ import { ROTATION_ACTION_BUTTONS } from '../../../pdf-viewer/utils/constants';
import { AssignReviewerApproverDialogComponent } from '../../dialogs/assign-reviewer-approver-dialog/assign-reviewer-approver-dialog.component';
import { DossiersDialogService } from '../../services/dossiers-dialog.service';
import { FileAssignService } from '../../services/file-assign.service';
+import { ProcessingIndicatorComponent } from '@shared/components/processing-indicator/processing-indicator.component';
+import { StatusBarComponent } from '@common-ui/shared';
+import { NgIf, NgTemplateOutlet } from '@angular/common';
@Component({
selector: 'redaction-file-actions',
templateUrl: './file-actions.component.html',
styleUrls: ['./file-actions.component.scss'],
+ standalone: true,
+ imports: [ProcessingIndicatorComponent, StatusBarComponent, LongPressDirective, ExpandableFileActionsComponent, NgTemplateOutlet, NgIf],
})
export class FileActionsComponent implements OnChanges {
@Input({ required: true }) file: File;
diff --git a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/assign-reviewer-approver-dialog/assign-reviewer-approver-dialog.component.ts b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/assign-reviewer-approver-dialog/assign-reviewer-approver-dialog.component.ts
index 31554c994..d98700c9a 100644
--- a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/assign-reviewer-approver-dialog/assign-reviewer-approver-dialog.component.ts
+++ b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/assign-reviewer-approver-dialog/assign-reviewer-approver-dialog.component.ts
@@ -1,7 +1,14 @@
import { Component } 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 { IconButtonTypes, IqserDialogComponent, LoadingService, Toaster } from '@iqser/common-ui';
+import {
+ CircleButtonComponent,
+ IconButtonComponent,
+ IconButtonTypes,
+ IqserDialogComponent,
+ LoadingService,
+ Toaster,
+} from '@iqser/common-ui';
import { getCurrentUser } from '@iqser/common-ui/lib/users';
import { File, User, WorkflowFileStatus, WorkflowFileStatuses } from '@red/domain';
import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service';
@@ -9,6 +16,12 @@ import { FilesService } from '@services/files/files.service';
import { PermissionsService } from '@services/permissions.service';
import { UserService } from '@users/user.service';
import { moveElementInArray } from '@utils/functions';
+import { TranslateModule } from '@ngx-translate/core';
+import { MatFormField } from '@angular/material/form-field';
+import { MatOption, MatSelect } from '@angular/material/select';
+import { NgForOf } from '@angular/common';
+import { NamePipe } from '@common-ui/users/name.pipe';
+import { MatDialogClose } from '@angular/material/dialog';
class DialogData {
targetStatus: WorkflowFileStatus;
@@ -20,6 +33,19 @@ class DialogData {
@Component({
templateUrl: './assign-reviewer-approver-dialog.component.html',
+ standalone: true,
+ imports: [
+ TranslateModule,
+ ReactiveFormsModule,
+ MatFormField,
+ MatSelect,
+ MatOption,
+ NgForOf,
+ NamePipe,
+ IconButtonComponent,
+ MatDialogClose,
+ CircleButtonComponent,
+ ],
})
export class AssignReviewerApproverDialogComponent extends IqserDialogComponent<
AssignReviewerApproverDialogComponent,
diff --git a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/attributes/edit-dossier-attributes.component.ts b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/attributes/edit-dossier-attributes.component.ts
index b03686c6b..e6288aca7 100644
--- a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/attributes/edit-dossier-attributes.component.ts
+++ b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/attributes/edit-dossier-attributes.component.ts
@@ -1,7 +1,18 @@
+import { NgForOf, NgIf } from '@angular/common';
import { Component, ElementRef, Input, OnInit, QueryList, ViewChildren } 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 { IconButtonTypes, LoadingService, Toaster } from '@iqser/common-ui';
+import { DynamicInputComponent } from '@common-ui/inputs/dynamic-input/dynamic-input.component';
+import { SnakeCasePipe } from '@common-ui/pipes/snake-case.pipe';
+import {
+ CircleButtonComponent,
+ EmptyStateComponent,
+ IconButtonComponent,
+ IconButtonTypes,
+ LoadingService,
+ Toaster,
+} from '@iqser/common-ui';
+import { TranslateModule } from '@ngx-translate/core';
import { Dossier, DossierAttributeConfigType, DossierAttributeConfigTypes, DossierAttributeWithValue } from '@red/domain';
import { DossierAttributesService } from '@services/entity-services/dossier-attributes.service';
import { PermissionsService } from '@services/permissions.service';
@@ -13,6 +24,18 @@ import { EditDossierSaveResult, EditDossierSectionInterface } from '../edit-doss
selector: 'redaction-edit-dossier-attributes',
templateUrl: './edit-dossier-attributes.component.html',
styleUrls: ['./edit-dossier-attributes.component.scss'],
+ standalone: true,
+ imports: [
+ ReactiveFormsModule,
+ NgIf,
+ TranslateModule,
+ EmptyStateComponent,
+ DynamicInputComponent,
+ NgForOf,
+ IconButtonComponent,
+ SnakeCasePipe,
+ CircleButtonComponent,
+ ],
})
export class EditDossierAttributesComponent implements EditDossierSectionInterface, OnInit {
@ViewChildren('fileInput') private _fileInputs: QueryList;
diff --git a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/dictionary/edit-dossier-dictionary.component.ts b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/dictionary/edit-dossier-dictionary.component.ts
index d517176d8..fd125866d 100644
--- a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/dictionary/edit-dossier-dictionary.component.ts
+++ b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/dictionary/edit-dossier-dictionary.component.ts
@@ -1,5 +1,5 @@
import { Component, Input, OnInit, ViewChild } from '@angular/core';
-import { IqserDialog, LoadingService } from '@iqser/common-ui';
+import { CircleButtonComponent, IconButtonComponent, IqserDialog, LoadingService } from '@iqser/common-ui';
import { List } from '@iqser/common-ui/lib/utils';
import { Dictionary, DictionaryEntryType, DictionaryEntryTypes, Dossier } from '@red/domain';
import { DictionaryService } from '@services/entity-services/dictionary.service';
@@ -8,11 +8,28 @@ import { DictionaryManagerComponent } from '@shared/components/dictionary-manage
import { firstValueFrom } from 'rxjs';
import { EditDossierSaveResult } from '../edit-dossier-section.interface';
import { EditDictionaryDialogComponent } from '../../edit-dictionary-dialog/edit-dictionary-dialog.component';
+import { NgForOf, NgIf } from '@angular/common';
+import { AnnotationIconComponent } from '@shared/components/annotation-icon/annotation-icon.component';
+import { MatTooltip } from '@angular/material/tooltip';
+import { MatIcon } from '@angular/material/icon';
+import { TranslateModule } from '@ngx-translate/core';
@Component({
selector: 'redaction-edit-dossier-dictionary',
templateUrl: './edit-dossier-dictionary.component.html',
styleUrls: ['./edit-dossier-dictionary.component.scss'],
+ standalone: true,
+ imports: [
+ NgForOf,
+ AnnotationIconComponent,
+ MatTooltip,
+ MatIcon,
+ CircleButtonComponent,
+ NgIf,
+ TranslateModule,
+ IconButtonComponent,
+ DictionaryManagerComponent,
+ ],
})
export class EditDossierDictionaryComponent implements OnInit {
@Input() dossier: Dossier;
diff --git a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.ts b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.ts
index c8c1d00a3..ce7c1d58c 100644
--- a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.ts
+++ b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.ts
@@ -1,6 +1,6 @@
import { Component, Input, OnInit } from '@angular/core';
import { Dossier, DownloadFileType, IReportTemplate } from '@red/domain';
-import { FormBuilder, FormGroup } from '@angular/forms';
+import { FormBuilder, FormGroup, ReactiveFormsModule } from '@angular/forms';
import { EditDossierSaveResult, EditDossierSectionInterface } from '../edit-dossier-section.interface';
import { downloadTypesTranslations } from '@translations/download-types-translations';
import { ReportTemplateService } from '@services/report-template.service';
@@ -10,6 +10,11 @@ import { DossiersService } from '@services/dossiers/dossiers.service';
import { WatermarksMapService } from '@services/entity-services/watermarks-map.service';
import { ContextComponent, shareLast } from '@iqser/common-ui/lib/utils';
import { Roles } from '@users/roles';
+import { AsyncPipe, NgIf } from '@angular/common';
+import { SelectComponent } from '@shared/components/select/select.component';
+import { TranslateModule } from '@ngx-translate/core';
+import { WatermarkSelectorComponent } from '@shared/components/dossier-watermark-selector/watermark-selector.component';
+import { IqserAllowDirective, IqserDenyDirective } from '@iqser/common-ui';
interface EditDossierDownloadPackageContext {
existsWatermarks: boolean;
@@ -19,6 +24,17 @@ interface EditDossierDownloadPackageContext {
selector: 'redaction-edit-dossier-download-package',
templateUrl: './edit-dossier-download-package.component.html',
styleUrls: ['./edit-dossier-download-package.component.scss'],
+ standalone: true,
+ imports: [
+ AsyncPipe,
+ NgIf,
+ SelectComponent,
+ ReactiveFormsModule,
+ TranslateModule,
+ WatermarkSelectorComponent,
+ IqserAllowDirective,
+ IqserDenyDirective,
+ ],
})
export class EditDossierDownloadPackageComponent
extends ContextComponent
diff --git a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/edit-dossier-dialog.component.html b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/edit-dossier-dialog.component.html
index 82dc74088..cda99eb6b 100644
--- a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/edit-dossier-dialog.component.html
+++ b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/edit-dossier-dialog.component.html
@@ -42,12 +42,13 @@
[dossier]="dossier()"
>
-
+ @if (activeNav() === 'dossierDictionary') {
+
+ }
-
+ @if (activeNav() === 'members') {
+
+ }
;
readonly showActionButtons: Signal;
- generalInfoComponent = viewChild(EditDossierGeneralInfoComponent);
- downloadPackageComponent = viewChild(EditDossierDownloadPackageComponent);
- dictionaryComponent = viewChild(EditDossierDictionaryComponent);
- membersComponent = viewChild(EditDossierTeamComponent);
- attributesComponent = viewChild(EditDossierAttributesComponent);
+ readonly generalInfoComponent = viewChild(EditDossierGeneralInfoComponent);
+ readonly downloadPackageComponent = viewChild(EditDossierDownloadPackageComponent);
+ readonly dictionaryComponent = viewChild(EditDossierDictionaryComponent);
+ readonly membersComponent = viewChild(EditDossierTeamComponent);
+ readonly attributesComponent = viewChild(EditDossierAttributesComponent);
constructor(
private readonly _dossiersService: DossiersService,
diff --git a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/edit-dossier-team/edit-dossier-team.component.ts b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/edit-dossier-team/edit-dossier-team.component.ts
index 2d330d904..cee33972f 100644
--- a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/edit-dossier-team/edit-dossier-team.component.ts
+++ b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/edit-dossier-team/edit-dossier-team.component.ts
@@ -1,11 +1,21 @@
+import { AsyncPipe, NgForOf, NgIf } from '@angular/common';
import { ChangeDetectionStrategy, Component, inject, Input, OnChanges, SimpleChanges } from '@angular/core';
-import { FormControl, FormGroup, Validators } from '@angular/forms';
-import { getConfig } from '@iqser/common-ui';
+import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';
+import { MatFormField } from '@angular/material/form-field';
+import { MatIcon } from '@angular/material/icon';
+import { MatOption, MatSelect } from '@angular/material/select';
+import { InputWithActionComponent } from '@common-ui/inputs/input-with-action/input-with-action.component';
+import { RoundCheckboxComponent } from '@common-ui/inputs/round-checkbox/round-checkbox.component';
+import { InitialsAvatarComponent } from '@common-ui/users';
+import { NamePipe } from '@common-ui/users/name.pipe';
+import { getConfig, StopPropagationDirective } from '@iqser/common-ui';
import { Debounce } from '@iqser/common-ui/lib/utils';
+import { TranslateModule } from '@ngx-translate/core';
import { Dossier, IDossierRequest } from '@red/domain';
import { DossiersService } from '@services/dossiers/dossiers.service';
import { FilesService } from '@services/files/files.service';
import { PermissionsService } from '@services/permissions.service';
+import { TeamMembersComponent } from '@shared/components/team-members/team-members.component';
import { UserService } from '@users/user.service';
import { compareLists } from '@utils/functions';
import { firstValueFrom } from 'rxjs';
@@ -17,19 +27,37 @@ import { EditDossierSaveResult, EditDossierSectionInterface } from '../edit-doss
templateUrl: './edit-dossier-team.component.html',
styleUrls: ['./edit-dossier-team.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
+ standalone: true,
+ imports: [
+ ReactiveFormsModule,
+ TranslateModule,
+ MatFormField,
+ MatSelect,
+ MatOption,
+ NgForOf,
+ NamePipe,
+ NgIf,
+ AsyncPipe,
+ TeamMembersComponent,
+ InputWithActionComponent,
+ InitialsAvatarComponent,
+ RoundCheckboxComponent,
+ MatIcon,
+ StopPropagationDirective,
+ ],
})
export class EditDossierTeamComponent implements EditDossierSectionInterface, OnChanges {
+ readonly #userService = inject(UserService);
+ readonly #dossiersService = inject(DossiersService);
+ readonly #permissionsService = inject(PermissionsService);
+ readonly #filesService = inject(FilesService);
form = this.#getForm();
+ readonly #formValue$ = this.form.valueChanges;
searchQuery = '';
@Input() dossier: Dossier;
membersSelectOptions: string[] = [];
readonly isDocumine = getConfig().IS_DOCUMINE;
- readonly #userService = inject(UserService);
readonly ownersSelectOptions = this.#userService.all.filter(u => u.isManager).map(m => m.id);
- readonly #dossiersService = inject(DossiersService);
- readonly #permissionsService = inject(PermissionsService);
- readonly #filesService = inject(FilesService);
- readonly #formValue$ = this.form.valueChanges;
readonly selectedReviewers$ = this.#formValue$.pipe(map(v => v.members.filter(m => !v.approvers.includes(m))));
readonly selectedApprovers$ = this.#formValue$.pipe(map(v => v.approvers));
diff --git a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.ts b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.ts
index 1894b809a..cc63d8f11 100644
--- a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.ts
+++ b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.ts
@@ -1,30 +1,65 @@
+import { NgForOf, NgIf } from '@angular/common';
import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core';
-import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
-import { Dossier, DOSSIER_TEMPLATE_ID, IDossierRequest, IDossierTemplate } from '@red/domain';
-import { EditDossierSaveResult, EditDossierSectionInterface } from '../edit-dossier-section.interface';
-import { DossiersDialogService } from '../../../services/dossiers-dialog.service';
-import { PermissionsService } from '@services/permissions.service';
-import { Router } from '@angular/router';
+import { ReactiveFormsModule, UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
+import { MatCheckbox } from '@angular/material/checkbox';
+import { MatDatepickerModule } from '@angular/material/datepicker';
import { MatDialogRef } from '@angular/material/dialog';
-import { EditDossierDialogComponent } from '../edit-dossier-dialog.component';
-import { ConfirmOptions, IconButtonTypes, IConfirmationDialogData, LoadingService, TitleColors, Toaster } from '@iqser/common-ui';
+import { MatFormField, MatSuffix } from '@angular/material/form-field';
+import { MatIcon } from '@angular/material/icon';
+import { MatOption, MatSelect } from '@angular/material/select';
+import { MatTooltip } from '@angular/material/tooltip';
+import { Router } from '@angular/router';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
+import { SmallChipComponent } from '@common-ui/shared';
+import {
+ ConfirmOptions,
+ HasScrollbarDirective,
+ IconButtonComponent,
+ IconButtonTypes,
+ IConfirmationDialogData,
+ LoadingService,
+ TitleColors,
+ Toaster,
+} from '@iqser/common-ui';
+import { TranslateModule, TranslateService } from '@ngx-translate/core';
+import { Dossier, DOSSIER_TEMPLATE_ID, IDossierRequest, IDossierTemplate } from '@red/domain';
import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service';
-import { DossierStatsService } from '@services/dossiers/dossier-stats.service';
-import { firstValueFrom } from 'rxjs';
-import { TranslateService } from '@ngx-translate/core';
-import { DossiersService } from '@services/dossiers/dossiers.service';
-import { TrashService } from '@services/entity-services/trash.service';
import { ArchivedDossiersService } from '@services/dossiers/archived-dossiers.service';
+import { DossierStatsService } from '@services/dossiers/dossier-stats.service';
+import { DossiersService } from '@services/dossiers/dossiers.service';
import { DossierStatesMapService } from '@services/entity-services/dossier-states-map.service';
-import dayjs from 'dayjs';
+import { TrashService } from '@services/entity-services/trash.service';
+import { PermissionsService } from '@services/permissions.service';
import { dateWithoutTime } from '@utils/functions';
+import dayjs from 'dayjs';
+import { firstValueFrom } from 'rxjs';
+import { DossiersDialogService } from '../../../services/dossiers-dialog.service';
+import { type EditDossierDialogComponent } from '../edit-dossier-dialog.component';
+import { EditDossierSaveResult, EditDossierSectionInterface } from '../edit-dossier-section.interface';
@Component({
selector: 'redaction-edit-dossier-general-info',
templateUrl: './edit-dossier-general-info.component.html',
styleUrls: ['./edit-dossier-general-info.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
+ standalone: true,
+ imports: [
+ ReactiveFormsModule,
+ MatFormField,
+ TranslateModule,
+ MatSelect,
+ MatOption,
+ NgForOf,
+ MatTooltip,
+ HasScrollbarDirective,
+ SmallChipComponent,
+ MatCheckbox,
+ MatDatepickerModule,
+ MatIcon,
+ MatSuffix,
+ IconButtonComponent,
+ NgIf,
+ ],
})
export class EditDossierGeneralInfoComponent implements OnInit, EditDossierSectionInterface {
@Input() dossier: Dossier;
diff --git a/apps/red-ui/src/app/modules/shared-dossiers/services/dossiers-dialog.service.ts b/apps/red-ui/src/app/modules/shared-dossiers/services/dossiers-dialog.service.ts
index 24c67d4a9..e2cb02fac 100644
--- a/apps/red-ui/src/app/modules/shared-dossiers/services/dossiers-dialog.service.ts
+++ b/apps/red-ui/src/app/modules/shared-dossiers/services/dossiers-dialog.service.ts
@@ -1,10 +1,9 @@
import { Injectable } from '@angular/core';
import { MatDialog } from '@angular/material/dialog';
-import { ConfirmationDialogComponent, DialogConfig, DialogService, largeDialogConfig } from '@iqser/common-ui';
+import { ConfirmationDialogComponent, DialogConfig, DialogService } from '@iqser/common-ui';
import { ImportRedactionsDialogComponent } from '../../file-preview/dialogs/import-redactions-dialog/import-redactions-dialog';
-import { EditDossierDialogComponent } from '../dialogs/edit-dossier-dialog/edit-dossier-dialog.component';
-type DialogType = 'confirm' | 'editDossier' | 'importRedactions';
+type DialogType = 'confirm' | 'importRedactions';
@Injectable({
providedIn: 'root',
@@ -15,10 +14,6 @@ export class DossiersDialogService extends DialogService {
component: ConfirmationDialogComponent,
dialogConfig: { disableClose: false },
},
- editDossier: {
- component: EditDossierDialogComponent,
- dialogConfig: { ...largeDialogConfig, width: '98vw', maxWidth: '98vw' },
- },
importRedactions: {
component: ImportRedactionsDialogComponent,
dialogConfig: { disableClose: false },
diff --git a/apps/red-ui/src/app/modules/shared-dossiers/services/file-assign.service.ts b/apps/red-ui/src/app/modules/shared-dossiers/services/file-assign.service.ts
index 75f0c3fcb..b5f106d0d 100644
--- a/apps/red-ui/src/app/modules/shared-dossiers/services/file-assign.service.ts
+++ b/apps/red-ui/src/app/modules/shared-dossiers/services/file-assign.service.ts
@@ -11,7 +11,7 @@ import { DossiersDialogService } from './dossiers-dialog.service';
const atLeastOneAssignee = (files: File[]) => files.reduce((acc, fs) => acc || !!fs.assignee, false);
-@Injectable()
+@Injectable({ providedIn: 'root' })
export class FileAssignService {
readonly currentUser = getCurrentUser();
diff --git a/apps/red-ui/src/app/modules/shared-dossiers/shared-dossiers.module.ts b/apps/red-ui/src/app/modules/shared-dossiers/shared-dossiers.module.ts
deleted file mode 100644
index 7cfca15d6..000000000
--- a/apps/red-ui/src/app/modules/shared-dossiers/shared-dossiers.module.ts
+++ /dev/null
@@ -1,76 +0,0 @@
-import { NgModule } from '@angular/core';
-import { CommonModule } from '@angular/common';
-import { FileActionsComponent } from './components/file-actions/file-actions.component';
-import { SharedModule } from '@shared/shared.module';
-import { EditDossierDialogComponent } from './dialogs/edit-dossier-dialog/edit-dossier-dialog.component';
-import { AssignReviewerApproverDialogComponent } from './dialogs/assign-reviewer-approver-dialog/assign-reviewer-approver-dialog.component';
-import { EditDossierGeneralInfoComponent } from './dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component';
-import { EditDossierDownloadPackageComponent } from './dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component';
-import { EditDossierDictionaryComponent } from './dialogs/edit-dossier-dialog/dictionary/edit-dossier-dictionary.component';
-import { EditDossierAttributesComponent } from './dialogs/edit-dossier-dialog/attributes/edit-dossier-attributes.component';
-import { EditDossierTeamComponent } from './dialogs/edit-dossier-dialog/edit-dossier-team/edit-dossier-team.component';
-import { DateColumnComponent } from './components/date-column/date-column.component';
-import { FileAssignService } from './services/file-assign.service';
-import {
- CircleButtonComponent,
- DynamicInputComponent,
- EmptyStateComponent,
- HasScrollbarDirective,
- IconButtonComponent,
- InputWithActionComponent,
- IqserAllowDirective,
- IqserDenyDirective,
- IqserHelpModeModule,
- RoundCheckboxComponent,
- StopPropagationDirective,
-} from '@iqser/common-ui';
-import { TranslateModule } from '@ngx-translate/core';
-import { DossiersListingActionsComponent } from './components/dossiers-listing-actions/dossiers-listing-actions.component';
-import { IqserUsersModule } from '@iqser/common-ui/lib/users';
-import { SideNavComponent, SmallChipComponent, StatusBarComponent } from '@iqser/common-ui/lib/shared';
-import { SelectComponent } from '@shared/components/select/select.component';
-import { SnakeCasePipe } from '@common-ui/pipes/snake-case.pipe';
-import { EditDictionaryDialogComponent } from './dialogs/edit-dictionary-dialog/edit-dictionary-dialog.component';
-
-const components = [
- FileActionsComponent,
- EditDossierGeneralInfoComponent,
- EditDossierDownloadPackageComponent,
- EditDossierDictionaryComponent,
- EditDossierAttributesComponent,
- EditDossierTeamComponent,
- FileActionsComponent,
- DateColumnComponent,
- DossiersListingActionsComponent,
-];
-const dialogs = [EditDossierDialogComponent, AssignReviewerApproverDialogComponent];
-
-@NgModule({
- declarations: [...components, ...dialogs],
- exports: [...components, ...dialogs],
- providers: [FileAssignService],
- imports: [
- CommonModule,
- SharedModule,
- IqserHelpModeModule,
- IqserUsersModule,
- TranslateModule,
- IconButtonComponent,
- CircleButtonComponent,
- EmptyStateComponent,
- SmallChipComponent,
- StatusBarComponent,
- SideNavComponent,
- StopPropagationDirective,
- HasScrollbarDirective,
- RoundCheckboxComponent,
- InputWithActionComponent,
- DynamicInputComponent,
- IqserAllowDirective,
- IqserDenyDirective,
- SelectComponent,
- SnakeCasePipe,
- EditDictionaryDialogComponent,
- ],
-})
-export class SharedDossiersModule {}
diff --git a/apps/red-ui/src/app/modules/shared/components/add-edit-entity/add-edit-entity.component.ts b/apps/red-ui/src/app/modules/shared/components/add-edit-entity/add-edit-entity.component.ts
index 038d22131..a45e20c63 100644
--- a/apps/red-ui/src/app/modules/shared/components/add-edit-entity/add-edit-entity.component.ts
+++ b/apps/red-ui/src/app/modules/shared/components/add-edit-entity/add-edit-entity.component.ts
@@ -1,11 +1,21 @@
+import { AsyncPipe, NgForOf, NgIf } from '@angular/common';
import { booleanAttribute, ChangeDetectorRef, Component, Input, OnInit } from '@angular/core';
-import { FormGroup, UntypedFormBuilder, UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms';
+import { FormGroup, ReactiveFormsModule, UntypedFormBuilder, UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms';
+import { MatButtonToggle, MatButtonToggleGroup } from '@angular/material/button-toggle';
+import { MatCheckbox } from '@angular/material/checkbox';
+import { MatFormField } from '@angular/material/form-field';
+import { MatIcon } from '@angular/material/icon';
+import { MatSelect } from '@angular/material/select';
+import { MatSlideToggle } from '@angular/material/slide-toggle';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
-import { BaseFormComponent, getConfig, LoadingService, Toaster } from '@iqser/common-ui';
+import { RoundCheckboxComponent } from '@common-ui/inputs/round-checkbox/round-checkbox.component';
+import { BaseFormComponent, getConfig, HasScrollbarDirective, LoadingService, Toaster } from '@iqser/common-ui';
+import { TranslateModule } from '@ngx-translate/core';
import { Dictionary, IDictionary } from '@red/domain';
import { DictionariesMapService } from '@services/entity-services/dictionaries-map.service';
import { DictionaryService } from '@services/entity-services/dictionary.service';
import { toSnakeCase } from '@utils/functions';
+import { ColorPickerModule } from 'ngx-color-picker';
import { Observable } from 'rxjs';
import { map, startWith } from 'rxjs/operators';
@@ -23,6 +33,24 @@ interface Color {
selector: 'redaction-add-edit-entity',
templateUrl: './add-edit-entity.component.html',
styleUrls: ['./add-edit-entity.component.scss'],
+ standalone: true,
+ imports: [
+ RoundCheckboxComponent,
+ NgIf,
+ ReactiveFormsModule,
+ NgForOf,
+ TranslateModule,
+ ColorPickerModule,
+ MatIcon,
+ AsyncPipe,
+ MatButtonToggleGroup,
+ MatButtonToggle,
+ MatFormField,
+ MatSelect,
+ HasScrollbarDirective,
+ MatSlideToggle,
+ MatCheckbox,
+ ],
})
export class AddEditEntityComponent extends BaseFormComponent implements OnInit {
@Input({ required: true }) dossierTemplateId: string;
diff --git a/apps/red-ui/src/app/modules/shared/components/annotation-icon/annotation-icon.component.ts b/apps/red-ui/src/app/modules/shared/components/annotation-icon/annotation-icon.component.ts
index c2a315e6b..99c27090c 100644
--- a/apps/red-ui/src/app/modules/shared/components/annotation-icon/annotation-icon.component.ts
+++ b/apps/red-ui/src/app/modules/shared/components/annotation-icon/annotation-icon.component.ts
@@ -5,6 +5,7 @@ import { AnnotationIconType } from '@red/domain';
selector: 'redaction-annotation-icon [color] [type] [label]',
templateUrl: './annotation-icon.component.html',
styleUrls: ['./annotation-icon.component.scss'],
+ standalone: true,
})
export class AnnotationIconComponent implements OnChanges {
@Input() color: string;
diff --git a/apps/red-ui/src/app/modules/shared/components/assign-user-dropdown/assign-user-dropdown.component.ts b/apps/red-ui/src/app/modules/shared/components/assign-user-dropdown/assign-user-dropdown.component.ts
index c1bc526cc..eb63fe2fb 100644
--- a/apps/red-ui/src/app/modules/shared/components/assign-user-dropdown/assign-user-dropdown.component.ts
+++ b/apps/red-ui/src/app/modules/shared/components/assign-user-dropdown/assign-user-dropdown.component.ts
@@ -1,13 +1,33 @@
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
-import { UserService } from '@users/user.service';
import { User } from '@red/domain';
import { List } from '@iqser/common-ui/lib/utils';
+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';
+import { NgForOf, NgTemplateOutlet } from '@angular/common';
+import { CircleButtonComponent, StopPropagationDirective } from '@iqser/common-ui';
+import { InitialsAvatarComponent } from '@common-ui/users';
@Component({
selector: 'redaction-assign-user-dropdown',
templateUrl: './assign-user-dropdown.component.html',
styleUrls: ['./assign-user-dropdown.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
+ standalone: true,
+ imports: [
+ MatFormField,
+ MatSelect,
+ MatSelectTrigger,
+ MatOption,
+ FormsModule,
+ TranslateModule,
+ NgTemplateOutlet,
+ StopPropagationDirective,
+ CircleButtonComponent,
+ NgForOf,
+ InitialsAvatarComponent,
+ ],
})
export class AssignUserDropdownComponent {
private _currentUser: User | string;
@@ -16,7 +36,7 @@ export class AssignUserDropdownComponent {
@Output() readonly save = new EventEmitter();
@Output() readonly cancel = new EventEmitter();
- constructor(private readonly _userService: UserService) {}
+ constructor() {}
get value(): User | string {
return this._currentUser;
diff --git a/apps/red-ui/src/app/modules/shared/components/buttons/file-download-btn/file-download-btn.component.ts b/apps/red-ui/src/app/modules/shared/components/buttons/file-download-btn/file-download-btn.component.ts
index 5a58c1260..8fde993b4 100644
--- a/apps/red-ui/src/app/modules/shared/components/buttons/file-download-btn/file-download-btn.component.ts
+++ b/apps/red-ui/src/app/modules/shared/components/buttons/file-download-btn/file-download-btn.component.ts
@@ -1,15 +1,18 @@
import { Component, inject, Input, OnChanges } from '@angular/core';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
-import { CircleButtonType, CircleButtonTypes, IqserDialog, Toaster } from '@iqser/common-ui';
+import { CircleButtonComponent, CircleButtonType, CircleButtonTypes, IqserDialog, Toaster } from '@iqser/common-ui';
import { Dossier, File, ProcessingFileStatuses } from '@red/domain';
import { PermissionsService } from '@services/permissions.service';
import { DownloadDialogComponent } from '@shared/dialogs/download-dialog/download-dialog.component';
import { FileDownloadService } from '@upload-download/services/file-download.service';
import { APP_BASE_HREF } from '@angular/common';
+import { TranslateModule } from '@ngx-translate/core';
@Component({
selector: 'redaction-file-download-btn',
templateUrl: './file-download-btn.component.html',
+ standalone: true,
+ imports: [CircleButtonComponent, TranslateModule],
})
export class FileDownloadBtnComponent implements OnChanges {
@Input({ required: true }) files: File[];
diff --git a/apps/red-ui/src/app/modules/shared/components/dictionary-manager/dictionary-manager.component.ts b/apps/red-ui/src/app/modules/shared/components/dictionary-manager/dictionary-manager.component.ts
index 66cdc3fc6..a842204f7 100644
--- a/apps/red-ui/src/app/modules/shared/components/dictionary-manager/dictionary-manager.component.ts
+++ b/apps/red-ui/src/app/modules/shared/components/dictionary-manager/dictionary-manager.component.ts
@@ -1,5 +1,5 @@
import { ChangeDetectorRef, Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges, ViewChild } from '@angular/core';
-import { IconButtonTypes, LoadingService } from '@iqser/common-ui';
+import { CircleButtonComponent, IconButtonComponent, IconButtonTypes, LoadingService } from '@iqser/common-ui';
import { Dictionary, DictionaryEntryType, DictionaryEntryTypes, DictionaryType, Dossier, DossierTemplate, IDictionary } from '@red/domain';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { DictionaryService } from '@services/entity-services/dictionary.service';
@@ -12,6 +12,15 @@ import { Debounce, List } from '@iqser/common-ui/lib/utils';
import IModelDeltaDecoration = monaco.editor.IModelDeltaDecoration;
import FindMatch = monaco.editor.FindMatch;
import { firstValueFrom } from 'rxjs';
+import { MatIcon } from '@angular/material/icon';
+import { NgForOf, NgIf } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+import { TranslateModule } from '@ngx-translate/core';
+import { MatTooltip } from '@angular/material/tooltip';
+import { MatCheckbox } from '@angular/material/checkbox';
+import { MatFormField } from '@angular/material/form-field';
+import { MatOption, MatSelect } from '@angular/material/select';
+import { MatDivider } from '@angular/material/divider';
const COMPARE_ENTRIES_ERROR = 'compare-entries-error';
const SMOOTH_SCROLL = 0;
@@ -25,6 +34,23 @@ const HELP_MODE_KEYS = {
selector: 'redaction-dictionary-manager',
templateUrl: './dictionary-manager.component.html',
styleUrls: ['./dictionary-manager.component.scss'],
+ standalone: true,
+ imports: [
+ MatIcon,
+ NgIf,
+ FormsModule,
+ TranslateModule,
+ CircleButtonComponent,
+ MatTooltip,
+ MatCheckbox,
+ MatFormField,
+ MatSelect,
+ MatOption,
+ MatDivider,
+ NgForOf,
+ IconButtonComponent,
+ EditorComponent,
+ ],
})
export class DictionaryManagerComponent implements OnChanges, OnInit {
private _searchDecorations: string[] = [];
diff --git a/apps/red-ui/src/app/modules/shared/components/donut-chart/donut-chart.component.ts b/apps/red-ui/src/app/modules/shared/components/donut-chart/donut-chart.component.ts
index e2925e41d..00435a9e5 100644
--- a/apps/red-ui/src/app/modules/shared/components/donut-chart/donut-chart.component.ts
+++ b/apps/red-ui/src/app/modules/shared/components/donut-chart/donut-chart.component.ts
@@ -1,6 +1,5 @@
import { Component, EventEmitter, Input, OnChanges, OnInit, Optional, Output, TemplateRef } from '@angular/core';
import { DonutChartConfig } from '@red/domain';
-import { IqserHelpModeModule } from '@iqser/common-ui';
import { Observable, of } from 'rxjs';
import { map } from 'rxjs/operators';
import { AsyncPipe, NgForOf, NgIf, NgTemplateOutlet } from '@angular/common';
@@ -14,7 +13,7 @@ import { StatusBarComponent } from '@iqser/common-ui/lib/shared';
templateUrl: './donut-chart.component.html',
styleUrls: ['./donut-chart.component.scss'],
standalone: true,
- imports: [NgForOf, NgIf, MatSelectModule, IqserHelpModeModule, StatusBarComponent, AsyncPipe, NgTemplateOutlet],
+ imports: [NgForOf, NgIf, MatSelectModule, StatusBarComponent, AsyncPipe, NgTemplateOutlet],
})
export class DonutChartComponent implements OnChanges, OnInit {
@Input() subtitles: string[] = [];
@@ -110,8 +109,8 @@ export class DonutChartComponent implements OnChanges, OnInit {
return this.totalType === 'simpleLabel'
? `${label}`
: this.totalType === 'sum'
- ? `${this.getFormattedValue(value)} ${label}`
- : `${label} (${this.getFormattedValue(value)} ${this.counterText})`;
+ ? `${this.getFormattedValue(value)} ${label}`
+ : `${label} (${this.getFormattedValue(value)} ${this.counterText})`;
}
selectValue(key: string): void {
diff --git a/apps/red-ui/src/app/modules/shared/components/dossier-name-column/dossier-name-column.component.ts b/apps/red-ui/src/app/modules/shared/components/dossier-name-column/dossier-name-column.component.ts
index 142dbdef6..b2178e0c7 100644
--- a/apps/red-ui/src/app/modules/shared/components/dossier-name-column/dossier-name-column.component.ts
+++ b/apps/red-ui/src/app/modules/shared/components/dossier-name-column/dossier-name-column.component.ts
@@ -4,6 +4,9 @@ import { DossierStats, IDossier } from '@red/domain';
import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service';
import { dateWithoutTime } from '@utils/functions';
import dayjs from 'dayjs';
+import { MatTooltip } from '@angular/material/tooltip';
+import { MatIcon } from '@angular/material/icon';
+import { DatePipe, NgIf } from '@angular/common';
const DUE_DATE_WARN_DAYS = 14;
@@ -20,6 +23,8 @@ export interface PartialDossier extends Partial {
selector: 'redaction-dossier-name-column',
templateUrl: './dossier-name-column.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
+ standalone: true,
+ imports: [MatTooltip, MatIcon, NgIf, DatePipe],
})
export class DossierNameColumnComponent {
@Input() dossier: PartialDossier;
diff --git a/apps/red-ui/src/app/modules/shared/components/dossier-state/dossier-state.component.ts b/apps/red-ui/src/app/modules/shared/components/dossier-state/dossier-state.component.ts
index f22a673b6..f29a69db1 100644
--- a/apps/red-ui/src/app/modules/shared/components/dossier-state/dossier-state.component.ts
+++ b/apps/red-ui/src/app/modules/shared/components/dossier-state/dossier-state.component.ts
@@ -2,12 +2,17 @@ import { ChangeDetectionStrategy, Component, Input, OnChanges } from '@angular/c
import { Dossier, DossierState } from '@red/domain';
import { DossierStatesMapService } from '@services/entity-services/dossier-states-map.service';
import { Observable } from 'rxjs';
+import { SmallChipComponent } from '@common-ui/shared';
+import { AsyncPipe } from '@angular/common';
+import { TranslateModule } from '@ngx-translate/core';
@Component({
selector: 'redaction-dossier-state [dossier]',
templateUrl: './dossier-state.component.html',
styleUrls: ['./dossier-state.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
+ standalone: true,
+ imports: [SmallChipComponent, AsyncPipe, TranslateModule],
})
export class DossierStateComponent implements OnChanges {
@Input() dossier: Dossier;
diff --git a/apps/red-ui/src/app/modules/shared/components/dossier-watermark-selector/watermark-selector.component.ts b/apps/red-ui/src/app/modules/shared/components/dossier-watermark-selector/watermark-selector.component.ts
index 14b47c44d..165278a34 100644
--- a/apps/red-ui/src/app/modules/shared/components/dossier-watermark-selector/watermark-selector.component.ts
+++ b/apps/red-ui/src/app/modules/shared/components/dossier-watermark-selector/watermark-selector.component.ts
@@ -1,12 +1,16 @@
+import { AsyncPipe, NgForOf, NgIf } from '@angular/common';
import { ChangeDetectionStrategy, Component, Input, OnChanges, SimpleChanges } from '@angular/core';
-import { BehaviorSubject, Observable } from 'rxjs';
-import { FormFieldComponent } from '@iqser/common-ui';
-import { filter, map, tap } from 'rxjs/operators';
import { NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';
+import { MatCheckbox, MatCheckboxChange } from '@angular/material/checkbox';
+import { MatFormField } from '@angular/material/form-field';
+import { MatIcon } from '@angular/material/icon';
+import { MatOption, MatSelect, MatSelectTrigger } from '@angular/material/select';
+import { FormFieldComponent } from '@common-ui/inputs/form-field/form-field-component.directive';
+import { shareLast } from '@iqser/common-ui/lib/utils';
import { Watermark } from '@red/domain';
import { WatermarksMapService } from '@services/entity-services/watermarks-map.service';
-import { MatCheckboxChange } from '@angular/material/checkbox';
-import { shareLast } from '@iqser/common-ui/lib/utils';
+import { BehaviorSubject, Observable } from 'rxjs';
+import { filter, map, tap } from 'rxjs/operators';
@Component({
selector: 'redaction-watermark-selector [dossierTemplateId] [label]',
@@ -25,6 +29,8 @@ import { shareLast } from '@iqser/common-ui/lib/utils';
useExisting: WatermarkSelectorComponent,
},
],
+ standalone: true,
+ imports: [NgIf, AsyncPipe, MatCheckbox, MatFormField, MatSelectTrigger, MatSelect, MatIcon, MatOption, NgForOf],
})
export class WatermarkSelectorComponent extends FormFieldComponent implements OnChanges {
#watermarks: Watermark[] = [];
diff --git a/apps/red-ui/src/app/modules/shared/components/dossiers-type-switch/dossiers-type-switch.component.ts b/apps/red-ui/src/app/modules/shared/components/dossiers-type-switch/dossiers-type-switch.component.ts
index 3febb956a..d5e520b58 100644
--- a/apps/red-ui/src/app/modules/shared/components/dossiers-type-switch/dossiers-type-switch.component.ts
+++ b/apps/red-ui/src/app/modules/shared/components/dossiers-type-switch/dossiers-type-switch.component.ts
@@ -2,12 +2,17 @@ import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
import { ARCHIVE_ROUTE, DOSSIER_TEMPLATE_ID, DOSSIERS_ROUTE } from '@red/domain';
import { DashboardStatsService } from '@services/dossier-templates/dashboard-stats.service';
import { getParam } from '@iqser/common-ui/lib/utils';
+import { AsyncPipe, NgIf } from '@angular/common';
+import { RouterLink, RouterLinkActive } from '@angular/router';
+import { TranslateModule } from '@ngx-translate/core';
@Component({
selector: 'redaction-dossiers-type-switch',
templateUrl: './dossiers-type-switch.component.html',
styleUrls: ['./dossiers-type-switch.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
+ standalone: true,
+ imports: [NgIf, AsyncPipe, RouterLink, RouterLinkActive, TranslateModule],
})
export class DossiersTypeSwitchComponent {
readonly DOSSIERS_ROUTE = DOSSIERS_ROUTE;
diff --git a/apps/red-ui/src/app/modules/shared/components/editor/editor.component.ts b/apps/red-ui/src/app/modules/shared/components/editor/editor.component.ts
index e15b60cc3..ffd19b7d1 100644
--- a/apps/red-ui/src/app/modules/shared/components/editor/editor.component.ts
+++ b/apps/red-ui/src/app/modules/shared/components/editor/editor.component.ts
@@ -11,6 +11,9 @@ import IDiffEditor = monaco.editor.IDiffEditor;
import IModelDeltaDecoration = monaco.editor.IModelDeltaDecoration;
import ILineChange = monaco.editor.ILineChange;
import IEditorMouseEvent = monaco.editor.IEditorMouseEvent;
+import { MonacoEditorModule, MonacoStandaloneCodeEditor, MonacoStandaloneDiffEditor } from '@materia-ui/ngx-monaco-editor';
+import { FormsModule } from '@angular/forms';
+import { NgIf } from '@angular/common';
const MIN_WORD_LENGTH = 2;
const lineChangeToDecoration = ({ originalEndLineNumber, originalStartLineNumber }: ILineChange) =>
@@ -28,6 +31,8 @@ const notZero = (lineChange: ILineChange) => lineChange.originalEndLineNumber !=
selector: 'redaction-editor',
templateUrl: './editor.component.html',
styleUrls: ['./editor.component.scss'],
+ standalone: true,
+ imports: [MonacoEditorModule, FormsModule, NgIf],
})
export class EditorComponent implements OnInit, OnChanges {
#initialEntriesSet = new Set();
@@ -107,7 +112,7 @@ export class EditorComponent implements OnInit, OnChanges {
};
}
- onDiffEditorInit(editor: IDiffEditor): void {
+ onDiffEditorInit(editor: MonacoStandaloneDiffEditor): void {
this._diffEditor = editor;
this.codeEditor = editor.getModifiedEditor();
this.#addMarginButtons();
@@ -120,7 +125,7 @@ export class EditorComponent implements OnInit, OnChanges {
this.#setTheme();
}
- onCodeEditorInit(editor: ICodeEditor): void {
+ onCodeEditorInit(editor: MonacoStandaloneCodeEditor): void {
this.codeEditor = editor;
this.#setTheme();
}
diff --git a/apps/red-ui/src/app/modules/shared/components/expandable-file-actions/expandable-file-actions.component.ts b/apps/red-ui/src/app/modules/shared/components/expandable-file-actions/expandable-file-actions.component.ts
index 7d2ab4a41..8f310dc0d 100644
--- a/apps/red-ui/src/app/modules/shared/components/expandable-file-actions/expandable-file-actions.component.ts
+++ b/apps/red-ui/src/app/modules/shared/components/expandable-file-actions/expandable-file-actions.component.ts
@@ -1,18 +1,40 @@
import { Component, inject, Input, OnChanges, SimpleChanges, ViewChild } from '@angular/core';
import { Action, ActionTypes, Dossier, File } from '@red/domain';
-import { CircleButtonType, IqserDialog, Toaster } from '@iqser/common-ui';
+import { CircleButtonComponent, CircleButtonType, IqserDialog, StopPropagationDirective, Toaster } from '@iqser/common-ui';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { FileDownloadService } from '@upload-download/services/file-download.service';
import { PermissionsService } from '@services/permissions.service';
-import { MatMenuTrigger } from '@angular/material/menu';
+import { MatMenu, MatMenuItem, MatMenuTrigger } from '@angular/material/menu';
import { DownloadDialogComponent } from '@shared/dialogs/download-dialog/download-dialog.component';
import { IqserTooltipPosition, trackByFactory } from '@iqser/common-ui/lib/utils';
-import { APP_BASE_HREF } from '@angular/common';
+import { APP_BASE_HREF, AsyncPipe, NgClass, NgForOf, NgIf } from '@angular/common';
+import { TranslateModule } from '@ngx-translate/core';
+import { FileDownloadBtnComponent } from '@shared/components/buttons/file-download-btn/file-download-btn.component';
+import { MatSlideToggle } from '@angular/material/slide-toggle';
+import { MatTooltip } from '@angular/material/tooltip';
+import { MatIcon } from '@angular/material/icon';
@Component({
selector: 'redaction-expandable-file-actions',
templateUrl: './expandable-file-actions.component.html',
styleUrls: ['./expandable-file-actions.component.scss'],
+ standalone: true,
+ imports: [
+ CircleButtonComponent,
+ TranslateModule,
+ AsyncPipe,
+ FileDownloadBtnComponent,
+ NgIf,
+ MatSlideToggle,
+ MatTooltip,
+ NgClass,
+ MatMenuTrigger,
+ MatMenu,
+ MatIcon,
+ MatMenuItem,
+ NgForOf,
+ StopPropagationDirective,
+ ],
})
export class ExpandableFileActionsComponent implements OnChanges {
@Input({ required: true }) actions: Action[];
diff --git a/apps/red-ui/src/app/modules/shared/components/file-name-column/file-name-column.component.ts b/apps/red-ui/src/app/modules/shared/components/file-name-column/file-name-column.component.ts
index 1bc56cb18..cea2dc564 100644
--- a/apps/red-ui/src/app/modules/shared/components/file-name-column/file-name-column.component.ts
+++ b/apps/red-ui/src/app/modules/shared/components/file-name-column/file-name-column.component.ts
@@ -15,6 +15,10 @@ import { FileAttributesService } from '@services/entity-services/file-attributes
import { combineLatest, map, ReplaySubject } from 'rxjs';
import { ContextComponent } from '@iqser/common-ui/lib/utils';
import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service';
+import { MatTooltip } from '@angular/material/tooltip';
+import { AsyncPipe, NgIf } from '@angular/common';
+import { FileAttributeComponent } from '../../../dossier-overview/components/file-attribute/file-attribute.component';
+import { FileStatsComponent } from '@shared/components/file-stats/file-stats.component';
interface FileNameColumnContext {
primaryAttribute: IFileAttributeConfig;
@@ -25,6 +29,8 @@ interface FileNameColumnContext {
templateUrl: './file-name-column.component.html',
styleUrls: ['./file-name-column.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
+ standalone: true,
+ imports: [MatTooltip, NgIf, AsyncPipe, FileAttributeComponent, FileStatsComponent],
})
export class FileNameColumnComponent extends ContextComponent implements OnInit, OnChanges {
readonly #reloadAttribute = new ReplaySubject(1);
diff --git a/apps/red-ui/src/app/modules/shared/components/file-stats/file-stats.component.ts b/apps/red-ui/src/app/modules/shared/components/file-stats/file-stats.component.ts
index a17a7c2ca..68ccc8e60 100644
--- a/apps/red-ui/src/app/modules/shared/components/file-stats/file-stats.component.ts
+++ b/apps/red-ui/src/app/modules/shared/components/file-stats/file-stats.component.ts
@@ -1,9 +1,16 @@
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
+import { MatIcon } from '@angular/material/icon';
+import { MatTooltip } from '@angular/material/tooltip';
+import { NgIf } from '@angular/common';
+import { TranslateModule } from '@ngx-translate/core';
+import { DatePipe } from '@shared/pipes/date.pipe';
@Component({
selector: 'redaction-file-stats',
templateUrl: './file-stats.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
+ standalone: true,
+ imports: [MatIcon, MatTooltip, NgIf, TranslateModule, DatePipe],
})
export class FileStatsComponent {
@Input() file: { numberOfPages: number; excludedPages: number[]; lastOCRTime?: string };
diff --git a/apps/red-ui/src/app/modules/shared/components/ocr-progress-bar/ocr-progress-bar.component.ts b/apps/red-ui/src/app/modules/shared/components/ocr-progress-bar/ocr-progress-bar.component.ts
index 0dffab4c7..28d27e7fa 100644
--- a/apps/red-ui/src/app/modules/shared/components/ocr-progress-bar/ocr-progress-bar.component.ts
+++ b/apps/red-ui/src/app/modules/shared/components/ocr-progress-bar/ocr-progress-bar.component.ts
@@ -1,10 +1,15 @@
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
+import { MatProgressBar } from '@angular/material/progress-bar';
+import { NgIf, PercentPipe } from '@angular/common';
+import { MatTooltip } from '@angular/material/tooltip';
@Component({
selector: 'redaction-ocr-progress-bar',
templateUrl: './ocr-progress-bar.component.html',
styleUrls: ['./ocr-progress-bar.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
+ standalone: true,
+ imports: [MatProgressBar, NgIf, MatTooltip, PercentPipe],
})
export class OcrProgressBarComponent {
@Input() numberOfPagesToOCR: number;
diff --git a/apps/red-ui/src/app/modules/shared/components/processing-indicator/processing-indicator.component.ts b/apps/red-ui/src/app/modules/shared/components/processing-indicator/processing-indicator.component.ts
index c70b5a778..88d8785b0 100644
--- a/apps/red-ui/src/app/modules/shared/components/processing-indicator/processing-indicator.component.ts
+++ b/apps/red-ui/src/app/modules/shared/components/processing-indicator/processing-indicator.component.ts
@@ -1,12 +1,18 @@
import { ChangeDetectionStrategy, Component, Input, OnChanges } from '@angular/core';
import { File } from '@red/domain';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
+import { MatTooltip } from '@angular/material/tooltip';
+import { TranslateModule } from '@ngx-translate/core';
+import { MatIcon } from '@angular/material/icon';
+import { NgIf } from '@angular/common';
@Component({
selector: 'redaction-processing-indicator [file]',
templateUrl: './processing-indicator.component.html',
styleUrls: ['./processing-indicator.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
+ standalone: true,
+ imports: [MatTooltip, TranslateModule, MatIcon, NgIf],
})
export class ProcessingIndicatorComponent implements OnChanges {
tooltip: string;
diff --git a/apps/red-ui/src/app/modules/shared/components/team-members/team-members.component.ts b/apps/red-ui/src/app/modules/shared/components/team-members/team-members.component.ts
index 9272c9f73..e1167277d 100644
--- a/apps/red-ui/src/app/modules/shared/components/team-members/team-members.component.ts
+++ b/apps/red-ui/src/app/modules/shared/components/team-members/team-members.component.ts
@@ -1,16 +1,21 @@
+import { NgForOf, NgIf } from '@angular/common';
import { Component, ElementRef, EventEmitter, inject, Input, OnChanges, Output, ViewChild } from '@angular/core';
-import { CircleButtonTypes } from '@iqser/common-ui';
-import { DossiersDialogService } from '../../../shared-dossiers/services/dossiers-dialog.service';
-import { Roles } from '@users/roles';
-import { User } from '@red/domain';
-import { UserService } from '@users/user.service';
-import { getCurrentUser } from '@iqser/common-ui/lib/users';
+import { MatIcon } from '@angular/material/icon';
+import { CircleButtonComponent, CircleButtonTypes, IqserAllowDirective, largeDialogConfig } from '@iqser/common-ui';
+import { getCurrentUser, InitialsAvatarComponent } from '@iqser/common-ui/lib/users';
import { List } from '@iqser/common-ui/lib/utils';
+import { TranslateModule } from '@ngx-translate/core';
+import { User } from '@red/domain';
+import { Roles } from '@users/roles';
+import { UserService } from '@users/user.service';
+import { DossiersDialogService } from '../../../shared-dossiers/services/dossiers-dialog.service';
@Component({
selector: 'redaction-team-members',
templateUrl: './team-members.component.html',
styleUrls: ['./team-members.component.scss'],
+ standalone: true,
+ imports: [NgForOf, InitialsAvatarComponent, NgIf, MatIcon, CircleButtonComponent, IqserAllowDirective, TranslateModule],
})
export class TeamMembersComponent implements OnChanges {
readonly circleButtonTypes = CircleButtonTypes;
@@ -58,8 +63,11 @@ export class TeamMembersComponent implements OnChanges {
return this.canRemove && !this.unremovableMembers.includes(userId);
}
- openEditDossierDialog(): void {
+ async openEditDossierDialog() {
const data = { dossierId: this.dossierId, section: 'members' };
- this._dialogService.openDialog('editDossier', data);
+ const editDossierDialogComponent = await import(
+ '../../../shared-dossiers/dialogs/edit-dossier-dialog/edit-dossier-dialog.component'
+ ).then(m => m.EditDossierDialogComponent);
+ this._dialogService.open(editDossierDialogComponent, data, { ...largeDialogConfig, width: '98vw', maxWidth: '98vw' });
}
}
diff --git a/apps/red-ui/src/app/modules/shared/components/type-filter/type-filter.component.ts b/apps/red-ui/src/app/modules/shared/components/type-filter/type-filter.component.ts
index 13c2f4b27..a269799cd 100644
--- a/apps/red-ui/src/app/modules/shared/components/type-filter/type-filter.component.ts
+++ b/apps/red-ui/src/app/modules/shared/components/type-filter/type-filter.component.ts
@@ -1,11 +1,16 @@
import { Component, Input, OnChanges } from '@angular/core';
import { INestedFilter } from '@iqser/common-ui/lib/filtering';
-import { TranslateService } from '@ngx-translate/core';
+import { TranslateModule, TranslateService } from '@ngx-translate/core';
+import { AsyncPipe, NgIf } from '@angular/common';
+import { MatIcon } from '@angular/material/icon';
+import { AnnotationIconComponent } from '@shared/components/annotation-icon/annotation-icon.component';
@Component({
selector: 'redaction-type-filter',
templateUrl: './type-filter.component.html',
styleUrls: ['./type-filter.component.scss'],
+ standalone: true,
+ imports: [NgIf, MatIcon, AnnotationIconComponent, AsyncPipe, TranslateModule],
})
export class TypeFilterComponent implements OnChanges {
private _needsAnalysisKeys: string[] = ['remove-only-here', 'analysis'];
diff --git a/apps/red-ui/src/app/modules/shared/custom-date-formatting.provider.ts b/apps/red-ui/src/app/modules/shared/custom-date-formatting.provider.ts
new file mode 100644
index 000000000..8ad493936
--- /dev/null
+++ b/apps/red-ui/src/app/modules/shared/custom-date-formatting.provider.ts
@@ -0,0 +1,25 @@
+import { DateAdapter, MAT_DATE_FORMATS } from '@angular/material/core';
+import { CustomDateAdapter } from '@shared/CustomDateAdapter';
+
+export function provideCustomDateFormatter() {
+ return [
+ {
+ provide: DateAdapter,
+ useClass: CustomDateAdapter,
+ },
+ {
+ provide: MAT_DATE_FORMATS,
+ useValue: {
+ parse: {
+ dateInput: 'D/M/YY',
+ },
+ display: {
+ dateInput: 'D/M/YY',
+ monthYearLabel: 'YYYY',
+ dateA11yLabel: 'LL',
+ monthYearA11yLabel: 'YYYY',
+ },
+ },
+ },
+ ];
+}
diff --git a/apps/red-ui/src/app/modules/shared/dialogs/add-dossier-dialog/add-dossier-dialog.component.ts b/apps/red-ui/src/app/modules/shared/dialogs/add-dossier-dialog/add-dossier-dialog.component.ts
index 5598a419b..b79ea0e3d 100644
--- a/apps/red-ui/src/app/modules/shared/dialogs/add-dossier-dialog/add-dossier-dialog.component.ts
+++ b/apps/red-ui/src/app/modules/shared/dialogs/add-dossier-dialog/add-dossier-dialog.component.ts
@@ -1,16 +1,39 @@
+import { NgForOf, NgIf } from '@angular/common';
import { Component, Inject, OnInit } from '@angular/core';
-import { Validators } from '@angular/forms';
+import { ReactiveFormsModule, Validators } from '@angular/forms';
+import { MatCheckbox } from '@angular/material/checkbox';
+import { MatDatepickerModule } from '@angular/material/datepicker';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
+import { MatFormField, MatSuffix } from '@angular/material/form-field';
+import { MatIcon } from '@angular/material/icon';
+import { MatOption, MatSelect } from '@angular/material/select';
+import { MatTooltip } from '@angular/material/tooltip';
import { Router } from '@angular/router';
-import { BaseDialogComponent, getConfig, IconButtonTypes, IqserPermissionsService, SaveOptions } from '@iqser/common-ui';
+import {
+ BaseDialogComponent,
+ CircleButtonComponent,
+ getConfig,
+ HasScrollbarDirective,
+ HelpButtonComponent,
+ IconButtonComponent,
+ IconButtonTypes,
+ IqserDenyDirective,
+ IqserPermissionsService,
+ largeDialogConfig,
+ SaveOptions,
+} from '@iqser/common-ui';
+import { TranslateModule } from '@ngx-translate/core';
import { DOSSIER_TEMPLATE_ID, DownloadFileType, IDossierRequest, IDossierTemplate, IReportTemplate } from '@red/domain';
import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service';
import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service';
import { ReportTemplateService } from '@services/report-template.service';
+import { WatermarkSelectorComponent } from '@shared/components/dossier-watermark-selector/watermark-selector.component';
+import { SelectComponent } from '@shared/components/select/select.component';
import { downloadTypesTranslations } from '@translations/download-types-translations';
import { Roles } from '@users/roles';
import dayjs from 'dayjs';
import { firstValueFrom } from 'rxjs';
+import { EditDossierDialogComponent } from '../../../shared-dossiers/dialogs/edit-dossier-dialog/edit-dossier-dialog.component';
import { DossiersDialogService } from '../../../shared-dossiers/services/dossiers-dialog.service';
interface DialogData {
@@ -20,6 +43,28 @@ interface DialogData {
@Component({
templateUrl: './add-dossier-dialog.component.html',
styleUrls: ['./add-dossier-dialog.component.scss'],
+ standalone: true,
+ imports: [
+ ReactiveFormsModule,
+ NgIf,
+ TranslateModule,
+ MatFormField,
+ MatSelect,
+ MatOption,
+ NgForOf,
+ MatTooltip,
+ HasScrollbarDirective,
+ WatermarkSelectorComponent,
+ MatCheckbox,
+ MatDatepickerModule,
+ MatIcon,
+ SelectComponent,
+ IqserDenyDirective,
+ IconButtonComponent,
+ HelpButtonComponent,
+ CircleButtonComponent,
+ MatSuffix,
+ ],
})
export class AddDossierDialogComponent extends BaseDialogComponent implements OnInit {
readonly config = getConfig();
@@ -80,10 +125,14 @@ export class AddDossierDialogComponent extends BaseDialogComponent implements On
if (savedDossier) {
await this._router.navigate([savedDossier.routerLink]);
if (options?.nextAction) {
- this._dialogService.openDialog('editDossier', {
- dossierId: savedDossier.id,
- section: 'members',
- });
+ this._dialogService.open(
+ EditDossierDialogComponent,
+ {
+ dossierId: savedDossier.id,
+ section: 'members',
+ },
+ { ...largeDialogConfig, width: '98vw', maxWidth: '98vw' },
+ );
}
this._dialogRef.close(savedDossier);
}
diff --git a/apps/red-ui/src/app/modules/shared/directives/long-press.directive.ts b/apps/red-ui/src/app/modules/shared/directives/long-press.directive.ts
index f69a381ac..d5d6979e1 100644
--- a/apps/red-ui/src/app/modules/shared/directives/long-press.directive.ts
+++ b/apps/red-ui/src/app/modules/shared/directives/long-press.directive.ts
@@ -8,6 +8,7 @@ export interface LongPressEvent {
@Directive({
selector: '[redactionLongPress]',
+ standalone: true,
})
export class LongPressDirective {
@Output() longPress = new EventEmitter();
diff --git a/apps/red-ui/src/app/modules/shared/directives/navigate-last-dossiers-screen.directive.ts b/apps/red-ui/src/app/modules/shared/directives/navigate-last-dossiers-screen.directive.ts
index 7410fa19c..ed447c55c 100644
--- a/apps/red-ui/src/app/modules/shared/directives/navigate-last-dossiers-screen.directive.ts
+++ b/apps/red-ui/src/app/modules/shared/directives/navigate-last-dossiers-screen.directive.ts
@@ -3,6 +3,7 @@ import { RouterHistoryService } from '@services/router-history.service';
@Directive({
selector: '[redactionNavigateLastDossiersScreen]',
+ standalone: true,
})
export class NavigateLastDossiersScreenDirective {
constructor(private readonly _routerHistoryService: RouterHistoryService) {}
diff --git a/apps/red-ui/src/app/modules/shared/pipes/date.pipe.ts b/apps/red-ui/src/app/modules/shared/pipes/date.pipe.ts
index c633e678a..632f71bfd 100644
--- a/apps/red-ui/src/app/modules/shared/pipes/date.pipe.ts
+++ b/apps/red-ui/src/app/modules/shared/pipes/date.pipe.ts
@@ -6,9 +6,13 @@ import dayjs from 'dayjs';
@Pipe({
name: 'date',
+ standalone: true,
})
export class DatePipe extends BaseDatePipe implements PipeTransform {
- constructor(@Inject(LOCALE_ID) private readonly _locale: string, private readonly _translateService: TranslateService) {
+ constructor(
+ @Inject(LOCALE_ID) private readonly _locale: string,
+ private readonly _translateService: TranslateService,
+ ) {
super(_locale);
}
diff --git a/apps/red-ui/src/app/modules/shared/services/dialog.service.ts b/apps/red-ui/src/app/modules/shared/services/dialog.service.ts
index edb55c943..c5781554a 100644
--- a/apps/red-ui/src/app/modules/shared/services/dialog.service.ts
+++ b/apps/red-ui/src/app/modules/shared/services/dialog.service.ts
@@ -5,7 +5,7 @@ import { ConfirmationDialogComponent, DialogConfig, DialogService } from '@iqser
type DialogType = 'addDossier' | 'confirm';
-@Injectable()
+@Injectable({ providedIn: 'root' })
export class SharedDialogService extends DialogService {
protected readonly _config: DialogConfig = {
confirm: {
diff --git a/apps/red-ui/src/app/modules/shared/shared.module.ts b/apps/red-ui/src/app/modules/shared/shared.module.ts
deleted file mode 100644
index d7330bd16..000000000
--- a/apps/red-ui/src/app/modules/shared/shared.module.ts
+++ /dev/null
@@ -1,130 +0,0 @@
-import { NgModule } from '@angular/core';
-import { CommonModule } from '@angular/common';
-import { ScrollingModule } from '@angular/cdk/scrolling';
-import { FileDownloadBtnComponent } from './components/buttons/file-download-btn/file-download-btn.component';
-import { MatConfigModule } from '../mat-config/mat-config.module';
-import { IconsModule } from '../icons/icons.module';
-import { FormsModule, ReactiveFormsModule } from '@angular/forms';
-import { AnnotationIconComponent } from './components/annotation-icon/annotation-icon.component';
-import { DonutChartComponent } from './components/donut-chart/donut-chart.component';
-import {
- CircleButtonComponent,
- DynamicInputComponent,
- HasScrollbarDirective,
- IconButtonComponent,
- IqserAllowDirective,
- IqserDenyDirective,
- IqserHelpModeModule,
- RoundCheckboxComponent,
- StopPropagationDirective,
-} from '@iqser/common-ui';
-import { NavigateLastDossiersScreenDirective } from './directives/navigate-last-dossiers-screen.directive';
-import { DictionaryManagerComponent } from './components/dictionary-manager/dictionary-manager.component';
-import { MonacoEditorModule } from '@materia-ui/ngx-monaco-editor';
-import { AssignUserDropdownComponent } from './components/assign-user-dropdown/assign-user-dropdown.component';
-import { DatePipe } from './pipes/date.pipe';
-import { LongPressDirective } from './directives/long-press.directive';
-import { TypeFilterComponent } from './components/type-filter/type-filter.component';
-import { TeamMembersComponent } from './components/team-members/team-members.component';
-import { EditorComponent } from './components/editor/editor.component';
-import { ExpandableFileActionsComponent } from './components/expandable-file-actions/expandable-file-actions.component';
-import { ProcessingIndicatorComponent } from './components/processing-indicator/processing-indicator.component';
-import { DossierStateComponent } from './components/dossier-state/dossier-state.component';
-import { FileStatsComponent } from './components/file-stats/file-stats.component';
-import { FileNameColumnComponent } from './components/file-name-column/file-name-column.component';
-import { DossierNameColumnComponent } from './components/dossier-name-column/dossier-name-column.component';
-import { DateAdapter, MAT_DATE_FORMATS } from '@angular/material/core';
-import { DossiersTypeSwitchComponent } from './components/dossiers-type-switch/dossiers-type-switch.component';
-import { TranslateModule } from '@ngx-translate/core';
-import { RouterModule } from '@angular/router';
-import { AddDossierDialogComponent } from './dialogs/add-dossier-dialog/add-dossier-dialog.component';
-import { SharedDialogService } from './services/dialog.service';
-import { AddEditEntityComponent } from './components/add-edit-entity/add-edit-entity.component';
-import { ColorPickerModule } from 'ngx-color-picker';
-import { WatermarkSelectorComponent } from './components/dossier-watermark-selector/watermark-selector.component';
-import { OcrProgressBarComponent } from './components/ocr-progress-bar/ocr-progress-bar.component';
-import { CustomDateAdapter } from '@shared/CustomDateAdapter';
-import { IqserUsersModule } from '@iqser/common-ui/lib/users';
-import { SmallChipComponent } from '@iqser/common-ui/lib/shared';
-import { SelectComponent } from '@shared/components/select/select.component';
-import { FileAttributeComponent } from '../dossier-overview/components/file-attribute/file-attribute.component';
-import { MatDividerModule } from '@angular/material/divider';
-
-const buttons = [FileDownloadBtnComponent];
-
-const components = [
- AnnotationIconComponent,
- DictionaryManagerComponent,
- AssignUserDropdownComponent,
- TypeFilterComponent,
- TeamMembersComponent,
- ExpandableFileActionsComponent,
- ProcessingIndicatorComponent,
- DossierStateComponent,
- DossierNameColumnComponent,
- FileStatsComponent,
- FileNameColumnComponent,
- DossiersTypeSwitchComponent,
- AddDossierDialogComponent,
- WatermarkSelectorComponent,
- AddEditEntityComponent,
- OcrProgressBarComponent,
-
- ...buttons,
-];
-
-const utils = [DatePipe, NavigateLastDossiersScreenDirective, LongPressDirective];
-
-const services = [SharedDialogService];
-
-const modules = [MatConfigModule, ScrollingModule, IconsModule, FormsModule, ReactiveFormsModule, ColorPickerModule];
-
-const deleteThisWhenAllComponentsAreStandalone = [DonutChartComponent, FileAttributeComponent];
-
-@NgModule({
- declarations: [...components, ...utils, EditorComponent],
- imports: [
- CommonModule,
- ...modules,
- MonacoEditorModule,
- TranslateModule,
- RouterModule,
- IqserHelpModeModule,
- IqserUsersModule,
- ...deleteThisWhenAllComponentsAreStandalone,
- CircleButtonComponent,
- IconButtonComponent,
- SmallChipComponent,
- StopPropagationDirective,
- HasScrollbarDirective,
- IqserAllowDirective,
- IqserDenyDirective,
- SelectComponent,
- RoundCheckboxComponent,
- DynamicInputComponent,
- MatDividerModule,
- ],
- exports: [...modules, ...components, ...utils, ...deleteThisWhenAllComponentsAreStandalone],
- providers: [
- ...services,
- {
- provide: DateAdapter,
- useClass: CustomDateAdapter,
- },
- {
- provide: MAT_DATE_FORMATS,
- useValue: {
- parse: {
- dateInput: 'D/M/YY',
- },
- display: {
- dateInput: 'D/M/YY',
- monthYearLabel: 'YYYY',
- dateA11yLabel: 'LL',
- monthYearA11yLabel: 'YYYY',
- },
- },
- },
- ],
-})
-export class SharedModule {}
diff --git a/apps/red-ui/src/app/modules/trash/trash-screen/trash-screen.component.ts b/apps/red-ui/src/app/modules/trash/trash-screen/trash-screen.component.ts
index a40d314c3..76263b639 100644
--- a/apps/red-ui/src/app/modules/trash/trash-screen/trash-screen.component.ts
+++ b/apps/red-ui/src/app/modules/trash/trash-screen/trash-screen.component.ts
@@ -1,6 +1,13 @@
import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
-import { ListingComponent, listingProvidersFactory, LoadingService, TableColumnConfig } from '@iqser/common-ui';
+import {
+ CircleButtonComponent,
+ IqserListingModule,
+ ListingComponent,
+ listingProvidersFactory,
+ LoadingService,
+ TableColumnConfig,
+} from '@iqser/common-ui';
import { SortingOrders } from '@iqser/common-ui/lib/sorting';
import { TrashItem } from '@red/domain';
import { TrashService } from '@services/entity-services/trash.service';
@@ -8,6 +15,9 @@ import { RouterHistoryService } from '@services/router-history.service';
import { firstValueFrom, Observable } from 'rxjs';
import { distinctUntilChanged, map } from 'rxjs/operators';
import { TrashDialogService } from '../services/trash-dialog.service';
+import { TranslateModule } from '@ngx-translate/core';
+import { AsyncPipe, NgIf } from '@angular/common';
+import { TrashTableItemComponent } from './trash-table-item/trash-table-item.component';
@Component({
templateUrl: './trash-screen.component.html',
@@ -16,11 +26,13 @@ import { TrashDialogService } from '../services/trash-dialog.service';
entitiesService: TrashService,
component: TrashScreenComponent,
}),
+ standalone: true,
+ imports: [IqserListingModule, TranslateModule, CircleButtonComponent, NgIf, TrashTableItemComponent, AsyncPipe],
})
export class TrashScreenComponent extends ListingComponent implements OnInit {
readonly tableHeaderLabel = _('trash.table-header.title');
- readonly canRestoreSelected$ = this._canRestoreSelected$;
- readonly canHardDeleteSelected$ = this._canHardDeleteSelected$;
+ readonly canRestoreSelected$ = this.#canRestoreSelected$;
+ readonly canHardDeleteSelected$ = this.#canHardDeleteSelected$;
readonly tableColumnConfigs: TableColumnConfig[] = [
{ label: _('trash.table-col-names.name'), sortByKey: 'name' },
{ label: _('trash.table-col-names.owner'), class: 'user-column', sortByKey: 'ownerName' },
@@ -43,14 +55,14 @@ export class TrashScreenComponent extends ListingComponent implements
});
}
- private get _canRestoreSelected$(): Observable {
+ get #canRestoreSelected$(): Observable {
return this.listingService.selectedEntities$.pipe(
map(entities => entities.length && !entities.find(dossier => !(dossier.canRestore && dossier.hasRestoreRights))),
distinctUntilChanged(),
);
}
- private get _canHardDeleteSelected$(): Observable {
+ get #canHardDeleteSelected$(): Observable {
return this.listingService.selectedEntities$.pipe(
map(entities => entities.length && !entities.find(dossier => !dossier.hasHardDeleteRights)),
distinctUntilChanged(),
diff --git a/apps/red-ui/src/app/modules/trash/trash-screen/trash-table-item/trash-table-item.component.ts b/apps/red-ui/src/app/modules/trash/trash-screen/trash-table-item/trash-table-item.component.ts
index 6f8e263e9..12baf4873 100644
--- a/apps/red-ui/src/app/modules/trash/trash-screen/trash-table-item/trash-table-item.component.ts
+++ b/apps/red-ui/src/app/modules/trash/trash-screen/trash-table-item/trash-table-item.component.ts
@@ -2,15 +2,35 @@ import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnChanges, Out
import { Dossier, DossierStats, TrashFile, TrashItem, User } from '@red/domain';
import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service';
import { DossierStatsService } from '@services/dossiers/dossier-stats.service';
-import { PartialDossier } from '@shared/components/dossier-name-column/dossier-name-column.component';
+import { DossierNameColumnComponent, PartialDossier } from '@shared/components/dossier-name-column/dossier-name-column.component';
import { Observable } from 'rxjs';
-import { getCurrentUser } from '@common-ui/users';
+import { getCurrentUser, InitialsAvatarComponent } from '@common-ui/users';
+import { MatIcon } from '@angular/material/icon';
+import { FileNameColumnComponent } from '@shared/components/file-name-column/file-name-column.component';
+import { AsyncPipe, NgIf } from '@angular/common';
+import { CircleButtonComponent } from '@iqser/common-ui';
+import { RouterLink } from '@angular/router';
+import { TranslateModule } from '@ngx-translate/core';
+import { DatePipe } from '@shared/pipes/date.pipe';
@Component({
selector: 'redaction-trash-table-item [item]',
templateUrl: './trash-table-item.component.html',
styleUrls: ['./trash-table-item.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
+ standalone: true,
+ imports: [
+ MatIcon,
+ FileNameColumnComponent,
+ DossierNameColumnComponent,
+ NgIf,
+ InitialsAvatarComponent,
+ CircleButtonComponent,
+ AsyncPipe,
+ RouterLink,
+ DatePipe,
+ TranslateModule,
+ ],
})
export class TrashTableItemComponent implements OnChanges {
@Input() item: TrashItem;
diff --git a/apps/red-ui/src/app/modules/trash/trash.module.ts b/apps/red-ui/src/app/modules/trash/trash.module.ts
deleted file mode 100644
index cb0defa70..000000000
--- a/apps/red-ui/src/app/modules/trash/trash.module.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import { NgModule } from '@angular/core';
-import { CommonModule } from '@angular/common';
-import { RouterModule } from '@angular/router';
-import { TrashScreenComponent } from './trash-screen/trash-screen.component';
-import { CircleButtonComponent, IqserListingModule } from '@iqser/common-ui';
-import { TrashTableItemComponent } from './trash-screen/trash-table-item/trash-table-item.component';
-import { SharedModule } from '@shared/shared.module';
-import { TrashDialogService } from './services/trash-dialog.service';
-import { TranslateModule } from '@ngx-translate/core';
-import { IqserUsersModule } from '@iqser/common-ui/lib/users';
-
-const routes = [{ path: '', component: TrashScreenComponent }];
-
-@NgModule({
- declarations: [TrashScreenComponent, TrashTableItemComponent],
- imports: [
- CommonModule,
- RouterModule.forChild(routes),
- SharedModule,
- IqserUsersModule,
- TranslateModule,
- IqserListingModule,
- CircleButtonComponent,
- ],
- providers: [TrashDialogService],
-})
-export class TrashModule {}
diff --git a/apps/red-ui/src/app/modules/trash/trash.routes.ts b/apps/red-ui/src/app/modules/trash/trash.routes.ts
new file mode 100644
index 000000000..543ca99ed
--- /dev/null
+++ b/apps/red-ui/src/app/modules/trash/trash.routes.ts
@@ -0,0 +1,5 @@
+import { TrashScreenComponent } from './trash-screen/trash-screen.component';
+import { TrashDialogService } from './services/trash-dialog.service';
+import { IqserRoutes } from '@iqser/common-ui';
+
+export default [{ path: '', component: TrashScreenComponent, providers: [TrashDialogService] }] satisfies IqserRoutes;
diff --git a/apps/red-ui/src/app/modules/upload-download/dialogs/overwrite-files-dialog/overwrite-files-dialog.component.ts b/apps/red-ui/src/app/modules/upload-download/dialogs/overwrite-files-dialog/overwrite-files-dialog.component.ts
index c39824e79..d9d05caae 100644
--- a/apps/red-ui/src/app/modules/upload-download/dialogs/overwrite-files-dialog/overwrite-files-dialog.component.ts
+++ b/apps/red-ui/src/app/modules/upload-download/dialogs/overwrite-files-dialog/overwrite-files-dialog.component.ts
@@ -1,15 +1,21 @@
+import { NgIf } from '@angular/common';
import { Component, Inject } from '@angular/core';
-import { TranslateService } from '@ngx-translate/core';
+import { ReactiveFormsModule, UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
+import { MatCheckbox } from '@angular/material/checkbox';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
-import { DetailsRadioOption, IconButtonTypes } from '@iqser/common-ui';
-import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
+import { DetailsRadioOption } from '@common-ui/inputs/details-radio/details-radio-option';
+import { DetailsRadioComponent } from '@common-ui/inputs/details-radio/details-radio.component';
+import { IconButtonComponent, IconButtonTypes } from '@iqser/common-ui';
+import { TranslateModule, TranslateService } from '@ngx-translate/core';
import { OverwriteFileOption, OverwriteFileOptions } from '@red/domain';
@Component({
selector: 'redaction-overwrite-files-dialog',
templateUrl: './overwrite-files-dialog.component.html',
styleUrls: ['./overwrite-files-dialog.component.scss'],
+ standalone: true,
+ imports: [NgIf, TranslateModule, ReactiveFormsModule, DetailsRadioComponent, MatCheckbox, IconButtonComponent],
})
export class OverwriteFilesDialogComponent {
readonly iconButtonTypes = IconButtonTypes;
diff --git a/apps/red-ui/src/app/modules/upload-download/file-drop/file-drop.component.ts b/apps/red-ui/src/app/modules/upload-download/file-drop/file-drop.component.ts
index aa5f4f56a..89c8e52d1 100644
--- a/apps/red-ui/src/app/modules/upload-download/file-drop/file-drop.component.ts
+++ b/apps/red-ui/src/app/modules/upload-download/file-drop/file-drop.component.ts
@@ -6,9 +6,13 @@ import { ActiveDossiersService } from '@services/dossiers/active-dossiers.servic
import { handleFileDrop } from '@utils/file-drop-utils';
import { FileUploadModel } from '@upload-download/model/file-upload.model';
import { DOSSIER_ID } from '../../../tokens';
+import { MatIcon } from '@angular/material/icon';
+import { TranslateModule } from '@ngx-translate/core';
@Component({
templateUrl: './file-drop.component.html',
+ standalone: true,
+ imports: [MatIcon, TranslateModule],
})
export class FileDropComponent {
constructor(
diff --git a/apps/red-ui/src/app/modules/upload-download/file-upload-download.module.ts b/apps/red-ui/src/app/modules/upload-download/file-upload-download.module.ts
deleted file mode 100644
index cd38be314..000000000
--- a/apps/red-ui/src/app/modules/upload-download/file-upload-download.module.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import { NgModule } from '@angular/core';
-import { CommonModule } from '@angular/common';
-import { FileDropComponent } from './file-drop/file-drop.component';
-import { OverlayModule } from '@angular/cdk/overlay';
-import { UploadStatusOverlayComponent } from './upload-status-overlay/upload-status-overlay.component';
-import { SharedModule } from '@shared/shared.module';
-import { OverwriteFilesDialogComponent } from './dialogs/overwrite-files-dialog/overwrite-files-dialog.component';
-import { FileUploadService } from './services/file-upload.service';
-import { FileDownloadService } from './services/file-download.service';
-import { StatusOverlayService } from './services/status-overlay.service';
-import { FileDropOverlayService } from './services/file-drop-overlay.service';
-import { UploadDownloadDialogService } from './services/upload-download-dialog.service';
-import { TranslateModule } from '@ngx-translate/core';
-import { CircleButtonComponent, DetailsRadioComponent, IconButtonComponent } from '@iqser/common-ui';
-
-@NgModule({
- imports: [
- CommonModule,
- SharedModule,
- OverlayModule,
- TranslateModule,
- CircleButtonComponent,
- IconButtonComponent,
- DetailsRadioComponent,
- ],
- declarations: [FileDropComponent, UploadStatusOverlayComponent, OverwriteFilesDialogComponent],
- providers: [UploadDownloadDialogService, FileUploadService, FileDownloadService, StatusOverlayService, FileDropOverlayService],
- exports: [FileDropComponent, UploadStatusOverlayComponent],
-})
-export class FileUploadDownloadModule {}
diff --git a/apps/red-ui/src/app/modules/upload-download/services/file-download.service.ts b/apps/red-ui/src/app/modules/upload-download/services/file-download.service.ts
index b2ea8336b..f8e7aeca4 100644
--- a/apps/red-ui/src/app/modules/upload-download/services/file-download.service.ts
+++ b/apps/red-ui/src/app/modules/upload-download/services/file-download.service.ts
@@ -8,13 +8,16 @@ import { NGXLogger } from 'ngx-logger';
import { mapEach } from '@iqser/common-ui/lib/utils';
import { TenantsService } from '@iqser/common-ui/lib/tenants';
-@Injectable()
+@Injectable({ providedIn: 'root' })
export class FileDownloadService extends EntitiesService {
protected readonly _defaultModelPath = 'async/download';
protected readonly _entityClass = DownloadStatus;
protected readonly _tenantsService = inject(TenantsService);
- constructor(private readonly _configService: ConfigService, private readonly _logger: NGXLogger) {
+ constructor(
+ private readonly _configService: ConfigService,
+ private readonly _logger: NGXLogger,
+ ) {
super();
}
diff --git a/apps/red-ui/src/app/modules/upload-download/services/file-drop-overlay.service.ts b/apps/red-ui/src/app/modules/upload-download/services/file-drop-overlay.service.ts
index 778156882..5d9cecba5 100644
--- a/apps/red-ui/src/app/modules/upload-download/services/file-drop-overlay.service.ts
+++ b/apps/red-ui/src/app/modules/upload-download/services/file-drop-overlay.service.ts
@@ -5,13 +5,16 @@ import { ComponentPortal } from '@angular/cdk/portal';
import { DOSSIER_ID } from '../../../tokens';
import { BehaviorSubject } from 'rxjs';
-@Injectable()
+@Injectable({ providedIn: 'root' })
export class FileDropOverlayService {
readonly #dropOverlayRef: OverlayRef;
readonly #importingRedactions$ = new BehaviorSubject(false);
#dossierId: string;
- constructor(private readonly _overlay: Overlay, private readonly _injector: Injector) {
+ constructor(
+ private readonly _overlay: Overlay,
+ private readonly _injector: Injector,
+ ) {
this.#dropOverlayRef = this._overlay.create({
height: '100vh',
width: '100vw',
diff --git a/apps/red-ui/src/app/modules/upload-download/services/file-upload.service.ts b/apps/red-ui/src/app/modules/upload-download/services/file-upload.service.ts
index 8f774e5b6..c4f82e77a 100644
--- a/apps/red-ui/src/app/modules/upload-download/services/file-upload.service.ts
+++ b/apps/red-ui/src/app/modules/upload-download/services/file-upload.service.ts
@@ -21,7 +21,7 @@ export interface ActiveUpload {
fileUploadModel: FileUploadModel;
}
-@Injectable()
+@Injectable({ providedIn: 'root' })
export class FileUploadService extends GenericService implements OnDestroy {
static readonly MAX_PARALLEL_UPLOADS = 5;
#pendingUploads: FileUploadModel[] = [];
diff --git a/apps/red-ui/src/app/modules/upload-download/services/status-overlay.service.ts b/apps/red-ui/src/app/modules/upload-download/services/status-overlay.service.ts
index f90697230..ea6bf07f9 100644
--- a/apps/red-ui/src/app/modules/upload-download/services/status-overlay.service.ts
+++ b/apps/red-ui/src/app/modules/upload-download/services/status-overlay.service.ts
@@ -3,11 +3,14 @@ import { Overlay, OverlayRef } from '@angular/cdk/overlay';
import { ComponentPortal } from '@angular/cdk/portal';
import { UploadStatusOverlayComponent } from '../upload-status-overlay/upload-status-overlay.component';
-@Injectable()
+@Injectable({ providedIn: 'root' })
export class StatusOverlayService {
private readonly _uploadStatusOverlayRef: OverlayRef;
- constructor(private readonly _overlay: Overlay, private readonly _injector: Injector) {
+ constructor(
+ private readonly _overlay: Overlay,
+ private readonly _injector: Injector,
+ ) {
this._uploadStatusOverlayRef = this._overlay.create();
}
diff --git a/apps/red-ui/src/app/modules/upload-download/services/upload-download-dialog.service.ts b/apps/red-ui/src/app/modules/upload-download/services/upload-download-dialog.service.ts
index 761aefb74..bcdb079da 100644
--- a/apps/red-ui/src/app/modules/upload-download/services/upload-download-dialog.service.ts
+++ b/apps/red-ui/src/app/modules/upload-download/services/upload-download-dialog.service.ts
@@ -10,7 +10,7 @@ const dialogConfig = {
autoFocus: false,
};
-@Injectable()
+@Injectable({ providedIn: 'root' })
export class UploadDownloadDialogService {
constructor(private readonly _dialog: MatDialog) {}
diff --git a/apps/red-ui/src/app/modules/upload-download/upload-status-overlay/upload-status-overlay.component.ts b/apps/red-ui/src/app/modules/upload-download/upload-status-overlay/upload-status-overlay.component.ts
index 38b57cf8a..d6f50ba5b 100644
--- a/apps/red-ui/src/app/modules/upload-download/upload-status-overlay/upload-status-overlay.component.ts
+++ b/apps/red-ui/src/app/modules/upload-download/upload-status-overlay/upload-status-overlay.component.ts
@@ -2,11 +2,19 @@ import { OverlayRef } from '@angular/cdk/overlay';
import { ChangeDetectorRef, Component, OnInit } from '@angular/core';
import { FileUploadModel } from '../model/file-upload.model';
import { FileUploadService } from '../services/file-upload.service';
+import { MatIcon } from '@angular/material/icon';
+import { TranslateModule } from '@ngx-translate/core';
+import { CircleButtonComponent } from '@iqser/common-ui';
+import { NgForOf, NgIf } from '@angular/common';
+import { MatTooltip } from '@angular/material/tooltip';
+import { MatProgressBar } from '@angular/material/progress-bar';
@Component({
selector: 'redaction-upload-status-overlay',
templateUrl: './upload-status-overlay.component.html',
styleUrls: ['./upload-status-overlay.component.scss'],
+ standalone: true,
+ imports: [MatIcon, TranslateModule, CircleButtonComponent, NgForOf, MatTooltip, NgIf, MatProgressBar],
})
export class UploadStatusOverlayComponent implements OnInit {
collapsed = true;
diff --git a/apps/red-ui/src/app/services/dossier-templates/dashboard-stats.service.ts b/apps/red-ui/src/app/services/dossier-templates/dashboard-stats.service.ts
index 17249dd72..f0f458e86 100644
--- a/apps/red-ui/src/app/services/dossier-templates/dashboard-stats.service.ts
+++ b/apps/red-ui/src/app/services/dossier-templates/dashboard-stats.service.ts
@@ -1,10 +1,11 @@
import { EntitiesService } from '@iqser/common-ui';
import { DashboardStats, IDashboardStats } from '@red/domain';
import { inject, Injectable } from '@angular/core';
-import { Observable } from 'rxjs';
-import { map, switchMap, tap } from 'rxjs/operators';
+import { Observable, of } from 'rxjs';
+import { catchError, filter, map, switchMap, tap } from 'rxjs/operators';
import { DossierStatesService } from '../entity-services/dossier-states.service';
import { mapEach } from '@iqser/common-ui/lib/utils';
+import { Router } from '@angular/router';
const templatesSorter = (a: DashboardStats, b: DashboardStats) => {
if (!a.isEmpty && b.isEmpty) {
@@ -20,6 +21,7 @@ const templatesSorter = (a: DashboardStats, b: DashboardStats) => {
})
export class DashboardStatsService extends EntitiesService {
readonly #dossierStatesService = inject(DossierStatesService);
+ readonly #router = inject(Router);
protected readonly _defaultModelPath = 'dossier-template/stats';
protected readonly _entityClass = DashboardStats;
@@ -35,6 +37,11 @@ export class DashboardStatsService extends EntitiesService(singleTemplateStatsUrl).pipe(
+ catchError(() => {
+ this.#router.navigate(['/']).then();
+ return of(null);
+ }),
+ filter(entity => !!entity),
map(entity => new DashboardStats(entity)),
switchMap(entity => this.#dossierStatesService.loadAllForTemplate(dossierTemplateId).pipe(map(() => entity))),
tap(entity => this.addEntity(entity)),
diff --git a/apps/red-ui/src/app/services/permissions.service.ts b/apps/red-ui/src/app/services/permissions.service.ts
index 0786aa785..b4b22fd13 100644
--- a/apps/red-ui/src/app/services/permissions.service.ts
+++ b/apps/red-ui/src/app/services/permissions.service.ts
@@ -412,7 +412,11 @@ export class PermissionsService {
}
#canReanalyseFile(file: File, dossier: Dossier): boolean {
- return dossier.isActive && this.isAssigneeOrApprover(file, dossier) && file.analysisRequired;
+ return (
+ dossier.isActive &&
+ ((this.isAssigneeOrApprover(file, dossier) && file.analysisRequired) ||
+ (file.isError && (this.isOwner(dossier) || this.isFileAssignee(file))))
+ );
}
#canEnableAutoAnalysis(file: File, dossier: Dossier): boolean {
diff --git a/apps/red-ui/src/app/translations/remove-annotation-translations.ts b/apps/red-ui/src/app/translations/remove-annotation-translations.ts
index 491bb10c9..478c9de8d 100644
--- a/apps/red-ui/src/app/translations/remove-annotation-translations.ts
+++ b/apps/red-ui/src/app/translations/remove-annotation-translations.ts
@@ -1,6 +1,6 @@
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
-import { RemoveAnnotationOption } from '../modules/file-preview/utils/dialog-options';
import { DialogOption } from '@translations/redact-text-translations';
+import { RemoveAnnotationOption } from '../modules/file-preview/utils/dialog-types';
export const removeAnnotationTranslations: { [key in RemoveAnnotationOption]: DialogOption } = {
ONLY_HERE: {
diff --git a/apps/red-ui/src/app/translations/remove-redaction-translations.ts b/apps/red-ui/src/app/translations/remove-redaction-translations.ts
index 615cb7bb9..41d5f8b86 100644
--- a/apps/red-ui/src/app/translations/remove-redaction-translations.ts
+++ b/apps/red-ui/src/app/translations/remove-redaction-translations.ts
@@ -1,6 +1,6 @@
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
-import { RemoveRedactionOption } from '../modules/file-preview/utils/dialog-options';
import { DialogOption } from '@translations/redact-text-translations';
+import { RemoveRedactionOption } from '../modules/file-preview/utils/dialog-types';
export const removeRedactionTranslations: { [key in RemoveRedactionOption]: DialogOption } = {
ONLY_HERE: {
diff --git a/apps/red-ui/src/app/users/user-preference.service.ts b/apps/red-ui/src/app/users/user-preference.service.ts
index 6f2f85211..4b05ce78c 100644
--- a/apps/red-ui/src/app/users/user-preference.service.ts
+++ b/apps/red-ui/src/app/users/user-preference.service.ts
@@ -1,7 +1,7 @@
import { Injectable } from '@angular/core';
import { IqserUserPreferenceService, ListingMode } from '@iqser/common-ui';
-import { RedactOrHintOption, RemoveRedactionOption } from '../modules/file-preview/utils/dialog-options';
import { SystemDefaultOption, SystemDefaultType } from '../modules/account/utils/dialog-defaults';
+import { RedactOrHintOption, RemoveRedactionOption } from '../modules/file-preview/utils/dialog-types';
export const PreferencesKeys = {
dossierRecent: 'Dossier-Recent',
diff --git a/apps/red-ui/src/app/utils/filter-utils.ts b/apps/red-ui/src/app/utils/filter-utils.ts
index c7b1439fd..68bf58595 100644
--- a/apps/red-ui/src/app/utils/filter-utils.ts
+++ b/apps/red-ui/src/app/utils/filter-utils.ts
@@ -1,5 +1,5 @@
import { handleCheckedValue, INestedFilter } from '@iqser/common-ui/lib/filtering';
-import { ComponentLogEntry, Dossier, File, User, UserType } from '@red/domain';
+import { Dossier, File, User, UserType } from '@red/domain';
export function handleFilterDelta(oldFilters: INestedFilter[], newFilters: INestedFilter[], allFilters: INestedFilter[]) {
const newFiltersDelta = {};
diff --git a/apps/red-ui/src/assets/i18n/redact/de.json b/apps/red-ui/src/assets/i18n/redact/de.json
index 0bcdae1a9..b1979d2a8 100644
--- a/apps/red-ui/src/assets/i18n/redact/de.json
+++ b/apps/red-ui/src/assets/i18n/redact/de.json
@@ -64,7 +64,7 @@
},
"form": {
"apply-updates-default": {
- "description": "Änderungen am Wörterbuch standardmäßig auf alle Dossiers anwenden",
+ "description": "„In alle Dossiers übernehmen“ beim Hinzufügen von Schwärzungen/Hinweisen standardmäßig vorauswählen",
"heading": "Konfiguration für Entitäten"
},
"description": "Beschreibung",
@@ -75,7 +75,7 @@
"title": "Versteckten Text beibehalten"
},
"image-metadata": {
- "description": "Bilder in Dokumenten können Zusatzinformationen in Form von Metadaten enthalten. Das können u. a. sein: der Ersteller, das Datum oder der Ort des Bilds.",
+ "description": "Bilder in Dokumenten können Zusatzinformationen in Form von Metadaten enthalten. Das können u. a. sein: Ersteller, Datum oder Ort des Bilds.",
"title": "Bildmetadaten beibehalten"
},
"name": "Name der Dossier-Vorlage",
@@ -261,7 +261,7 @@
"entities": "Entitäten",
"entity-info": "Info",
"entity-rule-editor": "Entitätsregeln-Editor",
- "false-positive": "Falsch-positiv",
+ "false-positive": "Falsch-Positive",
"false-recommendations": "Falsche Empfehlungen",
"file-attributes": "Datei-Attribute",
"justifications": "Begründungen",
@@ -272,6 +272,9 @@
"watermarks": "Wasserzeichen"
},
"analysis-disabled": "",
+ "annotation": {
+ "pending": "(Analyse steht aus)"
+ },
"annotation-actions": {
"accept-recommendation": {
"label": "Empfehlung annehmen"
@@ -327,14 +330,14 @@
"error": "Rekategorisierung des Bilds fehlgeschlagen: {error}",
"success": "Bild wurde einer neuen Kategorie zugeordnet."
},
- "remove-hint": {
- "error": "Entfernen des Hinweises fehlgeschlagen: {error}",
- "success": "Hinweis wurde entfernt"
- },
"remove": {
"error": "Entfernen der Schwärzung fehlgeschlagen: {error}",
"success": "Schwärzung wurde entfernt"
},
+ "remove-hint": {
+ "error": "Entfernen des Hinweises fehlgeschlagen: {error}",
+ "success": "Hinweis wurde entfernt"
+ },
"undo": {
"error": "Die Aktion konnte nicht rückgängig gemacht werden. Fehler: {error}",
"success": "Rücksetzung erfolgreich"
@@ -347,25 +350,25 @@
"remove-highlights": {
"label": "Ausgewählte Markierungen entfernen"
},
+ "resize": {
+ "label": "Größe ändern"
+ },
"resize-accept": {
"label": "Neue Größe speichern"
},
"resize-cancel": {
"label": "Größenänderung abbrechen"
},
- "resize": {
- "label": "Größe ändern"
- },
"see-references": {
"label": "Referenzen anzeigen"
},
- "show": "Zeigen",
+ "show": "Einblenden",
"undo": "Zurücksetzen"
},
"annotation-changes": {
"forced-hint": "Hint wurde erzwungen",
"forced-redaction": "Schwärzung wurde erzwungen",
- "header": "Manuelle Änderungen:",
+ "header": "Lokale manuelle Änderungen:",
"legal-basis": "Grund wurde geändert",
"recategorized": "Typ wurde geändert",
"removed-manual": "Schwärzung/Hinweis wurde entfernt",
@@ -388,9 +391,6 @@
"skipped": "Ignorierte Schwärzung",
"text-highlight": "Markierung"
},
- "annotation": {
- "pending": "(Analyse steht aus)"
- },
"annotations": "Annotationen",
"archived-dossiers-listing": {
"no-data": {
@@ -539,13 +539,13 @@
},
"add-new": "Neues Mapping",
"no-data": {
- "action": "",
- "title": ""
+ "action": "Neues Mapping",
+ "title": "Es gibt noch keine Komponent-Mappings."
},
"search": "Nach Name suchen...",
"table-col-names": {
"name": "Name",
- "number-of-lines": "",
+ "number-of-lines": "Zeilenzahl",
"version": "Version"
},
"table-header": {
@@ -605,21 +605,25 @@
"confirm-delete-users": {
"cancel": "{usersCount, plural, one{Benutzer} other{Benutzer}} behalten",
"delete": "{usersCount, plural, one{Benutzer} other{Benutzer}} löschen",
- "impacted-documents": "Betroffen sind alle Dokumente, deren Review durch den/die {usersCount, plural, one{user} other{users}} noch aussteht",
+ "impacted-documents": "Alle Dokumente betroffen, deren Review durch {usersCount, plural, one{den Benutzer} other{die Benutzer}} noch aussteht",
"impacted-dossiers": "{dossiersCount} {dossiersCount, plural, one{Dossier} other{Dossiers}} sind betroffen",
- "title": "{usersCount, plural, one{Benutzer} other{Benutzer}} aus dem Arbeitsbereich entfernen",
+ "title": "{usersCount, plural, one{Benutzer} other{Benutzer}} aus Workspace entfernen",
"toast-error": "Bitte bestätigen Sie, dass Sie die Folgen dieser Aktion verstehen.",
"warning": "Warnung: Wiederherstellung des Benutzers nicht möglich."
},
"confirmation-dialog": {
+ "approve-file": {
+ "question": "Dieses Dokument enthält ungesehene Änderungen. Möchten Sie es trotzdem freigeben?",
+ "title": "Warnung!"
+ },
"approve-file-without-analysis": {
"confirmationText": "Ohne Analyse freigeben",
"denyText": "Abbrechen",
"question": "Analyse zur Erkennung neuer Schwärzungen erforderlich.",
"title": "Warnung!"
},
- "approve-file": {
- "question": "Dieses Dokument enthält ungesehene Änderungen. Möchten Sie es trotzdem freigeben?",
+ "approve-multiple-files": {
+ "question": "Mindestens eine der ausgewählten Dateien enthält ungesehene Änderungen, die im Zuge einer Reanalyse hinzugefügt wurden. Möchen Sie die Dateien wirklich freigeben?",
"title": "Warnung!"
},
"approve-multiple-files-without-analysis": {
@@ -628,10 +632,6 @@
"question": "Für mindestens eine Datei ist ein Analyselauf zur Erkennung neuer Schwärzungen erforderlich.",
"title": "Warnung"
},
- "approve-multiple-files": {
- "question": "Mindestens eine der ausgewählten Dateien enthält ungesehene Änderungen, die im Zuge einer Reanalyse hinzugefügt wurden. Möchen Sie die Dateien wirklich freigeben?",
- "title": "Warnung!"
- },
"assign-file-to-me": {
"question": {
"multiple": "Dieses Dokument wird gerade von einer anderen Person geprüft. Möchten Sie sich die Datei dennoch zuweisen?",
@@ -670,7 +670,7 @@
},
"unsaved-changes": {
"confirmation-text": "Speichern und schließen",
- "details": "Bitte speichern Sie Ihre Änderungen. Wenn Sie den Tab jetzt verlassen, gehen alle gespeicherten Fortschritte verloren.",
+ "details": "Wenn Sie den Tab jetzt verlassen, gehen alle ungespeicherten Änderungen verloren. Bitte speichern Sie Ihre Änderungen. ",
"discard-changes-text": "ÄNDERUNGEN VERWERFEN",
"question": "Möchten Sie den Tab dennoch schließen?",
"title": "Sie haben ungespeicherte Änderungen"
@@ -756,7 +756,7 @@
"revert-changes": "Zurücksetzen",
"save-changes": "Änderungen speichern",
"search": "Suche...",
- "select-dictionary": "Wählen Sie oben das Wörterbuch aus, das Sie mit dem aktuellen Wörterbuch vergleichen möchten.",
+ "select-dictionary": "Wählen Sie oben das Wörterbuch aus, das Sie mit dem aktuellen Wörterbuch vergleichen möchten.",
"success": {
"generic": "Wörterbuch wurde aktualisiert"
}
@@ -792,8 +792,8 @@
},
"options": {
"kms": {
- "description": "Please upload a PEM file with the certificate and provide Amazon KMS credentials to secure the private key.",
- "label": "I use an Amazon KMS private key"
+ "description": "Bitte laden Sie eine PEM-Datei mit dem Zertifikat hoch und geben Sie die Amazon KMS-Anmeldedaten an, um den privaten Schlüssel zu sichern.",
+ "label": "Ich verwende einen Amazon KMS Private Key"
},
"pkcs": {
"description": "Eine PKCS#12-Datei kombiniert Ihren privaten Schlüssel mit einem X.509-Zertifikat. Der Passwortschutz ist unerlässlich, um den privaten Schlüssel zu sichern, da ungeschützte PKCS#12-Dateien nicht unterstützt werden.",
@@ -866,7 +866,7 @@
"dossier-details": {
"assign-members": "Mitglieder hinzufügen",
"collapse": "Details ausblenden",
- "document-status": "Verarbeitungsstatus Ihrer Dokumente",
+ "document-status": "Verarbeitungsstatus der Dokumente",
"edit-owner": "Besitzer bearbeiten",
"expand": "Details anzeigen",
"members": "Mitglieder",
@@ -958,7 +958,7 @@
"documents": "{count} {count, plural, one{Dokument} other{Dokumente}}",
"due-date": "Fällig am {date}",
"people": "{count} {count, plural, one{Benutzer} other{Benutzer}}",
- "processing-documents": "{count} Verarbeitung von {count, plural, one{document} other{documents}}"
+ "processing-documents": "{count} {count, plural, one{Dokument} other{Dokumente}} in Verarbeitung"
}
},
"download-file": "Herunterladen",
@@ -1001,13 +1001,13 @@
"recent": "Neu ({hours} h)",
"unassigned": "Keinem Bearbeiter zugewiesen"
},
+ "reanalyse": {
+ "action": "Datei analysieren"
+ },
"reanalyse-dossier": {
"error": "Einplanung der Dateien für die Reanalyse fehlgeschlagen. Bitte versuchen Sie es noch einmal.",
"success": "Dateien für Reanalyse vorgesehen."
},
- "reanalyse": {
- "action": "Datei analysieren"
- },
"start-auto-analysis": "Auto-Analyse aktivieren",
"stop-auto-analysis": "Auto-Analyse anhalten",
"table-col-names": {
@@ -1077,6 +1077,14 @@
"total-documents": "Dokumente",
"total-people": "{count} {count, plural, one{Benutzer} other {Benutzer}}"
},
+ "dossier-templates": {
+ "label": "Dossier-Vorlagen",
+ "status": {
+ "active": "Aktiv",
+ "inactive": "Inaktiv",
+ "incomplete": "Unvollständig"
+ }
+ },
"dossier-templates-listing": {
"action": {
"clone": "Vorlage klonen",
@@ -1098,7 +1106,7 @@
"no-match": {
"title": "Die ausgewählten Filter treffen auf keine Dossier-Vorlage zu."
},
- "search": "Suchen ...",
+ "search": "Suchen...",
"table-col-names": {
"created-by": "Ersteller",
"created-on": "Erstellt am",
@@ -1112,14 +1120,6 @@
"title": "{length} {length, plural, one{Dossier-Vorlage} other{Dossier-Vorlagen}}"
}
},
- "dossier-templates": {
- "label": "Dossier-Vorlagen",
- "status": {
- "active": "Aktiv",
- "inactive": "Inaktiv",
- "incomplete": "Unvollständig"
- }
- },
"dossier-watermark-selector": {
"heading": "Wasserzeichen auf Dokumenten",
"no-watermark": "Kein Wasserzeichen in der Dossier-Vorlage verfügbar: Bitten Sie Ihren Admin, eines zu konfigurieren.",
@@ -1165,7 +1165,7 @@
"delete": "Ausgewählte Downloads löschen"
},
"no-data": {
- "title": "Keine aktiven Downloads."
+ "title": "Sie haben keine aktiven Downloads."
},
"table-col-names": {
"date": "Datum",
@@ -1283,9 +1283,9 @@
"redacted-text": "Annotierter Text",
"section": "Absatz / Textstelle",
"type": "Typ",
- "unchanged": "Unchanged"
+ "unchanged": "Ungeändert"
},
- "title": "Edit {type, select, image{image} hint{hint} other{redaction}}"
+ "title": "{type, select, image{Bild} hint{Hinweis} other{Schwärzung}} bearbeiten"
}
},
"entities-listing": {
@@ -1315,20 +1315,6 @@
"title": "{length} {length, plural, one{Wörterbuch} other{Wörterbücher}}"
}
},
- "entity-rules-screen": {
- "error": {
- "generic": "Error: Entity rules update failed."
- },
- "errors-found": "{errors, plural, one{An error} other{{errors} errors}} found in rules",
- "revert-changes": "Zurücksetzen",
- "save-changes": "Änderungen speichern",
- "success": {
- "generic": "Entity rules updated."
- },
- "title": "Entity rule editor",
- "warning-text": "Warning: experimental feature!",
- "warnings-found": "{warnings, plural, one{A warning} other{{warnings} warnings}} found in rules"
- },
"entity": {
"info": {
"actions": {
@@ -1338,19 +1324,33 @@
"heading": "Entität bearbeiten"
}
},
+ "entity-rules-screen": {
+ "error": {
+ "generic": "Fehler: Aktualisierung der Entitätsregeln fehlgeschlagen."
+ },
+ "errors-found": "{errors, plural, one{An error} other{{errors} errors}} in den Regeln",
+ "revert-changes": "Zurücksetzen",
+ "save-changes": "Änderungen speichern",
+ "success": {
+ "generic": "Die Entitätsregeln wurden aktualisiert."
+ },
+ "title": "Entitätsregeln-Editor",
+ "warning-text": "Warnung: experimentelle Funktion!",
+ "warnings-found": "{warnings, plural, one{A warning} other{{warnings} warnings}} in Regeln gefunden"
+ },
"error": {
"deleted-entity": {
"dossier": {
"action": "Zurück zur Übersicht",
"label": "Dieses Dossier wurde gelöscht!"
},
- "file-dossier": {
- "action": "Zurück zur Übersicht",
- "label": "Das Dossier dieser Datei wurde gelöscht!"
- },
"file": {
"action": "Zurück zum Dossier",
"label": "Diese Datei wurde gelöscht!"
+ },
+ "file-dossier": {
+ "action": "Zurück zur Übersicht",
+ "label": "Das Dossier dieser Datei wurde gelöscht!"
}
},
"file-preview": {
@@ -1368,6 +1368,12 @@
},
"exact-date": "{day} {month} {year} um {hour}:{minute} Uhr",
"file": "Datei",
+ "file-attribute": {
+ "update": {
+ "error": "Aktualisierung des Werts für das Datei-Attribut fehlgeschlagen. Bitte versuchen Sie es noch einmal.",
+ "success": "Der Wert für das Dateiattribut wurde erfolgreich aktualisiert."
+ }
+ },
"file-attribute-encoding-types": {
"ascii": "ASCII",
"iso": "ISO-8859-1",
@@ -1378,12 +1384,6 @@
"number": "Nummer",
"text": "Freier Text"
},
- "file-attribute": {
- "update": {
- "error": "Aktualisierung des Werts für das Datei-Attribut fehlgeschlagen. Bitte versuchen Sie es noch einmal.",
- "success": "Der Wert für das Dateiattribut wurde erfolgreich aktualisiert."
- }
- },
"file-attributes-configurations": {
"cancel": "Abbrechen",
"form": {
@@ -1475,7 +1475,7 @@
"title": "Die aktuell ausgewählten Filter treffen auf kein Datei-Attribut zu."
},
"read-only": "Schreibgeschützt",
- "search": "Nach Attribut-Namen suchen ...",
+ "search": "Nach Attribut-Namen suchen...",
"table-col-names": {
"csv-column": "CSV-Spalte",
"displayed-in-file-list": "In Dokumentenliste",
@@ -1501,7 +1501,7 @@
"download-original-file": "Originaldatei herunterladen",
"exclude-pages": "Seiten von Schwärzung ausschließen",
"excluded-from-redaction": "Seite ausgeschlossen",
- "fullscreen": "Vollbildmodus",
+ "fullscreen": "Vollbildmodus (F-Taste)",
"get-tables": "Tabellen zeichnen",
"highlights": {
"convert": "Markierungen konvertieren",
@@ -1574,7 +1574,7 @@
}
},
"file-status": {
- "analyse": "Analyzing",
+ "analyse": "Analyse läuft",
"approved": "Genehmigt",
"error": "Reanalyse erforderlich",
"figure-detection-analyzing": "",
@@ -1582,34 +1582,25 @@
"full-reprocess": "Verarbeitung läuft",
"image-analyzing": "Bildanalyse",
"indexing": "Wird verarbeitet",
- "initial-processing": "Initial processing...",
- "ner-analyzing": "NER analyzing",
+ "initial-processing": "Initiale Verarbeitung läuft...",
+ "ner-analyzing": "NER-Analyse läuft",
"new": "Neu",
"ocr-processing": "OCR-Verarbeitung läuft",
"processed": "Verarbeitet",
"processing": "Wird verarbeitet...",
- "re-processing": "Reprocessing...",
+ "re-processing": "Erneute Verarbeitung läuft...",
"reprocess": "Wird verarbeitet",
- "table-parsing-analyzing": "Table parsing",
- "unassigned": "Unassigned",
+ "table-parsing-analyzing": "Table Parsing",
+ "unassigned": "Nicht zugewiesen",
"under-approval": "In Freigabe",
"under-review": "In Überprüfung",
"unprocessed": "Unverarbeitet"
},
"file-upload": {
"type": {
- "csv": "File attributes were imported successfully from uploaded CSV file."
+ "csv": "Die Datei-Attribute wurden erfolgreich aus der hochgeladenen CSV-Datei importiert."
}
},
- "filter-menu": {
- "filter-options": "Filteroptionen",
- "filter-types": "Filter",
- "label": "Filter",
- "pages-without-annotations": "Nur Seiten ohne Annotationen",
- "redaction-changes": "Nur Annotationen mit manuellen Änderungen",
- "unseen-pages": "Nur Annotationen auf ungesehenen Seiten",
- "with-comments": "Nur Annotationen mit Kommentaren"
- },
"filter": {
"analysis": "Analyse erforderlich",
"comment": "Kommentare",
@@ -1619,6 +1610,15 @@
"redaction": "Schwärzungen",
"updated": "Aktualisiert"
},
+ "filter-menu": {
+ "filter-options": "Filteroptionen",
+ "filter-types": "Filter",
+ "label": "Filter",
+ "pages-without-annotations": "Nur Seiten ohne Annotationen",
+ "redaction-changes": "Nur Annotationen mit lokalen manuellen Änderungen",
+ "unseen-pages": "Nur Annotationen auf ungesehenen Seiten",
+ "with-comments": "Nur Annotationen mit Kommentaren"
+ },
"filters": {
"assigned-people": "Bearbeiter",
"documents-status": "Dokumentenstatus",
@@ -1764,7 +1764,7 @@
"title": "Dokument mit Schwärzungen importieren"
},
"initials-avatar": {
- "unassigned": "Unassigned",
+ "unassigned": "Nicht zugewiesen",
"you": "Sie"
},
"justifications-listing": {
@@ -1792,15 +1792,15 @@
"analyzed-per-month": "Analysiertes Datenvolumen pro Monat",
"licensed": "Lizenzierte Kapazität",
"section-title": "Angaben zur Analysekapazität",
- "total-analyzed-data": "Analysiertes Datenvolumen (Gesamt)",
- "used-in-period": "Genutzte Analysekapazität (im Lizenzzeitraum)",
+ "total-analyzed-data": "Analysiertes Datenvolumen (Gesamt)",
+ "used-in-period": "Genutzte Analysekapazität (im Lizenzzeitraum)",
"used-in-total": "Insgesamt genutzte Analysekapazität"
},
"backend-version": "Backend-Version der Anwendung",
"copyright-claim-text": "Copyright © 2020 - {currentYear} knecon",
"copyright-claim-title": "Copyright",
"custom-app-title": "Name der Anwendung",
- "end-user-license-text": "Die Nutzung dieses Produkts unterliegt den Bedingungen der Endbenutzer-Lizenzvereinbarung für den RedactManager, sofern darin nichts Anderweitiges festgelegt ist.",
+ "end-user-license-text": "Die Nutzung dieses Produkts unterliegt den Bedingungen der Endbenutzer-Lizenzvereinbarung für RedactManager, sofern darin nichts Anderweitiges festgelegt ist.",
"end-user-license-title": "Endbenutzer-Lizenzvereinbarung",
"licensing-details": {
"license-title": "Titel der Lizenz",
@@ -1813,12 +1813,12 @@
},
"page-usage": {
"cumulative-pages": "Aufaddierte Seiten",
- "current-analyzed-pages": "Analysierte Seiten (im Lizenzzeitraum)",
- "ocr-analyzed-pages": "OCR-verarbeitete Seiten (im Lizenzzeitraum)",
+ "current-analyzed-pages": "Analysierte Seiten (im Lizenzzeitraum)",
+ "ocr-analyzed-pages": "OCR-verarbeitete Seiten (im Lizenzzeitraum)",
"pages-per-month": "Seiten pro Monat",
"section-title": "Details zur Seitenanzahl",
- "total-analyzed": "Insgesamt analysierte Seiten",
- "total-ocr-analyzed": "Total OCR-processed pages",
+ "total-analyzed": "Analysierte Seiten (Gesamt)",
+ "total-ocr-analyzed": "OCR-verarbeitete Dateien (Gesamt)",
"total-pages": "Lizenzierte Seiten",
"unlicensed-analyzed": "Ohne Lizenz analysierte Seiten"
},
@@ -1893,6 +1893,13 @@
"user-promoted-to-approver": "{user} wurde im Dossier {dossierHref, select, null{{dossierName}} other{{dossierName} }} zum Genehmiger ernannt!",
"user-removed-as-dossier-member": "{user} wurde als Mitglied von: {dossierHref, select, null{{dossierName}} other{{dossierName} }} entfernt!"
},
+ "notifications": {
+ "button-text": "Benachrichtigungen",
+ "deleted-dossier": "Gelöschtes Dossier",
+ "label": "Benachrichtigungen",
+ "mark-all-as-read": "Alle als gelesen markieren",
+ "mark-as": "Als {type, select, read{gelesen} unread{ungelesen} other{}} markieren"
+ },
"notifications-screen": {
"category": {
"email-notifications": "E-Mail-Benachrichtigungen",
@@ -1906,7 +1913,6 @@
"dossier": "Benachrichtigungen zu Dossiers",
"other": "Andere Benachrichtigungen"
},
- "options-title": "Wählen Sie aus, bei welchen Aktivitäten Sie benachrichtigt werden möchten",
"options": {
"ASSIGN_APPROVER": "Wenn ich einem Dokument als Genehmiger zugewiesen werde",
"ASSIGN_REVIEWER": "Wenn ich einem Dokument als Prüfer zugewiesen werde",
@@ -1924,6 +1930,7 @@
"USER_PROMOTED_TO_APPROVER": "Wenn ich Genehmiger in einem Dossier werde",
"USER_REMOVED_AS_DOSSIER_MEMBER": "Wenn ich die Dossier-Mitgliedschaft verliere"
},
+ "options-title": "Wählen Sie aus, bei welchen Aktivitäten Sie benachrichtigt werden möchten",
"schedule": {
"daily": "Tägliche Zusammenfassung",
"instant": "Sofort",
@@ -1931,13 +1938,6 @@
},
"title": "Benachrichtigungseinstellungen"
},
- "notifications": {
- "button-text": "Benachrichtigungen",
- "deleted-dossier": "Gelöschtes Dossier",
- "label": "Benachrichtigungen",
- "mark-all-as-read": "Alle als gelesen markieren",
- "mark-as": "Als {type, select, read{gelesen} unread{ungelesen} other{}} markieren"
- },
"ocr": {
"confirmation-dialog": {
"cancel": "Abbrechen",
@@ -1951,20 +1951,20 @@
"file-question": "{filename} ist bereits vorhanden. Wie möchten Sie fortfahren?",
"file-title": "Datei existiert bereits.",
"options": {
- "all-files": "Auf alle Dateien des aktuellen Uploads anwenden",
+ "all-files": "Auf alle Dateien des Uploads anwenden",
"cancel": "Alle Uploads abbrechen",
"current-files": "Auf aktuelle Datei anwenden",
"full-overwrite": {
- "description": "Alle manuellen Änderungen verwerfen, die an der Datei vorgenommen wurden, und mit der frisch verarbeiteten Datei neu beginnen.",
+ "description": "Verwerfen Sie alle manuellen Änderungen und beginnen Sie mit der frisch verarbeiteten Datei.",
"label": "Überschreiben und neu beginnen"
},
"partial-overwrite": {
- "description": "Manuelle Änderungen beibehalten, wenn die betroffenen Schwärzungen an der ursprünglichen Position bleiben. Wenn sich der Inhalt geändert hat, könnten einige Schwärzungen sonst falsch platziert werden.",
+ "description": "Behalten Sie manuelle Änderungen, sofern die Schwärzungen an der ursprünglichen Positionen bleiben. Bei geändertem Inhalt könnten Schwärzungen sonst falsch platziert werden.",
"label": "Überschreiben und manuelle Änderungen beibehalten"
},
"proceed": "Fortfahren",
"skip": {
- "description": "Upload der Datei überspringen und die vorhandene Datei nicht ersetzten.",
+ "description": "Behalten Sie die vorhandene Datei und überspringen Sie den Upload.",
"label": "Vorhandene Datei beibehalten und nicht überschreiben"
}
},
@@ -2029,16 +2029,16 @@
"warnings-label": "Dialoge und Meldungen",
"warnings-subtitle": "„Nicht mehr anzeigen“-Optionen"
},
+ "processing": {
+ "basic": "Verarbeitung läuft",
+ "ocr": "OCR"
+ },
"processing-status": {
"ocr": "OCR",
"pending": "Ausstehend",
"processed": "verarbeitet",
"processing": "Verarbeitung läuft"
},
- "processing": {
- "basic": "Verarbeitung läuft",
- "ocr": "OCR"
- },
"readonly": "Lesemodus",
"readonly-archived": "Lesemodus (archiviert)",
"redact-text": {
@@ -2175,7 +2175,7 @@
"display-name": "Dieser Platzhalter wird durch den Schwärzungstyp (Entität) ersetzt."
},
"excerpt": "Dieser Platzhalter wird durch einen Textausschnitt ersetzt, der die Schwärzung enthält.",
- "is-skipped": "Dieser Platzhalter gibt an, ob eine Schwärzung ignoriert wird oder nicht. Er kann in eine separate Spalte einer Vorlage eingebaut werden, die auch den Platzhalter {{redaction.value}} enthält. Der Platzhalter wird durch \"true\" (wahr) ersetzt, wenn die entsprechende Schwärzung ignoriert ist, und durch \"falsch\", wenn sie nicht ignoriert (d. h. geschwärzt) ist.",
+ "is-skipped": "Dieser Platzhalter gibt an, ob eine Schwärzung ignoriert wird oder nicht. Er kann in eine separate Spalte einer Vorlage eingebaut werden, die auch den Platzhalter '{{'redaction.value'}}' enthält. Der Platzhalter wird durch \"true\" (wahr) ersetzt, wenn die entsprechende Schwärzung ignoriert ist, und durch \"falsch\", wenn sie nicht ignoriert (d. h. geschwärzt) ist.",
"justification": "Dieser Platzhalter wird durch die Begründung für die Schwärzung ersetzt. Es handelt sich um eine Kombination aus der Rechtsgrundlage (justificationParagraph) und dem Begründungstext (justificationReason).",
"justification-legal-basis": "Dieser Platzhalter wird durch die Rechtgrundlage für die Schwärzung ersetzt.",
"justification-paragraph": "Dieser Platzer wird durch die Rechtsgrundlage für die Schwärzung ersetzt.",
@@ -2268,12 +2268,18 @@
"inactive": "Inaktiv",
"manager-admin": "Manager & Admin",
"no-role": "Keine Rolle definiert",
- "red-admin": "Anwendungsadministrator",
+ "red-admin": "Anwendungsadmin",
"red-manager": "Manager",
"red-user": "Benutzer",
- "red-user-admin": "Benutzer-Admin",
+ "red-user-admin": "Benutzeradmin",
"regular": "reguläre(r) Benutzer"
},
+ "search": {
+ "active-dossiers": "Dokumente in aktiven Dossiers",
+ "all-dossiers": "Alle Dokumente",
+ "placeholder": "Dokumente durchsuchen...",
+ "this-dossier": "In diesem Dossier"
+ },
"search-screen": {
"cols": {
"assignee": "Bearbeiter",
@@ -2297,12 +2303,6 @@
"no-match": "Suchbegriff wurde in keinem der Dokumente gefunden.",
"table-header": "{length} {length, plural, one{Suchergebnis} other{Suchergebnisse}}"
},
- "search": {
- "active-dossiers": "Dokumente in aktiven Dossiers",
- "all-dossiers": "Alle Dokumente",
- "placeholder": "Dokumente durchsuchen...",
- "this-dossier": "In diesem Dossier"
- },
"seconds": "Sekunden",
"size": "Größe",
"smtp-auth-config": {
@@ -2406,11 +2406,11 @@
"merge": "Einträge zusammenführen",
"overwrite": "Überschreiben"
},
- "question": "Wie möchten Sie fortfahren?",
+ "question": "Wie möchten Sie vorgehen?",
"title": "Das Wörterbuch hat bereits Einträge."
},
"upload-file": {
- "upload-area-text": "Klicken Sie auf den Button oder ziehen Sie die Dateien in diesen Bereich..."
+ "upload-area-text": "Klicken Sie hier oder ziehen Sie die Dateien in diesen Bereich..."
},
"upload-status": {
"dialog": {
@@ -2482,14 +2482,14 @@
},
"user-stats": {
"chart": {
- "users": "Benutzer im Arbeitsbereich"
+ "users": "Benutzer im Workspace"
},
"collapse": "Details ausblenden",
"expand": "Details anzeigen",
"title": "Benutzer"
},
"view-mode": {
- "list": "Liste",
+ "list": "Dokumentenliste",
"view-as": "Ansicht:",
"workflow": "Workflow-Spalten"
},
@@ -2520,7 +2520,7 @@
"font-size": "Schriftgröße",
"font-type": "Schriftart",
"name-label": "Name des Wasserzeichens",
- "name-placeholder": "Namen für das Wasserzeichen eingeben",
+ "name-placeholder": "Namen für Wasserzeichen eingeben",
"opacity": "Deckkraft",
"orientation": "Textrichtung",
"text-label": "Text für Wasserzeichen",
@@ -2558,4 +2558,4 @@
}
},
"yesterday": "Gestern"
-}
+}
\ No newline at end of file
diff --git a/apps/red-ui/src/assets/i18n/redact/en.json b/apps/red-ui/src/assets/i18n/redact/en.json
index c59dac4ce..1882eee2f 100644
--- a/apps/red-ui/src/assets/i18n/redact/en.json
+++ b/apps/red-ui/src/assets/i18n/redact/en.json
@@ -64,7 +64,7 @@
},
"form": {
"apply-updates-default": {
- "description": "Apply dictionary updates to all dossiers by default",
+ "description": "Set “Apply to all dossiers” as default when adding redactions/hints",
"heading": "Entity configuration"
},
"description": "Description",
@@ -365,7 +365,7 @@
"annotation-changes": {
"forced-hint": "Hint forced",
"forced-redaction": "Redaction forced",
- "header": "Manual changes:",
+ "header": "Local manual changes:",
"legal-basis": "Reason changed",
"recategorized": "Type changed",
"removed-manual": "Redaction/Hint removed",
@@ -1606,7 +1606,7 @@
"filter-types": "Filter",
"label": "Filter",
"pages-without-annotations": "Only pages without annotations",
- "redaction-changes": "Only annotations with manual changes",
+ "redaction-changes": "Only annotations with local manual changes",
"unseen-pages": "Only annotations on unseen pages",
"with-comments": "Only annotations with comments"
},
@@ -2175,7 +2175,7 @@
"display-name": "This placeholder is replaced by the type of redaction (entity)."
},
"excerpt": "This placeholder is replaced by a text snippet that contains the redaction.",
- "is-skipped": "The skipped redaction placeholder indicates whether a redaction is skipped or not. It can be included in a separate column of a template that also contains the {{redaction.value}} placeholder. The placeholder is replaced by “true” if the respective redaction is skipped, and by “false” if it is redacted (i. e., not skipped).",
+ "is-skipped": "The skipped redaction placeholder indicates whether a redaction is skipped or not. It can be included in a separate column of a template that also contains the '{{'redaction.value'}}' placeholder. The placeholder is replaced by “true” if the respective redaction is skipped, and by “false” if it is redacted (i. e., not skipped).",
"justification": "This placeholder is replaced by the justification of the redaction. It is a combination of the legal basis (justificationParagraph) and the justification text (justificationReason).",
"justification-legal-basis": "This placeholder is replaced by the legal basis for the redaction.",
"justification-paragraph": "This placeholder is replaced by the legal basis for the redaction.",
@@ -2558,4 +2558,4 @@
}
},
"yesterday": "Yesterday"
-}
+}
\ No newline at end of file
diff --git a/apps/red-ui/src/assets/i18n/scm/de.json b/apps/red-ui/src/assets/i18n/scm/de.json
index c990120b8..591a262d3 100644
--- a/apps/red-ui/src/assets/i18n/scm/de.json
+++ b/apps/red-ui/src/assets/i18n/scm/de.json
@@ -272,6 +272,9 @@
"watermarks": "Watermarks"
},
"analysis-disabled": "Analysis disabled",
+ "annotation": {
+ "pending": "(Pending analysis)"
+ },
"annotation-actions": {
"accept-recommendation": {
"label": "Empfehlung annehmen"
@@ -327,14 +330,14 @@
"error": "Rekategorisierung des Bildes gescheitert: {error}",
"success": "Bild wurde einer neuen Kategorie zugeordnet."
},
- "remove-hint": {
- "error": "Failed to remove hint: {error}",
- "success": "Hint removed!"
- },
"remove": {
"error": "Fehler beim Entfernen der Schwärzung: {error}",
"success": "Schwärzung entfernt!"
},
+ "remove-hint": {
+ "error": "Failed to remove hint: {error}",
+ "success": "Hint removed!"
+ },
"undo": {
"error": "Die Aktion konnte nicht rückgängig gemacht werden. Fehler: {error}",
"success": "erfolgreich Rückgängig gemacht"
@@ -347,15 +350,15 @@
"remove-highlights": {
"label": "Remove selected earmarks"
},
+ "resize": {
+ "label": "Größe ändern"
+ },
"resize-accept": {
"label": "Größe speichern"
},
"resize-cancel": {
"label": "Größenänderung abbrechen"
},
- "resize": {
- "label": "Größe ändern"
- },
"see-references": {
"label": "See references"
},
@@ -388,9 +391,6 @@
"skipped": "Übersprungen",
"text-highlight": "Earmark"
},
- "annotation": {
- "pending": "(Pending analysis)"
- },
"annotations": "Annotations",
"archived-dossiers-listing": {
"no-data": {
@@ -539,13 +539,13 @@
},
"add-new": "New Mapping",
"no-data": {
- "action": "",
- "title": ""
+ "action": "New Mapping",
+ "title": "There are no component mappings."
},
"search": "Search by name...",
"table-col-names": {
"name": "name",
- "number-of-lines": "",
+ "number-of-lines": "Number of lines",
"version": "version"
},
"table-header": {
@@ -612,14 +612,18 @@
"warning": "Achtung: Diese Aktion kann nicht rückgängig gemacht werden!"
},
"confirmation-dialog": {
+ "approve-file": {
+ "question": "Dieses Dokument enthält ungesehene Änderungen. Möchten Sie es trotzdem genehmigen?",
+ "title": "Warnung!"
+ },
"approve-file-without-analysis": {
"confirmationText": "Approve without analysis",
"denyText": "Cancel",
"question": "Analysis required to detect new components.",
"title": "Warning!"
},
- "approve-file": {
- "question": "Dieses Dokument enthält ungesehene Änderungen. Möchten Sie es trotzdem genehmigen?",
+ "approve-multiple-files": {
+ "question": "Mindestens eine der ausgewählten Dateien enthält ungesehene Änderungen. Möchten Sie sie trotzdem genehmigen?",
"title": "Warnung!"
},
"approve-multiple-files-without-analysis": {
@@ -628,10 +632,6 @@
"question": "Analysis required to detect new components for at least one file.",
"title": "Warning"
},
- "approve-multiple-files": {
- "question": "Mindestens eine der ausgewählten Dateien enthält ungesehene Änderungen. Möchten Sie sie trotzdem genehmigen?",
- "title": "Warnung!"
- },
"assign-file-to-me": {
"question": {
"multiple": "Dieses Dokument wird gerade von einer anderen Person geprüft. Möchten Sie Reviewer werden und sich selbst dem Dokument zuweisen?",
@@ -1001,13 +1001,13 @@
"recent": "Neu ({hours} h)",
"unassigned": "Niemandem zugewiesen"
},
+ "reanalyse": {
+ "action": "Datei analysieren"
+ },
"reanalyse-dossier": {
"error": "Die Dateien konnten nicht für eine Reanalyse eingeplant werden. Bitte versuchen Sie es erneut.",
"success": "Dateien für Reanalyse vorgesehen."
},
- "reanalyse": {
- "action": "Datei analysieren"
- },
"start-auto-analysis": "Enable auto-analysis",
"stop-auto-analysis": "Stop auto-analysis",
"table-col-names": {
@@ -1077,6 +1077,14 @@
"total-documents": "Anzahl der Dokumente",
"total-people": "{count} {count, plural, one{user} other {users}}"
},
+ "dossier-templates": {
+ "label": "Dossier-Vorlagen",
+ "status": {
+ "active": "Active",
+ "inactive": "Inactive",
+ "incomplete": "Incomplete"
+ }
+ },
"dossier-templates-listing": {
"action": {
"clone": "Clone template",
@@ -1112,14 +1120,6 @@
"title": "{length} dossier {length, plural, one{template} other{templates}}"
}
},
- "dossier-templates": {
- "label": "Dossier-Vorlagen",
- "status": {
- "active": "Active",
- "inactive": "Inactive",
- "incomplete": "Incomplete"
- }
- },
"dossier-watermark-selector": {
"heading": "Watermarks on documents",
"no-watermark": "There is no watermark defined for the dossier template. Contact your app admin to define one.",
@@ -1315,6 +1315,15 @@
"title": "{length} {length, plural, one{entity} other{entities}}"
}
},
+ "entity": {
+ "info": {
+ "actions": {
+ "revert": "Revert",
+ "save": "Save changes"
+ },
+ "heading": "Edit entity"
+ }
+ },
"entity-rules-screen": {
"error": {
"generic": "Something went wrong... Entity rules update failed!"
@@ -1329,28 +1338,19 @@
"warning-text": "Warning: experimental feature!",
"warnings-found": "{warnings, plural, one{A warning} other{{warnings} warnings}} found in rules"
},
- "entity": {
- "info": {
- "actions": {
- "revert": "Revert",
- "save": "Save changes"
- },
- "heading": "Edit entity"
- }
- },
"error": {
"deleted-entity": {
"dossier": {
"action": "Zurück zur Übersicht",
"label": "Dieses Dossier wurde gelöscht!"
},
- "file-dossier": {
- "action": "Zurück zur Übersicht",
- "label": "Das Dossier dieser Datei wurde gelöscht!"
- },
"file": {
"action": "Zurück zum Dossier",
"label": "Diese Datei wurde gelöscht!"
+ },
+ "file-dossier": {
+ "action": "Zurück zur Übersicht",
+ "label": "Das Dossier dieser Datei wurde gelöscht!"
}
},
"file-preview": {
@@ -1368,6 +1368,12 @@
},
"exact-date": "{day} {month} {year} um {hour}:{minute} Uhr",
"file": "Datei",
+ "file-attribute": {
+ "update": {
+ "error": "Failed to update file attribute value!",
+ "success": "File attribute value has been updated successfully!"
+ }
+ },
"file-attribute-encoding-types": {
"ascii": "ASCII",
"iso": "ISO-8859-1",
@@ -1378,12 +1384,6 @@
"number": "Nummer",
"text": "Freier Text"
},
- "file-attribute": {
- "update": {
- "error": "Failed to update file attribute value!",
- "success": "File attribute value has been updated successfully!"
- }
- },
"file-attributes-configurations": {
"cancel": "Cancel",
"form": {
@@ -1601,15 +1601,6 @@
"csv": "File attributes were imported successfully from uploaded CSV file."
}
},
- "filter-menu": {
- "filter-options": "Filteroptionen",
- "filter-types": "Filter",
- "label": "Filter",
- "pages-without-annotations": "Only pages without annotations",
- "redaction-changes": "Nur Anmerkungen mit Schwärzungsänderungen",
- "unseen-pages": "Nur Anmerkungen auf unsichtbaren Seiten",
- "with-comments": "Nur Anmerkungen mit Kommentaren"
- },
"filter": {
"analysis": "Analyse erforderlich",
"comment": "Kommentare",
@@ -1619,6 +1610,15 @@
"redaction": "Geschwärzt",
"updated": "Aktualisiert"
},
+ "filter-menu": {
+ "filter-options": "Filteroptionen",
+ "filter-types": "Filter",
+ "label": "Filter",
+ "pages-without-annotations": "Only pages without annotations",
+ "redaction-changes": "Nur Anmerkungen mit Schwärzungsänderungen",
+ "unseen-pages": "Nur Anmerkungen auf unsichtbaren Seiten",
+ "with-comments": "Nur Anmerkungen mit Kommentaren"
+ },
"filters": {
"assigned-people": "Beauftragt",
"documents-status": "Documents state",
@@ -1893,6 +1893,13 @@
"user-promoted-to-approver": "{user} wurde im Dossier {dossierHref, select, null{{dossierName}} other{{dossierName} }} zum Genehmiger ernannt!",
"user-removed-as-dossier-member": "{user} wurde als Mitglied von: {dossierHref, select, null{{dossierName}} other{{dossierName} }} entfernt!"
},
+ "notifications": {
+ "button-text": "Notifications",
+ "deleted-dossier": "Deleted dossier",
+ "label": "Benachrichtigungen",
+ "mark-all-as-read": "Alle als gelesen markieren",
+ "mark-as": "Mark as {type, select, read{read} unread{unread} other{}}"
+ },
"notifications-screen": {
"category": {
"email-notifications": "E-Mail Benachrichtigungen",
@@ -1906,7 +1913,6 @@
"dossier": "Dossierbezogene Benachrichtigungen",
"other": "Andere Benachrichtigungen"
},
- "options-title": "Wählen Sie aus, in welcher Kategorie Sie benachrichtigt werden möchten",
"options": {
"ASSIGN_APPROVER": "Wenn ich einem Dokument als Genehmiger zugewiesen bin",
"ASSIGN_REVIEWER": "Wenn ich einem Dokument als Überprüfer zugewiesen bin",
@@ -1924,6 +1930,7 @@
"USER_PROMOTED_TO_APPROVER": "Wenn ich Genehmiger in einem Dossier werde",
"USER_REMOVED_AS_DOSSIER_MEMBER": "Wenn ich die Dossier-Mitgliedschaft verliere"
},
+ "options-title": "Wählen Sie aus, in welcher Kategorie Sie benachrichtigt werden möchten",
"schedule": {
"daily": "Tägliche Zusammenfassung",
"instant": "Sofortig",
@@ -1931,13 +1938,6 @@
},
"title": "Benachrichtigungseinstellungen"
},
- "notifications": {
- "button-text": "Notifications",
- "deleted-dossier": "Deleted dossier",
- "label": "Benachrichtigungen",
- "mark-all-as-read": "Alle als gelesen markieren",
- "mark-as": "Mark as {type, select, read{read} unread{unread} other{}}"
- },
"ocr": {
"confirmation-dialog": {
"cancel": "Cancel",
@@ -2029,16 +2029,16 @@
"warnings-label": "Prompts and dialogs",
"warnings-subtitle": "Do not show again options"
},
+ "processing": {
+ "basic": "Processing",
+ "ocr": "OCR"
+ },
"processing-status": {
"ocr": "OCR",
"pending": "Pending",
"processed": "Processed",
"processing": "Processing"
},
- "processing": {
- "basic": "Processing",
- "ocr": "OCR"
- },
"readonly": "Lesemodus",
"readonly-archived": "Read only (archived)",
"redact-text": {
@@ -2274,6 +2274,12 @@
"red-user-admin": "Benutzer-Admin",
"regular": "Regulär"
},
+ "search": {
+ "active-dossiers": "ganze Plattform",
+ "all-dossiers": "all documents",
+ "placeholder": "Nach Dokumenten oder Dokumenteninhalt suchen",
+ "this-dossier": "in diesem Dossier"
+ },
"search-screen": {
"cols": {
"assignee": "Bevollmächtigter",
@@ -2297,12 +2303,6 @@
"no-match": "Keine Dokumente entsprechen Ihren aktuellen Filtern.",
"table-header": "{length} search {length, plural, one{result} other{results}}"
},
- "search": {
- "active-dossiers": "ganze Plattform",
- "all-dossiers": "all documents",
- "placeholder": "Nach Dokumenten oder Dokumenteninhalt suchen",
- "this-dossier": "in diesem Dossier"
- },
"seconds": "seconds",
"size": "Size",
"smtp-auth-config": {
@@ -2558,4 +2558,4 @@
}
},
"yesterday": "Gestern"
-}
+}
\ No newline at end of file
diff --git a/apps/red-ui/src/assets/i18n/scm/en.json b/apps/red-ui/src/assets/i18n/scm/en.json
index c4887426d..8c62be31a 100644
--- a/apps/red-ui/src/assets/i18n/scm/en.json
+++ b/apps/red-ui/src/assets/i18n/scm/en.json
@@ -2558,4 +2558,4 @@
}
},
"yesterday": "Yesterday"
-}
+}
\ No newline at end of file
diff --git a/apps/red-ui/src/assets/icons/general/exit-fullscreen.svg b/apps/red-ui/src/assets/icons/general/exit-fullscreen.svg
deleted file mode 100644
index 48b88b14f..000000000
--- a/apps/red-ui/src/assets/icons/general/exit-fullscreen.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
diff --git a/apps/red-ui/src/assets/icons/general/fullscreen.svg b/apps/red-ui/src/assets/icons/general/fullscreen.svg
deleted file mode 100644
index ea1045287..000000000
--- a/apps/red-ui/src/assets/icons/general/fullscreen.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
diff --git a/docker/red-ui/Dockerfile b/docker/red-ui/Dockerfile
index 477fffd5b..e85f4c56c 100644
--- a/docker/red-ui/Dockerfile
+++ b/docker/red-ui/Dockerfile
@@ -1,4 +1,4 @@
-FROM node:20.11-buster AS builder
+FROM node:20.14-buster AS builder
WORKDIR /ng-app
@@ -23,7 +23,7 @@ CMD ["/bin/cp", "-r", "/ng-app/dist/paligo-styles", "/tmp/styles-export"]
### STAGE 2: Setup ###
-FROM nginx:1.25.4-alpine
+FROM nginx:1.27.0-alpine
ENV NGINX_ENVSUBST_OUTPUT_DIR=/tmp
ENV PDFTRON_ALLOWED_HOSTS=''
## Copy our default nginx config
@@ -34,7 +34,7 @@ COPY docker/common/nginx/custom.conf /etc/nginx/templates/custom.conf.template
RUN rm -rf /usr/share/nginx/html/*
## From ‘builder’ stage copy over the artifacts in dist folder to default nginx public folder
-COPY --from=builder /ng-app/dist/apps/red-ui /usr/share/nginx/html/ui
+COPY --from=builder /ng-app/dist/apps/red-ui/browser /usr/share/nginx/html/ui
COPY version.json /usr/share/nginx/html/ui/assets/version/version.json
#RUN mkdir /tmp/nginx
diff --git a/libs/common-ui b/libs/common-ui
index f60ea513a..590ebcbae 160000
--- a/libs/common-ui
+++ b/libs/common-ui
@@ -1 +1 @@
-Subproject commit f60ea513ac88456f5003ea85c1158ff73fdd3d06
+Subproject commit 590ebcbae2a8a358a52468511c3b60e366ef7e36
diff --git a/libs/red-domain/src/lib/dossier-attributes/dossier-attribute-config.model.ts b/libs/red-domain/src/lib/dossier-attributes/dossier-attribute-config.model.ts
index 552640799..9fa724999 100644
--- a/libs/red-domain/src/lib/dossier-attributes/dossier-attribute-config.model.ts
+++ b/libs/red-domain/src/lib/dossier-attributes/dossier-attribute-config.model.ts
@@ -1,6 +1,5 @@
import { IListable } from '@iqser/common-ui';
-import { IDossierAttributeConfig } from './dossier-attribute-config';
-import { DossierAttributeConfigType } from './types';
+import { DossierAttributeConfigType, IDossierAttributeConfig } from './dossier-attribute-config';
export class DossierAttributeConfig implements IDossierAttributeConfig, IListable {
readonly id: string;
diff --git a/libs/red-domain/src/lib/dossier-attributes/dossier-attribute-config.ts b/libs/red-domain/src/lib/dossier-attributes/dossier-attribute-config.ts
index 43687f835..d80dd873b 100644
--- a/libs/red-domain/src/lib/dossier-attributes/dossier-attribute-config.ts
+++ b/libs/red-domain/src/lib/dossier-attributes/dossier-attribute-config.ts
@@ -1,4 +1,13 @@
-import { DossierAttributeConfigType } from './types';
+export const DossierAttributeConfigTypes = {
+ DATE: 'DATE',
+ IMAGE: 'IMAGE',
+ NUMBER: 'NUMBER',
+ TEXT: 'TEXT',
+} as const;
+
+export type DossierAttributeConfigType = keyof typeof DossierAttributeConfigTypes;
+
+export type DossierAttributeWithValue = IDossierAttributeConfig & { value: string };
export interface IDossierAttributeConfig {
readonly id: string;
diff --git a/libs/red-domain/src/lib/dossier-attributes/index.ts b/libs/red-domain/src/lib/dossier-attributes/index.ts
index f13a671ec..536fd9261 100644
--- a/libs/red-domain/src/lib/dossier-attributes/index.ts
+++ b/libs/red-domain/src/lib/dossier-attributes/index.ts
@@ -1,4 +1,3 @@
-export * from './types';
export * from './dossier-attribute-config';
export * from './dossier-attribute-config.model';
export * from './dossier-attribute';
diff --git a/libs/red-domain/src/lib/dossier-attributes/types.ts b/libs/red-domain/src/lib/dossier-attributes/types.ts
deleted file mode 100644
index 475eb38ee..000000000
--- a/libs/red-domain/src/lib/dossier-attributes/types.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { IDossierAttributeConfig } from './dossier-attribute-config';
-
-export const DossierAttributeConfigTypes = {
- DATE: 'DATE',
- IMAGE: 'IMAGE',
- NUMBER: 'NUMBER',
- TEXT: 'TEXT',
-} as const;
-
-export type DossierAttributeConfigType = keyof typeof DossierAttributeConfigTypes;
-
-export type DossierAttributeWithValue = IDossierAttributeConfig & { value: string };
diff --git a/libs/red-domain/src/lib/dossier-stats/dossier-stats.model.ts b/libs/red-domain/src/lib/dossier-stats/dossier-stats.model.ts
index bf53edf95..7a9a2e4ea 100644
--- a/libs/red-domain/src/lib/dossier-stats/dossier-stats.model.ts
+++ b/libs/red-domain/src/lib/dossier-stats/dossier-stats.model.ts
@@ -1,4 +1,11 @@
-import { isProcessingStatuses, OCR_STATES, PENDING_STATES, PROCESSED_STATES, PROCESSING_STATES, ProcessingFileStatus } from '../files';
+import {
+ isProcessingStatuses,
+ OCR_STATES,
+ PENDING_STATES,
+ PROCESSED_STATES,
+ PROCESSING_STATES,
+ ProcessingFileStatus,
+} from '../files/types';
import { IDossierStats } from './dossier-stats';
import { FileCountPerProcessingStatus, FileCountPerWorkflowStatus } from './types';
diff --git a/libs/red-domain/src/lib/dossier-stats/types.ts b/libs/red-domain/src/lib/dossier-stats/types.ts
index 54a188567..b57ca4ecd 100644
--- a/libs/red-domain/src/lib/dossier-stats/types.ts
+++ b/libs/red-domain/src/lib/dossier-stats/types.ts
@@ -1,4 +1,4 @@
-import { ProcessingFileStatus, WorkflowFileStatus } from '../files';
+import { ProcessingFileStatus, WorkflowFileStatus } from '../files/types';
export type FileCountPerWorkflowStatus = { [key in WorkflowFileStatus]?: number };
export type FileCountPerProcessingStatus = { [key in ProcessingFileStatus]?: number };
diff --git a/libs/red-domain/src/lib/dossiers/dossier.model.ts b/libs/red-domain/src/lib/dossiers/dossier.model.ts
index 859694fd2..e3aae5b61 100644
--- a/libs/red-domain/src/lib/dossiers/dossier.model.ts
+++ b/libs/red-domain/src/lib/dossiers/dossier.model.ts
@@ -1,6 +1,6 @@
import { IListable } from '@iqser/common-ui';
import { List } from '@iqser/common-ui/lib/utils';
-import { DownloadFileType } from '../shared';
+import { DownloadFileType } from '../shared/types';
import { ARCHIVE_ROUTE, DOSSIERS_ROUTE } from './constants';
import { IDossier } from './dossier';
diff --git a/libs/red-domain/src/lib/dossiers/dossier.ts b/libs/red-domain/src/lib/dossiers/dossier.ts
index 0c8a48f10..af6762120 100644
--- a/libs/red-domain/src/lib/dossiers/dossier.ts
+++ b/libs/red-domain/src/lib/dossiers/dossier.ts
@@ -1,5 +1,5 @@
-import { DownloadFileType } from '../shared';
import { List } from '@iqser/common-ui/lib/utils';
+import { DownloadFileType } from '../shared/types';
export interface IDossier {
readonly approverIds: List;
diff --git a/libs/red-domain/src/lib/files/file.model.ts b/libs/red-domain/src/lib/files/file.model.ts
index 8222de8ce..5146f18fb 100644
--- a/libs/red-domain/src/lib/files/file.model.ts
+++ b/libs/red-domain/src/lib/files/file.model.ts
@@ -1,8 +1,8 @@
import { Entity } from '@iqser/common-ui';
-import { ProcessingType, ProcessingTypes } from '../dossier-stats';
-import { ARCHIVE_ROUTE, DOSSIERS_ROUTE } from '../dossiers';
-import { FileAttributes } from '../file-attributes';
-import { StatusSorter } from '../shared';
+import { ProcessingType, ProcessingTypes } from '../dossier-stats/dossier-stats.model';
+import { ARCHIVE_ROUTE, DOSSIERS_ROUTE } from '../dossiers/constants';
+import { FileAttributes } from '../file-attributes/file-attributes';
+import { StatusSorter } from '../shared/sorters/status-sorter';
import { IFile } from './file';
import {
isFullProcessingStatuses,
diff --git a/libs/red-domain/src/lib/pages/viewed-page.model.ts b/libs/red-domain/src/lib/pages/viewed-page.model.ts
index 21fb8bc6f..5a8f0fef0 100644
--- a/libs/red-domain/src/lib/pages/viewed-page.model.ts
+++ b/libs/red-domain/src/lib/pages/viewed-page.model.ts
@@ -1,5 +1,5 @@
import { Entity } from '@iqser/common-ui';
-import { IViewedPage } from '.';
+import { IViewedPage } from './viewed-page';
export class ViewedPage extends Entity {
readonly fileId: string;
diff --git a/libs/red-domain/src/lib/shared/colors.ts b/libs/red-domain/src/lib/shared/colors.ts
index 86f5d289d..a58af7fb5 100644
--- a/libs/red-domain/src/lib/shared/colors.ts
+++ b/libs/red-domain/src/lib/shared/colors.ts
@@ -1,3 +1,3 @@
-import { WorkflowFileStatus } from '../files';
+import { WorkflowFileStatus } from '../files/types';
export type Color = WorkflowFileStatus | string;
diff --git a/libs/red-domain/src/lib/shared/expandable-file-actions.ts b/libs/red-domain/src/lib/shared/expandable-file-actions.ts
index ec27e0575..5293615bb 100644
--- a/libs/red-domain/src/lib/shared/expandable-file-actions.ts
+++ b/libs/red-domain/src/lib/shared/expandable-file-actions.ts
@@ -1,7 +1,7 @@
-import { Observable } from 'rxjs';
import { CircleButtonType, ITrackable } from '@iqser/common-ui';
-import { type File } from '../files';
-import { type Dossier } from '../dossiers';
+import { Observable } from 'rxjs';
+import { Dossier } from '../dossiers/dossier.model';
+import { File } from '../files/file.model';
export const ActionTypes = {
circleBtn: 'circleBtn',
diff --git a/libs/red-domain/src/lib/shared/sorters/status-sorter.ts b/libs/red-domain/src/lib/shared/sorters/status-sorter.ts
index 52d7c1377..1b9ff671f 100644
--- a/libs/red-domain/src/lib/shared/sorters/status-sorter.ts
+++ b/libs/red-domain/src/lib/shared/sorters/status-sorter.ts
@@ -1,4 +1,4 @@
-import { WorkflowFileStatus } from '../../files';
+import { WorkflowFileStatus } from '../../files/types';
type StatusSorterItem = { key: WorkflowFileStatus } | WorkflowFileStatus | string;
type Sorter = Record & {
diff --git a/ngsw-config.json b/ngsw-config.json
index 41cfd4f5a..244fb97b9 100644
--- a/ngsw-config.json
+++ b/ngsw-config.json
@@ -17,5 +17,15 @@
"files": ["/assets/**", "/*.(eot|svg|cur|jpg|png|webp|gif|otf|ttf|woff|woff2|ani)"]
}
}
+ ],
+ "navigationUrls": [
+ "/**",
+ "!/**/*.*",
+ "!/**/*__*",
+ "!/**/*__*/**",
+ "!/ui/assets/wv-resources/**/webviewer-core.min.js",
+ "!/ui/assets/wv-resources/**/webviewer-ui.min.js",
+ "!/assets/wv-resources/**/webviewer-core.min.js",
+ "!/assets/wv-resources/**/webviewer-ui.min.js"
]
}
diff --git a/package.json b/package.json
index fa6ebe421..d714510f0 100644
--- a/package.json
+++ b/package.json
@@ -70,7 +70,7 @@
"@angular/cli": "18.0.4",
"@angular/compiler-cli": "18.0.3",
"@angular/language-service": "18.0.3",
- "@bartholomej/ngx-translate-extract": "^8.0.2",
+ "@vendure/ngx-translate-extract": "9.2.0",
"@localazy/ts-api": "^1.0.0",
"@schematics/angular": "18.0.4",
"@types/file-saver": "^2.0.7",
diff --git a/yarn.lock b/yarn.lock
index 421474ee1..3ccbdcd21 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -198,13 +198,6 @@
dependencies:
tslib "^2.3.0"
-"@angular/compiler@^13.1.1":
- version "13.4.0"
- resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-13.4.0.tgz#ec24a2b71808abd1e3c629e4935a378d487d0143"
- integrity sha512-tPWoq2RC/VIrJtynEnMRWQZemBIC/ypuVfuUf3p8IIXCZHjuGnibdlZTtFYkexc4/sR1ug9xk1cJWvbOPwilng==
- dependencies:
- tslib "^2.3.0"
-
"@angular/core@18.0.3":
version "18.0.3"
resolved "https://registry.yarnpkg.com/@angular/core/-/core-18.0.3.tgz#9de529e9a25e0197bb8aa1ac8d74439bad71e942"
@@ -628,22 +621,6 @@
"@babel/helper-validator-identifier" "^7.24.7"
to-fast-properties "^2.0.0"
-"@bartholomej/ngx-translate-extract@^8.0.2":
- version "8.0.2"
- resolved "https://registry.yarnpkg.com/@bartholomej/ngx-translate-extract/-/ngx-translate-extract-8.0.2.tgz#24fd28c34d66a91b20e6c3b0e1cc1b70878b1bc7"
- integrity sha512-QBayCNhuatTL5mJJzfGtBpbbViRqG+Vv0iQGyiTcoJv40Wv4G+70rQl1Q+I+CW6jcw5L1VfR+RDtKD6WkeuWZw==
- dependencies:
- "@angular/compiler" "^13.1.1"
- "@phenomnomnominal/tsquery" "^4.1.1"
- boxen "^6.2.1"
- colorette "^2.0.16"
- flat "^5.0.2"
- gettext-parser "^4.2.0"
- glob "^7.2.0"
- path "^0.12.7"
- terminal-link "^3.0.0"
- yargs "^17.2.1"
-
"@bcoe/v8-coverage@^0.2.3":
version "0.2.3"
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
@@ -2350,12 +2327,13 @@
resolved "https://registry.yarnpkg.com/@pdftron/webviewer/-/webviewer-10.10.1.tgz#f55f8ce5102582472e970742599449d05810e3d6"
integrity sha512-5CzTS5q1TvjitC2yJGTKq4zuPVN8A696D/57sdlmMVF6RwzGJ9QWHEnDAzkAp5U2wyXs+0QNsOe7EWKcUH7/5Q==
-"@phenomnomnominal/tsquery@^4.1.1":
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/@phenomnomnominal/tsquery/-/tsquery-4.2.0.tgz#7742ff4af12ce673b0b601ba5515c934f1876b14"
- integrity sha512-hR2U3uVcrrdkuG30ItQ+uFDs4ncZAybxWG0OjTE8ptPzVoU7GVeXpy+vMU8zX9EbmjGeITPw/su5HjYQyAH8bA==
+"@phenomnomnominal/tsquery@^6.1.3":
+ version "6.1.3"
+ resolved "https://registry.yarnpkg.com/@phenomnomnominal/tsquery/-/tsquery-6.1.3.tgz#5e819403da2fa6a64b009f1876278fb105ec6b55"
+ integrity sha512-CEqpJ872StsxRmwv9ePCZ4BCisrJSlREUC5XxIRYxhvODt4aQoJFFmjTgaP6meyKiiXxxN/VWPZ58j4yHXRkmw==
dependencies:
- esquery "^1.0.1"
+ "@types/esquery" "^1.5.0"
+ esquery "^1.5.0"
"@pkgjs/parseargs@^0.11.0":
version "0.11.0"
@@ -2613,6 +2591,13 @@
"@types/estree" "*"
"@types/json-schema" "*"
+"@types/esquery@^1.5.0":
+ version "1.5.4"
+ resolved "https://registry.yarnpkg.com/@types/esquery/-/esquery-1.5.4.tgz#ebfd3a3bca6db50446688ba5592d18bb9b807e91"
+ integrity sha512-yYO4Q8H+KJHKW1rEeSzHxcZi90durqYgWVfnh5K6ZADVBjBv2e1NEveYX5yT2bffgN7RqzH3k9930m+i2yBoMA==
+ dependencies:
+ "@types/estree" "*"
+
"@types/estree@*", "@types/estree@1.0.5", "@types/estree@^1.0.5":
version "1.0.5"
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4"
@@ -2683,7 +2668,14 @@
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.5.tgz#e6c29b58e66995d57cd170ce3e2a61926d55ee04"
integrity sha512-MBIOHVZqVqgfro1euRDWX7OO0fBVUUMrN6Pwm8LQsz8cWhEpihlvR70ENj3f40j58TNxZaWv2ndSkInykNBBJw==
-"@types/node@*", "@types/node@20.14.2":
+"@types/node@*":
+ version "20.14.6"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.6.tgz#f3c19ffc98c2220e18de259bb172dd4d892a6075"
+ integrity sha512-JbA0XIJPL1IiNnU7PFxDXyfAwcwVVrOoqyzzyQTyMeVhBzkJVMSkC1LlVsRQ2lpqiY4n6Bb9oCS6lzDKVQxbZw==
+ dependencies:
+ undici-types "~5.26.4"
+
+"@types/node@20.14.2":
version "20.14.2"
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.2.tgz#a5f4d2bcb4b6a87bffcaa717718c5a0f208f4a18"
integrity sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==
@@ -2700,6 +2692,16 @@
resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8"
integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==
+"@types/strip-bom@^3.0.0":
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/@types/strip-bom/-/strip-bom-3.0.0.tgz#14a8ec3956c2e81edb7520790aecf21c290aebd2"
+ integrity sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==
+
+"@types/strip-json-comments@0.0.30":
+ version "0.0.30"
+ resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1"
+ integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==
+
"@types/tough-cookie@*":
version "4.0.5"
resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz#cb6e2a691b70cb177c6e3ae9c1d2e8b2ea8cd304"
@@ -2718,15 +2720,15 @@
"@types/yargs-parser" "*"
"@typescript-eslint/eslint-plugin@^7.2.0":
- version "7.13.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.13.0.tgz#3cdeb5d44d051b21a9567535dd90702b2a42c6ff"
- integrity sha512-FX1X6AF0w8MdVFLSdqwqN/me2hyhuQg4ykN6ZpVhh1ij/80pTvDKclX1sZB9iqex8SjQfVhwMKs3JtnnMLzG9w==
+ version "7.13.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.13.1.tgz#cdc521c8bca38b55585cf30db787fb2abad3f9fd"
+ integrity sha512-kZqi+WZQaZfPKnsflLJQCz6Ze9FFSMfXrrIOcyargekQxG37ES7DJNpJUE9Q/X5n3yTIP/WPutVNzgknQ7biLg==
dependencies:
"@eslint-community/regexpp" "^4.10.0"
- "@typescript-eslint/scope-manager" "7.13.0"
- "@typescript-eslint/type-utils" "7.13.0"
- "@typescript-eslint/utils" "7.13.0"
- "@typescript-eslint/visitor-keys" "7.13.0"
+ "@typescript-eslint/scope-manager" "7.13.1"
+ "@typescript-eslint/type-utils" "7.13.1"
+ "@typescript-eslint/utils" "7.13.1"
+ "@typescript-eslint/visitor-keys" "7.13.1"
graphemer "^1.4.0"
ignore "^5.3.1"
natural-compare "^1.4.0"
@@ -2740,14 +2742,14 @@
"@typescript-eslint/utils" "5.62.0"
"@typescript-eslint/parser@^7.2.0":
- version "7.13.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.13.0.tgz#9489098d68d57ad392f507495f2b82ce8b8f0a6b"
- integrity sha512-EjMfl69KOS9awXXe83iRN7oIEXy9yYdqWfqdrFAYAAr6syP8eLEFI7ZE4939antx2mNgPRW/o1ybm2SFYkbTVA==
+ version "7.13.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.13.1.tgz#fac57811b3e519185f7259bac312291f7b9c4e72"
+ integrity sha512-1ELDPlnLvDQ5ybTSrMhRTFDfOQEOXNM+eP+3HT/Yq7ruWpciQw+Avi73pdEbA4SooCawEWo3dtYbF68gN7Ed1A==
dependencies:
- "@typescript-eslint/scope-manager" "7.13.0"
- "@typescript-eslint/types" "7.13.0"
- "@typescript-eslint/typescript-estree" "7.13.0"
- "@typescript-eslint/visitor-keys" "7.13.0"
+ "@typescript-eslint/scope-manager" "7.13.1"
+ "@typescript-eslint/types" "7.13.1"
+ "@typescript-eslint/typescript-estree" "7.13.1"
+ "@typescript-eslint/visitor-keys" "7.13.1"
debug "^4.3.4"
"@typescript-eslint/scope-manager@5.62.0":
@@ -2758,21 +2760,21 @@
"@typescript-eslint/types" "5.62.0"
"@typescript-eslint/visitor-keys" "5.62.0"
-"@typescript-eslint/scope-manager@7.13.0":
- version "7.13.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.13.0.tgz#6927d6451537ce648c6af67a2327378d4cc18462"
- integrity sha512-ZrMCe1R6a01T94ilV13egvcnvVJ1pxShkE0+NDjDzH4nvG1wXpwsVI5bZCvE7AEDH1mXEx5tJSVR68bLgG7Dng==
+"@typescript-eslint/scope-manager@7.13.1":
+ version "7.13.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.13.1.tgz#c08041206904bf36f0e6997efdb0ca775e0c452e"
+ integrity sha512-adbXNVEs6GmbzaCpymHQ0MB6E4TqoiVbC0iqG3uijR8ZYfpAXMGttouQzF4Oat3P2GxDVIrg7bMI/P65LiQZdg==
dependencies:
- "@typescript-eslint/types" "7.13.0"
- "@typescript-eslint/visitor-keys" "7.13.0"
+ "@typescript-eslint/types" "7.13.1"
+ "@typescript-eslint/visitor-keys" "7.13.1"
-"@typescript-eslint/type-utils@7.13.0":
- version "7.13.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.13.0.tgz#4587282b5227a23753ea8b233805ecafc3924c76"
- integrity sha512-xMEtMzxq9eRkZy48XuxlBFzpVMDurUAfDu5Rz16GouAtXm0TaAoTFzqWUFPPuQYXI/CDaH/Bgx/fk/84t/Bc9A==
+"@typescript-eslint/type-utils@7.13.1":
+ version "7.13.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.13.1.tgz#63bec3f1fb43cf0bc409cbdb88ef96d118ca8632"
+ integrity sha512-aWDbLu1s9bmgPGXSzNCxELu+0+HQOapV/y+60gPXafR8e2g1Bifxzevaa+4L2ytCWm+CHqpELq4CSoN9ELiwCg==
dependencies:
- "@typescript-eslint/typescript-estree" "7.13.0"
- "@typescript-eslint/utils" "7.13.0"
+ "@typescript-eslint/typescript-estree" "7.13.1"
+ "@typescript-eslint/utils" "7.13.1"
debug "^4.3.4"
ts-api-utils "^1.3.0"
@@ -2781,10 +2783,10 @@
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f"
integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==
-"@typescript-eslint/types@7.13.0":
- version "7.13.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.13.0.tgz#0cca95edf1f1fdb0cfe1bb875e121b49617477c5"
- integrity sha512-QWuwm9wcGMAuTsxP+qz6LBBd3Uq8I5Nv8xb0mk54jmNoCyDspnMvVsOxI6IsMmway5d1S9Su2+sCKv1st2l6eA==
+"@typescript-eslint/types@7.13.1":
+ version "7.13.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.13.1.tgz#787db283bd0b58751094c90d5b58bbf5e9fc9bd8"
+ integrity sha512-7K7HMcSQIAND6RBL4kDl24sG/xKM13cA85dc7JnmQXw2cBDngg7c19B++JzvJHRG3zG36n9j1i451GBzRuHchw==
"@typescript-eslint/typescript-estree@5.62.0":
version "5.62.0"
@@ -2799,13 +2801,13 @@
semver "^7.3.7"
tsutils "^3.21.0"
-"@typescript-eslint/typescript-estree@7.13.0":
- version "7.13.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.13.0.tgz#4cc24fc155088ebf3b3adbad62c7e60f72c6de1c"
- integrity sha512-cAvBvUoobaoIcoqox1YatXOnSl3gx92rCZoMRPzMNisDiM12siGilSM4+dJAekuuHTibI2hVC2fYK79iSFvWjw==
+"@typescript-eslint/typescript-estree@7.13.1":
+ version "7.13.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.13.1.tgz#3412841b130e070db2f675e3d9b8cb1ae49e1c3f"
+ integrity sha512-uxNr51CMV7npU1BxZzYjoVz9iyjckBduFBP0S5sLlh1tXYzHzgZ3BR9SVsNed+LmwKrmnqN3Kdl5t7eZ5TS1Yw==
dependencies:
- "@typescript-eslint/types" "7.13.0"
- "@typescript-eslint/visitor-keys" "7.13.0"
+ "@typescript-eslint/types" "7.13.1"
+ "@typescript-eslint/visitor-keys" "7.13.1"
debug "^4.3.4"
globby "^11.1.0"
is-glob "^4.0.3"
@@ -2827,15 +2829,15 @@
eslint-scope "^5.1.1"
semver "^7.3.7"
-"@typescript-eslint/utils@7.13.0":
- version "7.13.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.13.0.tgz#f84e7e8aeceae945a9a3f40d077fd95915308004"
- integrity sha512-jceD8RgdKORVnB4Y6BqasfIkFhl4pajB1wVxrF4akxD2QPM8GNYjgGwEzYS+437ewlqqrg7Dw+6dhdpjMpeBFQ==
+"@typescript-eslint/utils@7.13.1":
+ version "7.13.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.13.1.tgz#611083379caa0d3a2c09d126c65065a3e4337ba2"
+ integrity sha512-h5MzFBD5a/Gh/fvNdp9pTfqJAbuQC4sCN2WzuXme71lqFJsZtLbjxfSk4r3p02WIArOF9N94pdsLiGutpDbrXQ==
dependencies:
"@eslint-community/eslint-utils" "^4.4.0"
- "@typescript-eslint/scope-manager" "7.13.0"
- "@typescript-eslint/types" "7.13.0"
- "@typescript-eslint/typescript-estree" "7.13.0"
+ "@typescript-eslint/scope-manager" "7.13.1"
+ "@typescript-eslint/types" "7.13.1"
+ "@typescript-eslint/typescript-estree" "7.13.1"
"@typescript-eslint/visitor-keys@5.62.0":
version "5.62.0"
@@ -2845,12 +2847,12 @@
"@typescript-eslint/types" "5.62.0"
eslint-visitor-keys "^3.3.0"
-"@typescript-eslint/visitor-keys@7.13.0":
- version "7.13.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.13.0.tgz#2eb7ce8eb38c2b0d4a494d1fe1908e7071a1a353"
- integrity sha512-nxn+dozQx+MK61nn/JP+M4eCkHDSxSLDpgE3WcQo0+fkjEolnaB5jswvIKC4K56By8MMgIho7f1PVxERHEo8rw==
+"@typescript-eslint/visitor-keys@7.13.1":
+ version "7.13.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.13.1.tgz#9c229a795a919db61f2d7f2337ef584ac05fbe96"
+ integrity sha512-k/Bfne7lrP7hcb7m9zSsgcBmo+8eicqqfNAJ7uUY+jkTFpKeH2FSkWpFRtimBxgkyvqfu9jTPRbYOvud6isdXA==
dependencies:
- "@typescript-eslint/types" "7.13.0"
+ "@typescript-eslint/types" "7.13.1"
eslint-visitor-keys "^3.4.3"
"@ungap/structured-clone@^1.2.0":
@@ -2858,6 +2860,21 @@
resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406"
integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==
+"@vendure/ngx-translate-extract@9.2.0":
+ version "9.2.0"
+ resolved "https://registry.yarnpkg.com/@vendure/ngx-translate-extract/-/ngx-translate-extract-9.2.0.tgz#3e7d25066284ed9a5d45008b2cb370e07a03db9d"
+ integrity sha512-ou6lQjsBy52lSt5m8p8Xugc4147s/6wamX6lbRvOD4K6/oeuQFhpfnuXgxUxnlCkna9udJIRsHlJSL8hXEtx3w==
+ dependencies:
+ "@phenomnomnominal/tsquery" "^6.1.3"
+ braces "^3.0.2"
+ colorette "^2.0.20"
+ flat "^6.0.1"
+ gettext-parser "^4.2.0"
+ glob "^10.3.0"
+ json5 "^2.2.3"
+ tsconfig "^7.0.0"
+ yargs "^17.7.2"
+
"@vitejs/plugin-basic-ssl@1.1.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz#8b840305a6b48e8764803435ec0c716fa27d3802"
@@ -3123,13 +3140,6 @@ ajv@^8.0.0:
require-from-string "^2.0.2"
uri-js "^4.4.1"
-ansi-align@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59"
- integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==
- dependencies:
- string-width "^4.1.0"
-
ansi-colors@4.1.3, ansi-colors@^4.1.1:
version "4.1.3"
resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b"
@@ -3142,13 +3152,6 @@ ansi-escapes@^4.2.1, ansi-escapes@^4.3.2:
dependencies:
type-fest "^0.21.3"
-ansi-escapes@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-5.0.0.tgz#b6a0caf0eef0c41af190e9a749e0c00ec04bb2a6"
- integrity sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==
- dependencies:
- type-fest "^1.0.2"
-
ansi-escapes@^6.2.0:
version "6.2.1"
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-6.2.1.tgz#76c54ce9b081dad39acec4b5d53377913825fb0f"
@@ -3368,20 +3371,6 @@ boolbase@^1.0.0:
resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==
-boxen@^6.2.1:
- version "6.2.1"
- resolved "https://registry.yarnpkg.com/boxen/-/boxen-6.2.1.tgz#b098a2278b2cd2845deef2dff2efc38d329b434d"
- integrity sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==
- dependencies:
- ansi-align "^3.0.1"
- camelcase "^6.2.0"
- chalk "^4.1.2"
- cli-boxes "^3.0.0"
- string-width "^5.0.1"
- type-fest "^2.5.0"
- widest-line "^4.0.1"
- wrap-ansi "^8.0.1"
-
brace-expansion@^1.1.7:
version "1.1.11"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
@@ -3397,7 +3386,7 @@ brace-expansion@^2.0.1:
dependencies:
balanced-match "^1.0.0"
-braces@^3.0.3, braces@~3.0.2:
+braces@^3.0.2, braces@^3.0.3, braces@~3.0.2:
version "3.0.3"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
@@ -3491,9 +3480,9 @@ camelcase@^6.2.0:
integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
caniuse-lite@^1.0.30001629:
- version "1.0.30001634"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001634.tgz#aa563c8e7aeaf552f7ead60371bc8d803425deaa"
- integrity sha512-fbBYXQ9q3+yp1q1gBk86tOFs4pyn/yxFm5ZNP18OXJDfA3txImOY9PhfxVggZ4vRHDqoU8NrKU81eN0OtzOgRA==
+ version "1.0.30001636"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz#b15f52d2bdb95fad32c2f53c0b68032b85188a78"
+ integrity sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==
caseless@~0.12.0:
version "0.12.0"
@@ -3509,7 +3498,7 @@ chalk@^2.4.2:
escape-string-regexp "^1.0.5"
supports-color "^5.3.0"
-chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2, chalk@~4.1.0:
+chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@~4.1.0:
version "4.1.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
@@ -3579,11 +3568,6 @@ clean-stack@^2.0.0:
resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
-cli-boxes@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145"
- integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==
-
cli-cursor@3.1.0, cli-cursor@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307"
@@ -3669,7 +3653,7 @@ color-name@~1.1.4:
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
-colorette@^2.0.16, colorette@^2.0.20:
+colorette@^2.0.20:
version "2.0.20"
resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a"
integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==
@@ -3990,9 +3974,9 @@ ejs@^3.1.7:
jake "^10.8.5"
electron-to-chromium@^1.4.796:
- version "1.4.803"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.803.tgz#cf55808a5ee12e2a2778bbe8cdc941ef87c2093b"
- integrity sha512-61H9mLzGOCLLVsnLiRzCbc63uldP0AniRYPV3hbGVtONA1pI7qSGILdbofR7A8TMbOypDocEAjH/e+9k1QIe3g==
+ version "1.4.807"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.807.tgz#4d6c5ea1516f0164ac5bfd487ccd4ee9507c8f01"
+ integrity sha512-kSmJl2ZwhNf/bcIuCH/imtNOKlpkLDn2jqT5FJ+/0CXjhnFaOa9cOe9gHKKy71eM49izwuQjZhKk+lWQ1JxB7A==
emittery@^0.13.1:
version "0.13.1"
@@ -4329,7 +4313,7 @@ esprima@^4.0.0, esprima@^4.0.1:
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
-esquery@^1.0.1, esquery@^1.4.2:
+esquery@^1.4.2, esquery@^1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b"
integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==
@@ -4541,6 +4525,11 @@ flat@^5.0.2:
resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241"
integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==
+flat@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/flat/-/flat-6.0.1.tgz#09070cf918293b401577f20843edeadf4d3e8755"
+ integrity sha512-/3FfIa8mbrg3xE7+wAhWeV+bd7L2Mof+xtZb5dRDKZ+wDvYJK4WDYeIOuOhre5Yv5aQObZrlbRmk3RTSiuQBtw==
+
flatted@^3.2.9:
version "3.3.1"
resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a"
@@ -4688,18 +4677,19 @@ glob-to-regexp@^0.4.1:
resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
-glob@^10.2.2, glob@^10.3.10:
- version "10.4.1"
- resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.1.tgz#0cfb01ab6a6b438177bfe6a58e2576f6efe909c2"
- integrity sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==
+glob@^10.2.2, glob@^10.3.0, glob@^10.3.10:
+ version "10.4.2"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.2.tgz#bed6b95dade5c1f80b4434daced233aee76160e5"
+ integrity sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==
dependencies:
foreground-child "^3.1.0"
jackspeak "^3.1.2"
minimatch "^9.0.4"
minipass "^7.1.2"
+ package-json-from-dist "^1.0.0"
path-scurry "^1.11.1"
-glob@^7.1.3, glob@^7.1.4, glob@^7.2.0, glob@~7.2.0:
+glob@^7.1.3, glob@^7.1.4, glob@~7.2.0:
version "7.2.3"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
@@ -4965,11 +4955,6 @@ inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3:
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
-inherits@2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
- integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==
-
ini@4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.2.tgz#7f646dbd9caea595e61f88ef60bfff8b01f8130a"
@@ -5827,15 +5812,15 @@ lint-staged@15.2.7:
yaml "~2.4.2"
listr2@~8.2.1:
- version "8.2.1"
- resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.2.1.tgz#06a1a6efe85f23c5324180d7c1ddbd96b5eefd6d"
- integrity sha512-irTfvpib/rNiD637xeevjO2l3Z5loZmuaRi0L0YE5LfijwVY96oyVn0DFD3o/teAok7nfobMG1THvvcHh/BP6g==
+ version "8.2.2"
+ resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.2.2.tgz#e00501c515242798d0ea4a0bbaffa8dc97158648"
+ integrity sha512-sy0dq+JPS+RAFiFk2K8Nbub7khNmeeoFALNUJ4Wzk34wZKAzaOhEXqGWs4RA5aui0RaM6Hgn7VEKhCj0mlKNLA==
dependencies:
cli-truncate "^4.0.0"
colorette "^2.0.20"
eventemitter3 "^5.0.1"
log-update "^6.0.0"
- rfdc "^1.3.1"
+ rfdc "^1.4.1"
wrap-ansi "^9.0.0"
lmdb@3.0.8:
@@ -6590,6 +6575,11 @@ p-try@^2.0.0:
resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+package-json-from-dist@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00"
+ integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==
+
pacote@18.0.6:
version "18.0.6"
resolved "https://registry.yarnpkg.com/pacote/-/pacote-18.0.6.tgz#ac28495e24f4cf802ef911d792335e378e86fac7"
@@ -6701,14 +6691,6 @@ path-type@^4.0.0:
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
-path@^0.12.7:
- version "0.12.7"
- resolved "https://registry.yarnpkg.com/path/-/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f"
- integrity sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==
- dependencies:
- process "^0.11.1"
- util "^0.10.3"
-
picocolors@^1.0.0, picocolors@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1"
@@ -6803,11 +6785,6 @@ process-nextick-args@~2.0.0:
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
-process@^0.11.1:
- version "0.11.10"
- resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
- integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==
-
promise-inflight@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
@@ -6987,7 +6964,7 @@ reusify@^1.0.4:
resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
-rfdc@^1.3.1:
+rfdc@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca"
integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==
@@ -7487,6 +7464,11 @@ strip-json-comments@3.1.1, strip-json-comments@^3.1.1:
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+strip-json-comments@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+ integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==
+
strong-log-transformer@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz#0f5ed78d325e0421ac6f90f7f10e691d6ae3ae10"
@@ -7503,7 +7485,7 @@ supports-color@^5.3.0:
dependencies:
has-flag "^3.0.0"
-supports-color@^7.0.0, supports-color@^7.1.0:
+supports-color@^7.1.0:
version "7.2.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
@@ -7517,14 +7499,6 @@ supports-color@^8.0.0:
dependencies:
has-flag "^4.0.0"
-supports-hyperlinks@^2.2.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624"
- integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==
- dependencies:
- has-flag "^4.0.0"
- supports-color "^7.0.0"
-
supports-preserve-symlinks-flag@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
@@ -7585,14 +7559,6 @@ tar@^6.1.11, tar@^6.1.2:
mkdirp "^1.0.3"
yallist "^4.0.0"
-terminal-link@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-3.0.0.tgz#91c82a66b52fc1684123297ce384429faf72ac5c"
- integrity sha512-flFL3m4wuixmf6IfhFJd1YPiLiMuxEc8uHRM1buzIeZPm22Au2pDqBJQgdo7n1WfPU1ONFGv7YDwpFBmHGF6lg==
- dependencies:
- ansi-escapes "^5.0.0"
- supports-hyperlinks "^2.2.0"
-
terser-webpack-plugin@^5.3.10:
version "5.3.10"
resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199"
@@ -7738,6 +7704,16 @@ tsconfig-paths@^4.1.2:
minimist "^1.2.6"
strip-bom "^3.0.0"
+tsconfig@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-7.0.0.tgz#84538875a4dc216e5c4a5432b3a4dec3d54e91b7"
+ integrity sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==
+ dependencies:
+ "@types/strip-bom" "^3.0.0"
+ "@types/strip-json-comments" "0.0.30"
+ strip-bom "^3.0.0"
+ strip-json-comments "^2.0.0"
+
tslib@2.6.3, tslib@^2.0.0, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.5.0, tslib@^2.6.2:
version "2.6.3"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0"
@@ -7794,16 +7770,6 @@ type-fest@^0.21.3:
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
-type-fest@^1.0.2:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1"
- integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==
-
-type-fest@^2.5.0:
- version "2.19.0"
- resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b"
- integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==
-
typescript@5.4.5:
version "5.4.5"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611"
@@ -7871,13 +7837,6 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1:
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
-util@^0.10.3:
- version "0.10.4"
- resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901"
- integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==
- dependencies:
- inherits "2.0.3"
-
v8-compile-cache-lib@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf"
@@ -8047,13 +8006,6 @@ which@^4.0.0:
dependencies:
isexe "^3.1.1"
-widest-line@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-4.0.1.tgz#a0fc673aaba1ea6f0a0d35b3c2795c9a9cc2ebf2"
- integrity sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==
- dependencies:
- string-width "^5.0.1"
-
word-wrap@^1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"
@@ -8086,7 +8038,7 @@ wrap-ansi@^7.0.0:
string-width "^4.1.0"
strip-ansi "^6.0.0"
-wrap-ansi@^8.0.1, wrap-ansi@^8.1.0:
+wrap-ansi@^8.1.0:
version "8.1.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"
integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==
@@ -8181,7 +8133,7 @@ yargs-parser@21.1.1, yargs-parser@^21.0.1, yargs-parser@^21.1.1:
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"
integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
-yargs@17.7.2, yargs@^17.0.0, yargs@^17.2.1, yargs@^17.3.1, yargs@^17.6.2:
+yargs@17.7.2, yargs@^17.0.0, yargs@^17.2.1, yargs@^17.3.1, yargs@^17.6.2, yargs@^17.7.2:
version "17.7.2"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269"
integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==