-
-
- {{ item.numberOfPages }}
+
+
-
+
+
+
+
+
+
+ {{ item.numberOfPages }}
+
+
+
diff --git a/apps/red-ui/src/app/modules/search/search-item-template/search-item-template.component.scss b/apps/red-ui/src/app/modules/search/search-item-template/search-item-template.component.scss
index 7bf631ad2..d9b2dd141 100644
--- a/apps/red-ui/src/app/modules/search/search-item-template/search-item-template.component.scss
+++ b/apps/red-ui/src/app/modules/search/search-item-template/search-item-template.component.scss
@@ -7,3 +7,8 @@
background-color: var(--iqser-highlight-color);
}
}
+
+a.item-link {
+ display: contents;
+ @include common-mixins.clear-a;
+}
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 f53228d4f..6675f8d16 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
@@ -1,5 +1,5 @@
import { NgIf, NgTemplateOutlet } from '@angular/common';
-import { ChangeDetectorRef, Component, HostBinding, inject, Injector, Input, OnChanges, Optional, ViewChild } from '@angular/core';
+import { ChangeDetectorRef, Component, HostBinding, inject, Injector, Input, OnChanges, Optional, signal, ViewChild } from '@angular/core';
import { toObservable } from '@angular/core/rxjs-interop';
import { Router } from '@angular/router';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
@@ -15,13 +15,14 @@ import {
} from '@iqser/common-ui';
import { getCurrentUser } from '@iqser/common-ui/lib/users';
import { IqserTooltipPositions } from '@iqser/common-ui/lib/utils';
-import { Action, ActionTypes, Dossier, File, ProcessingFileStatuses, User } from '@red/domain';
+import { Action, ActionTypes, ApproveResponse, Dossier, File, ProcessingFileStatuses, User } from '@red/domain';
import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service';
import { FileAttributesService } from '@services/entity-services/file-attributes.service';
import { FileManagementService } from '@services/files/file-management.service';
import { FilesService } from '@services/files/files.service';
import { PermissionsService } from '@services/permissions.service';
import { ReanalysisService, ReanalyzeQueryParams } from '@services/reanalysis.service';
+import { ApproveWarningDetailsComponent } from '@shared/components/approve-warning-details/approve-warning-details.component';
import { ExpandableFileActionsComponent } from '@shared/components/expandable-file-actions/expandable-file-actions.component';
import { ProcessingIndicatorComponent } from '@shared/components/processing-indicator/processing-indicator.component';
import { LongPressDirective, LongPressEvent } from '@shared/directives/long-press.directive';
@@ -304,20 +305,22 @@ export class FileActionsComponent implements OnChanges {
}
async setFileApproved() {
- if (!this.file.analysisRequired && !this.file.hasUpdates) {
- await this.#setFileApproved();
+ this._loadingService.start();
+ const approvalResponse: ApproveResponse = (await this._filesService.getApproveWarnings([this.file]))[0];
+ this._loadingService.stop();
+ if (!approvalResponse.hasWarnings) {
return;
}
const data: IConfirmationDialogData = {
- title: this.file.analysisRequired
- ? _('confirmation-dialog.approve-file-without-analysis.title')
- : _('confirmation-dialog.approve-file.title'),
- question: this.file.analysisRequired
- ? _('confirmation-dialog.approve-file-without-analysis.question')
- : _('confirmation-dialog.approve-file.question'),
- confirmationText: this.file.analysisRequired ? _('confirmation-dialog.approve-file-without-analysis.confirmationText') : null,
- denyText: this.file.analysisRequired ? _('confirmation-dialog.approve-file-without-analysis.denyText') : null,
+ title: _('confirmation-dialog.approve-file.title'),
+ question: _('confirmation-dialog.approve-file.question'),
+ translateParams: { questionLength: 1 },
+ confirmationText: _('confirmation-dialog.approve-file.confirmationText'),
+ denyText: _('confirmation-dialog.approve-file.denyText'),
+ component: ApproveWarningDetailsComponent,
+ componentInputs: { data: signal([approvalResponse]), files: signal([this.file]) },
+ cancelButtonPrimary: true,
};
this._dialogService.openDialog('confirm', data, () => this.#setFileApproved());
diff --git a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/dictionary/edit-dossier-dictionary.component.html b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/dictionary/edit-dossier-dictionary.component.html
index 727bec369..7adbcaea3 100644
--- a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/dictionary/edit-dossier-dictionary.component.html
+++ b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/dictionary/edit-dossier-dictionary.component.html
@@ -1,14 +1,16 @@
@@ -18,73 +20,31 @@
- {{
- dictionary.entries.length +
- dictionary.falsePositiveEntries.length +
- dictionary.falseRecommendationEntries.length
- }}
- entries
+
-
diff --git a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/dictionary/edit-dossier-dictionary.component.scss b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/dictionary/edit-dossier-dictionary.component.scss
index 01fac8bdf..62aca620b 100644
--- a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/dictionary/edit-dossier-dictionary.component.scss
+++ b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/dictionary/edit-dossier-dictionary.component.scss
@@ -11,13 +11,14 @@
.dictionaries {
border-right: 1px solid var(--iqser-separator);
- overflow-y: scroll;
+ overflow-y: auto;
+ width: 200px;
@include common-mixins.scroll-bar;
.dictionary {
height: 40px;
padding: 15px;
- border: 1px solid var(--iqser-separator);
+ border-bottom: 1px solid var(--iqser-separator);
display: flex;
gap: 10px;
cursor: pointer;
@@ -43,33 +44,7 @@
.entries {
flex-grow: 1;
padding: 16px 0 16px 12px;
-
- .header-wrapper {
- display: flex;
- justify-content: space-between;
-
- .header-left {
- display: flex;
-
- .iqser-input-group {
- margin-left: 24px;
- }
- }
-
- .read-only {
- padding-right: 100px;
- }
-
- .display-name {
- display: flex;
- align-items: center;
- margin-bottom: 24px;
-
- > div {
- font-weight: 600;
- }
- }
- }
+ overflow: hidden;
}
}
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 fd125866d..28d5e725f 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,12 @@
import { Component, Input, OnInit, ViewChild } from '@angular/core';
-import { CircleButtonComponent, IconButtonComponent, IqserDialog, LoadingService } from '@iqser/common-ui';
+import {
+ CircleButtonComponent,
+ ConfirmationDialogService,
+ ConfirmOptions,
+ 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';
@@ -13,6 +20,7 @@ import { AnnotationIconComponent } from '@shared/components/annotation-icon/anno
import { MatTooltip } from '@angular/material/tooltip';
import { MatIcon } from '@angular/material/icon';
import { TranslateModule } from '@ngx-translate/core';
+import { workloadTranslations } from '@translations/workload-translations';
@Component({
selector: 'redaction-edit-dossier-dictionary',
@@ -40,8 +48,17 @@ export class EditDossierDictionaryComponent implements OnInit {
activeEntryType = DictionaryEntryTypes.ENTRY;
entriesToDisplay: List = [];
readonly entryTypes = DictionaryEntryTypes;
+ protected readonly workloadTranslations = workloadTranslations;
@ViewChild(DictionaryManagerComponent, { static: false }) private readonly _dictionaryManager: DictionaryManagerComponent;
+ constructor(
+ private readonly _dictionaryService: DictionaryService,
+ private readonly _permissionsService: PermissionsService,
+ private readonly _loadingService: LoadingService,
+ private readonly _iqserDialog: IqserDialog,
+ private readonly _confirmationDialogService: ConfirmationDialogService,
+ ) {}
+
get changed(): boolean {
return this._dictionaryManager?.editor.hasChanges;
}
@@ -54,13 +71,6 @@ export class EditDossierDictionaryComponent implements OnInit {
return this._dictionaryManager?.editor.hasChanges;
}
- constructor(
- private readonly _dictionaryService: DictionaryService,
- private readonly _permissionsService: PermissionsService,
- private readonly _loadingService: LoadingService,
- private readonly _iqserDialog: IqserDialog,
- ) {}
-
async ngOnInit() {
this._loadingService.start();
this.canEdit = this._permissionsService.canEditDossierDictionary(this.dossier);
@@ -95,16 +105,23 @@ export class EditDossierDictionaryComponent implements OnInit {
this._dictionaryManager.revert();
}
- selectDictionary(dictionary: Dictionary, entryType?: DictionaryEntryType) {
+ async selectDictionary(dictionary: Dictionary, entryType?: DictionaryEntryType, checkForChanges = false) {
+ if (checkForChanges && !(await this._checkForChanges()).continue) {
+ return;
+ }
+
this.selectedDictionary = dictionary;
- this.selectEntryType(entryType);
+ await this.selectEntryType(entryType);
}
- selectEntryType(selectedEntryType: DictionaryEntryType) {
- this.activeEntryType = selectedEntryType ?? this.activeEntryType;
- const entryType = this.selectedDictionary.hint ? DictionaryEntryTypes.ENTRY : this.activeEntryType;
+ async selectEntryType(selectedEntryType: DictionaryEntryType, checkForChanges = false) {
+ if (checkForChanges && !(await this._checkForChanges()).continue) {
+ return;
+ }
- switch (entryType) {
+ this.activeEntryType = selectedEntryType ?? this.activeEntryType;
+
+ switch (this.activeEntryType) {
case DictionaryEntryTypes.ENTRY: {
this.entriesToDisplay = this.selectedDictionary.entries;
break;
@@ -141,13 +158,32 @@ export class EditDossierDictionaryComponent implements OnInit {
await this.#retrieveDictionaries();
}
+ private async _checkForChanges(): Promise<{ continue: boolean }> {
+ if (this.changed) {
+ const dialogRef = this._confirmationDialogService.open({ disableConfirm: !this.valid });
+ const result = await firstValueFrom(dialogRef.afterClosed());
+ if (result === ConfirmOptions.CONFIRM) {
+ this._loadingService.start();
+ const { success } = await this.save();
+ this._loadingService.stop();
+ if (!success) {
+ return { continue: false };
+ }
+ } else if (!result) {
+ return { continue: false };
+ }
+ }
+
+ return { continue: true };
+ }
+
async #updateDossierDictionary() {
await this.#retrieveDictionaries();
let dictionaryToSelect = this.dictionaries[0];
if (this.selectedDictionary) {
dictionaryToSelect = this.dictionaries.find(d => d.type === this.selectedDictionary.type);
}
- this.selectDictionary(dictionaryToSelect, this.activeEntryType);
+ await this.selectDictionary(dictionaryToSelect, this.activeEntryType);
}
async #retrieveDictionaries() {
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 ce7c1d58c..c41932fba 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
@@ -42,12 +42,16 @@ export class EditDossierDownloadPackageComponent
{
#existsWatermarks$: Observable
;
form: FormGroup;
- downloadTypes: { key: DownloadFileType; label: string }[] = ['ORIGINAL', 'PREVIEW', 'DELTA_PREVIEW', 'REDACTED'].map(
- (type: DownloadFileType) => ({
- key: type,
- label: downloadTypesTranslations[type],
- }),
- );
+ downloadTypes: { key: DownloadFileType; label: string }[] = [
+ 'ORIGINAL',
+ 'PREVIEW',
+ 'OPTIMIZED_PREVIEW',
+ 'DELTA_PREVIEW',
+ 'REDACTED',
+ ].map((type: DownloadFileType) => ({
+ key: type,
+ label: downloadTypesTranslations[type],
+ }));
availableReportTypes: IReportTemplate[] = [];
readonly roles = Roles;
@Input() dossier: Dossier;
diff --git a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.html b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.html
index bbd9d8aa2..86a398e69 100644
--- a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.html
+++ b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.html
@@ -44,11 +44,15 @@