diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/rss-dialog/rss-dialog.component.html b/apps/red-ui/src/app/modules/file-preview/dialogs/rss-dialog/rss-dialog.component.html
new file mode 100644
index 000000000..7b6438719
--- /dev/null
+++ b/apps/red-ui/src/app/modules/file-preview/dialogs/rss-dialog/rss-dialog.component.html
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/rss-dialog/rss-dialog.component.scss b/apps/red-ui/src/app/modules/file-preview/dialogs/rss-dialog/rss-dialog.component.scss
new file mode 100644
index 000000000..fa01814c2
--- /dev/null
+++ b/apps/red-ui/src/app/modules/file-preview/dialogs/rss-dialog/rss-dialog.component.scss
@@ -0,0 +1,21 @@
+.rss-row {
+ display: flex;
+ flex-direction: row;
+ border-bottom: 1px solid var(--iqser-separator);
+
+ .rss-key {
+ font-weight: bold;
+ flex: 30;
+ text-align: right;
+ padding: 4px;
+ }
+
+ .rss-value {
+ padding: 4px;
+ flex: 70;
+ }
+}
+
+.dialog-content {
+ overflow: auto;
+}
diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/rss-dialog/rss-dialog.component.ts b/apps/red-ui/src/app/modules/file-preview/dialogs/rss-dialog/rss-dialog.component.ts
new file mode 100644
index 000000000..1408b1425
--- /dev/null
+++ b/apps/red-ui/src/app/modules/file-preview/dialogs/rss-dialog/rss-dialog.component.ts
@@ -0,0 +1,41 @@
+import { Component, Inject } from '@angular/core';
+import { BaseDialogComponent, SaveOptions } from '@iqser/common-ui';
+import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
+import { RssService } from '@services/files/rss.service';
+import { IFile, IRssEntry } from '@red/domain';
+import { BehaviorSubject, Observable } from 'rxjs';
+import { saveAs } from 'file-saver';
+import { tap } from 'rxjs/operators';
+
+interface RssData {
+ file: IFile;
+}
+
+@Component({
+ templateUrl: './rss-dialog.component.html',
+ styleUrls: ['./rss-dialog.component.scss'],
+})
+export class RssDialogComponent extends BaseDialogComponent {
+ rssData$: Observable;
+ rssDataSubject$: BehaviorSubject = new BehaviorSubject(null);
+
+ constructor(
+ protected readonly _dialogRef: MatDialogRef,
+ private readonly _rssService: RssService,
+ @Inject(MAT_DIALOG_DATA) readonly data: RssData,
+ ) {
+ super(_dialogRef);
+ this.rssData$ = this._rssService
+ .getRSSData(this.data.file.dossierId, this.data.file.fileId)
+ .pipe(tap(entry => this.rssDataSubject$.next(entry)));
+ }
+
+ export() {
+ const blob = new Blob([JSON.stringify(this.rssDataSubject$.value, null, 2)], { type: 'application/json' });
+ saveAs(blob, this.data.file.filename + '.rss.json');
+ }
+
+ save(options?: SaveOptions): void {
+ this.export();
+ }
+}
diff --git a/apps/red-ui/src/app/modules/file-preview/file-preview-screen.component.html b/apps/red-ui/src/app/modules/file-preview/file-preview-screen.component.html
index 4e3f9d474..591c68ff6 100644
--- a/apps/red-ui/src/app/modules/file-preview/file-preview-screen.component.html
+++ b/apps/red-ui/src/app/modules/file-preview/file-preview-screen.component.html
@@ -51,6 +51,16 @@
icon="iqser:download"
tooltipPosition="below"
>
+
+
{
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
index df268de84..464a6937e 100644
--- 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
@@ -50,6 +50,7 @@ import { AnnotationReferenceComponent } from './components/annotation-reference/
import { ImportRedactionsDialogComponent } from './dialogs/import-redactions-dialog/import-redactions-dialog';
import { DocumentUnloadedGuard } from './services/document-unloaded.guard';
import { FilePreviewRightContainerComponent } from './components/right-container/file-preview-right-container.component';
+import { RssDialogComponent } from './dialogs/rss-dialog/rss-dialog.component';
const routes: Routes = [
{
@@ -72,6 +73,7 @@ const dialogs = [
AcceptRecommendationDialogComponent,
DocumentInfoDialogComponent,
ImportRedactionsDialogComponent,
+ RssDialogComponent,
];
const components = [
diff --git a/apps/red-ui/src/app/modules/file-preview/services/file-preview-dialog.service.ts b/apps/red-ui/src/app/modules/file-preview/services/file-preview-dialog.service.ts
index 833300c10..49a7df222 100644
--- a/apps/red-ui/src/app/modules/file-preview/services/file-preview-dialog.service.ts
+++ b/apps/red-ui/src/app/modules/file-preview/services/file-preview-dialog.service.ts
@@ -9,10 +9,12 @@ import { RecategorizeImageDialogComponent } from '../dialogs/recategorize-image-
import { ConfirmationDialogComponent, DialogConfig, DialogService } from '@iqser/common-ui';
import { ResizeAnnotationDialogComponent } from '../dialogs/resize-annotation-dialog/resize-annotation-dialog.component';
import { HighlightActionDialogComponent } from '../dialogs/highlight-action-dialog/highlight-action-dialog.component';
+import { RssDialogComponent } from '../dialogs/rss-dialog/rss-dialog.component';
type DialogType =
| 'confirm'
| 'documentInfo'
+ | 'rss'
| 'recategorizeImage'
| 'changeLegalBasis'
| 'removeAnnotations'
@@ -54,6 +56,10 @@ export class FilePreviewDialogService extends DialogService {
highlightAction: {
component: HighlightActionDialogComponent,
},
+ rss: {
+ component: RssDialogComponent,
+ dialogConfig: { width: '90vw' },
+ },
};
constructor(protected readonly _dialog: MatDialog) {
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 c59924305..1ebc9f6e2 100644
--- a/apps/red-ui/src/app/modules/icons/icons.module.ts
+++ b/apps/red-ui/src/app/modules/icons/icons.module.ts
@@ -62,6 +62,7 @@ export class IconsModule {
'report',
'resize',
'rotation',
+ 'rss',
'rule',
'secret',
'status',
diff --git a/apps/red-ui/src/app/services/files/rss.service.ts b/apps/red-ui/src/app/services/files/rss.service.ts
new file mode 100644
index 000000000..f8ba3030c
--- /dev/null
+++ b/apps/red-ui/src/app/services/files/rss.service.ts
@@ -0,0 +1,22 @@
+import { Injectable } from '@angular/core';
+import { GenericService, HeadersConfiguration, QueryParam, RequiredParam, Validate } from '@iqser/common-ui';
+import { IRedactionLog, IRssData, IRssEntry } from '@red/domain';
+import { catchError, map, tap } from 'rxjs/operators';
+import { of } from 'rxjs';
+
+@Injectable({ providedIn: 'root' })
+export class RssService extends GenericService {
+ protected readonly _defaultModelPath = 'import-redactions';
+
+ @Validate()
+ getRSSData(@RequiredParam() dossierId: string, @RequiredParam() fileId: string) {
+ const queryParams: QueryParam[] = [];
+ queryParams.push({ key: 'fileId', value: fileId });
+
+ const rssData$ = this._getOne([dossierId], 'rss', queryParams);
+ return rssData$.pipe(
+ map(data => data.files[0]),
+ catchError(() => of({} as IRssEntry)),
+ );
+ }
+}
diff --git a/apps/red-ui/src/assets/config/config.json b/apps/red-ui/src/assets/config/config.json
index 0c71adeeb..29b4efaed 100644
--- a/apps/red-ui/src/assets/config/config.json
+++ b/apps/red-ui/src/assets/config/config.json
@@ -1,7 +1,7 @@
{
"ADMIN_CONTACT_NAME": null,
"ADMIN_CONTACT_URL": null,
- "API_URL": "https://dev-04.iqser.cloud/redaction-gateway-v1",
+ "API_URL": "https://qa1.iqser.cloud/redaction-gateway-v1",
"APP_NAME": "RedactManager",
"AUTO_READ_TIME": 3,
"BACKEND_APP_VERSION": "4.4.40",
@@ -11,7 +11,7 @@
"MAX_RETRIES_ON_SERVER_ERROR": 3,
"OAUTH_CLIENT_ID": "redaction",
"OAUTH_IDP_HINT": null,
- "OAUTH_URL": "https://dev-04.iqser.cloud/auth/realms/redaction",
+ "OAUTH_URL": "https://qa1.iqser.cloud/auth/realms/redaction",
"RECENT_PERIOD_IN_HOURS": 24,
"SELECTION_MODE": "structural",
"MANUAL_BASE_URL": "https://docs.redactmanager.com/preview"
diff --git a/apps/red-ui/src/assets/i18n/en.json b/apps/red-ui/src/assets/i18n/en.json
index 5cad2bf27..9b3377f17 100644
--- a/apps/red-ui/src/assets/i18n/en.json
+++ b/apps/red-ui/src/assets/i18n/en.json
@@ -1295,6 +1295,13 @@
},
"upload-csv": "Upload File Attributes Configuration"
},
+ "rss-dialog": {
+ "title": "RSS",
+ "actions": {
+ "export": "Export",
+ "close": "Close"
+ }
+ },
"file-preview": {
"assign-me": "Assign to me",
"assign-reviewer": "Assign User",
@@ -1303,6 +1310,7 @@
"delta-tooltip": "The Delta View shows the unseen changes since your last visit to the page. This view is only available if there is at least 1 change.",
"document-info": "Document Info",
"download-original-file": "Download Original File",
+ "open-rss-view": "Open RSS View",
"exclude-pages": "Exclude pages from redaction",
"excluded-from-redaction": "excluded",
"fullscreen": "Full Screen (F)",
diff --git a/apps/red-ui/src/assets/icons/general/rss.svg b/apps/red-ui/src/assets/icons/general/rss.svg
new file mode 100644
index 000000000..e10dd41de
--- /dev/null
+++ b/apps/red-ui/src/assets/icons/general/rss.svg
@@ -0,0 +1,14 @@
+
+
+
diff --git a/libs/red-domain/src/index.ts b/libs/red-domain/src/index.ts
index de796e9e6..dd4b6515d 100644
--- a/libs/red-domain/src/index.ts
+++ b/libs/red-domain/src/index.ts
@@ -28,3 +28,4 @@ export * from './lib/license';
export * from './lib/digital-signature';
export * from './lib/watermarks';
export * from './lib/colors';
+export * from './lib/rss';
diff --git a/libs/red-domain/src/lib/rss/index.ts b/libs/red-domain/src/lib/rss/index.ts
new file mode 100644
index 000000000..3ca054201
--- /dev/null
+++ b/libs/red-domain/src/lib/rss/index.ts
@@ -0,0 +1,2 @@
+export * from './rss-data';
+export * from './rss-entry';
diff --git a/libs/red-domain/src/lib/rss/rss-data.ts b/libs/red-domain/src/lib/rss/rss-data.ts
new file mode 100644
index 000000000..8e0ff7334
--- /dev/null
+++ b/libs/red-domain/src/lib/rss/rss-data.ts
@@ -0,0 +1,5 @@
+import { IRssEntry } from './rss-entry';
+
+export interface IRssData {
+ files: Array;
+}
diff --git a/libs/red-domain/src/lib/rss/rss-entry.ts b/libs/red-domain/src/lib/rss/rss-entry.ts
new file mode 100644
index 000000000..845a4202e
--- /dev/null
+++ b/libs/red-domain/src/lib/rss/rss-entry.ts
@@ -0,0 +1,4 @@
+export interface IRssEntry {
+ filaName: string;
+ result: { [key: string]: string };
+}