From de55f6c392574172ff93c2a6b4a2f0ac541935d4 Mon Sep 17 00:00:00 2001 From: George Date: Tue, 1 Aug 2023 14:34:42 +0300 Subject: [PATCH 1/4] RED-7266, stop loading when archive screen has initialized. --- .../archived-dossiers-screen.component.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/red-ui/src/app/modules/archive/screens/archived-dossiers-screen/archived-dossiers-screen.component.ts b/apps/red-ui/src/app/modules/archive/screens/archived-dossiers-screen/archived-dossiers-screen.component.ts index 5313ce943..93ce93770 100644 --- a/apps/red-ui/src/app/modules/archive/screens/archived-dossiers-screen/archived-dossiers-screen.component.ts +++ b/apps/red-ui/src/app/modules/archive/screens/archived-dossiers-screen/archived-dossiers-screen.component.ts @@ -1,6 +1,6 @@ import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; -import { ListingComponent, listingProvidersFactory } from '@iqser/common-ui'; +import { ListingComponent, listingProvidersFactory, LoadingService } from '@iqser/common-ui'; import { Dossier, DOSSIER_TEMPLATE_ID } from '@red/domain'; import { ConfigService } from '../../services/config.service'; import { tap } from 'rxjs/operators'; @@ -22,6 +22,7 @@ export class ArchivedDossiersScreenComponent extends ListingComponent i constructor( private readonly _configService: ConfigService, private readonly _archivedDossiersService: ArchivedDossiersService, + private readonly _loadingService: LoadingService, router: Router, ) { super(); @@ -33,6 +34,7 @@ export class ArchivedDossiersScreenComponent extends ListingComponent i this.addSubscription = this._archivedDossiersService.all$ .pipe(tap(dossiers => this.entitiesService.setEntities(dossiers.filter(d => d.dossierTemplateId === this.#dossierTemplateId)))) .subscribe(); + this._loadingService.stop(); } private _computeAllFilters() { From 40d0dbd6c0d2c097ae53591e3604c86f58885736 Mon Sep 17 00:00:00 2001 From: George Date: Wed, 2 Aug 2023 12:40:19 +0300 Subject: [PATCH 2/4] RED-7266, fix loading when switching from archive tab. --- .../archived-dossiers-screen.component.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/red-ui/src/app/modules/archive/screens/archived-dossiers-screen/archived-dossiers-screen.component.ts b/apps/red-ui/src/app/modules/archive/screens/archived-dossiers-screen/archived-dossiers-screen.component.ts index 93ce93770..09aacd4d1 100644 --- a/apps/red-ui/src/app/modules/archive/screens/archived-dossiers-screen/archived-dossiers-screen.component.ts +++ b/apps/red-ui/src/app/modules/archive/screens/archived-dossiers-screen/archived-dossiers-screen.component.ts @@ -6,6 +6,7 @@ import { ConfigService } from '../../services/config.service'; import { tap } from 'rxjs/operators'; import { ArchivedDossiersService } from '@services/dossiers/archived-dossiers.service'; import { Router } from '@angular/router'; +import { OnAttach } from '@common-ui/utils'; @Component({ selector: 'redaction-archived-dossiers-screen', @@ -13,7 +14,7 @@ import { Router } from '@angular/router'; providers: listingProvidersFactory(ArchivedDossiersScreenComponent), changeDetection: ChangeDetectionStrategy.OnPush, }) -export class ArchivedDossiersScreenComponent extends ListingComponent implements OnInit { +export class ArchivedDossiersScreenComponent extends ListingComponent implements OnInit, OnAttach { readonly tableColumnConfigs = this._configService.tableConfig; readonly tableHeaderLabel = _('archived-dossiers-listing.table-header.title'); readonly computeFilters$ = this.entitiesService.all$.pipe(tap(() => this._computeAllFilters())); @@ -37,6 +38,10 @@ export class ArchivedDossiersScreenComponent extends ListingComponent i this._loadingService.stop(); } + ngOnAttach() { + this._loadingService.stop(); + } + private _computeAllFilters() { const filterGroups = this._configService.filterGroups(this.entitiesService.all); this.filterService.addFilterGroups(filterGroups); From a2c4d68b80c929c7afe552f81254419475bb4901 Mon Sep 17 00:00:00 2001 From: Dan Percic Date: Wed, 2 Aug 2023 14:11:44 +0300 Subject: [PATCH 3/4] Add get tables features --- apps/red-ui/src/app/app.module.ts | 5 +- .../auth-error/auth-error.component.ts | 10 +-- .../file-preview-screen.component.html | 8 +++ .../file-preview-screen.component.ts | 71 ++++++++++++------- .../file-preview/file-preview.module.ts | 3 +- .../file-preview/services/tables.service.ts | 46 ++++++++++++ .../services/annotation-draw.service.ts | 26 +++++++ apps/red-ui/src/app/users/roles.ts | 1 + apps/red-ui/src/assets/i18n/redact/de.json | 1 + apps/red-ui/src/assets/i18n/redact/en.json | 1 + apps/red-ui/src/assets/i18n/scm/de.json | 1 + apps/red-ui/src/assets/i18n/scm/en.json | 1 + package.json | 2 + yarn.lock | 36 +++++++++- 14 files changed, 179 insertions(+), 33 deletions(-) create mode 100644 apps/red-ui/src/app/modules/file-preview/services/tables.service.ts diff --git a/apps/red-ui/src/app/app.module.ts b/apps/red-ui/src/app/app.module.ts index 469f657d1..09df3b063 100644 --- a/apps/red-ui/src/app/app.module.ts +++ b/apps/red-ui/src/app/app.module.ts @@ -150,7 +150,7 @@ export const appModuleFactory = (config: AppConfig) => { enabled: true, }, CHANGES: { - enabled: true, + enabled: false, }, STATS: { enabled: false, @@ -164,6 +164,9 @@ export const appModuleFactory = (config: AppConfig) => { PAGES: { enabled: false, }, + DOSSIERS_CHANGES: { + enabled: false, + }, }, } as ILoggerConfig, }, diff --git a/apps/red-ui/src/app/components/auth-error/auth-error.component.ts b/apps/red-ui/src/app/components/auth-error/auth-error.component.ts index 358f36a2f..5445ec196 100644 --- a/apps/red-ui/src/app/components/auth-error/auth-error.component.ts +++ b/apps/red-ui/src/app/components/auth-error/auth-error.component.ts @@ -1,6 +1,7 @@ import { Component } from '@angular/core'; import { UserService } from '@users/user.service'; -import { ConfigService } from '@services/config.service'; +import { getConfig } from '@iqser/common-ui'; +import { AppConfig } from '@red/domain'; @Component({ selector: 'redaction-auth-error', @@ -8,8 +9,9 @@ import { ConfigService } from '@services/config.service'; styleUrls: ['./auth-error.component.scss'], }) export class AuthErrorComponent { - adminName = this._configService.values.ADMIN_CONTACT_NAME; - adminUrl = this._configService.values.ADMIN_CONTACT_URL; + readonly #config = getConfig(); + readonly adminName = this.#config.ADMIN_CONTACT_NAME; + readonly adminUrl = this.#config.ADMIN_CONTACT_URL; - constructor(readonly userService: UserService, private readonly _configService: ConfigService) {} + constructor(readonly userService: UserService) {} } 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 62353eda8..474573ac1 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 @@ -40,6 +40,14 @@ type="file-preview" > + + ; @ViewChild('actionsWrapper', { static: false }) private readonly _actionsWrapper: ElementRef; + readonly #isDocumine = getConfig().IS_DOCUMINE; readonly circleButtonTypes = CircleButtonTypes; readonly roles = Roles; fullScreen = false; readonly fileId = this.state.fileId; readonly dossierId = this.state.dossierId; readonly lastAssignee = computed(() => this.getLastAssignee()); - readonly #isDocumine; width: number; constructor( @@ -143,6 +146,7 @@ export class FilePreviewScreenComponent private readonly _suggestionsService: SuggestionsService, private readonly _dossierTemplatesService: DossierTemplatesService, private readonly _dialog: MatDialog, + private readonly _tablesService: TablesService, ) { super(); effect(() => { @@ -174,7 +178,6 @@ export class FilePreviewScreenComponent this._stampService.stampPDF().then(); } }); - this.#isDocumine = getConfig().IS_DOCUMINE; } get changed() { @@ -369,29 +372,6 @@ export class FilePreviewScreenComponent ); } - async #openRedactTextDialog(manualRedactionEntryWrapper: ManualRedactionEntryWrapper) { - const file = this.state.file(); - const hint = manualRedactionEntryWrapper.type === ManualRedactionEntryTypes.HINT; - - const data = this.#getRedactTextDialogData(manualRedactionEntryWrapper, file); - const result = await this.#getRedactTextDialog(hint, data).result(); - - if (!result) { - return; - } - - const add$ = this._manualRedactionService.addAnnotation([result.redaction], this.dossierId, this.fileId, { - hint, - dictionaryLabel: result.dictionary?.label, - }); - - const addAndReload$ = add$.pipe( - tap(() => this._documentViewer.clearSelection()), - switchMap(() => this._filesService.reload(this.dossierId, file)), - ); - return firstValueFrom(addAndReload$.pipe(catchError(() => of(undefined)))); - } - toggleFullScreen() { this.fullScreen = !this.fullScreen; if (this.fullScreen) { @@ -521,6 +501,47 @@ export class FilePreviewScreenComponent return this.#cleanupAndRedrawAnnotations(annotationsToDraw); } + async getTables() { + const currentPage = this.pdf.currentPage(); + const tables = await this._tablesService.get(this.state.dossierId, this.state.fileId, this.pdf.currentPage()); + await this._annotationDrawService.drawTables(tables, currentPage, this.state.dossierTemplateId); + + const filename = this.state.file().filename; + const zip = new JSZip(); + + tables.forEach((t, index) => { + const blob = new Blob([atob(t.csvAsBytes)], { + type: 'text/csv;charset=utf-8', + }); + zip.file(filename + '_page' + currentPage + '_table' + (index + 1) + '.csv', blob); + }); + + saveAs(await zip.generateAsync({ type: 'blob' }), filename + '_tables.zip'); + } + + async #openRedactTextDialog(manualRedactionEntryWrapper: ManualRedactionEntryWrapper) { + const file = this.state.file(); + const hint = manualRedactionEntryWrapper.type === ManualRedactionEntryTypes.HINT; + + const data = this.#getRedactTextDialogData(manualRedactionEntryWrapper, file); + const result = await this.#getRedactTextDialog(hint, data).result(); + + if (!result) { + return; + } + + const add$ = this._manualRedactionService.addAnnotation([result.redaction], this.dossierId, this.fileId, { + hint, + dictionaryLabel: result.dictionary?.label, + }); + + const addAndReload$ = add$.pipe( + tap(() => this._documentViewer.clearSelection()), + switchMap(() => this._filesService.reload(this.dossierId, file)), + ); + return firstValueFrom(addAndReload$.pipe(catchError(() => of(undefined)))); + } + @Debounce(30) private _updateItemWidth(entry: ResizeObserverEntry): void { this.width = entry.contentRect.width; 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 271921eb0..086827b0e 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 @@ -72,6 +72,7 @@ import { RemoveAnnotationDialogComponent } from './dialogs/docu-mine/remove-anno import { ResizeAnnotationDialogComponent } from './dialogs/docu-mine/resize-annotation-dialog/resize-annotation-dialog.component'; import { EditAnnotationDialogComponent } from './dialogs/docu-mine/edit-annotation-dialog/edit-annotation-dialog.component'; import { EditRedactionDialogComponent } from './dialogs/edit-redaction-dialog/edit-redaction-dialog.component'; +import { TablesService } from './services/tables.service'; const routes: IqserRoutes = [ { @@ -157,6 +158,6 @@ const components = [ TenantPipe, LogPipe, ], - providers: [FilePreviewDialogService, ManualRedactionService, DocumentUnloadedGuard, SuggestionsService], + providers: [FilePreviewDialogService, ManualRedactionService, DocumentUnloadedGuard, SuggestionsService, TablesService], }) export class FilePreviewModule {} diff --git a/apps/red-ui/src/app/modules/file-preview/services/tables.service.ts b/apps/red-ui/src/app/modules/file-preview/services/tables.service.ts new file mode 100644 index 000000000..609b8f3fb --- /dev/null +++ b/apps/red-ui/src/app/modules/file-preview/services/tables.service.ts @@ -0,0 +1,46 @@ +import { inject, Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { firstValueFrom } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { log } from '@common-ui/utils'; + +export interface BoundingBox { + readonly x: number; + readonly y: number; + readonly width: number; + readonly height: number; +} + +interface CellPerRow { + readonly boundingBox: BoundingBox; + readonly value: string; +} + +export interface Table { + readonly boundingBox: BoundingBox; + readonly cellsPerRow: CellPerRow[][]; + readonly experimental: boolean; + readonly csvAsBytes: string; +} + +interface Response { + readonly tables: Table[]; +} + +@Injectable() +export class TablesService { + readonly #http = inject(HttpClient); + readonly #serviceName = 'table-provider'; + readonly #defaultUrl = 'tables'; + + get(dossierId: string, fileId: string, pageNumber: number) { + const url = `/${this.#serviceName}/${encodeURI(this.#defaultUrl)}/${dossierId}/${fileId}`; + const request$ = this.#http.post(url, { pageNumber, tableExtractionType: 'STABLE' }); + return firstValueFrom( + request$.pipe( + map(response => response.tables), + log('TablesService.get'), + ), + ); + } +} diff --git a/apps/red-ui/src/app/modules/pdf-viewer/services/annotation-draw.service.ts b/apps/red-ui/src/app/modules/pdf-viewer/services/annotation-draw.service.ts index 0e0ca0860..6435330a3 100644 --- a/apps/red-ui/src/app/modules/pdf-viewer/services/annotation-draw.service.ts +++ b/apps/red-ui/src/app/modules/pdf-viewer/services/annotation-draw.service.ts @@ -12,12 +12,24 @@ import { REDAnnotationManager } from './annotation-manager.service'; import { List } from '@iqser/common-ui/lib/utils'; import { REDDocumentViewer } from './document-viewer.service'; import { DefaultColorsService } from '@services/entity-services/default-colors.service'; +import { BoundingBox, Table } from '../../file-preview/services/tables.service'; import Annotation = Core.Annotations.Annotation; import Quad = Core.Math.Quad; const DEFAULT_TEXT_ANNOTATION_OPACITY = 1; const DEFAULT_REMOVED_ANNOTATION_OPACITY = 0.2; +export function getSectionRectangle(box: BoundingBox): ISectionRectangle { + return { + topLeft: { + x: box.x, + y: box.y, + }, + width: box.width, + height: box.height, + }; +} + @Injectable() export class AnnotationDrawService { constructor( @@ -57,6 +69,20 @@ export class AnnotationDrawService { return this._pdf.quad(x1, y1, x2, y2, x3, y3, x4, y4); } + async drawTables(tables: Table[], page: number, dossierTemplateId: string) { + const sections: Core.Annotations.RectangleAnnotation[] = []; + tables.forEach(table => { + sections.push(this._computeSection(page, getSectionRectangle(table.boundingBox), dossierTemplateId)); + table.cellsPerRow + .flatMap(row => row) + .forEach(row => { + sections.push(this._computeSection(page, getSectionRectangle(row.boundingBox), dossierTemplateId)); + }); + }); + + await this._annotationManager.add(sections); + } + private async _draw(annotationWrappers: List, hideSkipped: boolean, dossierTemplateId: string) { const totalPages = this._pdf.totalPages(); const annotations = annotationWrappers diff --git a/apps/red-ui/src/app/users/roles.ts b/apps/red-ui/src/app/users/roles.ts index 67ba6f5a2..2ae41147f 100644 --- a/apps/red-ui/src/app/users/roles.ts +++ b/apps/red-ui/src/app/users/roles.ts @@ -16,6 +16,7 @@ export const Roles = { search: 'red-search', searchAudit: 'red-search-audit-log', manageAclPermissions: 'red-manage-acl-permissions', + getTables: 'red-get-tables', rules: { read: 'red-read-rules', write: 'red-write-rules', diff --git a/apps/red-ui/src/assets/i18n/redact/de.json b/apps/red-ui/src/assets/i18n/redact/de.json index 172f84362..c592fb7a6 100644 --- a/apps/red-ui/src/assets/i18n/redact/de.json +++ b/apps/red-ui/src/assets/i18n/redact/de.json @@ -1437,6 +1437,7 @@ "exclude-pages": "Seiten von Schwärzung ausschließen", "excluded-from-redaction": "Von Schwärzung ausgeschlossen", "fullscreen": "Vollbildmodus", + "get-tables": "", "highlights": { "convert": "", "remove": "" diff --git a/apps/red-ui/src/assets/i18n/redact/en.json b/apps/red-ui/src/assets/i18n/redact/en.json index 9a95bf113..259b6fed9 100644 --- a/apps/red-ui/src/assets/i18n/redact/en.json +++ b/apps/red-ui/src/assets/i18n/redact/en.json @@ -1437,6 +1437,7 @@ "exclude-pages": "Exclude pages from redaction", "excluded-from-redaction": "excluded", "fullscreen": "Full Screen (F)", + "get-tables": "Draw tables", "highlights": { "convert": "Convert earmarks", "remove": "Remove earmarks" diff --git a/apps/red-ui/src/assets/i18n/scm/de.json b/apps/red-ui/src/assets/i18n/scm/de.json index cf36b4924..c43325f0c 100644 --- a/apps/red-ui/src/assets/i18n/scm/de.json +++ b/apps/red-ui/src/assets/i18n/scm/de.json @@ -1437,6 +1437,7 @@ "exclude-pages": "Seiten von Schwärzung ausschließen", "excluded-from-redaction": "Von Schwärzung ausgeschlossen", "fullscreen": "Vollbildmodus", + "get-tables": "", "highlights": { "convert": "", "remove": "" diff --git a/apps/red-ui/src/assets/i18n/scm/en.json b/apps/red-ui/src/assets/i18n/scm/en.json index 35d564a44..593d4cec3 100644 --- a/apps/red-ui/src/assets/i18n/scm/en.json +++ b/apps/red-ui/src/assets/i18n/scm/en.json @@ -1437,6 +1437,7 @@ "exclude-pages": "Exclude pages from component", "excluded-from-redaction": "excluded", "fullscreen": "Full Screen (F)", + "get-tables": "Draw tables", "highlights": { "convert": "Convert earmarks", "remove": "Remove earmarks" diff --git a/package.json b/package.json index e084fdb84..4f98d1c69 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "chart.js": "^4.3.0", "dayjs": "^1.11.5", "file-saver": "^2.0.5", + "jszip": "^3.10.1", "jwt-decode": "^3.1.2", "keycloak-angular": "14.0.0", "keycloak-js": "21.1.1", @@ -79,6 +80,7 @@ "@nx/linter": "16.3.2", "@nx/workspace": "16.3.2", "@schematics/angular": "16.1.0", + "@types/file-saver": "^2.0.5", "@types/jest": "29.5.2", "@types/lodash-es": "^4.17.6", "@types/node": "20.3.1", diff --git a/yarn.lock b/yarn.lock index 5f7b26dfa..ce6912051 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3720,6 +3720,11 @@ "@types/qs" "*" "@types/serve-static" "*" +"@types/file-saver@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@types/file-saver/-/file-saver-2.0.5.tgz#9ee342a5d1314bb0928375424a2f162f97c310c7" + integrity sha512-zv9kNf3keYegP5oThGLaPk8E081DFDuwfqjtiTzm6PoxChdJ1raSuADf2YGCVIyrSynLrgc8JWv296s7Q7pQSQ== + "@types/graceful-fs@^4.1.3": version "4.1.6" resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" @@ -7282,6 +7287,11 @@ image-size@~0.5.0: resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ== +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== + immutable@^4.0.0: version "4.3.0" resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.0.tgz#eb1738f14ffb39fd068b1dbe1296117484dd34be" @@ -8233,6 +8243,16 @@ jsonparse@^1.3.1: resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== +jszip@^3.10.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" + integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== + dependencies: + lie "~3.3.0" + pako "~1.0.2" + readable-stream "~2.3.6" + setimmediate "^1.0.5" + jwt-decode@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-3.1.2.tgz#3fb319f3675a2df0c2895c8f5e9fa4b67b04ed59" @@ -8335,6 +8355,13 @@ license-webpack-plugin@4.0.2, license-webpack-plugin@^4.0.2: dependencies: webpack-sources "^3.0.0" +lie@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" + integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== + dependencies: + immediate "~3.0.5" + lilconfig@2.1.0, lilconfig@^2.0.3: version "2.1.0" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" @@ -9448,7 +9475,7 @@ pacote@15.2.0: ssri "^10.0.0" tar "^6.1.11" -pako@^1.0.3: +pako@^1.0.3, pako@~1.0.2: version "1.0.11" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== @@ -10370,7 +10397,7 @@ read-package-json@^6.0.0: normalize-package-data "^5.0.0" npm-normalize-package-bin "^3.0.0" -readable-stream@^2.0.1, readable-stream@^2.3.0, readable-stream@^2.3.5: +readable-stream@^2.0.1, readable-stream@^2.3.0, readable-stream@^2.3.5, readable-stream@~2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== @@ -10819,6 +10846,11 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" From fb43fb17d628c33d787b986e69400d3b308ea514 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adina=20=C8=9Aeudan?= Date: Wed, 2 Aug 2023 15:58:36 +0300 Subject: [PATCH 4/4] RED-3800: Update common-ui --- .../base-screen/base-screen.component.html | 5 +-- .../base-screen/base-screen.component.ts | 35 +++++++++---------- .../skeleton-top-bar.component.html | 2 +- .../skeleton-top-bar.component.ts | 3 -- ...one-dossier-template-dialog.component.html | 4 +-- .../screens/audit/audit-screen.component.html | 12 +++---- ...ossier-template-info-screen.component.html | 8 ++--- .../dossier-details-stats.component.html | 4 +-- .../document-info.component.html | 2 +- .../src/app/modules/icons/icons.module.ts | 14 ++++++-- .../edit-dossier-general-info.component.html | 6 ++-- .../dossier-name-column.component.html | 4 +-- .../add-dossier-dialog.component.html | 2 +- .../src/assets/icons/general/calendar.svg | 15 -------- libs/common-ui | 2 +- 15 files changed, 52 insertions(+), 66 deletions(-) delete mode 100644 apps/red-ui/src/assets/icons/general/calendar.svg diff --git a/apps/red-ui/src/app/components/base-screen/base-screen.component.html b/apps/red-ui/src/app/components/base-screen/base-screen.component.html index b0a9e9658..b7efcf7a5 100644 --- a/apps/red-ui/src/app/components/base-screen/base-screen.component.html +++ b/apps/red-ui/src/app/components/base-screen/base-screen.component.html @@ -11,10 +11,7 @@ diff --git a/apps/red-ui/src/app/components/base-screen/base-screen.component.ts b/apps/red-ui/src/app/components/base-screen/base-screen.component.ts index d1e8a888f..2a4d299a8 100644 --- a/apps/red-ui/src/app/components/base-screen/base-screen.component.ts +++ b/apps/red-ui/src/app/components/base-screen/base-screen.component.ts @@ -6,7 +6,7 @@ import { Title } from '@angular/platform-browser'; import { TranslateService } from '@ngx-translate/core'; import { SpotlightSearchAction } from '@components/spotlight-search/spotlight-search-action'; import { filter, map, startWith } from 'rxjs/operators'; -import { getConfig, IqserPermissionsService } from '@iqser/common-ui'; +import { IqserPermissionsService } from '@iqser/common-ui'; import { BreadcrumbsService } from '@services/breadcrumbs.service'; import { FeaturesService } from '@services/features.service'; import { ARCHIVE_ROUTE, DOSSIERS_ARCHIVE, DOSSIERS_ROUTE } from '@red/domain'; @@ -24,16 +24,9 @@ const isSearchScreen: (url: string) => boolean = url => url.includes('/search'); styleUrls: ['./base-screen.component.scss'], }) export class BaseScreenComponent { - readonly #navigationStart$ = this._router.events.pipe( - filter(isNavigationStart), - map(event => event.url), - startWith(this._router.url), - shareDistinctLast(), - ); readonly roles = Roles; readonly documentViewer = inject(REDDocumentViewer); readonly currentUser = this.userService.currentUser; - readonly config = getConfig(); readonly searchActions: List = [ { text: this._translateService.instant('search.this-dossier'), @@ -53,8 +46,24 @@ export class BaseScreenComponent { action: (query): void => this.#search(query, []), }, ]; + readonly #navigationStart$ = this._router.events.pipe( + filter(isNavigationStart), + map(event => event.url), + startWith(this._router.url), + shareDistinctLast(), + ); readonly isSearchScreen$ = this.#navigationStart$.pipe(map(isSearchScreen)); + get #hideSearchThisDossier() { + const routerLink = this.breadcrumbsService.breadcrumbs[1]?.options?.routerLink; + if (!routerLink) { + return true; + } + + const isDossierOverview = (routerLink.includes(DOSSIERS_ROUTE) || routerLink.includes(ARCHIVE_ROUTE)) && routerLink.length === 3; + return !isDossierOverview; + } + constructor( private readonly _router: Router, activatedRoute: ActivatedRoute, @@ -71,16 +80,6 @@ export class BaseScreenComponent { activatedRoute.queryParamMap.pipe(takeUntilDestroyed()).subscribe(queryParams => this.#navigate(queryParams)); } - get #hideSearchThisDossier() { - const routerLink = this.breadcrumbsService.breadcrumbs[1]?.options?.routerLink; - if (!routerLink) { - return true; - } - - const isDossierOverview = (routerLink.includes(DOSSIERS_ROUTE) || routerLink.includes(ARCHIVE_ROUTE)) && routerLink.length === 3; - return !isDossierOverview; - } - #navigate(queryParams: ParamMap) { if (queryParams.has('username')) { return this._router.navigate([], { diff --git a/apps/red-ui/src/app/components/skeleton/skeleton-top-bar/skeleton-top-bar.component.html b/apps/red-ui/src/app/components/skeleton/skeleton-top-bar/skeleton-top-bar.component.html index ffc2d86fd..4f080c00f 100644 --- a/apps/red-ui/src/app/components/skeleton/skeleton-top-bar/skeleton-top-bar.component.html +++ b/apps/red-ui/src/app/components/skeleton/skeleton-top-bar/skeleton-top-bar.component.html @@ -4,7 +4,7 @@ diff --git a/apps/red-ui/src/app/components/skeleton/skeleton-top-bar/skeleton-top-bar.component.ts b/apps/red-ui/src/app/components/skeleton/skeleton-top-bar/skeleton-top-bar.component.ts index 936ef0af5..1ac32cbd5 100644 --- a/apps/red-ui/src/app/components/skeleton/skeleton-top-bar/skeleton-top-bar.component.ts +++ b/apps/red-ui/src/app/components/skeleton/skeleton-top-bar/skeleton-top-bar.component.ts @@ -1,6 +1,5 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; import { Title } from '@angular/platform-browser'; -import { getConfig } from '@iqser/common-ui'; @Component({ selector: 'redaction-skeleton-top-bar', @@ -9,7 +8,5 @@ import { getConfig } from '@iqser/common-ui'; changeDetection: ChangeDetectionStrategy.OnPush, }) export class SkeletonTopBarComponent { - readonly config = getConfig(); - constructor(readonly titleService: Title) {} } diff --git a/apps/red-ui/src/app/modules/admin/dialogs/add-edit-dossier-template-dialog/add-edit-clone-dossier-template-dialog.component.html b/apps/red-ui/src/app/modules/admin/dialogs/add-edit-dossier-template-dialog/add-edit-clone-dossier-template-dialog.component.html index d49a04bba..d3f993aa4 100644 --- a/apps/red-ui/src/app/modules/admin/dialogs/add-edit-dossier-template-dialog/add-edit-clone-dossier-template-dialog.component.html +++ b/apps/red-ui/src/app/modules/admin/dialogs/add-edit-dossier-template-dialog/add-edit-clone-dossier-template-dialog.component.html @@ -45,7 +45,7 @@ placeholder="dd/mm/yy" /> - + @@ -60,7 +60,7 @@ placeholder="dd/mm/yy" /> - + diff --git a/apps/red-ui/src/app/modules/admin/screens/audit/audit-screen.component.html b/apps/red-ui/src/app/modules/admin/screens/audit/audit-screen.component.html index 2c24e476d..10ada4ff0 100644 --- a/apps/red-ui/src/app/modules/admin/screens/audit/audit-screen.component.html +++ b/apps/red-ui/src/app/modules/admin/screens/audit/audit-screen.component.html @@ -30,8 +30,8 @@ {{ (translations[category] | translate) || category }} @@ -52,7 +52,7 @@
- +
@@ -65,14 +65,14 @@
- +
@@ -81,14 +81,14 @@
- +
diff --git a/apps/red-ui/src/app/modules/admin/screens/info/info-screen/dossier-template-info-screen.component.html b/apps/red-ui/src/app/modules/admin/screens/info/info-screen/dossier-template-info-screen.component.html index 0b6e312b6..ab6d52248 100644 --- a/apps/red-ui/src/app/modules/admin/screens/info/info-screen/dossier-template-info-screen.component.html +++ b/apps/red-ui/src/app/modules/admin/screens/info/info-screen/dossier-template-info-screen.component.html @@ -17,12 +17,12 @@
- +
- +
@@ -32,12 +32,12 @@
- +
- +
diff --git a/apps/red-ui/src/app/modules/dossier-overview/components/dossier-details-stats/dossier-details-stats.component.html b/apps/red-ui/src/app/modules/dossier-overview/components/dossier-details-stats/dossier-details-stats.component.html index 698475809..964c708b6 100644 --- a/apps/red-ui/src/app/modules/dossier-overview/components/dossier-details-stats/dossier-details-stats.component.html +++ b/apps/red-ui/src/app/modules/dossier-overview/components/dossier-details-stats/dossier-details-stats.component.html @@ -22,7 +22,7 @@
- +
@@ -37,8 +37,8 @@
- +
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 d0b98b06e..9ad978831 100644 --- a/apps/red-ui/src/app/modules/icons/icons.module.ts +++ b/apps/red-ui/src/app/modules/icons/icons.module.ts @@ -2,6 +2,7 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { MatIconModule, MatIconRegistry } from '@angular/material/icon'; import { DomSanitizer } from '@angular/platform-browser'; +import { getConfig } from '@common-ui/services'; @NgModule({ imports: [CommonModule, MatIconModule], @@ -9,6 +10,8 @@ import { DomSanitizer } from '@angular/platform-browser'; exports: [MatIconModule], }) export class IconsModule { + readonly config = getConfig(); + constructor(private readonly _iconRegistry: MatIconRegistry, private readonly _sanitizer: DomSanitizer) { const icons = [ 'ai', @@ -26,7 +29,6 @@ export class IconsModule { 'assign', 'assign-me', 'attribute', - 'calendar', 'case-sensitive', 'color-picker', 'comment', @@ -36,7 +38,6 @@ export class IconsModule { 'dictionary', 'denied', 'disable-analysis', - 'documine-logo', 'double-chevron-right', 'enable-analysis', 'enter', @@ -51,7 +52,6 @@ export class IconsModule { 'info', 'import_redactions', 'lightning', - 'logo', 'nav-first', 'nav-last', 'nav-next', @@ -100,5 +100,13 @@ export class IconsModule { _sanitizer.bypassSecurityTrustResourceUrl(`/assets/icons/general/${icon}.svg`), ); } + + const logo = this.config.IS_DOCUMINE ? 'documine-logo' : 'logo'; + + _iconRegistry.addSvgIconInNamespace( + 'iqser', + 'logo', + _sanitizer.bypassSecurityTrustResourceUrl(`/assets/icons/general/${logo}.svg`), + ); } } 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 bda829798..35e78ad5d 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 @@ -69,7 +69,7 @@
- +
@@ -81,20 +81,20 @@ diff --git a/apps/red-ui/src/app/modules/shared/components/dossier-name-column/dossier-name-column.component.html b/apps/red-ui/src/app/modules/shared/components/dossier-name-column/dossier-name-column.component.html index 026670beb..d3dc3d53e 100644 --- a/apps/red-ui/src/app/modules/shared/components/dossier-name-column/dossier-name-column.component.html +++ b/apps/red-ui/src/app/modules/shared/components/dossier-name-column/dossier-name-column.component.html @@ -1,4 +1,4 @@ -
+
{{ dossier.dossierName }}
@@ -26,7 +26,7 @@
- + {{ dossier.date | date : 'mediumDate' }}
diff --git a/apps/red-ui/src/app/modules/shared/dialogs/add-dossier-dialog/add-dossier-dialog.component.html b/apps/red-ui/src/app/modules/shared/dialogs/add-dossier-dialog/add-dossier-dialog.component.html index 261705769..af225b1bb 100644 --- a/apps/red-ui/src/app/modules/shared/dialogs/add-dossier-dialog/add-dossier-dialog.component.html +++ b/apps/red-ui/src/app/modules/shared/dialogs/add-dossier-dialog/add-dossier-dialog.component.html @@ -71,7 +71,7 @@
- +
diff --git a/apps/red-ui/src/assets/icons/general/calendar.svg b/apps/red-ui/src/assets/icons/general/calendar.svg deleted file mode 100644 index 7ec143f05..000000000 --- a/apps/red-ui/src/assets/icons/general/calendar.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - diff --git a/libs/common-ui b/libs/common-ui index 3b84e73f8..5d40f20a3 160000 --- a/libs/common-ui +++ b/libs/common-ui @@ -1 +1 @@ -Subproject commit 3b84e73f8060f648e91b61f7df6827778d73917c +Subproject commit 5d40f20a32fbcbd99faaaf42688b19b6601a8f1f