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 @@ +
+
+ +
+
+
+
+
{{ entry.key }}:
+
{{ entry.value }}
+
+
+
+ +
+ +
+
+ + +
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 }; +}