From fb0cf403d10d8d4c40eec802da7b14c8a3aed57c Mon Sep 17 00:00:00 2001 From: Valentin Date: Wed, 12 Jan 2022 13:42:08 +0200 Subject: [PATCH 01/13] removed 'dossier-info' icon --- .../dossiers-listing-actions.component.html | 2 +- libs/common-ui | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-actions/dossiers-listing-actions.component.html b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-actions/dossiers-listing-actions.component.html index 6dec76bb6..c37bd2a84 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-actions/dossiers-listing-actions.component.html +++ b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-actions/dossiers-listing-actions.component.html @@ -12,7 +12,7 @@ *ngIf="currentUser.isUser" [tooltip]="(currentUser.isManager ? 'dossier-listing.edit.action' : 'dossier-listing.dossier-info.action') | translate" [type]="circleButtonTypes.dark" - [icon]="currentUser.isManager ? 'iqser:edit' : 'iqser:dossier-info'" + [icon]="currentUser.isManager ? 'iqser:edit' : 'red:info'" iqserHelpMode="edit-dossier-from-list" > diff --git a/libs/common-ui b/libs/common-ui index 3f1c419e0..10ed48587 160000 --- a/libs/common-ui +++ b/libs/common-ui @@ -1 +1 @@ -Subproject commit 3f1c419e0acdc92514b615611bdaa29e000a0b32 +Subproject commit 10ed48587427e7e6e4015dd905253ac87514d3db From 8a1122ef890c2eea522e0ab533cdf48a4367b241 Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Wed, 12 Jan 2022 12:46:07 +0100 Subject: [PATCH 02/13] chore(release) --- package.json | 2 +- paligo-theme.tar.gz | Bin 3202 -> 3201 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3fb6881a0..325e6fab1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redaction", - "version": "3.143.0", + "version": "3.144.0", "private": true, "license": "MIT", "scripts": { diff --git a/paligo-theme.tar.gz b/paligo-theme.tar.gz index e07249f0a9eca0d02c26cb4e514880860e951e50..9de28d828a2c602eb4dfa803d589fc7a92def731 100644 GIT binary patch delta 3112 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 Do?RUN From 21e900d34e6a55c0ba10111cc0995783dba6931c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adina=20=C8=9Aeudan?= Date: Wed, 12 Jan 2022 14:43:12 +0200 Subject: [PATCH 03/13] RED-3165: Due date approaching/passed indicator --- .../dossiers-listing-dossier-name.component.html | 12 ++++++------ .../dossiers-listing-dossier-name.component.ts | 15 +++++++++++++++ libs/common-ui | 2 +- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-dossier-name/dossiers-listing-dossier-name.component.html b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-dossier-name/dossiers-listing-dossier-name.component.html index 7f8d42a1e..c12eabe47 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-dossier-name/dossiers-listing-dossier-name.component.html +++ b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-dossier-name/dossiers-listing-dossier-name.component.html @@ -9,28 +9,28 @@ -
-
+
+
{{ dossierStats.numberOfFiles }}
-
+
{{ dossierStats.numberOfPages }}
-
+
{{ dossier.memberIds.length }}
-
+
{{ dossier.date | date: 'mediumDate' }}
-
+
{{ dossier.dueDate | date: 'mediumDate' }}
diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-dossier-name/dossiers-listing-dossier-name.component.ts b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-dossier-name/dossiers-listing-dossier-name.component.ts index 5a270d9fc..3e5d2afc9 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-dossier-name/dossiers-listing-dossier-name.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-dossier-name/dossiers-listing-dossier-name.component.ts @@ -3,6 +3,9 @@ import { Dossier, DossierStats } from '@red/domain'; import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; import { DossierStatsService } from '@services/entity-services/dossier-stats.service'; import { DossiersService } from '@services/entity-services/dossiers.service'; +import * as moment from 'moment'; + +const DUE_DATE_WARN_DAYS = 14; @Component({ selector: 'redaction-dossiers-listing-dossier-name', @@ -20,6 +23,18 @@ export class DossiersListingDossierNameComponent { private readonly _dossiersService: DossiersService, ) {} + get approachingDueDate(): boolean { + return this._dueDateDaysDiff >= 0 && this._dueDateDaysDiff <= DUE_DATE_WARN_DAYS; + } + + get passedDueDate(): boolean { + return this._dueDateDaysDiff < 0; + } + + private get _dueDateDaysDiff(): number { + return moment(this.dossier.dueDate).diff(moment(), 'days') + 1; + } + getDossierTemplateNameFor(dossierTemplateId: string): string { return this._dossierTemplatesService.find(dossierTemplateId).name; } diff --git a/libs/common-ui b/libs/common-ui index 10ed48587..5341338d3 160000 --- a/libs/common-ui +++ b/libs/common-ui @@ -1 +1 @@ -Subproject commit 10ed48587427e7e6e4015dd905253ac87514d3db +Subproject commit 5341338d36d55b63fb0ff08b0d5779b80ed5902f From 9d554fd11173720bb17589722408d136b6c9c68f Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Wed, 12 Jan 2022 13:53:27 +0100 Subject: [PATCH 04/13] chore(release) --- package.json | 2 +- paligo-theme.tar.gz | Bin 3201 -> 3214 bytes paligo-theme/paligo-styles/redacto-theme.css | 1 + 3 files changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 325e6fab1..e43b3cad2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redaction", - "version": "3.144.0", + "version": "3.145.0", "private": true, "license": "MIT", "scripts": { diff --git a/paligo-theme.tar.gz b/paligo-theme.tar.gz index 9de28d828a2c602eb4dfa803d589fc7a92def731..64245b5465f2eb988a994189b4b751a602fc72f8 100644 GIT binary patch literal 3214 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 A`~Uy| delta 3200 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 diff --git a/paligo-theme/paligo-styles/redacto-theme.css b/paligo-theme/paligo-styles/redacto-theme.css index 5ceef3777..fc5511db6 100644 --- a/paligo-theme/paligo-styles/redacto-theme.css +++ b/paligo-theme/paligo-styles/redacto-theme.css @@ -324,6 +324,7 @@ li.searchresultitem { --iqser-green-2: #5ce594; --iqser-yellow-1: #ffb83b; --iqser-yellow-2: #fdbd00; + --iqser-yellow-rgb: 253, 189, 0; --iqser-red-1: #dd4d50; --iqser-blue-5: #c5d3eb; --iqser-helpmode-primary: green; From 99316c2cab246cf153a0894c495534068908351e Mon Sep 17 00:00:00 2001 From: Timo Bejan Date: Wed, 12 Jan 2022 15:51:09 +0200 Subject: [PATCH 05/13] detect changes --- .../modules/admin/screens/rules/rules-screen.component.ts | 5 ++++- .../src/app/modules/dossier/utils/pdf-viewer.utils.ts | 8 +++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen.component.ts index b691bd9c5..9e4809505 100644 --- a/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen.component.ts @@ -1,4 +1,4 @@ -import { ChangeDetectionStrategy, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; import { PermissionsService } from '@services/permissions.service'; import { Debounce, IconButtonTypes, LoadingService, Toaster } from '@iqser/common-ui'; import { TranslateService } from '@ngx-translate/core'; @@ -38,6 +38,7 @@ export class RulesScreenComponent extends ComponentHasChanges implements OnInit constructor( readonly permissionsService: PermissionsService, private readonly _rulesService: RulesService, + private readonly _changeDetectorRef: ChangeDetectorRef, private readonly _dossierTemplatesService: DossierTemplatesService, private readonly _toaster: Toaster, protected readonly _translateService: TranslateService, @@ -74,6 +75,7 @@ export class RulesScreenComponent extends ComponentHasChanges implements OnInit }, }); (window as any).monaco.editor.setTheme('redaction'); + this._changeDetectorRef.detectChanges(); } @Debounce() @@ -106,6 +108,7 @@ export class RulesScreenComponent extends ComponentHasChanges implements OnInit revert(): void { this.currentLines = this.initialLines; this._decorations = this._codeEditor?.deltaDecorations(this._decorations, []) || []; + this._changeDetectorRef.detectChanges(); this._loadingService.stop(); } diff --git a/apps/red-ui/src/app/modules/dossier/utils/pdf-viewer.utils.ts b/apps/red-ui/src/app/modules/dossier/utils/pdf-viewer.utils.ts index e441e1dd1..54ea63b1f 100644 --- a/apps/red-ui/src/app/modules/dossier/utils/pdf-viewer.utils.ts +++ b/apps/red-ui/src/app/modules/dossier/utils/pdf-viewer.utils.ts @@ -109,6 +109,12 @@ export class PdfViewerUtils { for (const hotkey of DISABLED_HOTKEYS) { this.instance.UI.hotkeys.off(hotkey); } + console.log('disable', this.instance); + this.instance.UI.hotkeys.off(this.instance.UI.hotkeys.Keys.DOWN); + this.instance.UI.hotkeys.off(this.instance.UI.hotkeys.Keys.UP); + this.instance.UI.hotkeys.off(this.instance.UI.hotkeys.Keys.PAGE_UP); + this.instance.UI.hotkeys.off(this.instance.UI.hotkeys.Keys.PAGE_DOWN); + this.instance.UI.hotkeys.off(this.instance.UI.hotkeys.Keys.P); } translateQuads(page: number, quads: any) { @@ -121,7 +127,7 @@ export class PdfViewerUtils { } selectAnnotations(annotations?: AnnotationWrapper[], multiSelectActive: boolean = false) { - if (!annotations){ + if (!annotations) { return; } if (!multiSelectActive) { From 69650775540b4292c0129b083eea679439d6adf7 Mon Sep 17 00:00:00 2001 From: Timo Bejan Date: Wed, 12 Jan 2022 15:51:45 +0200 Subject: [PATCH 06/13] revert --- .../src/app/modules/dossier/utils/pdf-viewer.utils.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/apps/red-ui/src/app/modules/dossier/utils/pdf-viewer.utils.ts b/apps/red-ui/src/app/modules/dossier/utils/pdf-viewer.utils.ts index 54ea63b1f..90fc310e4 100644 --- a/apps/red-ui/src/app/modules/dossier/utils/pdf-viewer.utils.ts +++ b/apps/red-ui/src/app/modules/dossier/utils/pdf-viewer.utils.ts @@ -109,12 +109,6 @@ export class PdfViewerUtils { for (const hotkey of DISABLED_HOTKEYS) { this.instance.UI.hotkeys.off(hotkey); } - console.log('disable', this.instance); - this.instance.UI.hotkeys.off(this.instance.UI.hotkeys.Keys.DOWN); - this.instance.UI.hotkeys.off(this.instance.UI.hotkeys.Keys.UP); - this.instance.UI.hotkeys.off(this.instance.UI.hotkeys.Keys.PAGE_UP); - this.instance.UI.hotkeys.off(this.instance.UI.hotkeys.Keys.PAGE_DOWN); - this.instance.UI.hotkeys.off(this.instance.UI.hotkeys.Keys.P); } translateQuads(page: number, quads: any) { From 3224a1d9aed3883cae13154e5a82c0589cbe436b Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Wed, 12 Jan 2022 14:56:40 +0100 Subject: [PATCH 07/13] chore(release) --- package.json | 2 +- paligo-theme.tar.gz | Bin 3214 -> 3214 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e43b3cad2..b7451d28e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redaction", - "version": "3.145.0", + "version": "3.146.0", "private": true, "license": "MIT", "scripts": { diff --git a/paligo-theme.tar.gz b/paligo-theme.tar.gz index 64245b5465f2eb988a994189b4b751a602fc72f8..77cea4bdd80b87c4f39ccaa2c7a7f39480b28ebd 100644 GIT binary patch delta 3097 zcmV+!4CeEW8IBo{cM1?J0uTBfJ8*(mk%1w9zpz%9cNcHywk#@!nku`x zOc^Wd_03IEeuh*2}Z1%88*&BO* z=Gpe0J@duiK>S^Zzf19V1%Dke#}RWJF~<>e95Kh?bAA)ky3Fv?C-nm^FR$+|=A1s9 zSt-FWsnEYJ5PE0PJSLB8Ie`n46CN^$Qmtwe7=C}dXURQQQ;`fa`j#BV zJ#Rm)gpw>4E6G(H+x|628Wt6oBXY_|R2LbI(MPct2Ql6aS{06IQv>HMT?RRSCrNT5 zE$cNHLPXLc>l9y{Hh6UYQH0BnXsl8F_hCtIVu$i+S!&z_ps$p$o)5vy#% zj7FF%c0xFswx0LFzec#lq3g=m&CCEeSAJMDnj}TlQ-@A+TT4H-bBd0C?#Ozts2NNT zJ*Rmt?W1#iLO;C#Hx-R}2miDf*+MTPoUmpKu?jg!#sBMPY%q}E4p<+oriBkVrfEu% zipFNY(f9(=%^Q6wafwfE@5X*t<8jKPPHWOY*gBzA&8#S;(%A?xwDN&@xkOODf1Ut@% zCMeYv)wvrzA}`=kcH}A#)05}!vdYjVeWH^Z7>rE zj&T|Tx6$REJRIJ9j6SD%Mks6Y4f^=zVh+eGkO0Xn$LL8f|B<-M<)z>jp#NS}_eoYf z3}D?USUYlh*uQ~hni|TRcd$4}N=M;Mp>XWm9>r%QZ`eChZAt$AJFZ}4l~s|@Y=F$4 zq{m*W$Z(WaG)ftN-Iz!UCb1-5kL9Z-N|PqP7eQEuUrbZs_VAyFB!`u0j(GCZF<6A8 zO0xIgMk#^*8ht5>|3BdzZ%9=S)>%$!&R_NGd|6}}tixsY8L7x5)2m6MSALJ|_eEV( zAQxz1q{j<;^8sgUgz|P0J>lUV&mS_N5s%oL z+zhrG?`Zh+FaP`Ze`<7-14@W%J<1{|SgDlWVkdYb80J$kI;B#PrbUxhnB!??NM+O-Tq&vp7 z4_1)F;&8mm_md}%6F7a9I;Ukxm?kiuF0{$gG_*8-CM&F>(J8an6E>1h?91PmpI74+1br!j%^q23@0~x+XV9C2%L5XbC;)_K7l#c_h|RkGw)2VR#c=J>5O+KyV}Mn8D=C=GqEY4Cff(zRWV0^??>eKbsH-pG~Z-TW!hgY z2pb6GN_<=*Qf2#k2&9^wze8U1jxsDBtvbbV@z5Q!scxA22v@J$I;#s5TKW3j4bFU5 z5DdyxjTXCSWCD0t`0O=lqXkTVqn2|C<65+v3}p^KkQyx+{KP+qbI`ECra;#0)tW9^IO<@|sdd0WJfo!E0m2|dB{?jXY;_^^3BhU3DPrF|| zYr8JV;jRN1)sF>-_9fGQG*{Yee@b90Cd418fp&N;+&(c-B=POHp78dkB)a{*?5Ha>;!1_KQj*r1jlRf4 zNK*Y*sXG_9_jz-1cx!laGHDmXt@zyGXg`3-_-U}>E@$gf1|!6O8f0)K@0p6kVoxQx z9%qsL(WJN(E5d&Qlhc=v>ZH!c?mM9E+>w$WKtaa$8W#!}R(ty3+cQW7W@r)cqX);o z9xVo%D>dO89I4s3)#G0Nu#QFp@;LGTd%m%KqxaUb#YK%GAM z;y|Bt+(Ux_%#rU42IRc>S-}wBOEPF(yWJy#0iS!{4xA#$zCb@oki9=Ht0E#XSf41- z<~1YbfmgQ^DV}3WQO2^<#owPpeAAG+egyGgQNe zRg;Pezxxv(iwgEqXNJU=Iee2{Zr|m0U0&bibzOen<#$~{-xYLSi@s|iyUOmfB4d|z zoakEGk35WjotS#s8SEsI4?cPwNq-pnPJHhEJXYQiWB1JVAjUw$sOWx((K{BS@2MCS z(|KXQe;!-jDCs+`Xpk7kx#PazBS6d%tQ$PK{GCLQ6j3vE>HSmxuPx_xZs&Gx=XP%A nc5df(Zs&Gx=XP%Ac5df(Zs&Gx=XP$t*!F*DpQ92408jt`#SQgz delta 3097 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 Date: Wed, 12 Jan 2022 18:09:21 +0200 Subject: [PATCH 08/13] RED-3165 fix --- .../dossiers-listing-dossier-name.component.ts | 2 +- libs/common-ui | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-dossier-name/dossiers-listing-dossier-name.component.ts b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-dossier-name/dossiers-listing-dossier-name.component.ts index 3e5d2afc9..bbc7be107 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-dossier-name/dossiers-listing-dossier-name.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-dossier-name/dossiers-listing-dossier-name.component.ts @@ -32,7 +32,7 @@ export class DossiersListingDossierNameComponent { } private get _dueDateDaysDiff(): number { - return moment(this.dossier.dueDate).diff(moment(), 'days') + 1; + return moment(this.dossier.dueDate).diff(moment().startOf('day'), 'days'); } getDossierTemplateNameFor(dossierTemplateId: string): string { diff --git a/libs/common-ui b/libs/common-ui index 5341338d3..51f3d7502 160000 --- a/libs/common-ui +++ b/libs/common-ui @@ -1 +1 @@ -Subproject commit 5341338d36d55b63fb0ff08b0d5779b80ed5902f +Subproject commit 51f3d7502b5545663afa2fa0a62abc3578f92905 From 7b05faec83e3b855ac6c6ed6a0464f53dde796da Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Wed, 12 Jan 2022 17:13:19 +0100 Subject: [PATCH 09/13] chore(release) --- package.json | 2 +- paligo-theme.tar.gz | Bin 3214 -> 3216 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b7451d28e..47767ae8d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redaction", - "version": "3.146.0", + "version": "3.147.0", "private": true, "license": "MIT", "scripts": { diff --git a/paligo-theme.tar.gz b/paligo-theme.tar.gz index 77cea4bdd80b87c4f39ccaa2c7a7f39480b28ebd..0e85ebbd650282119240f6e49a30be9f567ef119 100644 GIT binary patch delta 3102 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 QZok;}e`ueh5&%#D058=E!~g&Q From a2a96ad2df62f8120295790634689287b3cc6ca6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adina=20=C8=9Aeudan?= Date: Mon, 13 Dec 2021 21:24:16 +0200 Subject: [PATCH 10/13] Fixed dossier / files changes --- .../dossier-overview-screen.component.ts | 18 +++++++++--------- .../dossiers-listing-screen.component.ts | 8 +------- .../file-actions/file-actions.component.ts | 9 ++++++++- .../entity-services/dossiers.service.ts | 12 ++++++++++-- libs/common-ui | 2 +- 5 files changed, 29 insertions(+), 20 deletions(-) diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/screen/dossier-overview-screen.component.ts b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/screen/dossier-overview-screen.component.ts index bf8865bdd..7995c6d03 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/screen/dossier-overview-screen.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/screen/dossier-overview-screen.component.ts @@ -16,8 +16,8 @@ import { FileUploadModel } from '@upload-download/model/file-upload.model'; import { FileUploadService } from '@upload-download/services/file-upload.service'; import { StatusOverlayService } from '@upload-download/services/status-overlay.service'; import * as moment from 'moment'; -import { Observable, timer } from 'rxjs'; -import { filter, skip, switchMap, tap } from 'rxjs/operators'; +import { combineLatest, Observable } from 'rxjs'; +import { skip, switchMap, tap } from 'rxjs/operators'; import { convertFiles, Files, handleFileDrop } from '@utils/index'; import { CircleButtonTypes, @@ -45,7 +45,7 @@ import { LongPressEvent } from '@shared/directives/long-press.directive'; import { UserPreferenceService } from '@services/user-preference.service'; import { FilesMapService } from '@services/entity-services/files-map.service'; import { FilesService } from '@services/entity-services/files.service'; -import { CHANGED_CHECK_INTERVAL } from '@utils/constants'; +import { DossierStatsService } from '@services/entity-services/dossier-stats.service'; @Component({ templateUrl: './dossier-overview-screen.component.html', @@ -81,6 +81,7 @@ export class DossierOverviewScreenComponent extends ListingComponent imple readonly permissionsService: PermissionsService, private readonly _loadingService: LoadingService, private readonly _dossiersService: DossiersService, + private readonly _dossierStatsService: DossierStatsService, private readonly _dossierTemplatesService: DossierTemplatesService, private readonly _appConfigService: AppConfigService, private readonly _fileUploadService: FileUploadService, @@ -128,12 +129,11 @@ export class DossierOverviewScreenComponent extends ListingComponent imple this._fileDropOverlayService.initFileDropHandling(this.dossierId); - this.addSubscription = timer(CHANGED_CHECK_INTERVAL, CHANGED_CHECK_INTERVAL) - .pipe( - switchMap(() => this._filesService.hasChanges$(this.dossierId)), - filter(changed => changed), - switchMap(() => this._reloadFiles()), - ) + this.addSubscription = combineLatest([ + this._dossiersService.getEntityChanged$(this.dossierId), + this._dossierStatsService.watch$(this.dossierId), + ]) + .pipe(switchMap(() => this._reloadFiles())) .subscribe(); this.addSubscription = this.configService.listingMode$.subscribe(() => { diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/screen/dossiers-listing-screen.component.ts b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/screen/dossiers-listing-screen.component.ts index c7ba3f10b..79b8fd977 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/screen/dossiers-listing-screen.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/screen/dossiers-listing-screen.component.ts @@ -3,7 +3,6 @@ import { Dossier } from '@red/domain'; import { UserService } from '@services/user.service'; import { PermissionsService } from '@services/permissions.service'; import { TranslateChartService } from '@services/translate-chart.service'; -import { timer } from 'rxjs'; import { Router } from '@angular/router'; import { DossiersDialogService } from '../../../services/dossiers-dialog.service'; import { DefaultListingServicesTmp, EntitiesService, ListingComponent, OnAttach, OnDetach, TableComponent } from '@iqser/common-ui'; @@ -12,8 +11,7 @@ import { ConfigService } from '../config.service'; import { DossiersService } from '@services/entity-services/dossiers.service'; import { FilesService } from '@services/entity-services/files.service'; import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; -import { switchMap, tap } from 'rxjs/operators'; -import { CHANGED_CHECK_INTERVAL } from '@utils/constants'; +import { tap } from 'rxjs/operators'; @Component({ templateUrl: './dossiers-listing-screen.component.html', @@ -57,10 +55,6 @@ export class DossiersListingScreenComponent extends ListingComponent im } ngOnInit(): void { - this.addSubscription = timer(CHANGED_CHECK_INTERVAL, CHANGED_CHECK_INTERVAL) - .pipe(switchMap(() => this._dossiersService.loadAllIfChanged())) - .subscribe(); - this.addSubscription = this._dossiersService.all$.pipe(tap(() => this._computeAllFilters())).subscribe(); } diff --git a/apps/red-ui/src/app/modules/dossier/shared/components/file-actions/file-actions.component.ts b/apps/red-ui/src/app/modules/dossier/shared/components/file-actions/file-actions.component.ts index 150f44c55..95a6427cd 100644 --- a/apps/red-ui/src/app/modules/dossier/shared/components/file-actions/file-actions.component.ts +++ b/apps/red-ui/src/app/modules/dossier/shared/components/file-actions/file-actions.component.ts @@ -1,5 +1,6 @@ import { ChangeDetectionStrategy, + ChangeDetectorRef, Component, EventEmitter, HostBinding, @@ -96,6 +97,7 @@ export class FileActionsComponent extends AutoUnsubscribe implements OnDestroy, private readonly _userPreferenceService: UserPreferenceService, private readonly _reanalysisService: ReanalysisService, private readonly _router: Router, + private readonly _changeRef: ChangeDetectorRef, ) { super(); } @@ -224,7 +226,10 @@ export class FileActionsComponent extends AutoUnsubscribe implements OnDestroy, } ngOnInit() { - this._dossiersService.getEntityChanged$(this.file.dossierId).pipe(tap(() => this._setup())); + this.addSubscription = this._dossiersService + .getEntityChanged$(this.file.dossierId) + .pipe(tap(() => this._setup())) + .subscribe(); } ngOnChanges() { @@ -353,6 +358,8 @@ export class FileActionsComponent extends AutoUnsubscribe implements OnDestroy, this.showReanalyseDossierOverview = this.canReanalyse && this.isDossierOverview && this.analysisForced; this.buttons = this._buttons; + + this._changeRef.markForCheck(); } private async _setFileApproved() { diff --git a/apps/red-ui/src/app/services/entity-services/dossiers.service.ts b/apps/red-ui/src/app/services/entity-services/dossiers.service.ts index 7f4bbdc68..e3543d71b 100644 --- a/apps/red-ui/src/app/services/entity-services/dossiers.service.ts +++ b/apps/red-ui/src/app/services/entity-services/dossiers.service.ts @@ -1,11 +1,12 @@ import { Injectable, Injector } from '@angular/core'; -import { EntitiesService, List, mapEach, QueryParam, RequiredParam, shareLast, Toaster, Validate } from '@iqser/common-ui'; +import { EntitiesService, List, log, mapEach, QueryParam, RequiredParam, shareLast, Toaster, Validate } from '@iqser/common-ui'; import { Dossier, IDossier, IDossierRequest } from '@red/domain'; import { catchError, filter, map, mapTo, switchMap, tap } from 'rxjs/operators'; -import { combineLatest, iif, Observable, of, throwError } from 'rxjs'; +import { combineLatest, iif, Observable, of, throwError, timer } from 'rxjs'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { HttpErrorResponse, HttpStatusCode } from '@angular/common/http'; import { DossierStatsService } from '@services/entity-services/dossier-stats.service'; +import { CHANGED_CHECK_INTERVAL } from '@utils/constants'; export interface IDossiersStats { totalPeople: number; @@ -27,6 +28,13 @@ export class DossiersService extends EntitiesService { private readonly _dossierStatsService: DossierStatsService, ) { super(_injector, Dossier, 'dossier'); + + timer(CHANGED_CHECK_INTERVAL, CHANGED_CHECK_INTERVAL) + .pipe( + switchMap(() => this.loadAllIfChanged()), + log(), + ) + .subscribe(); } loadAll(): Observable { diff --git a/libs/common-ui b/libs/common-ui index 51f3d7502..a1c1be7ed 160000 --- a/libs/common-ui +++ b/libs/common-ui @@ -1 +1 @@ -Subproject commit 51f3d7502b5545663afa2fa0a62abc3578f92905 +Subproject commit a1c1be7edc783bdea42b86c0f8b1f74437065b76 From 72504dfebc8f41b335a1e4f8090a68d99e891f49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adina=20=C8=9Aeudan?= Date: Wed, 12 Jan 2022 22:05:59 +0200 Subject: [PATCH 11/13] Use new changes details endpoint --- .../dossier-overview-screen.component.ts | 27 ++++++---------- .../entity-services/dossiers.service.ts | 32 ++++++++++++++++--- 2 files changed, 36 insertions(+), 23 deletions(-) diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/screen/dossier-overview-screen.component.ts b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/screen/dossier-overview-screen.component.ts index 7995c6d03..9aed7b89f 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/screen/dossier-overview-screen.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/screen/dossier-overview-screen.component.ts @@ -15,9 +15,8 @@ import { FileDropOverlayService } from '@upload-download/services/file-drop-over import { FileUploadModel } from '@upload-download/model/file-upload.model'; import { FileUploadService } from '@upload-download/services/file-upload.service'; import { StatusOverlayService } from '@upload-download/services/status-overlay.service'; -import * as moment from 'moment'; -import { combineLatest, Observable } from 'rxjs'; -import { skip, switchMap, tap } from 'rxjs/operators'; +import { Observable } from 'rxjs'; +import { filter, skip, switchMap, tap } from 'rxjs/operators'; import { convertFiles, Files, handleFileDrop } from '@utils/index'; import { CircleButtonTypes, @@ -129,17 +128,17 @@ export class DossierOverviewScreenComponent extends ListingComponent imple this._fileDropOverlayService.initFileDropHandling(this.dossierId); - this.addSubscription = combineLatest([ - this._dossiersService.getEntityChanged$(this.dossierId), - this._dossierStatsService.watch$(this.dossierId), - ]) - .pipe(switchMap(() => this._reloadFiles())) - .subscribe(); - this.addSubscription = this.configService.listingMode$.subscribe(() => { this._computeAllFilters(); }); + this.addSubscription = this._dossiersService.dossierFileChanges$ + .pipe( + filter(dossierId => dossierId === this.dossierId), + switchMap(dossierId => this._filesService.loadAll(dossierId)), + ) + .subscribe(); + this.addSubscription = this._dossierTemplatesService .getEntityChanged$(this.currentDossier.dossierTemplateId) .pipe( @@ -192,9 +191,6 @@ export class DossierOverviewScreenComponent extends ListingComponent imple (this._fileInput as any).nativeElement.value = null; } - recentlyModifiedChecker = (file: File) => - moment(file.lastUpdated).add(this._appConfigService.values.RECENT_PERIOD_IN_HOURS, 'hours').isAfter(moment()); - private _updateFileAttributes(): void { this._fileAttributeConfigs = this._fileAttributesService.getFileAttributeConfig(this.currentDossier.dossierTemplateId)?.fileAttributeConfigs || []; @@ -204,11 +200,6 @@ export class DossierOverviewScreenComponent extends ListingComponent imple this._computeAllFilters(); } - private async _reloadFiles() { - await this._filesService.loadAll(this.dossierId).toPromise(); - this._computeAllFilters(); - } - private _loadEntitiesFromState() { this.currentDossier = this._dossiersService.find(this.dossierId); this._computeAllFilters(); diff --git a/apps/red-ui/src/app/services/entity-services/dossiers.service.ts b/apps/red-ui/src/app/services/entity-services/dossiers.service.ts index e3543d71b..5d14236fe 100644 --- a/apps/red-ui/src/app/services/entity-services/dossiers.service.ts +++ b/apps/red-ui/src/app/services/entity-services/dossiers.service.ts @@ -1,8 +1,8 @@ import { Injectable, Injector } from '@angular/core'; -import { EntitiesService, List, log, mapEach, QueryParam, RequiredParam, shareLast, Toaster, Validate } from '@iqser/common-ui'; +import { EntitiesService, List, mapEach, QueryParam, RequiredParam, shareLast, Toaster, Validate } from '@iqser/common-ui'; import { Dossier, IDossier, IDossierRequest } from '@red/domain'; import { catchError, filter, map, mapTo, switchMap, tap } from 'rxjs/operators'; -import { combineLatest, iif, Observable, of, throwError, timer } from 'rxjs'; +import { combineLatest, Observable, of, Subject, throwError, timer } from 'rxjs'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { HttpErrorResponse, HttpStatusCode } from '@angular/common/http'; import { DossierStatsService } from '@services/entity-services/dossier-stats.service'; @@ -13,6 +13,16 @@ export interface IDossiersStats { totalAnalyzedPages: number; } +interface ChangesDetails { + dossierChanges: [ + { + dossierChanges: boolean; + dossierId: string; + fileChanges: boolean; + }, + ]; +} + const DOSSIER_EXISTS_MSG = _('add-dossier-dialog.errors.dossier-already-exists'); const GENERIC_MGS = _('add-dossier-dialog.errors.generic'); @@ -21,6 +31,7 @@ const GENERIC_MGS = _('add-dossier-dialog.errors.generic'); }) export class DossiersService extends EntitiesService { readonly generalStats$ = this.all$.pipe(switchMap(entities => this._generalStats$(entities))); + readonly dossierFileChanges$ = new Subject(); constructor( private readonly _toaster: Toaster, @@ -32,7 +43,7 @@ export class DossiersService extends EntitiesService { timer(CHANGED_CHECK_INTERVAL, CHANGED_CHECK_INTERVAL) .pipe( switchMap(() => this.loadAllIfChanged()), - log(), + tap(changes => this._emitFileChanges(changes)), ) .subscribe(); } @@ -47,8 +58,15 @@ export class DossiersService extends EntitiesService { ); } - loadAllIfChanged(): Observable { - return this.hasChanges$().pipe(switchMap(changed => iif(() => changed, this.loadAll()).pipe(mapTo(changed)))); + loadAllIfChanged(): Observable { + return this.hasChangesDetails$().pipe(switchMap(changes => this.loadAll().pipe(mapTo(changes)))); + } + + hasChangesDetails$(): Observable { + const body = { value: this._lastCheckedForChanges.get('root') ?? '0' }; + return this._post(body, `${this._defaultModelPath}/changes/details`).pipe( + filter(changes => changes.dossierChanges.length > 0), + ); } @Validate() @@ -90,6 +108,10 @@ export class DossiersService extends EntitiesService { return super.delete(body, 'deleted-dossiers/hard-delete', body).toPromise(); } + private _emitFileChanges(changes: ChangesDetails): void { + changes.dossierChanges.filter(change => change.fileChanges).forEach(change => this.dossierFileChanges$.next(change.dossierId)); + } + private _computeStats(entities: List): IDossiersStats { let totalAnalyzedPages = 0; const totalPeople = new Set(); From c400e875f98fc031575a9b42f7ffe826dbc89c9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adina=20=C8=9Aeudan?= Date: Thu, 13 Jan 2022 00:21:25 +0200 Subject: [PATCH 12/13] Handle deleted entities --- apps/red-ui/src/app/app.component.html | 1 + .../dossier-overview-screen.component.ts | 27 ++++++++++--- .../dossiers-listing-screen.component.ts | 11 ++--- .../file-preview-screen.component.ts | 40 ++++++++++++++----- .../entity-services/files-map.service.ts | 10 +++++ apps/red-ui/src/assets/i18n/en.json | 14 +++++++ 6 files changed, 79 insertions(+), 24 deletions(-) diff --git a/apps/red-ui/src/app/app.component.html b/apps/red-ui/src/app/app.component.html index ff64625af..20a8fecb2 100644 --- a/apps/red-ui/src/app/app.component.html +++ b/apps/red-ui/src/app/app.component.html @@ -1,3 +1,4 @@ + diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/screen/dossier-overview-screen.component.ts b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/screen/dossier-overview-screen.component.ts index 9aed7b89f..19e8e7e71 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/screen/dossier-overview-screen.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/screen/dossier-overview-screen.component.ts @@ -15,18 +15,19 @@ import { FileDropOverlayService } from '@upload-download/services/file-drop-over import { FileUploadModel } from '@upload-download/model/file-upload.model'; import { FileUploadService } from '@upload-download/services/file-upload.service'; import { StatusOverlayService } from '@upload-download/services/status-overlay.service'; -import { Observable } from 'rxjs'; +import { Observable, Subscription } from 'rxjs'; import { filter, skip, switchMap, tap } from 'rxjs/operators'; import { convertFiles, Files, handleFileDrop } from '@utils/index'; import { CircleButtonTypes, + CustomError, DefaultListingServices, + ErrorService, ListingComponent, ListingModes, LoadingService, NestedFilter, OnAttach, - OnDetach, TableColumnConfig, TableComponent, WorkflowConfig, @@ -52,7 +53,7 @@ import { DossierStatsService } from '@services/entity-services/dossier-stats.ser providers: [...DefaultListingServices, { provide: ListingComponent, useExisting: forwardRef(() => DossierOverviewScreenComponent) }], changeDetection: ChangeDetectionStrategy.OnPush, }) -export class DossierOverviewScreenComponent extends ListingComponent implements OnInit, OnDestroy, OnDetach, OnAttach { +export class DossierOverviewScreenComponent extends ListingComponent implements OnInit, OnDestroy, OnAttach { readonly listingModes = ListingModes; readonly circleButtonTypes = CircleButtonTypes; readonly tableHeaderLabel = _('dossier-overview.table-header.title'); @@ -73,6 +74,7 @@ export class DossierOverviewScreenComponent extends ListingComponent imple @ViewChild('fileInput', { static: true }) private readonly _fileInput: ElementRef; @ViewChild(TableComponent) private readonly _tableComponent: TableComponent; private _fileAttributeConfigs: IFileAttributeConfig[]; + private readonly _removableSubscriptions = new Subscription(); constructor( protected readonly _injector: Injector, @@ -92,6 +94,7 @@ export class DossierOverviewScreenComponent extends ListingComponent imple readonly configService: ConfigService, private readonly _userPreferenceService: UserPreferenceService, private readonly _fileMapService: FilesMapService, + private readonly _errorService: ErrorService, activatedRoute: ActivatedRoute, ) { super(_injector); @@ -165,11 +168,10 @@ export class DossierOverviewScreenComponent extends ListingComponent imple ngOnAttach() { this._fileDropOverlayService.initFileDropHandling(this.dossierId); + this._setRemovableSubscriptions(); this._tableComponent?.scrollToLastIndex(); } - ngOnDetach() {} - forceReanalysisAction($event: LongPressEvent) { this.analysisForced = !$event.touchEnd && this._userPreferenceService.areDevFeaturesEnabled; } @@ -191,6 +193,21 @@ export class DossierOverviewScreenComponent extends ListingComponent imple (this._fileInput as any).nativeElement.value = null; } + private _setRemovableSubscriptions(): void { + this._removableSubscriptions.add( + this._dossiersService + .getEntityDeleted$(this.dossierId) + .pipe(tap(() => this._handleDeletedDossier())) + .subscribe(), + ); + } + + private _handleDeletedDossier(): void { + this._errorService.set( + new CustomError(_('error.deleted-entity.dossier.label'), _('error.deleted-entity.dossier.action'), 'iqser:expand'), + ); + } + private _updateFileAttributes(): void { this._fileAttributeConfigs = this._fileAttributesService.getFileAttributeConfig(this.currentDossier.dossierTemplateId)?.fileAttributeConfigs || []; diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/screen/dossiers-listing-screen.component.ts b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/screen/dossiers-listing-screen.component.ts index 79b8fd977..d70a2ae00 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/screen/dossiers-listing-screen.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/screen/dossiers-listing-screen.component.ts @@ -1,11 +1,11 @@ -import { ChangeDetectionStrategy, Component, forwardRef, Injector, OnDestroy, OnInit, TemplateRef, ViewChild } from '@angular/core'; +import { ChangeDetectionStrategy, Component, forwardRef, Injector, OnInit, TemplateRef, ViewChild } from '@angular/core'; import { Dossier } from '@red/domain'; import { UserService } from '@services/user.service'; import { PermissionsService } from '@services/permissions.service'; import { TranslateChartService } from '@services/translate-chart.service'; import { Router } from '@angular/router'; import { DossiersDialogService } from '../../../services/dossiers-dialog.service'; -import { DefaultListingServicesTmp, EntitiesService, ListingComponent, OnAttach, OnDetach, TableComponent } from '@iqser/common-ui'; +import { DefaultListingServicesTmp, EntitiesService, ListingComponent, OnAttach, TableComponent } from '@iqser/common-ui'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { ConfigService } from '../config.service'; import { DossiersService } from '@services/entity-services/dossiers.service'; @@ -23,7 +23,7 @@ import { tap } from 'rxjs/operators'; ], changeDetection: ChangeDetectionStrategy.OnPush, }) -export class DossiersListingScreenComponent extends ListingComponent implements OnInit, OnDestroy, OnAttach, OnDetach { +export class DossiersListingScreenComponent extends ListingComponent implements OnInit, OnAttach { readonly currentUser = this._userService.currentUser; readonly tableColumnConfigs = this._configService.tableConfig; readonly tableHeaderLabel = _('dossier-listing.table-header.title'); @@ -59,14 +59,9 @@ export class DossiersListingScreenComponent extends ListingComponent im } ngOnAttach(): void { - this.ngOnInit(); this._tableComponent?.scrollToLastIndex(); } - ngOnDetach(): void { - this.ngOnDestroy(); - } - openAddDossierDialog(): void { this._dialogService.openDialog('addDossier', null, null, async (addResponse: { dossier: Dossier; addMembers: boolean }) => { await this._router.navigate([addResponse.dossier.routerLink]); diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.ts b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.ts index 445d22bbd..4ff4c076a 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.ts @@ -5,7 +5,9 @@ import { PdfViewerComponent } from './components/pdf-viewer/pdf-viewer.component import { AutoUnsubscribe, CircleButtonTypes, + CustomError, Debounce, + ErrorService, FilterService, LoadingService, OnAttach, @@ -43,19 +45,12 @@ import { ViewModeService } from './services/view-mode.service'; import { MultiSelectService } from './services/multi-select.service'; import { DocumentInfoService } from './services/document-info.service'; import { ReanalysisService } from '../../../../services/reanalysis.service'; +import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import Annotation = Core.Annotations.Annotation; import PDFNet = Core.PDFNet; const ALL_HOTKEY_ARRAY = ['Escape', 'F', 'f', 'ArrowUp', 'ArrowDown']; -function diff(first: readonly T[], second: readonly T[]): T[] { - // symmetrical difference between two arrays - const a = new Set(first); - const b = new Set(second); - - return [...first.filter(x => !b.has(x)), ...second.filter(x => !a.has(x))]; -} - @Component({ templateUrl: './file-preview-screen.component.html', styleUrls: ['./file-preview-screen.component.scss'], @@ -108,6 +103,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni private readonly _filesMapService: FilesMapService, private readonly _dossiersService: DossiersService, private readonly _reanalysisService: ReanalysisService, + private readonly _errorService: ErrorService, readonly excludedPagesService: ExcludedPagesService, readonly viewModeService: ViewModeService, readonly multiSelectService: MultiSelectService, @@ -190,7 +186,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni ngOnDetach(): void { this.displayPdfViewer = false; - super.ngOnDestroy(); + super.ngOnDetach(); this._changeDetectorRef.markForCheck(); } @@ -529,10 +525,10 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni } private _subscribeToFileUpdates(): void { - this.addSubscription = timer(0, 5000) + this.addActiveScreenSubscription = timer(0, 5000) .pipe(switchMap(() => this._filesService.reload(this.dossierId, this.fileId))) .subscribe(); - this.addSubscription = this._filesMapService.fileReanalysed$ + this.addActiveScreenSubscription = this._filesMapService.fileReanalysed$ .pipe(filter(file => file.fileId === this.fileId)) .subscribe(async file => { if (file.lastProcessed !== this.fileData?.file.lastProcessed) { @@ -541,6 +537,28 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni } this._loadingService.stop(); }); + + this.addActiveScreenSubscription = this._dossiersService + .getEntityDeleted$(this.dossierId) + .pipe(tap(() => this._handleDeletedDossier())) + .subscribe(); + + this.addActiveScreenSubscription = this._filesMapService + .watchDeleted$(this.fileId) + .pipe(tap(() => this._handleDeletedFile())) + .subscribe(); + } + + private _handleDeletedDossier(): void { + this._errorService.set( + new CustomError(_('error.deleted-entity.file-dossier.label'), _('error.deleted-entity.file-dossier.action'), 'iqser:expand'), + ); + } + + private _handleDeletedFile(): void { + this._errorService.set( + new CustomError(_('error.deleted-entity.file.label'), _('error.deleted-entity.file.action'), 'iqser:expand'), + ); } private async _loadFileData(file: File): Promise { diff --git a/apps/red-ui/src/app/services/entity-services/files-map.service.ts b/apps/red-ui/src/app/services/entity-services/files-map.service.ts index b861090da..9d04a9d99 100644 --- a/apps/red-ui/src/app/services/entity-services/files-map.service.ts +++ b/apps/red-ui/src/app/services/entity-services/files-map.service.ts @@ -7,6 +7,7 @@ import { filter, startWith } from 'rxjs/operators'; export class FilesMapService { readonly fileReanalysed$ = new Subject(); private readonly _entityChanged$ = new Subject(); + private readonly _entityDeleted$ = new Subject(); private readonly _map = new Map>(); get$(dossierId: string) { @@ -39,6 +40,7 @@ export class FilesMapService { const reanalysedEntities = []; const changedEntities = []; + const deletedEntities = this.get(key).filter(oldEntity => !entities.find(newEntity => newEntity.id === oldEntity.id)); // Keep old object references for unchanged entities const newEntities = entities.map(newEntity => { @@ -67,6 +69,10 @@ export class FilesMapService { for (const file of changedEntities) { this._entityChanged$.next(file); } + + for (const file of deletedEntities) { + this._entityDeleted$.next(file); + } } replace(entity: File) { @@ -83,4 +89,8 @@ export class FilesMapService { startWith(this.get(key, entityId)), ); } + + watchDeleted$(entityId: string): Observable { + return this._entityDeleted$.pipe(filter(entity => entity.id === entityId)); + } } diff --git a/apps/red-ui/src/assets/i18n/en.json b/apps/red-ui/src/assets/i18n/en.json index 510458983..fa8141da2 100644 --- a/apps/red-ui/src/assets/i18n/en.json +++ b/apps/red-ui/src/assets/i18n/en.json @@ -938,6 +938,20 @@ "unsaved-changes": "You have unsaved changes. Save or revert before changing the tab." }, "error": { + "deleted-entity": { + "dossier": { + "action": "Back to overview", + "label": "This dossier has been deleted!" + }, + "file-dossier": { + "action": "Back to overview", + "label": "The dossier of this file has been deleted!" + }, + "file": { + "action": "Back to dossier", + "label": "This file has been deleted!" + } + }, "http": { "generic": "Action failed with code {status}" }, From 557f9f17aef6f2f672cd21dbede8d4059e5f3241 Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Wed, 12 Jan 2022 23:31:01 +0100 Subject: [PATCH 13/13] chore(release) --- package.json | 2 +- paligo-theme.tar.gz | Bin 3216 -> 3214 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 47767ae8d..1cf394330 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redaction", - "version": "3.147.0", + "version": "3.148.0", "private": true, "license": "MIT", "scripts": { diff --git a/paligo-theme.tar.gz b/paligo-theme.tar.gz index 0e85ebbd650282119240f6e49a30be9f567ef119..3bb6a886132a0322f029877d3e6d3d4e1999549e 100644 GIT binary patch delta 3127 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 Ro!c+A{U7a{pPc|u006s_DeC|L delta 3129 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 Tc5dhPi*5f0ABu=a08jt`n*bbm