From ff9e73e437b0ffdb5d6d792e503fa850a54cfbd4 Mon Sep 17 00:00:00 2001 From: Dan Percic Date: Thu, 24 Feb 2022 14:57:15 +0200 Subject: [PATCH 01/19] remove unused i18n --- .../components/file-workload/file-workload.component.html | 2 +- .../components/file-workload/file-workload.component.ts | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/file-workload/file-workload.component.html b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/file-workload/file-workload.component.html index cc48bfa09..c1e083ac7 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/file-workload/file-workload.component.html +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/file-workload/file-workload.component.html @@ -160,7 +160,7 @@ diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/file-workload/file-workload.component.ts b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/file-workload/file-workload.component.ts index 49e0d9989..e92b5f771 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/file-workload/file-workload.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/file-workload/file-workload.component.ts @@ -34,7 +34,6 @@ import { MultiSelectService } from '../../services/multi-select.service'; import { DocumentInfoService } from '../../services/document-info.service'; import { SkippedService } from '../../services/skipped.service'; import { FilePreviewStateService } from '../../services/file-preview-state.service'; -import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; const COMMAND_KEY_ARRAY = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Escape']; const ALL_HOTKEY_ARRAY = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown']; @@ -48,8 +47,6 @@ const ALL_HOTKEY_ARRAY = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown']; export class FileWorkloadComponent { readonly iconButtonTypes = IconButtonTypes; readonly circleButtonTypes = CircleButtonTypes; - readonly noDataI18NKey = _('file-preview.no-data.title'); - readonly resetFiltersI18NKey = _('file-preview.reset-filters'); displayedAnnotations = new Map(); @Input() selectedAnnotations: AnnotationWrapper[]; From cbeb63e1219241bac86803c51c5ca3958451a379 Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Thu, 24 Feb 2022 14:04:51 +0100 Subject: [PATCH 02/19] chore(release) --- package.json | 2 +- paligo-theme.tar.gz | Bin 3214 -> 3215 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 81e9aee99..b4d3dc543 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redaction", - "version": "3.261.0", + "version": "3.262.0", "private": true, "license": "MIT", "scripts": { diff --git a/paligo-theme.tar.gz b/paligo-theme.tar.gz index 4541f9ed73388176e467555638ea2a4fa6c04bbc..af890fdd087f3417e6efb25ecfbe71267d268d6e 100644 GIT binary patch delta 3099 zcmV+$4CM2U8IKu|b_=kyZO`#v*^ccmgOPzDf9}#b>;K1Sd-Y$D7)MNw&7->hur;`X z7ygv~J;(99PXF+I3Ho0Ip8E>f-!H4?_6yhln<&LqO&GfT>(^gctINBKH*{MT6+=yx zU0tS(mG%1OCMj}O&o@P}$p|iKJ&%g*4H$&`y994(_Vmf0OOpTgE1cJB%5XM&*re=@ ze?9YT`_7*E;%^}SF2vuZ_`8C?j+o~8&>e&Wl>W`3+Smxh8cZJ z4&$D;pH@Oi7K@eSDvoXcnj;O1ipvo>!a6P9N_iU$D31L&e-M~1-fT%sF)H%x3Dr?WNRDtGqbp^LEct%B7P!p& zTGOEKwsJ7 zriY%>JeT&-IX$7aX3aoJ2$)nwz{(Hr6($z@c7^LIYmJbPqF>ZW$>JtoM3Gi-t# zXG9Z}>Wb>zjUJH~hKTI$+ZqC~K_5HxAEJ-cM|@9B*#yW!buZ&UfAC>}&g3xnImI@Z z2?WPDje*x=THTed8d~-1eWEMz(WR_#}q?i9l+~x98a0}3XFRJ?_ zD;@^0?i8#YIX&#(Kr>AZ<;^=-93-Wq@TO2W_HB>iGmK$}~qj`RN!e zLQ*B!`){L^K!1(C6vh9aaE>>mst4;VCpG7<`gOi6vJBSYGW(2FWRmICB+)CsNA~-o zt|^cUv@p`+g}wQJGd4nbJBe}`DJbt7P%9%Sgp4x;6XjCbf1=N0%8F`etM;U|1ks2} z$hD(1qvZX6C7~&)8lDtqkZ=x(btd`iV4+l_ZLeEOIF{rf*Px=P=F+az>D&=(b$M}9rTHoY4H$&sGyTNSCBj7=qwNdW(r zEt~}4NHOhvf0>MEeZ-JirAM!nQh?7p$LPG5%rk&C0#iZGw|fof|Spzc-f1e%GoU>JvDuoj8fc-UF_3J`jho ztr75$!g^~YJ~UhzxC+iOe5n0dYbB%kH327re;MCoAP#)xx(g78yW%nd!PxWLYjyfJ z4UO(CNZFWhe61r_4lKKQn~FR^PO4U1+K|hc^4mx>81i5UV;qIvXvjB;PYeaqWGsx5 z6+=s-a>dZfsLKtn5(Hzmoh0@U48}NTK}3REZM7%Jvx)}+m?YuK3k`#=QPFa+-30-t zf5chc&X6{RSILf6P3^3qAwo1!5PL*hG$mQNEn>3Ug@S(Rl=@BXY_E^ldHlekLYaNmF9W13eAAo%6>k3HVxsmwwM<~=FoWalM0k!k2*c65{ zA_&`UZt|=4QU=SzJQaAoh9DT;Q*g8$e5 zzAFd@WvWJt-7_))JS=?nnzYdZf2L7S9&PUddC6JmG+I?!ImGs<5^4)#M7Ux!k|p8z zf@oL~T*w1l8( zbz*x=`aGILx0`V-+D(Qshabp|%*iufn|0j-!AKmc9?mW9fT zUySuh+>9TVHGCcT#%MX#rfb%wJJ6;u4Pm|F+u}gB(u+zuTP6SLl{|5ID4CJxdXlHz zub#DCm*jBQ0gUR$f8*1 z<6n;!1I?A1@C}aCY~1Q`FMn7^qXBs$#N^xth9UsR2C))n9nvPR3EM@|BAc~eh8M(I z^ipo9e-=*|6naj0f4QJ?VS2Ejj{o5A6!sD$g7E=zCR4WqnEN1j2>(moAgH*HczU2t zpL}tkPde_Q!2ssS_XPuTUi_?Ji0>sCw65Lm5y61Zy>ACj5oBMWpCriMAD2}Tkr=E` zlxXvsk@CQ++lds_i9Qx-98h(>D$ixJji-v7Ex#7Fba+;eX#nQz}}uhAuct&R9=?aLXe z;lrv)MTOt}iH}7Ed#N)+;>#Sq$u76=a=R|C@AA4Xzwh$9uAuJJFyKFrEpL?comMnRjN{yKU+@ti<_Oje9$o%UB1np;nY#4;ssGoOb332cype$+f1bTO>;K1Sd-Y$D7)MNw&7->hur;`X z7ygv~JqOg?>3`wzerFMQ{wrjEzpR?uFI@j`q7+v(Vd(O&Uw>h(F7Gbh&}~^%3^i4D zb(u0&*6W*_q{vx4-xS3rBe5Pz5A?+X4pVvZx`IAV??<~U-G!{_`argfR&r%&n!TwY$^UCcRs zII~iMV^X1iT_E(%qIpan*T}hpUn!xm{u=p#T|VAjJP#n&>yRWxMFeDsqx(%&G+4UfoF* zL|WEsFocMtMb;_4C~-vD(;C_H<%!58e_agq`ltb9FkC`eGGq?-ExeXLm;aqo%5PS6R@Uk;-5T zHn#@xpM4w)>$G?)B?PkuLMM<3VgT3-ha?j#NKdv#d6A2KIG#N1i$m9yubY_xaIXBYXf#QRs;3T})wC~<;a}` zN2$NFU`AO+W)l;^two}Te-%+Xa~MnA)seB(Tj-(AK7l-hPaqH*9sLPwweIVb6%~g! zcCd^*GAkxgQQ_95gYHSiWiw4xlZ|&rZ-{#&mr)JQ-}!9w?2#d>tvunBgY z5lv94E2?uhdPH6rBC@-0YY4;!eeBSGh(1yu@jW$V6CexKy^I6Fe}@G+lf&HS6x(1X z5FFz)25zIvJ$X31`51jp^Ndi|^r_NZzn_q}r1F{dZi!$SSKMq1gbL zKS__hRFUB*t!R`of4VV|6ii}CydKL}O_U~0elLQs4!@YD!tLQd4@nLy(;V^Sr(>`P zNtI;pzl~A?{Wbbh6#sw1Io^<}9;~yR)SSQS*ZH!@GFXSp>@!l4Nv2nmM6diF+3$gKqDTp zH@O*XH{Q|k>0kc$@Bh^3Dt-TLlh6%8UsPZo`SlRn^lk_wM|!evRith*HkCjo0sLFG za1wwc#kBKfe=?%=5kqE?d)Mis;L7H~jsFu6O(xf9=hjMcJdvfHmWk=1(Q{iuN2_*> zrVy$!9CeFl!>2SG8_o4I!O*!fQ}3@7)W=F zYags2hsEJ|mG37{94B!4Ds@iFk}yqRJY8s$rDPYe6MHhu8gZU7 z7`3WRe+b;U_6)h6_~V;qxoZRo3PeP85J!=4mP6ESe~a01J%MzF9LG^7LB5E?jKpAl zx8Cgv+v;FmuzrHY_=m+eEB98n2~I+FZpa}0-dH00U8{DePvEe2;v^b-54g(tKpe)l zM!-V~>#dRa&~RnoDmcgRq4sC3m5k=s1e^$Fe|(dHIPjJ0ESxIF%(Rbu`o(j z3@wey6+4A>=A9zlw{?$h{p-gw`Iebwtv4u$1O}0P>};DaG2))$k!JKNjT!x;vkOM2d(phJBs53+pA>BuMWH}Q_S&OYqTA;v|}Nc z8O@x-IE}#d=l5D>--0JL}%eiT_YtmMw{=z*D75nRyBnPO zt{@ncsTwVI&&UMuu<+Sy(nbrIe?~odw7m!9C1;`2XjN(D5Zk9ps4a*Q;fm2nmW1OA zqG3gFArIJviSSag#2X^NYE_I3wq4N&kRRy;zeYw>scS%HEAi=K4tdIkSZ^tL5U(oK ziS04z^Jos;ZpO7}HyO$tejqn8C(nFs)^!gABayV*aHjnfH$G+^8*FiGe|AIrylp26 z`w#~JNl^h|4V2tfgljUS?&yPq-EK7Gk#ds@O9uDqvcqeu34MzK%2reg!PJViv!t8FDmJ5mHeky^2Ft#WJaFrNuGAU zde(MblEYmGFsdI54(&^(e`&6?+5VKkR!oRLPy_AoTDW~;pvEs5A|jkcS5U$u3po%j zu2lw5>Ph0;Z$07dPf2w9gKH-BMn?_$Mws-!#{pkQQ1*fYQ&WaZKWiwH5+}A ziIAlFuTpm|ZtwHv;_%k+KS9O5QUSiN&5u zay`x>`=d#5DOQC41SY31AJs{nkKK1b+qokpKY)Ua?=>zIFs%0U!MA6S3e3A`|J{)4|$*h`EE#s|omOx+G(?t|bV{4aTfpyEE_>47?Z z^2LEZ>9~gm1DGS<7YxXG@w0*DMp%z||LZalAI&>+&%LQ+zJ05`Mwk4xHsY_fFK4KR z5342>6@K?8J{A@1rOphAFLU@NyWGCZ?Yg|a%j>%QzRT~rg1#&0x)y!cLUxtiXGO*? z>p0Q1v>$mGe>*Ytv@_UABp-bAI+Fe{^qu(J{dugsA;#{R?LmxzhEdV|5Tkc2M&DC0 zDyH+ofd4$UyiwA3TG1dej&sL-!AF3YBUm?hboo1pASt3|>eBnC{$E?p?cC1o+|KRX o&h6aJ?cC1o+|KRX&h6aJ?cC1o+|KRXezEQU0#iHu1OQL~0CY|V(*OVf From fecec0e32ef40f5e190463eddd41a42bedecfa51 Mon Sep 17 00:00:00 2001 From: Valentin Mihai Date: Fri, 25 Feb 2022 12:45:34 +0200 Subject: [PATCH 03/19] updated base dialog to not verify the changes on closing the window when it's on edit mode --- apps/red-ui/src/app/modules/admin/admin-routing.module.ts | 1 - .../add-edit-dictionary-dialog.component.ts | 2 +- .../add-edit-dossier-attribute-dialog.component.ts | 2 +- .../add-edit-dossier-state-dialog.component.ts | 2 +- .../add-edit-dossier-template-dialog.component.ts | 2 +- .../add-edit-file-attribute-dialog.component.ts | 2 +- .../add-edit-user-dialog/add-edit-user-dialog.component.ts | 4 ++-- .../dialogs/edit-color-dialog/edit-color-dialog.component.ts | 2 +- .../file-attributes-configurations-dialog.component.ts | 2 +- .../add-edit-justification-dialog.component.ts | 2 +- .../src/app/modules/admin/screens/rules/rules.module.ts | 3 ++- .../change-legal-basis-dialog.component.ts | 2 +- .../edit-dossier-dialog/edit-dossier-dialog.component.ts | 2 +- libs/common-ui | 2 +- 14 files changed, 15 insertions(+), 15 deletions(-) diff --git a/apps/red-ui/src/app/modules/admin/admin-routing.module.ts b/apps/red-ui/src/app/modules/admin/admin-routing.module.ts index bb0a2a0e8..96fe292f5 100644 --- a/apps/red-ui/src/app/modules/admin/admin-routing.module.ts +++ b/apps/red-ui/src/app/modules/admin/admin-routing.module.ts @@ -75,7 +75,6 @@ const routes: Routes = [ path: 'rules', component: BaseDossierTemplateScreenComponent, canActivate: [CompositeRouteGuard], - canDeactivate: [PendingChangesGuard], data: { routeGuards: [AuthGuard, RedRoleGuard], }, diff --git a/apps/red-ui/src/app/modules/admin/dialogs/add-edit-dictionary-dialog/add-edit-dictionary-dialog.component.ts b/apps/red-ui/src/app/modules/admin/dialogs/add-edit-dictionary-dialog/add-edit-dictionary-dialog.component.ts index 1e713ac18..c1748e7f8 100644 --- a/apps/red-ui/src/app/modules/admin/dialogs/add-edit-dictionary-dialog/add-edit-dictionary-dialog.component.ts +++ b/apps/red-ui/src/app/modules/admin/dialogs/add-edit-dictionary-dialog/add-edit-dictionary-dialog.component.ts @@ -41,7 +41,7 @@ export class AddEditDictionaryDialogComponent extends BaseDialogComponent { @Inject(MAT_DIALOG_DATA) private readonly _data: { readonly dictionary: Dictionary; readonly dossierTemplateId: string }, ) { - super(_injector, _dialogRef); + super(_injector, _dialogRef, !!_data.dictionary); this.form = this._getForm(this.dictionary); this.initialFormValue = this.form.getRawValue(); this.hasColor$ = this._colorEmpty$; diff --git a/apps/red-ui/src/app/modules/admin/dialogs/add-edit-dossier-attribute-dialog/add-edit-dossier-attribute-dialog.component.ts b/apps/red-ui/src/app/modules/admin/dialogs/add-edit-dossier-attribute-dialog/add-edit-dossier-attribute-dialog.component.ts index 94dd875f6..1c1e6b7ee 100644 --- a/apps/red-ui/src/app/modules/admin/dialogs/add-edit-dossier-attribute-dialog/add-edit-dossier-attribute-dialog.component.ts +++ b/apps/red-ui/src/app/modules/admin/dialogs/add-edit-dossier-attribute-dialog/add-edit-dossier-attribute-dialog.component.ts @@ -27,7 +27,7 @@ export class AddEditDossierAttributeDialogComponent extends BaseDialogComponent @Inject(MAT_DIALOG_DATA) readonly data: { readonly dossierAttribute: IDossierAttributeConfig; dossierTemplateId: string }, ) { - super(_injector, _dialogRef); + super(_injector, _dialogRef, !!data.dossierAttribute); this.form = this._getForm(this.dossierAttribute); this.initialFormValue = this.form.getRawValue(); } diff --git a/apps/red-ui/src/app/modules/admin/dialogs/add-edit-dossier-state-dialog/add-edit-dossier-state-dialog.component.ts b/apps/red-ui/src/app/modules/admin/dialogs/add-edit-dossier-state-dialog/add-edit-dossier-state-dialog.component.ts index 0a3ec2ad4..55a44ba00 100644 --- a/apps/red-ui/src/app/modules/admin/dialogs/add-edit-dossier-state-dialog/add-edit-dossier-state-dialog.component.ts +++ b/apps/red-ui/src/app/modules/admin/dialogs/add-edit-dossier-state-dialog/add-edit-dossier-state-dialog.component.ts @@ -22,7 +22,7 @@ export class AddEditDossierStateDialogComponent extends BaseDialogComponent { protected readonly _dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) readonly data: DialogData, ) { - super(_injector, _dialogRef); + super(_injector, _dialogRef, !!data.dossierState); this.form = this.#getForm(); this.initialFormValue = this.form.getRawValue(); } diff --git a/apps/red-ui/src/app/modules/admin/dialogs/add-edit-dossier-template-dialog/add-edit-dossier-template-dialog.component.ts b/apps/red-ui/src/app/modules/admin/dialogs/add-edit-dossier-template-dialog/add-edit-dossier-template-dialog.component.ts index 5973b7db4..6297f906f 100644 --- a/apps/red-ui/src/app/modules/admin/dialogs/add-edit-dossier-template-dialog/add-edit-dossier-template-dialog.component.ts +++ b/apps/red-ui/src/app/modules/admin/dialogs/add-edit-dossier-template-dialog/add-edit-dossier-template-dialog.component.ts @@ -41,7 +41,7 @@ export class AddEditDossierTemplateDialogComponent extends BaseDialogComponent { private readonly _loadingService: LoadingService, @Inject(MAT_DIALOG_DATA) readonly dossierTemplateId: string, ) { - super(_injector, _dialogRef); + super(_injector, _dialogRef, !!dossierTemplateId); this.dossierTemplate = this._dossierTemplatesService.find(this.dossierTemplateId); this.form = this._getForm(); this.initialFormValue = this.form.getRawValue(); diff --git a/apps/red-ui/src/app/modules/admin/dialogs/add-edit-file-attribute-dialog/add-edit-file-attribute-dialog.component.ts b/apps/red-ui/src/app/modules/admin/dialogs/add-edit-file-attribute-dialog/add-edit-file-attribute-dialog.component.ts index 413cdc418..dbd272169 100644 --- a/apps/red-ui/src/app/modules/admin/dialogs/add-edit-file-attribute-dialog/add-edit-file-attribute-dialog.component.ts +++ b/apps/red-ui/src/app/modules/admin/dialogs/add-edit-file-attribute-dialog/add-edit-file-attribute-dialog.component.ts @@ -34,7 +34,7 @@ export class AddEditFileAttributeDialogComponent extends BaseDialogComponent { numberOfFilterableAttrs: number; }, ) { - super(_injector, _dialogRef); + super(_injector, _dialogRef, !!data.fileAttribute); this.canSetDisplayed = data.numberOfDisplayedAttrs < this.DISPLAYED_FILTERABLE_LIMIT || data.fileAttribute?.displayedInFileList; this.canSetFilterable = data.numberOfFilterableAttrs < this.DISPLAYED_FILTERABLE_LIMIT || data.fileAttribute?.filterable; this.form = this._getForm(this.fileAttribute); diff --git a/apps/red-ui/src/app/modules/admin/dialogs/add-edit-user-dialog/add-edit-user-dialog.component.ts b/apps/red-ui/src/app/modules/admin/dialogs/add-edit-user-dialog/add-edit-user-dialog.component.ts index a35e42d2e..ea8f17e66 100644 --- a/apps/red-ui/src/app/modules/admin/dialogs/add-edit-user-dialog/add-edit-user-dialog.component.ts +++ b/apps/red-ui/src/app/modules/admin/dialogs/add-edit-user-dialog/add-edit-user-dialog.component.ts @@ -19,9 +19,9 @@ export class AddEditUserDialogComponent extends BaseDialogComponent { protected readonly _dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) readonly user: User, ) { - super(_injector, _dialogRef); + super(_injector, _dialogRef, !!user); } - + X; toggleResetPassword() { this.resettingPassword = !this.resettingPassword; } diff --git a/apps/red-ui/src/app/modules/admin/dialogs/edit-color-dialog/edit-color-dialog.component.ts b/apps/red-ui/src/app/modules/admin/dialogs/edit-color-dialog/edit-color-dialog.component.ts index 2f544c1d0..d10739d47 100644 --- a/apps/red-ui/src/app/modules/admin/dialogs/edit-color-dialog/edit-color-dialog.component.ts +++ b/apps/red-ui/src/app/modules/admin/dialogs/edit-color-dialog/edit-color-dialog.component.ts @@ -33,7 +33,7 @@ export class EditColorDialogComponent extends BaseDialogComponent { @Inject(MAT_DIALOG_DATA) readonly data: IEditColorData, ) { - super(_injector, _dialogRef); + super(_injector, _dialogRef, true); this._dossierTemplateId = data.dossierTemplateId; this.form = this._getForm(); diff --git a/apps/red-ui/src/app/modules/admin/dialogs/file-attributes-configurations-dialog/file-attributes-configurations-dialog.component.ts b/apps/red-ui/src/app/modules/admin/dialogs/file-attributes-configurations-dialog/file-attributes-configurations-dialog.component.ts index 37bb5c850..6c20af995 100644 --- a/apps/red-ui/src/app/modules/admin/dialogs/file-attributes-configurations-dialog/file-attributes-configurations-dialog.component.ts +++ b/apps/red-ui/src/app/modules/admin/dialogs/file-attributes-configurations-dialog/file-attributes-configurations-dialog.component.ts @@ -28,7 +28,7 @@ export class FileAttributesConfigurationsDialogComponent extends BaseDialogCompo protected readonly _dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) private _data: { config: IFileAttributesConfig; dossierTemplateId: string }, ) { - super(_injector, _dialogRef); + super(_injector, _dialogRef, true); this.form = this._getForm(); this.initialFormValue = this.form.getRawValue(); } diff --git a/apps/red-ui/src/app/modules/admin/screens/justifications/add-edit-justification-dialog/add-edit-justification-dialog.component.ts b/apps/red-ui/src/app/modules/admin/screens/justifications/add-edit-justification-dialog/add-edit-justification-dialog.component.ts index c19723be9..5a53c1d98 100644 --- a/apps/red-ui/src/app/modules/admin/screens/justifications/add-edit-justification-dialog/add-edit-justification-dialog.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/justifications/add-edit-justification-dialog/add-edit-justification-dialog.component.ts @@ -23,7 +23,7 @@ export class AddEditJustificationDialogComponent extends BaseDialogComponent { protected readonly _dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: { justification?: Justification; dossierTemplateId: string }, ) { - super(_injector, _dialogRef); + super(_injector, _dialogRef, !!data.justification); this.form = this._getForm(); this.initialFormValue = this.form.getRawValue(); diff --git a/apps/red-ui/src/app/modules/admin/screens/rules/rules.module.ts b/apps/red-ui/src/app/modules/admin/screens/rules/rules.module.ts index e2824d79e..9e7d816ba 100644 --- a/apps/red-ui/src/app/modules/admin/screens/rules/rules.module.ts +++ b/apps/red-ui/src/app/modules/admin/screens/rules/rules.module.ts @@ -4,8 +4,9 @@ import { RouterModule } from '@angular/router'; import { SharedModule } from '../../../shared/shared.module'; import { RulesScreenComponent } from './rules-screen/rules-screen.component'; import { MonacoEditorModule } from '@materia-ui/ngx-monaco-editor'; +import { PendingChangesGuard } from '../../../../guards/can-deactivate.guard'; -const routes = [{ path: '', component: RulesScreenComponent }]; +const routes = [{ path: '', component: RulesScreenComponent, canDeactivate: [PendingChangesGuard] }]; @NgModule({ declarations: [RulesScreenComponent], diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/change-legal-basis-dialog/change-legal-basis-dialog.component.ts b/apps/red-ui/src/app/modules/dossier/dialogs/change-legal-basis-dialog/change-legal-basis-dialog.component.ts index 350bba3e4..94d74dffd 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/change-legal-basis-dialog/change-legal-basis-dialog.component.ts +++ b/apps/red-ui/src/app/modules/dossier/dialogs/change-legal-basis-dialog/change-legal-basis-dialog.component.ts @@ -31,7 +31,7 @@ export class ChangeLegalBasisDialogComponent extends BaseDialogComponent impleme protected readonly _dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) private readonly _data: { annotations: AnnotationWrapper[]; dossier: Dossier }, ) { - super(_injector, _dialogRef); + super(_injector, _dialogRef, true); this.form = this._getForm(); } diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/edit-dossier-dialog.component.ts b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/edit-dossier-dialog.component.ts index 8b0b8eb1a..943d1cbe5 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/edit-dossier-dialog.component.ts +++ b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/edit-dossier-dialog.component.ts @@ -53,7 +53,7 @@ export class EditDossierDialogComponent extends BaseDialogComponent implements A section?: Section; }, ) { - super(_injector, _dialogRef); + super(_injector, _dialogRef, true); this.navItems = [ { key: 'dossierInfo', diff --git a/libs/common-ui b/libs/common-ui index 8f8ce778b..6c82fe505 160000 --- a/libs/common-ui +++ b/libs/common-ui @@ -1 +1 @@ -Subproject commit 8f8ce778bd78a42076db33c886b4e623a17d4f15 +Subproject commit 6c82fe505b7495d06bec21acbc2a20b653a791ed From 51c7515ae9f9076c8f8315d2238a54d7e9a38bc8 Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Fri, 25 Feb 2022 11:50:48 +0100 Subject: [PATCH 04/19] chore(release) --- package.json | 2 +- paligo-theme.tar.gz | Bin 3215 -> 3216 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b4d3dc543..04bdb0491 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redaction", - "version": "3.262.0", + "version": "3.263.0", "private": true, "license": "MIT", "scripts": { diff --git a/paligo-theme.tar.gz b/paligo-theme.tar.gz index af890fdd087f3417e6efb25ecfbe71267d268d6e..3628bfbf183c601298041e6e8b8f0f07530c8f32 100644 GIT binary patch delta 3130 zcmV-A48`-08IT!}b$|B4@tlS0ys{nJUk0yG@Pkk@Xid#H7EFrE}K*kJ0w(zalY?m>io&b^T#$a0M^?DgAqn<9VI_U1zZb{VxK~e}(Mt zmsNB7h3o%Kl;Wx;3|;>9>o2U;<=w>_x-E-}p{B~NE>p(JdVhU$lN33t=bNI~WCWMA zo=3&@1`NXeU4pkXd-~+hCCPvL70&B5WjLEXY*O~do_V%?XU}}`HxPdp;_p)YUBO>R z%yGmVN6c}=97oJ?_?+Lwv@SFJ^hy1I%ggJ#i#ewcXI4sZOe*xR3xwWTG>^&S8aa3H zD+J$BV&gvM&j)h<1IHvgq5V#<3XL%HskmW6KuYVkZsv1T(T~$kw zu+trSu76HvQeUis?Oo!EZl?lM>vnsm9j;ae7{`_T;_ePY0!6DIhgnMK(m3|-Orq(qkYr*7>B-h8FLJRD$FryAb+Q3XWq-sfn=qph=8ByVj;5{WeekalZgJ?k z@^v#a0M3;k7L6uJQT5cJlib$QkL{eIqdT(RD{2PQL(gfROZ(^?pU_V)z)eMC-oZaD zMz+w)2q&!BLaahgQt|)#85;~FxC7P)t7+jwj%k`wq@uCeZ#2Gubn`}EN?hWT+q<#f z)qi-L@~G3AG!V8Z4H6g zppPB;579^JBfh7mYyxDVx|eYv_^?1{a+v#^VjIi^f@7SBflPEo8Aq9c=H zT-iLh@qYrM$>bXC+*(PFC$hBDGBG_gdTvYTXw{C<6hc+T!(cn0{;~00#6OY>-JecYhug<&!w>Fyq>d zs|Q^HueU&N>k1}|0n4J_)S#iVqQE<3WMWT-StHI<2BTKB34uG;o*~y0e|*y{ca0!H zfrzLM;wTc%a)`R^Z!tTrCy>sN<2dRh$QN;#kr=G+*1KI{TOG^`)=#h)|FHOG<=*Nx z!AYpj4H=~08%t!rYk$=a^$8r-PMkzz?*UgiABe-))(Ch=VZAjH9~!OK1%D*)+(`WTBNS>7&fw?sfZBOhYzo5}5rpkFH~Ce2DTC!{~FWC3%$Y zJ4#A;kUJ$qlUhGO$o^Xh&+%fPOdx?0n!Y8Fu?+e8U_|;^m#j0iT$taV8j-x_M_L_* zPKFst)J$v&sLA$$cU8<0;QJBzeci^22+cRyQ$cA70)=d5nf7`cthk@t%{Ms zwk!Go@*|z#*T{$}bq&aDB|cruAy3&5>n$Y@;(t|zIO3UV}mV@&2DI)x9vn>AL0NYDJmeWfs(t5a7~8P9er@H z+pVU91dYSpJ&ew$V$u8T_k`PUwdUt_5O4*{LgmFT#`+{~#t+LHz7Bk2v>a>GHEYuy zXn#|fhOl1oZE+x5=|v@-t&;!rN}jkpl+4I;J;~GVSI^q6OLDmD07ms=!J&Q0G|iPZ z+n*BHiV5)tYM>on3%5@U)c7SsM1-^G3QBlnAqT?6waNfWJxP4~ttY(wDT!`>aLuIN z=%_*82$TNTc-Ape=}MO`Dm&^*jkr>wt$&oHwPvF)G7*wg|5fVF#qE9GTpZpSo}5hD z#c(S=cR1P)U^0FhthmeBx|G2Pu?87j$$O?EvDi~duE$wqe>5pB#ftEsz~uDhqdKYc zvHK2aJ9nhy2T+jly~c$ChSi=v`1TA^ff-r^{OG~)uSbi4=1NWY21jZ(ZuPjAKYy&F z(SSS=VsdT+LlJ;ugII~P4r!CugzX|}k}3Oy&hTu`|%Jy=l3 zfADt-dx;Uj_y9SRsoMd}eGoi^|0Qn_RNO~AJy54lzBte)9rw^+0CVK~f&n=%epWEV z_mT`+*KYTSV8G|zw*#jLvM+NO|DZ?L>;_m{OFn>~!(> z=MdjCr0(Cy87riI#%sjlQE(LZU$%%d$S{8-!LF8-&ntU3n$SnS4`tCQiF@nsI* zWS84_xm}mncX?fx-*@?4SI~C_UDu-TTF9=l`>e>=WgREFmi8kLV<)Dbb_P3%R delta 3129 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 Date: Fri, 25 Feb 2022 14:42:38 +0200 Subject: [PATCH 05/19] RED-3456 -> split 'scroll_up_and_down' key in two keys: 'scroll_up_button' and 'scroll_down_button' --- apps/red-ui/src/assets/help-mode/links.json | 16 ++++++++++++++-- libs/common-ui | 2 +- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/apps/red-ui/src/assets/help-mode/links.json b/apps/red-ui/src/assets/help-mode/links.json index 5062488e9..7dacb0fa5 100644 --- a/apps/red-ui/src/assets/help-mode/links.json +++ b/apps/red-ui/src/assets/help-mode/links.json @@ -221,13 +221,25 @@ "it": "", "fr": "" }, - "dossiers_scroll_up_and_down": { + "dossiers_scroll_up_button": { "en": "/en/index-en.html?contextId=dossiers_scroll_up_and_down", "de": "", "it": "", "fr": "" }, - "documents_scroll_up_and_down": { + "dossiers_scroll_down_button": { + "en": "/en/index-en.html?contextId=dossiers_scroll_up_and_down", + "de": "", + "it": "", + "fr": "" + }, + "documents_scroll_up_button": { + "en": "/en/index-en.html?contextId=documents_scroll_up_and_down", + "de": "", + "it": "", + "fr": "" + }, + "documents_scroll_down_button": { "en": "/en/index-en.html?contextId=documents_scroll_up_and_down", "de": "", "it": "", diff --git a/libs/common-ui b/libs/common-ui index 6c82fe505..dd87dd682 160000 --- a/libs/common-ui +++ b/libs/common-ui @@ -1 +1 @@ -Subproject commit 6c82fe505b7495d06bec21acbc2a20b653a791ed +Subproject commit dd87dd6821ecc8d591b03191964e77fb5fc6e8f8 From 3bd75bd1ca04931f184637a3d204150103183b1d Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Fri, 25 Feb 2022 13:47:21 +0100 Subject: [PATCH 06/19] chore(release) --- package.json | 2 +- paligo-theme.tar.gz | Bin 3216 -> 3215 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 04bdb0491..1bb0d2efd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redaction", - "version": "3.263.0", + "version": "3.264.0", "private": true, "license": "MIT", "scripts": { diff --git a/paligo-theme.tar.gz b/paligo-theme.tar.gz index 3628bfbf183c601298041e6e8b8f0f07530c8f32..28575e57f2cbcac8d95112728d8a39bf3ce813aa 100644 GIT binary patch delta 1013 zcmV6k@4T`dJFvZ1DEL9B8MLNmxI*a1SnB84=DPmnkD5JYr2f9F z;dK3b?s9q7|Buo3>c1i}j+h*qM|J&SYj6cG{3-o=j^lZ~{+Esm`dhMFq7x=a}>>-Eh|Qh(&Eo^Og`lM!6fdL9+q z8!!m>cM0Co?CFy~mn8q~S2(ZNl;Ldluu0h)d*<2pojvo#-$49bh`&qmcLjePF~<>e z95Kfca~v_p;d6cy)4I&?(vc$yq9Ot^#L@kxDw;gDq9QA*HTuY1d9Lq_;ZW)b5H1X>rtioa zEquO!?0S&Pa*m)cqdBoUQdY}$;ucpMnp>_oImGU+iP#pVlATV9L z*^-!IROHzcs-udK9N|1hSIQPy^8I!#aGCeDra|9rMb%S>PI6mIKelsccp;gVSD5cWb2r;zsfpu@dgmUCgf}_;mSumq4BeRK#;MOA1!-}Y#IgF+5 z>d08?E%Z=lpFkeMClH8@j{bzTTK9Fzii*P1P}gFbfX zKSUp?kNBRNvI&rd>R!fy;KKr)$zkquifu3x2##?Y1GmxTo;)1he2hM)c}6H}@(ud< j=3)-WERX=nEXU|cFaME1`G2!g1U3i=X0~Nn08jt`qgMF< delta 1014 zcmVLQ>%6iZ+g}E+Q1F9LGiXiCaD~v1vDDA8&2|0DA2oZ*Nd0|T z!|D3>+@*8Y|Buo3>c1i}j+h*qM|J&SYj6cG{3-o=j^lZq{#|FW1pO}p&wqvN@0V3` z`-SWOO_buQCJbHv_3JOJ)#csA8@ervilL^;t}au?%6ffslYbOBtLK}d*klBkw4O)B z_67{X{au2$G<*8w&n3x!`xVaXHDx%PJ#13;#-4e$eP_>n@i!2E7vk?y{9VCcN6c}= z97oJ?#2iP=arm6y#I!Cm{PaovfXmD4yNfxe4`)_Na7-%nuM33USu~Hy;~F`4@GB)0 z)?Xt(u*=80i+|?<#Cjc)q^O913~_Y7sfs3#t*FR~YK=Z}SDx!TV>pyL0)z|0s_8qj zMhl-WAiEyqvYaF6%Vh;Zf{-nK zv>s^8Qov=~DzY`g4J-KXvZyJe1@u%T!;HQqhjGu_Pk$?+B#XsLauvt6f6bAGMaAWa zobnOXMMh)vQS8M*jCX@pg=5;(z}4wttwpm7N7{vE1J3Fg#g2tv;y9-H1`xO)Z)bTFmXPHwaIb$Hf~p!uI9*jsk+9Pp zdah1qQh#5pg6&=6isbCh$bZySHSa15nln-vY{BN%ApWzDV_}^ZZ>78q1{BAB90*Jo zZ?+_+7!`T;gzBgwBu6-p(Ur1AmVCcm3tZ-Xt!dDATRE8b_CT|N+}+Qdsf1wGKhQlz4>*>5zyfOPXlUrJo!liRzo-_>}W z@_(q)nluo$PH0s#D@v(!HbM-od|=%hFrgf|li(=zcNWYj%gAhEBDl3k^spjoXAWbj zyE-zKdJ8?&*(Z>P@CgKBqoY4zt=4^=vZCVf#txQ|M`pz&Dk|K%bkIGixNN4WYO?X} z=nZj?Lb3VrfdRap}LoGAo#FAXL6YPoMIcy1cGCn#=vcKxhD^YHy@+VX`T_vntX#k kzPXqKG7BU?GRrY~(#wA&?s9pvQ3N&!2m Date: Mon, 28 Feb 2022 16:43:18 +0200 Subject: [PATCH 07/19] fix RED-3486 --- apps/red-ui/src/app/services/permissions.service.ts | 9 +++++++-- apps/red-ui/src/app/services/user.service.ts | 4 ++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/apps/red-ui/src/app/services/permissions.service.ts b/apps/red-ui/src/app/services/permissions.service.ts index 361e96385..17e62cfd1 100644 --- a/apps/red-ui/src/app/services/permissions.service.ts +++ b/apps/red-ui/src/app/services/permissions.service.ts @@ -2,12 +2,17 @@ import { Injectable } from '@angular/core'; import { UserService } from './user.service'; import { Dossier, File, IComment, IDossier } from '@red/domain'; import { DossiersService } from './entity-services/dossiers.service'; +import { FilesMapService } from '@services/entity-services/files-map.service'; @Injectable({ providedIn: 'root', }) export class PermissionsService { - constructor(private readonly _userService: UserService, private readonly _dossiersService: DossiersService) {} + constructor( + private readonly _userService: UserService, + private readonly _dossiersService: DossiersService, + private readonly _filesMapService: FilesMapService, + ) {} isReviewerOrApprover(file: File): boolean { const dossier = this._getDossier(file); @@ -15,7 +20,7 @@ export class PermissionsService { } displayReanalyseBtn(dossier: Dossier): boolean { - return this.isApprover(dossier); + return this.isApprover(dossier) && this._filesMapService.get(dossier.dossierId).length > 0; } canEditFileAttributes(file: File): boolean { diff --git a/apps/red-ui/src/app/services/user.service.ts b/apps/red-ui/src/app/services/user.service.ts index aca9a8b42..c610856bc 100644 --- a/apps/red-ui/src/app/services/user.service.ts +++ b/apps/red-ui/src/app/services/user.service.ts @@ -37,6 +37,10 @@ export class UserService extends EntitiesService { } async initialize(): Promise { + if (!this.currentUser) { + return; + } + if (this.currentUser.isUserAdmin || this.currentUser.isUser || this.currentUser.isAdmin) { await firstValueFrom(this.loadAll()); } From 050d270c2e0dd31554b50e093d0f4c4fb822b72c Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Mon, 28 Feb 2022 15:47:35 +0100 Subject: [PATCH 08/19] chore(release) --- package.json | 2 +- paligo-theme.tar.gz | Bin 3215 -> 3216 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1bb0d2efd..962bde73f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redaction", - "version": "3.264.0", + "version": "3.265.0", "private": true, "license": "MIT", "scripts": { diff --git a/paligo-theme.tar.gz b/paligo-theme.tar.gz index 28575e57f2cbcac8d95112728d8a39bf3ce813aa..88ea182bde6a695e525cb224f9125c8d8073eb85 100644 GIT binary patch delta 3129 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 From 559aaa96cfdeb839e9700431a520248ec83763f6 Mon Sep 17 00:00:00 2001 From: Dan Percic Date: Mon, 28 Feb 2022 17:33:57 +0200 Subject: [PATCH 09/19] RED-3484 quick fix --- .../entity-services/dossier-stats.service.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/apps/red-ui/src/app/services/entity-services/dossier-stats.service.ts b/apps/red-ui/src/app/services/entity-services/dossier-stats.service.ts index f49e77cc0..52085cd92 100644 --- a/apps/red-ui/src/app/services/entity-services/dossier-stats.service.ts +++ b/apps/red-ui/src/app/services/entity-services/dossier-stats.service.ts @@ -2,12 +2,23 @@ import { Injectable, Injector } from '@angular/core'; import { StatsService } from '@iqser/common-ui'; import { DossierStats, IDossierStats } from '@red/domain'; import { DOSSIER_ID } from '@utils/constants'; +import { Observable, of } from 'rxjs'; +import { UserService } from '@services/user.service'; @Injectable({ providedIn: 'root', }) export class DossierStatsService extends StatsService { - constructor(protected readonly _injector: Injector) { + constructor(protected readonly _injector: Injector, private readonly _userService: UserService) { super(_injector, DOSSIER_ID, DossierStats, 'dossier-stats'); } + + getFor(ids: string[]): Observable { + const isUserAdminOnly = this._userService.currentUser.roles.length === 1 && this._userService.currentUser.isUserAdmin; + if (isUserAdminOnly) { + return of([]); + } + + return super.getFor(ids); + } } From 5ffb1baff6e0f484a51cb70d14a2290daa585e8f Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Mon, 28 Feb 2022 16:38:16 +0100 Subject: [PATCH 10/19] chore(release) --- package.json | 2 +- paligo-theme.tar.gz | Bin 3216 -> 3215 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 962bde73f..9add80669 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redaction", - "version": "3.265.0", + "version": "3.266.0", "private": true, "license": "MIT", "scripts": { diff --git a/paligo-theme.tar.gz b/paligo-theme.tar.gz index 88ea182bde6a695e525cb224f9125c8d8073eb85..2af1fda68594f1e95a80ac92125de036a3244010 100644 GIT binary patch delta 3127 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

H0Z!QjR4Np!c?P9nU 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 From de121f2e01da9f598163d3223e48a1d49f4291ad Mon Sep 17 00:00:00 2001 From: Valentin Mihai Date: Mon, 28 Feb 2022 17:51:57 +0200 Subject: [PATCH 11/19] RED-3494 -> shown suggestions in preview as redactions --- apps/red-ui/src/app/models/file/annotation.wrapper.ts | 4 ++++ apps/red-ui/src/app/models/file/file-data.model.ts | 2 +- .../file-preview-screen/file-preview-screen.component.ts | 4 +++- .../file-preview-screen/services/annotation-draw.service.ts | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/apps/red-ui/src/app/models/file/annotation.wrapper.ts b/apps/red-ui/src/app/models/file/annotation.wrapper.ts index 41bd46e73..46a9a584a 100644 --- a/apps/red-ui/src/app/models/file/annotation.wrapper.ts +++ b/apps/red-ui/src/app/models/file/annotation.wrapper.ts @@ -235,6 +235,10 @@ export class AnnotationWrapper { return this.legalBasisChangeValue || this.legalBasisValue; } + get previewAnnotation() { + return this.isRedacted || this.isSuggestionAdd; + } + static fromData(redactionLogEntry?: RedactionLogEntry) { const annotationWrapper = new AnnotationWrapper(); diff --git a/apps/red-ui/src/app/models/file/file-data.model.ts b/apps/red-ui/src/app/models/file/file-data.model.ts index 3356e3ce5..9aa33ccb8 100644 --- a/apps/red-ui/src/app/models/file/file-data.model.ts +++ b/apps/red-ui/src/app/models/file/file-data.model.ts @@ -46,7 +46,7 @@ export class FileDataModel { } else if (viewMode === 'DELTA') { return annotation.isChangeLogEntry; } else { - return annotation.isRedacted; + return annotation.previewAnnotation; } }); } 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 785b034ce..dc7183e8f 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 @@ -722,7 +722,9 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni private _setAnnotationsColor(annotations: Annotation[], customData: string) { annotations.forEach(annotation => { - annotation['StrokeColor'] = this._annotationDrawService.convertColor(this._instance, annotation.getCustomData(customData)); + const color = this._annotationDrawService.convertColor(this._instance, annotation.getCustomData(customData)); + annotation['StrokeColor'] = color; + annotation['FillColor'] = color; }); } } diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/services/annotation-draw.service.ts b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/services/annotation-draw.service.ts index 173a752c3..508bc4242 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/services/annotation-draw.service.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/services/annotation-draw.service.ts @@ -204,7 +204,7 @@ export class AnnotationDrawService { annotationWrapper.isOCR || annotationWrapper.hidden; annotation.setCustomData('redact-manager', 'true'); - annotation.setCustomData('redaction', String(annotationWrapper.isRedacted)); + annotation.setCustomData('redaction', String(annotationWrapper.previewAnnotation)); annotation.setCustomData('skipped', String(annotationWrapper.isSkipped)); annotation.setCustomData('changeLog', String(annotationWrapper.isChangeLogEntry)); annotation.setCustomData('changeLogRemoved', String(annotationWrapper.isChangeLogRemoved)); From 06c3fd344448214e2dd16648159e8b038c66651b Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Mon, 28 Feb 2022 17:49:11 +0100 Subject: [PATCH 12/19] chore(release) --- package.json | 2 +- paligo-theme.tar.gz | Bin 3215 -> 3215 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9add80669..dd9abc9ca 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redaction", - "version": "3.266.0", + "version": "3.267.0", "private": true, "license": "MIT", "scripts": { diff --git a/paligo-theme.tar.gz b/paligo-theme.tar.gz index 2af1fda68594f1e95a80ac92125de036a3244010..4ef2d94159f194a19940691eeb17701766ed3064 100644 GIT binary patch delta 3095 zcmV+y4CwQZ8IKu|cnL0SKX_$3c3>}&fg^u+*8h*u_UgYPF^-rVn@4s1VQX*&FZ?O} zdk(0(*T1)LLH~=ucV8j<`(@SKe&PCm6Q#JS2}75E{rU@Qb$NI3hHlHEVyLOItIL$J zvR>cZBt_2Z`KBl~8Nns3=TWh}0fTUVm*6eUo<8|=N%G%*h4Xq%8O~-8o0Pq=XP$p; z-`O)?{0+q4h4{M^e^>C=5px_d#}RWJF~<>e96skaF|ErCKYda^;PUeN?qbgA!jI&77R_VwxJJ$${7MOh_1DM`?DFyM;&}kEUWX(pDk3059NllKqRC?`Dzc(l zqmSH`=laeV4yBF&;li+L`i`v8!smYr$gT&uEawRNGMW>sBW1O0CvI`Ip}ED15`b4) zUsy0!Y=LSc(Wv`b6I?~9AY_Xltp^&j6mZ$LifoN=!wUYpENaSV0X-GTFr#nDVchff z(@H4GVzH83#j)*QbEIKWaXBKVd_;AT(HMOcdvOrs-Jn(Bm^L+V-qK}|bCQ1~C(^QB zgCRsDEwWDWMTsNIp4P~oFHb}^d)dlEYtih&k#?ckfU`PAv18$vIF4z)0R%3{+gTok zC1iOE-0L5QpsI!uPFK}ZBse z|Lo&fSf|BXDQ|-T#jzg;0@HuRn=OecMn#@Ip*pGv$q~+Dbfs*OCEst?0+)GTYZ~<3 zRu1O9J_ql=#GD^_llaq^w4vf z=h8kp$0zjD3vg4>n0N3`i;*q#GQtUKwh*h3lT`e_e#Qm^3GRUP!D?FgkYk#r6sc%z z_8W~aAlf$tcZWwnZsD>u8xeQ-a-#`_6g)6d;)>k=;%*at94(etf)A=v4dsg zky$Z`iVC+b9du7BE}Lnpnryr~dPCeJxr}OX{?2EcXO9d?-PEqV#{@ZWhE1^JjA(*V zT~VF8(IfK05Ru(|TSFi==wpZeL-djQi0`Q>n*dp;?qwVZJ}iIGnH=Umr`QHFf#4XY zF>o7Q?#aX9&By3-nrDQvCf}fsZ!YG5%mN9J%yNvL^zt8xyIfuhZUOr5MRlKK#lryB zor1L^r-%I;Xr`&5ym<$UgQRp6-V_SQzU@(bM)HQeBh{AV@4w>;MpjuB3C#w`{7HK3 zrHTwkX+@)y(T#tJq+k+D;`La*YN9l0@_P}4b@;_J6>bmzc}Q|tndXQmKOKWbNU9`z z|80~K=&#Y2qWJ$4&hds+^QI$E`3G=)%= z@o=T&OZ<3_$AoH&GeL7kHE6KptseH}Iz2_bpiKPqlHovT)k$)=0(4}M!9coWT>D@J zIV=vxt9(Cs;y8iRSE+MamV{{nOoh)>n+gRx`N4Kz_RE!HE5`;DDVy$nb?zI)`;_z!KhVj zLg0VSwP(on#2?=@%UvT#P#_|zgE)$WvmBys`&-P8>j|VY2+S-H2mO>h#bb3+E{_r?<0?^?A(eFBHI6DQHwd%#uB2jVccH3A+| zSZ|HQhlVQySHU@k54AsQtz%L^Hxj@82!$GiGx+&Dpmv@Wo5FBL1Yx_) zO@7s0%3yhzrvk6n5Cp?}3XZm;L_2@7cchCw0An#ht1h>-ndxJ&r4SDHVl&BjtVs2` zW9RO7fx|TSN4~x|NWu}f76)<6K4_g6+)*4S*j^<|es$n=nPQILTBGf#r5y{o%xLBu z#%TnuKfl*9`xeY;Ngk#9j*=1{0&22-;9V7S1o(bLeqXn-B0}>`_Ee_*)q=2r zK(55cB_dU}uZKXY+4(!|ovLqZ|5DhDW z3wgjUOoW$`CEgJERjXoTubI4OR#Cl7~gLqY;PHc}! zpGR}(b~CO;yU9@I@B_J#IeF%5v#xs}7>T6ahBNJ_xbZRT*kFrevm1Zf=WRPt*oQa( zNQw#wYoO$=B3zRpbw?i@>~^c^AVK4BcMqfUsaW(r`#s?{T&?+e9Rys#vQT;Pi?Ke5 zoAJZ4hOYzP7%j)zbj{jy2ig>-A*@$?TO7z%dQnMdtK>huk|!=*x&Gx4Rwqip3ff{Is*TU@+12ulh5E0=lx`GlOS;&EKaji0d zQcn`!e(MQue@dd;A6zr3H#%z2H^QXPOb-^+@gMx1!d_xTFg`%eWa@SRa~}i`;eW{+1QquYPY=}TlP?bR zNyj}j7{DC)zF(P+(JF~WMx`(Kxd_-Njld+tpo^X*&hHM-=lwGn@H+2!_KZrA1YU0&Da_g#M174%&}*R|-o7P71CJ}WYIS;vX4 zrTxgm*ol9sr=7u0BKhE>*OByxq3^`!?$2Z84Ka4lY!6}#G>nSwhZwzMG5Vg0Q8Aqt z2K?u-<&BcQ(~1U(ahyBu3qAtG9KpK5qs!k(1W6G!Q+fg^u^*8h*u_UgYPF^-rVn@4s1VQX*&FZ?O} zdk(0()BnP8J<$Im@Ie3e_sgoe{lfMCCQ5Nt6NWDT`t=vq>hkX54c(SS#ZXgaSC=Vc zWxc++Ns64+^G#7~GJ;E5&!b{{0|w##F2P%xJ$>@$lH|Yr3g`8jGMvpGHYs~!&pdzI zzO!e(_#2473-Na;{;uG!Bjz|_jw9wcVvZx`IDF1;Vp^9Oe)^<-z~$xj-Nl^KhchcB zI3^YP*9AiFESksUagCfi_>~e0>#va?*yZEh#q$7Sy$(rIR760AIJ)0dMU%%?RAfc9 zMjyE=&-I-#97-Jl!i8bg^c`8Fh0lK%kX;XQS=Cq zzOZ1d*aFo?qEYv=Cb)`HLC6+AS`Rd4Dd4hg71Pw#yrs(^=OlkgPNZeM z21AHQT4bH#ixNkaJ*|;FU!I6;_Og|S)}q;kBke-70cUlLV#mTSaU9cp0|;D@x3fG7 zOUUvTxYs`pK~)VSoUW>+NZ9EPJy)kQsV`Q+_AYTna&~9rKWeI)ca;Ur8L14mU~_8_ z|Jlc}uuhA&Qr-pwieoq5 ztsKmId!X4s?(S#KR6;OoAanwmAO?WVa7Z$-g7jo-loz?!hvV5(^E%mprZQrcO_wN7L5xKKR!Nw>WfN`MQ}I0O!gNi$;^AsCw$qNp5TD$97K9(H(zT?-ezJ>7nN| z&!v5Ij!)>P7vQF%G4J4?79(5eWrP#fY#~-5C#m><{frF;65IjngVnU~A;&aLDN@nc z>^B-;K)QLOFC{MV$?e_P?`k|wdDLl58VFk_w5pjErBpf_A%<2yu$S5aFqHx z3ucsMWHvDo+*%}hSP_4=VdC_yhv6(b1o6%}q>I_REMTsG5GHQ9J~^oF=cav9a&{GHD>&mI|)x~W}zj|p<%44Yub8PNo# zx}rLFqetY0AtJl`wuV4#(8mt_hv*~q5#Li&HUY9w-OD%-d{}>=GdawCPO%MU0>Lp( zW8gNr+>?jHn~%}wG|vcSO};@N-(1WAnFSIcndKNg>E%BXce%V2+yeC9i|RhfiiZKL zI|XY;P7nJx&`eW9dGihy2TAEDyeSlpecPk>jN}b_N2)E!-+#vyjI6RM5}FN=`IGe6 zOBET8(uzhYqZ@w{Nx>wR#Otwq)kJC1+p+dD%>9a^N{4QGR+ZBemVw=kW@+b z{@W-e&|jl3Me+Y9oZ}6t>cKk8NzM7Iew{CiEQ58p%swL(nPhr3N%YF^k^R1?YYOB7 zEsXSdVQ)U*jEzv$0eM7dP9=<|P=vZ5N=sy%5fK{TQga_uP1 zD0%;1NoY!{h9|`tB%DKHoymP*J3B-CLTbEz{~c(m<~B6MGrcD~+~fH}1~lRkdy|{N zcHP2V^axa62QM@3nu|M zQcOEvCL@1ZA2DPWxp$pD3a)G(-1t8M(PVOsc5baC#}irFX_=TF8a=lqbhK*6XbPb! z;#695DH z4mQZ7n>&w+@<|+bm~rjK)q}2p*IS^sbp?~ffMwBdYS2(wQQ#diGO;JatP$ragHfy6 zgus8DYtNADi9fz+mb*rfpg=@a2XPb$XE{XO_P3ZF*Aqx*$Z;HX66A|G%t#E@ckA7* zu&oZ}1?wkRjDJ{svvO~Bo8Tl==Y|Z@?~Nt0-?eIo`UDPZCr+ZV_kgRM55!??YXm%` zu-+Pp4-Hoau7Yz6A8LQrTFGdBO~8p@#y5W%hy!1_?gGT&uDDDT<)Y1i_eXCy6}-gE7uo5Ru?kTkQ$*tl~icCP}#RLc^eIRJ0sycR>IuaaMn~ zGo(%7RkEX1Q#)&Dh!9N_#2(QWO-WX6il3$+uZr!ch} zdyA{9Jr;AVO=#`mT1O;(2TN(r2OwYix&jh-ZX|yF5ehX3XYliRK^aPX%7DAqa-|6dY|wiFSWv??@MW0LEg1R$XpuGt= z$IjjF0*7htk9>V`kc1;{Ee_(Ceb72DxT82uu)Ru_{OZ8#GQ}LfwMN@fOFI^FnbFKS zjME5Qe}1oJ_AQvxk~~WH9VI0^$eog*Nv$6sWdALM=XkMCCXhf0P2Up8ScZRmeJ~>Z ztV`AzS}x4*PmM@k^CPVeLnp(GBx)u$1=M8wz`H8u2=M)g{Jw5uMTF*??5Rxqs|8^L zfn14?OGK({Uk`y)v-5Yzi{4R&#iLcHI4&N#V>ZW)4**zH!+L4wBN?jA6*3a4zwvuLs+l)wm6Wj^rDi^R>^;QB~M%)N@nD_p5$rwt7mQ3 zB{|%60HgY`;LyHgn&y8>o9#~tY{i8512xbNuZ7zu25S70AtJ(AbOj|mvXBGe;#y?@ zrJf|d{niuS{**+wKe%R6Z*p?nFvX$ z|0;Fo;`TmoE)H)EPfjN7Vz?EbI~?r?Fd07$R@~)mUCLmDSc88IuH-#akyz}hB-i6C zvOk&>mtsZuPhfKT@==}C`Ph92w4FOr@&hQy_+H~e0mEufAAEZTslW^^0)F)1_}8Pw zKy#%ge1ju38@GDg%OBR!Xh5C_F*&z^p$NdSL9E1ChqTFS!gi6g$Y$-A;RUf4y_6g3 zpT!dfg`N{$E~tN8m>w*s<3IR2g}uaxV0?g_$<*xt<~|4>!vB&t2rBL)o*t;vCtn=s zla706Fn~GoeZhd77e6Z);(JL3t!uY?L@?lU@7sY>1lbqpCke9m$7NMSBnImfCEC1Z zq&)EIb|S@dOexA(cDnfcbBJ#mQulA8DyA0l3-WM%IB56 z8%^jV--oj3ltoM%qS2bcVubaW_rER^@zK09_uQLG=G(X0Yjnw9Ya{+z`*MbA_^@hH zQQ>!g;$u<4Uh2${_%erYvdite+^);(yS%Q;@4Ni2E9kp|u4~bEEo4{OeO6@bvW^p7 zOZ$5YjV)Q)~qhdNQ z4EWDu%Nr$qrxgtn<2ZNR7kmVWIf8YAN0+~o2$CXdrY^mI>i@On+|KRX&h6aJ?cC1o l+|KRX&h6aJ?cC1o+|KRX&h6aJ?HAkr4@XbX3IGF8008ti0q+0+ From 5612fc01eacd86c262c1a91b0391c9d1d6aa7849 Mon Sep 17 00:00:00 2001 From: Timo Bejan Date: Mon, 28 Feb 2022 10:56:25 +0200 Subject: [PATCH 13/19] text-highlights --- .../src/app/models/file/annotation.wrapper.ts | 35 ++++- .../src/app/models/file/file-data.model.ts | 20 +++ .../app/modules/dossier/dossiers.module.ts | 13 +- .../annotation-card.component.html | 8 +- .../annotations-list.component.html | 107 +++++++++------ .../annotations-list.component.scss | 4 + .../annotations-list.component.ts | 73 ++++++++++- .../file-workload.component.html | 7 +- .../file-workload.component.scss | 21 +-- .../file-workload/file-workload.component.ts | 17 +++ .../type-annotation-icon.component.ts | 9 +- .../view-switch/view-switch.component.html | 11 ++ .../highlight-action-dialog.component.html | 35 +++++ .../highlight-action-dialog.component.ts | 70 ++++++++++ .../file-preview-screen.component.ts | 21 ++- .../services/annotation-draw.service.ts | 123 ++++++++++-------- .../services/view-mode.service.ts | 8 ++ .../services/annotation-processing.service.ts | 24 +++- .../services/dossiers-dialog.service.ts | 7 +- .../services/pdf-viewer-data.service.ts | 8 +- .../services/text-highlight.service.ts | 40 ++++++ .../annotation-icon.component.html | 2 +- .../type-filter/type-filter.component.html | 5 +- .../annotation-types-translations.ts | 3 +- .../app/utils/sorters/super-type-sorter.ts | 1 + apps/red-ui/src/assets/i18n/en.json | 38 +++++- .../src/assets/styles/red-components.scss | 31 ++++- libs/common-ui | 2 +- libs/red-domain/src/index.ts | 1 + libs/red-domain/src/lib/shared/view-mode.ts | 2 +- .../lib/text-highlight/imported-redaction.ts | 6 + .../src/lib/text-highlight/index.ts | 4 + .../text-highlight-operation.ts | 5 + .../text-highlight/text-highlight.request.ts | 8 ++ .../text-highlight/text-highlight.response.ts | 9 ++ 35 files changed, 632 insertions(+), 146 deletions(-) create mode 100644 apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/dialogs/highlight-action-dialog/highlight-action-dialog.component.html create mode 100644 apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/dialogs/highlight-action-dialog/highlight-action-dialog.component.ts create mode 100644 apps/red-ui/src/app/modules/dossier/services/text-highlight.service.ts create mode 100644 libs/red-domain/src/lib/text-highlight/imported-redaction.ts create mode 100644 libs/red-domain/src/lib/text-highlight/index.ts create mode 100644 libs/red-domain/src/lib/text-highlight/text-highlight-operation.ts create mode 100644 libs/red-domain/src/lib/text-highlight/text-highlight.request.ts create mode 100644 libs/red-domain/src/lib/text-highlight/text-highlight.response.ts diff --git a/apps/red-ui/src/app/models/file/annotation.wrapper.ts b/apps/red-ui/src/app/models/file/annotation.wrapper.ts index 46a9a584a..618b9b02a 100644 --- a/apps/red-ui/src/app/models/file/annotation.wrapper.ts +++ b/apps/red-ui/src/app/models/file/annotation.wrapper.ts @@ -1,9 +1,10 @@ import { annotationTypesTranslations } from '../../translations/annotation-types-translations'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; -import { IComment, IManualChange, IPoint, IRectangle, LogEntryStatus, ManualRedactionType } from '@red/domain'; +import { IComment, IManualChange, ImportedRedaction, IPoint, IRectangle, LogEntryStatus, ManualRedactionType } from '@red/domain'; import { RedactionLogEntry } from '@models/file/redaction-log.entry'; export type AnnotationSuperType = + | 'text-highlight' | 'suggestion-change-legal-basis' | 'suggestion-recategorize-image' | 'suggestion-add-dictionary' @@ -121,6 +122,10 @@ export class AnnotationWrapper { } get filterKey() { + if (this.isHighlight) { + return this.color; + } + return this.topLevelFilter ? this.superType : this.superType + this.type; } @@ -154,6 +159,10 @@ export class AnnotationWrapper { return this.superType === 'hint'; } + get isHighlight() { + return this.superType === 'text-highlight'; + } + get isIgnoredHint() { return this.superType === 'ignored-hint'; } @@ -235,10 +244,34 @@ export class AnnotationWrapper { return this.legalBasisChangeValue || this.legalBasisValue; } + get width(): number { + return Math.floor(this.positions[0].width); + } + + get height(): number { + return Math.floor(this.positions[0].height); + } + get previewAnnotation() { return this.isRedacted || this.isSuggestionAdd; } + static fromHighlight(color: string, entry: ImportedRedaction) { + const annotationWrapper = new AnnotationWrapper(); + + annotationWrapper.annotationId = entry.id; + annotationWrapper.pageNumber = entry.positions[0].page; + annotationWrapper.superType = 'text-highlight'; + annotationWrapper.typeValue = 'text-highlight'; + annotationWrapper.value = 'Imported'; + annotationWrapper.color = color; + annotationWrapper.positions = entry.positions; + annotationWrapper.firstTopLeftPoint = entry.positions[0]?.topLeft; + annotationWrapper.typeLabel = annotationTypesTranslations[annotationWrapper.superType]; + + return annotationWrapper; + } + static fromData(redactionLogEntry?: RedactionLogEntry) { const annotationWrapper = new AnnotationWrapper(); diff --git a/apps/red-ui/src/app/models/file/file-data.model.ts b/apps/red-ui/src/app/models/file/file-data.model.ts index 9aa33ccb8..a66d13b3b 100644 --- a/apps/red-ui/src/app/models/file/file-data.model.ts +++ b/apps/red-ui/src/app/models/file/file-data.model.ts @@ -7,6 +7,7 @@ import { IViewedPage, LogEntryStatus, ManualRedactionType, + TextHighlightResponse, ViewMode, } from '@red/domain'; import { AnnotationWrapper } from './annotation.wrapper'; @@ -19,6 +20,8 @@ export class FileDataModel { allAnnotations: AnnotationWrapper[] = []; readonly hasChangeLog$ = new BehaviorSubject(false); missingTypes = new Set(); + _textHighlightResponse: TextHighlightResponse; + textHighlightAnnotations: AnnotationWrapper[] = []; constructor( private readonly _file: File, @@ -39,7 +42,24 @@ export class FileDataModel { this._buildAllAnnotations(); } + set textHighlights(textHighlightResponse: TextHighlightResponse) { + this._textHighlightResponse = textHighlightResponse; + + const highlights = []; + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + for (const color of Object.keys(textHighlightResponse.redactionPerColor)) { + for (const entry of textHighlightResponse.redactionPerColor[color]) { + const annotation = AnnotationWrapper.fromHighlight(color, entry); + highlights.push(annotation); + } + } + this.textHighlightAnnotations = highlights; + } + getVisibleAnnotations(viewMode: ViewMode) { + if (viewMode === 'TEXT_HIGHLIGHTS') { + return this.textHighlightAnnotations; + } return this.allAnnotations.filter(annotation => { if (viewMode === 'STANDARD') { return !annotation.isChangeLogRemoved; diff --git a/apps/red-ui/src/app/modules/dossier/dossiers.module.ts b/apps/red-ui/src/app/modules/dossier/dossiers.module.ts index 9fd58b8cb..64171adb8 100644 --- a/apps/red-ui/src/app/modules/dossier/dossiers.module.ts +++ b/apps/red-ui/src/app/modules/dossier/dossiers.module.ts @@ -25,6 +25,8 @@ import { OverlayModule } from '@angular/cdk/overlay'; import { SharedDossiersModule } from './shared/shared-dossiers.module'; import { ResizeAnnotationDialogComponent } from './dialogs/resize-annotation-dialog/resize-annotation-dialog.component'; import { EditDossierTeamComponent } from './dialogs/edit-dossier-dialog/edit-dossier-team/edit-dossier-team.component'; +import { HighlightActionDialogComponent } from './screens/file-preview-screen/dialogs/highlight-action-dialog/highlight-action-dialog.component'; +import { ColorPickerModule } from 'ngx-color-picker'; const screens = [SearchScreenComponent]; @@ -39,6 +41,7 @@ const dialogs = [ AssignReviewerApproverDialogComponent, ChangeLegalBasisDialogComponent, RecategorizeImageDialogComponent, + HighlightActionDialogComponent, ]; const components = [ @@ -58,6 +61,14 @@ const services = [DossiersDialogService, ManualAnnotationService, AnnotationProc @NgModule({ declarations: [...components], providers: [...services], - imports: [CommonModule, SharedModule, SharedDossiersModule, FileUploadDownloadModule, DossiersRoutingModule, OverlayModule], + imports: [ + CommonModule, + SharedModule, + SharedDossiersModule, + FileUploadDownloadModule, + DossiersRoutingModule, + OverlayModule, + ColorPickerModule, + ], }) export class DossiersModule {} diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/annotation-card/annotation-card.component.html b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/annotation-card/annotation-card.component.html index 8698ee617..8eec26deb 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/annotation-card/annotation-card.component.html +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/annotation-card/annotation-card.component.html @@ -5,7 +5,7 @@
{{ annotation.typeLabel | translate }}
-
+
{{ annotation.descriptor | translate }}: : {{ annotation.shortContent }}
+
+ : {{ annotation.color }} +
+
+ : {{ annotation.width }}x{{ annotation.height }} px +
diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/annotations-list/annotations-list.component.html b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/annotations-list/annotations-list.component.html index ed9e5f03b..75536064a 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/annotations-list/annotations-list.component.html +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/annotations-list/annotations-list.component.html @@ -1,46 +1,75 @@ -
-
- -
- - -
-
- - {{ annotation.comments.length }} -
- -
- -
+ +
+
+ +
- +
+ + + +
- -
+
+
+ +
+ + +
+
+ + {{ annotation.comments.length }} +
+ +
+ +
+
+ + +
+ + +
+ div { + display: flex; +} diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/annotations-list/annotations-list.component.ts b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/annotations-list/annotations-list.component.ts index cb29ddd3a..f864b8bb4 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/annotations-list/annotations-list.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/annotations-list/annotations-list.component.ts @@ -1,11 +1,20 @@ import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnChanges, Output, SimpleChanges, TemplateRef } from '@angular/core'; import { AnnotationWrapper } from '@models/file/annotation.wrapper'; -import { FilterService, IqserEventTarget } from '@iqser/common-ui'; +import { CircleButtonTypes, FilterService, IqserEventTarget } from '@iqser/common-ui'; import { MultiSelectService } from '../../services/multi-select.service'; import { AnnotationReferencesService } from '../../services/annotation-references.service'; -import { ViewModeService } from '../../services/view-mode.service'; import { FilePreviewStateService } from '../../services/file-preview-state.service'; -import { UserPreferenceService } from '../../../../../../services/user-preference.service'; +import { UserPreferenceService } from '@services/user-preference.service'; +import { ViewModeService } from '../../services/view-mode.service'; +import { BehaviorSubject } from 'rxjs'; +import { DossiersDialogService } from '../../../../services/dossiers-dialog.service'; +import { TextHighlightOperation } from '@red/domain'; + +interface HighlightGroup { + startIdx: number; + color: string; + length: number; +} @Component({ selector: 'redaction-annotations-list', @@ -14,6 +23,8 @@ import { UserPreferenceService } from '../../../../../../services/user-preferenc changeDetection: ChangeDetectionStrategy.OnPush, }) export class AnnotationsListComponent implements OnChanges { + readonly circleButtonTypes = CircleButtonTypes; + @Input() annotations: AnnotationWrapper[]; @Input() selectedAnnotations: AnnotationWrapper[]; @Input() annotationActionsTemplate: TemplateRef; @@ -23,19 +34,36 @@ export class AnnotationsListComponent implements OnChanges { @Output() readonly selectAnnotations = new EventEmitter(); @Output() readonly deselectAnnotations = new EventEmitter(); + highlightGroups$ = new BehaviorSubject([]); + constructor( readonly multiSelectService: MultiSelectService, - readonly viewModeService: ViewModeService, readonly annotationReferencesService: AnnotationReferencesService, + readonly state: FilePreviewStateService, private readonly _filterService: FilterService, - private readonly _state: FilePreviewStateService, private readonly _userPreferenceService: UserPreferenceService, + private readonly _viewModeService: ViewModeService, + private readonly _dialogService: DossiersDialogService, ) {} + convertHighlights(highlightGroup: HighlightGroup): void { + const data = this._getActionData(highlightGroup, TextHighlightOperation.CONVERT); + this._dialogService.openDialog('highlightAction', null, data); + } + + removeHighlights(highlightGroup: HighlightGroup): void { + const data = this._getActionData(highlightGroup, TextHighlightOperation.REMOVE); + this._dialogService.openDialog('highlightAction', null, data); + } + ngOnChanges(changes: SimpleChanges): void { - if (changes.annotations && this.annotations) { + if (changes.annotations && this.annotations && !this._viewModeService.isTextHighlights) { this.annotations = this.annotations.sort(this.annotationsPositionCompare); } + + if (this._viewModeService.isTextHighlights) { + this._updateHighlightGroups(); + } } annotationClicked(annotation: AnnotationWrapper, $event: MouseEvent): void { @@ -80,4 +108,37 @@ export class AnnotationsListComponent implements OnChanges { return first.x < second.y ? -1 : 1; } } + + showHighlightGroup(idx: number): HighlightGroup { + return this._viewModeService.isTextHighlights && this.highlightGroups$.value.find(h => h.startIdx === idx); + } + + private _getActionData(highlightGroup: HighlightGroup, operation: TextHighlightOperation) { + return { + dossierId: this.state.dossierId, + fileId: this.state.fileId, + color: highlightGroup.color, + operation, + }; + } + + private _updateHighlightGroups(): void { + if (!this.annotations?.length) { + return; + } + const highlightGroups: HighlightGroup[] = []; + let lastGroup: HighlightGroup; + for (let idx = 0; idx < this.annotations.length; ++idx) { + if (idx === 0 || this.annotations[idx].color !== this.annotations[idx - 1].color) { + if (lastGroup) { + highlightGroups.push(lastGroup); + } + lastGroup = { startIdx: idx, length: 1, color: this.annotations[idx].color }; + } else { + lastGroup.length += 1; + } + } + highlightGroups.push(lastGroup); + this.highlightGroups$.next(highlightGroups); + } } diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/file-workload/file-workload.component.html b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/file-workload/file-workload.component.html index c1e083ac7..528e8846d 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/file-workload/file-workload.component.html +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/file-workload/file-workload.component.html @@ -10,7 +10,8 @@
-
+
+ {{ title$ | async | translate }}
diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/file-workload/file-workload.component.scss b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/file-workload/file-workload.component.scss index 95e122287..1b7ef781f 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/file-workload/file-workload.component.scss +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/file-workload/file-workload.component.scss @@ -115,25 +115,6 @@ } } - .page-separator { - border-bottom: 1px solid variables.$separator; - height: 32px; - box-sizing: border-box; - padding: 0 10px; - display: flex; - align-items: center; - justify-content: space-between; - background-color: variables.$grey-6; - - > div { - display: flex; - - > div:not(:last-child) { - margin-right: 8px; - } - } - } - .annotations { overflow: hidden; width: 100%; @@ -157,7 +138,7 @@ padding-left: 0 !important; } -::ng-deep .page-separator iqser-circle-button mat-icon { +::ng-deep .workload-separator iqser-circle-button.excluded mat-icon { color: var(--iqser-primary); } diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/file-workload/file-workload.component.ts b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/file-workload/file-workload.component.ts index e92b5f771..fded2fb67 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/file-workload/file-workload.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/file-workload/file-workload.component.ts @@ -34,6 +34,8 @@ import { MultiSelectService } from '../../services/multi-select.service'; import { DocumentInfoService } from '../../services/document-info.service'; import { SkippedService } from '../../services/skipped.service'; import { FilePreviewStateService } from '../../services/file-preview-state.service'; +import { ViewModeService } from '../../services/view-mode.service'; +import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; const COMMAND_KEY_ARRAY = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Escape']; const ALL_HOTKEY_ARRAY = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown']; @@ -67,6 +69,8 @@ export class FileWorkloadComponent { readonly multiSelectActive$: Observable; readonly multiSelectInactive$: Observable; readonly showExcludedPages$: Observable; + readonly title$: Observable; + readonly isHighlights$: Observable; private _annotations$ = new BehaviorSubject([]); @ViewChild('annotationsElement') private readonly _annotationsElement: ElementRef; @ViewChild('quickNavigation') private readonly _quickNavigationElement: ElementRef; @@ -78,6 +82,7 @@ export class FileWorkloadComponent { readonly multiSelectService: MultiSelectService, readonly documentInfoService: DocumentInfoService, readonly excludedPagesService: ExcludedPagesService, + private readonly _viewModeService: ViewModeService, private readonly _changeDetectorRef: ChangeDetectorRef, private readonly _permissionsService: PermissionsService, private readonly _annotationProcessingService: AnnotationProcessingService, @@ -86,6 +91,8 @@ export class FileWorkloadComponent { this.multiSelectActive$ = this._multiSelectActive$; this.multiSelectInactive$ = this._multiSelectInactive$; this.showExcludedPages$ = this._showExcludedPages$; + this.isHighlights$ = this._isHighlights$; + this.title$ = this._title$; } @Input() @@ -112,6 +119,16 @@ export class FileWorkloadComponent { ); } + private get _title$(): Observable { + return this.isHighlights$.pipe( + map(isHighlights => (isHighlights ? _('file-preview.tabs.highlights.label') : _('file-preview.tabs.annotations.label'))), + ); + } + + private get _isHighlights$(): Observable { + return this._viewModeService.viewMode$.pipe(map(() => this._viewModeService.isTextHighlights)); + } + private get _multiSelectInactive$() { return this.multiSelectService.inactive$.pipe( tap(value => { diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/type-annotation-icon/type-annotation-icon.component.ts b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/type-annotation-icon/type-annotation-icon.component.ts index 1ffa10e30..2e5f280b1 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/type-annotation-icon/type-annotation-icon.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/type-annotation-icon/type-annotation-icon.component.ts @@ -26,9 +26,11 @@ export class TypeAnnotationIconComponent implements OnChanges { return; } - const { isSuggestion, isRecommendation, isSkipped, isDeclinedSuggestion, isHint, isIgnoredHint } = this.annotation; + const { isHighlight, isSuggestion, isRecommendation, isSkipped, isDeclinedSuggestion, isHint, isIgnoredHint } = this.annotation; - if (this.annotation.isSuperTypeBasedColor) { + if (isHighlight) { + this.color = this.annotation.color; + } else if (this.annotation.isSuperTypeBasedColor) { this.color = this._dictionariesMapService.getDictionaryColor(this.annotation.superType, this._dossierTemplateId); } else { this.color = this._dictionariesMapService.getDictionaryColor(this.annotation.type, this._dossierTemplateId); @@ -36,6 +38,7 @@ export class TypeAnnotationIconComponent implements OnChanges { this.type = isSuggestion || isDeclinedSuggestion ? 'rhombus' : isHint || isIgnoredHint ? 'circle' : isRecommendation ? 'hexagon' : 'square'; - this.label = isSuggestion || isDeclinedSuggestion ? 'S' : isSkipped ? 'S' : this.annotation.type[0].toUpperCase(); + + this.label = isHighlight ? '' : isSuggestion || isDeclinedSuggestion || isSkipped ? 'S' : this.annotation.type[0].toUpperCase(); } } diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/view-switch/view-switch.component.html b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/view-switch/view-switch.component.html index d1e001a44..d997c1c45 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/view-switch/view-switch.component.html +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/view-switch/view-switch.component.html @@ -30,4 +30,15 @@ > {{ 'file-preview.redacted' | translate }} + + diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/dialogs/highlight-action-dialog/highlight-action-dialog.component.html b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/dialogs/highlight-action-dialog/highlight-action-dialog.component.html new file mode 100644 index 000000000..add8e2521 --- /dev/null +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/dialogs/highlight-action-dialog/highlight-action-dialog.component.html @@ -0,0 +1,35 @@ +
+
+
+ +
+
+ +
+ + +
+
+ +
+ + {{ confirmationMessage | translate }} + +
+
+ +
+ +
+
+
+ + +
diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/dialogs/highlight-action-dialog/highlight-action-dialog.component.ts b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/dialogs/highlight-action-dialog/highlight-action-dialog.component.ts new file mode 100644 index 000000000..59dd303e7 --- /dev/null +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/dialogs/highlight-action-dialog/highlight-action-dialog.component.ts @@ -0,0 +1,70 @@ +import { Component, Inject, Injector } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { TextHighlightOperation } from '@red/domain'; +import { BaseDialogComponent, LoadingService } from '@iqser/common-ui'; +import { TextHighlightService } from '../../../../services/text-highlight.service'; +import { firstValueFrom } from 'rxjs'; +import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; + +export interface HighlightActionData { + readonly operation: TextHighlightOperation; + readonly color: string; + readonly dossierId: string; + readonly fileId: string; +} + +@Component({ + templateUrl: './highlight-action-dialog.component.html', +}) +export class HighlightActionDialogComponent extends BaseDialogComponent { + readonly title: string; + readonly details: string; + readonly confirmationMessage: string; + readonly saveMessage: string; + + constructor( + private readonly _formBuilder: FormBuilder, + protected readonly _injector: Injector, + protected readonly _dialogRef: MatDialogRef, + private readonly _textHighlightService: TextHighlightService, + private readonly _loadingService: LoadingService, + @Inject(MAT_DIALOG_DATA) readonly data: HighlightActionData, + ) { + super(_injector, _dialogRef); + this.form = this._getForm(); + this.initialFormValue = this.form.getRawValue(); + + this.title = + data.operation === TextHighlightOperation.CONVERT + ? _('highlight-action-dialog.convert.title') + : _('highlight-action-dialog.remove.title'); + this.details = + data.operation === TextHighlightOperation.CONVERT + ? _('highlight-action-dialog.convert.details') + : _('highlight-action-dialog.remove.details'); + this.confirmationMessage = + data.operation === TextHighlightOperation.CONVERT + ? _('highlight-action-dialog.convert.confirmation') + : _('highlight-action-dialog.remove.confirmation'); + this.saveMessage = + data.operation === TextHighlightOperation.CONVERT + ? _('highlight-action-dialog.convert.save') + : _('highlight-action-dialog.remove.save'); + } + + async save(): Promise { + this._loadingService.start(); + const { dossierId, fileId, color, operation } = this.data; + await firstValueFrom(this._textHighlightService.performHighlightsAction(dossierId, fileId, [color], operation)); + this._loadingService.stop(); + this._dialogRef.close(true); + } + + private _getForm(): FormGroup { + return this._formBuilder.group({ + color: [{ value: this.data.color, disabled: true }, Validators.required], + confirmation: [false, Validators.requiredTrue], + }); + } +} 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 dc7183e8f..a4b57d3b2 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 @@ -155,6 +155,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni const ocrAnnotationIds = this._fileData.allAnnotations.filter(a => a.isOCR).map(a => a.id); const annotations = this._getAnnotations(a => a.getCustomData('redact-manager')); const redactions = annotations.filter(a => a.getCustomData('redaction')); + const highlights = annotations.filter(a => a.getCustomData('highlight')); switch (this.viewModeService.viewMode) { case 'STANDARD': { @@ -165,7 +166,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni const nonStandardEntries = annotations.filter(a => a.getCustomData('changeLogRemoved') === 'true'); this._setAnnotationsOpacity(standardEntries, true); this._show(standardEntries); - this._hide(nonStandardEntries); + this._hide([...nonStandardEntries, ...highlights]); break; } case 'DELTA': { @@ -174,7 +175,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni this._setAnnotationsColor(redactions, 'annotationColor'); this._setAnnotationsOpacity(changeLogEntries, true); this._show(changeLogEntries); - this._hide(nonChangeLogEntries); + this._hide([...nonChangeLogEntries, ...highlights]); break; } case 'REDACTED': { @@ -182,9 +183,23 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni this._setAnnotationsOpacity(redactions); this._setAnnotationsColor(redactions, 'redactionColor'); this._show(redactions); - this._hide(nonRedactionEntries); + this._hide([...nonRedactionEntries, ...highlights]); break; } + case 'TEXT_HIGHLIGHTS': { + this._loadingService.start(); + const textHighlights = await firstValueFrom(this._pdfViewerDataService.loadTextHighlightsFor(this.dossierId, this.fileId)); + this._hide(annotations); + this._fileData.textHighlights = textHighlights; + await this._annotationDrawService.drawAnnotations( + this.activeViewer, + this._fileData.textHighlightAnnotations, + this.dossierId, + this.fileId, + false, + ); + this._loadingService.stop(); + } } await this._stampPDF(); diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/services/annotation-draw.service.ts b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/services/annotation-draw.service.ts index 508bc4242..42de352b7 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/services/annotation-draw.service.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/services/annotation-draw.service.ts @@ -156,66 +156,85 @@ export class AnnotationDrawService { compareMode: boolean, ) { const pageNumber = compareMode ? annotationWrapper.pageNumber * 2 - 1 : annotationWrapper.pageNumber; - const dossierTemplateId = this._dossiersService.find(dossierId).dossierTemplateId; - let annotation: Core.Annotations.RectangleAnnotation | Core.Annotations.TextHighlightAnnotation; - if (annotationWrapper.rectangle || annotationWrapper.isImage) { - annotation = new activeViewer.Core.Annotations.RectangleAnnotation(); + if (annotationWrapper.superType === 'text-highlight') { + const rectangleAnnot = new activeViewer.Core.Annotations.RectangleAnnotation(); const pageHeight = activeViewer.Core.documentViewer.getPageHeight(pageNumber); - const firstPosition = annotationWrapper.positions[0]; - annotation.X = firstPosition.topLeft.x; - annotation.Y = pageHeight - (firstPosition.topLeft.y + firstPosition.height); - annotation.Width = firstPosition.width; - annotation.FillColor = this.getAndConvertColor( + const rectangle: IRectangle = annotationWrapper.positions[0]; + rectangleAnnot.PageNumber = pageNumber; + rectangleAnnot.X = rectangle.topLeft.x; + rectangleAnnot.Y = pageHeight - (rectangle.topLeft.y + rectangle.height); + rectangleAnnot.Width = rectangle.width; + rectangleAnnot.Height = rectangle.height; + rectangleAnnot.ReadOnly = true; + rectangleAnnot.StrokeColor = this.convertColor(activeViewer, annotationWrapper.color); + rectangleAnnot.StrokeThickness = 1; + rectangleAnnot.Id = annotationWrapper.id; + + return rectangleAnnot; + } else { + const dossierTemplateId = this._dossiersService.find(dossierId).dossierTemplateId; + + let annotation: Core.Annotations.RectangleAnnotation | Core.Annotations.TextHighlightAnnotation; + if (annotationWrapper.rectangle || annotationWrapper.isImage) { + annotation = new activeViewer.Core.Annotations.RectangleAnnotation(); + const pageHeight = activeViewer.Core.documentViewer.getPageHeight(pageNumber); + const firstPosition = annotationWrapper.positions[0]; + annotation.X = firstPosition.topLeft.x; + annotation.Y = pageHeight - (firstPosition.topLeft.y + firstPosition.height); + annotation.Width = firstPosition.width; + annotation.FillColor = this.getAndConvertColor( + activeViewer, + dossierTemplateId, + annotationWrapper.superType, + annotationWrapper.type, + ); + annotation.Opacity = annotationWrapper.isChangeLogRemoved + ? AnnotationDrawService.DEFAULT_REMOVED_ANNOTATION_OPACITY + : AnnotationDrawService.DEFAULT_RECTANGLE_ANNOTATION_OPACITY; + annotation.Height = firstPosition.height; + annotation.Intensity = 100; + } else { + annotation = new activeViewer.Core.Annotations.TextHighlightAnnotation(); + annotation.Quads = this._rectanglesToQuads(annotationWrapper.positions, activeViewer, pageNumber); + annotation.Opacity = annotationWrapper.isChangeLogRemoved + ? AnnotationDrawService.DEFAULT_REMOVED_ANNOTATION_OPACITY + : AnnotationDrawService.DEFAULT_TEXT_ANNOTATION_OPACITY; + } + + annotation.setContents(annotationWrapper.content); + + annotation.PageNumber = pageNumber; + annotation.StrokeColor = this.getAndConvertColor( activeViewer, dossierTemplateId, annotationWrapper.superType, annotationWrapper.type, ); - annotation.Opacity = annotationWrapper.isChangeLogRemoved - ? AnnotationDrawService.DEFAULT_REMOVED_ANNOTATION_OPACITY - : AnnotationDrawService.DEFAULT_RECTANGLE_ANNOTATION_OPACITY; - annotation.Height = firstPosition.height; - annotation.Intensity = 100; - } else { - annotation = new activeViewer.Core.Annotations.TextHighlightAnnotation(); - annotation.Quads = this._rectanglesToQuads(annotationWrapper.positions, activeViewer, pageNumber); - annotation.Opacity = annotationWrapper.isChangeLogRemoved - ? AnnotationDrawService.DEFAULT_REMOVED_ANNOTATION_OPACITY - : AnnotationDrawService.DEFAULT_TEXT_ANNOTATION_OPACITY; + annotation.Id = annotationWrapper.id; + annotation.ReadOnly = true; + // change log entries are drawn lighter + + annotation.Hidden = + annotationWrapper.isChangeLogRemoved || + (this._skippedService.hideSkipped && annotationWrapper.isSkipped) || + annotationWrapper.isOCR || + annotationWrapper.hidden; + annotation.setCustomData('redact-manager', 'true'); + annotation.setCustomData('redaction', String(annotationWrapper.previewAnnotation)); + annotation.setCustomData('highlight', String(annotationWrapper.isHighlight)); + annotation.setCustomData('skipped', String(annotationWrapper.isSkipped)); + annotation.setCustomData('changeLog', String(annotationWrapper.isChangeLogEntry)); + annotation.setCustomData('changeLogRemoved', String(annotationWrapper.isChangeLogRemoved)); + annotation.setCustomData('opacity', String(annotation.Opacity)); + annotation.setCustomData('redactionColor', String(this.getColor(activeViewer, dossierTemplateId, 'redaction', 'redaction'))); + annotation.setCustomData( + 'annotationColor', + String(this.getColor(activeViewer, dossierTemplateId, annotationWrapper.superType, annotationWrapper.type)), + ); + + return annotation; } - - annotation.setContents(annotationWrapper.content); - - annotation.PageNumber = pageNumber; - annotation.StrokeColor = this.getAndConvertColor( - activeViewer, - dossierTemplateId, - annotationWrapper.superType, - annotationWrapper.type, - ); - annotation.Id = annotationWrapper.id; - annotation.ReadOnly = true; - // change log entries are drawn lighter - - annotation.Hidden = - annotationWrapper.isChangeLogRemoved || - (this._skippedService.hideSkipped && annotationWrapper.isSkipped) || - annotationWrapper.isOCR || - annotationWrapper.hidden; - annotation.setCustomData('redact-manager', 'true'); - annotation.setCustomData('redaction', String(annotationWrapper.previewAnnotation)); - annotation.setCustomData('skipped', String(annotationWrapper.isSkipped)); - annotation.setCustomData('changeLog', String(annotationWrapper.isChangeLogEntry)); - annotation.setCustomData('changeLogRemoved', String(annotationWrapper.isChangeLogRemoved)); - annotation.setCustomData('opacity', String(annotation.Opacity)); - annotation.setCustomData('redactionColor', String(this.getColor(activeViewer, dossierTemplateId, 'redaction', 'redaction'))); - annotation.setCustomData( - 'annotationColor', - String(this.getColor(activeViewer, dossierTemplateId, annotationWrapper.superType, annotationWrapper.type)), - ); - - return annotation; } private _rectanglesToQuads(positions: IRectangle[], activeViewer: WebViewerInstance, pageNumber: number): any[] { diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/services/view-mode.service.ts b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/services/view-mode.service.ts index f24d66389..31b824ce8 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/services/view-mode.service.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/services/view-mode.service.ts @@ -43,6 +43,10 @@ export class ViewModeService { return this._viewMode$.value === 'REDACTED'; } + get isTextHighlights() { + return this._viewMode$.value === 'TEXT_HIGHLIGHTS'; + } + get isCompare() { return this._compareMode$.value; } @@ -63,6 +67,10 @@ export class ViewModeService { this._switchTo('REDACTED'); } + switchToHighlights() { + this._switchTo('TEXT_HIGHLIGHTS'); + } + private _switchTo(mode: ViewMode) { this._viewMode$.next(mode); } diff --git a/apps/red-ui/src/app/modules/dossier/services/annotation-processing.service.ts b/apps/red-ui/src/app/modules/dossier/services/annotation-processing.service.ts index 06bbf924f..de2bdaab0 100644 --- a/apps/red-ui/src/app/modules/dossier/services/annotation-processing.service.ts +++ b/apps/red-ui/src/app/modules/dossier/services/annotation-processing.service.ts @@ -58,7 +58,13 @@ export class AnnotationProcessingService { } else { // top level filter if (topLevelFilter) { - this._createParentFilter(a.superType, filterMap, filters); + this._createParentFilter( + a.isHighlight ? a.filterKey : a.superType, + filterMap, + filters, + a.isHighlight, + a.isHighlight ? a.color : null, + ); } else { let parentFilter = filterMap.get(a.superType); if (!parentFilter) { @@ -124,18 +130,28 @@ export class AnnotationProcessingService { } obj.forEach((values, page) => { - obj.set(page, this._sortAnnotations(values)); + if (!values[0].isHighlight) { + obj.set(page, this._sortAnnotations(values)); + } }); return obj; } - private _createParentFilter(key: string, filterMap: Map, filters: INestedFilter[]) { + private _createParentFilter( + key: string, + filterMap: Map, + filters: INestedFilter[], + skipTranslation = false, + color?: string, + ) { const filter: INestedFilter = new NestedFilter({ id: key, topLevelFilter: true, matches: 1, - label: annotationTypesTranslations[key], + label: skipTranslation ? key : annotationTypesTranslations[key], + skipTranslation, + color, }); filterMap.set(key, filter); filters.push(filter); diff --git a/apps/red-ui/src/app/modules/dossier/services/dossiers-dialog.service.ts b/apps/red-ui/src/app/modules/dossier/services/dossiers-dialog.service.ts index ca5aef32e..9e5d17f5f 100644 --- a/apps/red-ui/src/app/modules/dossier/services/dossiers-dialog.service.ts +++ b/apps/red-ui/src/app/modules/dossier/services/dossiers-dialog.service.ts @@ -11,6 +11,7 @@ import { ChangeLegalBasisDialogComponent } from '../dialogs/change-legal-basis-d import { RecategorizeImageDialogComponent } from '../dialogs/recategorize-image-dialog/recategorize-image-dialog.component'; import { ConfirmationDialogComponent, DialogConfig, DialogService, largeDialogConfig } from '@iqser/common-ui'; import { ResizeAnnotationDialogComponent } from '../dialogs/resize-annotation-dialog/resize-annotation-dialog.component'; +import { HighlightActionDialogComponent } from '../screens/file-preview-screen/dialogs/highlight-action-dialog/highlight-action-dialog.component'; type DialogType = | 'confirm' @@ -23,7 +24,8 @@ type DialogType = | 'removeAnnotations' | 'resizeAnnotation' | 'forceAnnotation' - | 'manualAnnotation'; + | 'manualAnnotation' + | 'highlightAction'; @Injectable() export class DossiersDialogService extends DialogService { @@ -67,6 +69,9 @@ export class DossiersDialogService extends DialogService { component: ManualAnnotationDialogComponent, dialogConfig: { autoFocus: true }, }, + highlightAction: { + component: HighlightActionDialogComponent, + }, }; constructor(protected readonly _dialog: MatDialog) { diff --git a/apps/red-ui/src/app/modules/dossier/services/pdf-viewer-data.service.ts b/apps/red-ui/src/app/modules/dossier/services/pdf-viewer-data.service.ts index cfd3e816d..394baf523 100644 --- a/apps/red-ui/src/app/modules/dossier/services/pdf-viewer-data.service.ts +++ b/apps/red-ui/src/app/modules/dossier/services/pdf-viewer-data.service.ts @@ -3,7 +3,7 @@ import { forkJoin, Observable, of } from 'rxjs'; import { catchError, map, tap } from 'rxjs/operators'; import { FileDataModel } from '@models/file/file-data.model'; import { PermissionsService } from '@services/permissions.service'; -import { Dictionary, File, IRedactionLog, IViewedPage } from '@red/domain'; +import { Dictionary, File, IRedactionLog, IViewedPage, TextHighlightResponse } from '@red/domain'; import { RedactionLogService } from './redaction-log.service'; import { ViewedPagesService } from '@services/entity-services/viewed-pages.service'; import { UserPreferenceService } from '@services/user-preference.service'; @@ -11,12 +11,14 @@ import { FilePreviewStateService } from '../screens/file-preview-screen/services import { Toaster } from '@iqser/common-ui'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { DictionariesMapService } from '@services/entity-services/dictionaries-map.service'; +import { TextHighlightService } from './text-highlight.service'; @Injectable() export class PdfViewerDataService { constructor( private readonly _permissionsService: PermissionsService, private readonly _redactionLogService: RedactionLogService, + private readonly _textHighlightService: TextHighlightService, private readonly _viewedPagesService: ViewedPagesService, private readonly _userPreferenceService: UserPreferenceService, private readonly _stateService: FilePreviewStateService, @@ -31,6 +33,10 @@ export class PdfViewerDataService { ); } + loadTextHighlightsFor(dossierId: string, fileId: string): Observable { + return this._textHighlightService.getTextHighlights(dossierId, fileId).pipe(catchError(() => of({}))); + } + loadDataFor(newFile: File): Observable { const redactionLog$ = this.loadRedactionLogFor(newFile.dossierId, newFile.fileId); const viewedPages$ = this.getViewedPagesFor(newFile); diff --git a/apps/red-ui/src/app/modules/dossier/services/text-highlight.service.ts b/apps/red-ui/src/app/modules/dossier/services/text-highlight.service.ts new file mode 100644 index 000000000..4f50d4502 --- /dev/null +++ b/apps/red-ui/src/app/modules/dossier/services/text-highlight.service.ts @@ -0,0 +1,40 @@ +import { Injectable, Injector } from '@angular/core'; +import { GenericService, RequiredParam, Toaster, Validate } from '@iqser/common-ui'; +import { TextHighlightOperation, TextHighlightRequest, TextHighlightResponse } from '@red/domain'; +import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; +import { tap } from 'rxjs/operators'; + +@Injectable({ + providedIn: 'root', +}) +export class TextHighlightService extends GenericService { + constructor(protected readonly _injector: Injector, private readonly _toaster: Toaster) { + super(_injector, ''); + } + + @Validate() + getTextHighlights(@RequiredParam() dossierId: string, @RequiredParam() fileId: string) { + const request: TextHighlightRequest = { + dossierId, + fileId, + operation: TextHighlightOperation.INFO, + }; + + return this._post(request, 'texthighlights-conversion'); + } + + @Validate() + performHighlightsAction( + @RequiredParam() dossierId: string, + @RequiredParam() fileId: string, + @RequiredParam() colors: string[], + @RequiredParam() operation: TextHighlightOperation, + ) { + const request: TextHighlightRequest = { dossierId, fileId, colors, operation }; + return this._post(request, 'texthighlights-conversion').pipe( + tap(() => { + this._toaster.success(_('highlight-action-dialog.success'), { params: { operation } }); + }), + ); + } +} diff --git a/apps/red-ui/src/app/modules/shared/components/annotation-icon/annotation-icon.component.html b/apps/red-ui/src/app/modules/shared/components/annotation-icon/annotation-icon.component.html index 854591c74..4f119b5df 100644 --- a/apps/red-ui/src/app/modules/shared/components/annotation-icon/annotation-icon.component.html +++ b/apps/red-ui/src/app/modules/shared/components/annotation-icon/annotation-icon.component.html @@ -6,5 +6,5 @@ [class.request]="isRequest" class="icon" > - {{ label || dictionary.label.charAt(0) }} + {{ label || dictionary?.label?.charAt(0) }}
diff --git a/apps/red-ui/src/app/modules/shared/components/type-filter/type-filter.component.html b/apps/red-ui/src/app/modules/shared/components/type-filter/type-filter.component.html index 2c08380b1..f8ef2c738 100644 --- a/apps/red-ui/src/app/modules/shared/components/type-filter/type-filter.component.html +++ b/apps/red-ui/src/app/modules/shared/components/type-filter/type-filter.component.html @@ -60,10 +60,13 @@
+ + -{{ filter.label | translate }} + {{ filter.label }} +{{ filter.label | translate }} diff --git a/apps/red-ui/src/app/translations/annotation-types-translations.ts b/apps/red-ui/src/app/translations/annotation-types-translations.ts index 65ad140ef..0ea4d69c1 100644 --- a/apps/red-ui/src/app/translations/annotation-types-translations.ts +++ b/apps/red-ui/src/app/translations/annotation-types-translations.ts @@ -1,7 +1,8 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; -import { AnnotationSuperType } from '../models/file/annotation.wrapper'; +import { AnnotationSuperType } from '@models/file/annotation.wrapper'; export const annotationTypesTranslations: { [key in AnnotationSuperType]: string } = { + 'text-highlight': _('annotation-type.text-highlight'), 'declined-suggestion': _('annotation-type.declined-suggestion'), hint: _('annotation-type.hint'), 'ignored-hint': _('annotation-type.ignored-hint'), diff --git a/apps/red-ui/src/app/utils/sorters/super-type-sorter.ts b/apps/red-ui/src/app/utils/sorters/super-type-sorter.ts index 644827a55..c7d976872 100644 --- a/apps/red-ui/src/app/utils/sorters/super-type-sorter.ts +++ b/apps/red-ui/src/app/utils/sorters/super-type-sorter.ts @@ -1,6 +1,7 @@ import { AnnotationSuperType } from '../../models/file/annotation.wrapper'; export const SuperTypeSorter: { [key in AnnotationSuperType]: number } = { + 'text-highlight': 100, 'suggestion-change-legal-basis': 14, 'suggestion-force-redaction': 15, 'suggestion-force-hint': 16, diff --git a/apps/red-ui/src/assets/i18n/en.json b/apps/red-ui/src/assets/i18n/en.json index ed148fdc3..59b6449b4 100644 --- a/apps/red-ui/src/assets/i18n/en.json +++ b/apps/red-ui/src/assets/i18n/en.json @@ -310,7 +310,8 @@ "suggestion-recategorize-image": "Suggested recategorize image", "suggestion-remove": "Suggested local removal", "suggestion-remove-dictionary": "Suggested dictionary removal", - "suggestion-resize": "Suggested Resize" + "suggestion-resize": "Suggested Resize", + "text-highlight": "Highlight" }, "annotations": "Annotations", "assign-dossier-owner": { @@ -393,6 +394,7 @@ }, "header": "Edit Redaction Reason" }, + "color": "Color", "comments": { "add-comment": "Enter comment", "comments": "{count} {count, plural, one{comment} other{comments}}", @@ -1207,6 +1209,10 @@ "exclude-pages": "Exclude pages from redaction", "excluded-from-redaction": "excluded", "fullscreen": "Full Screen (F)", + "highlights": { + "convert": "Convert highlights", + "remove": "Remove highlights" + }, "last-reviewer": "Last Reviewed by:", "no-data": { "title": "There have been no changes to this page." @@ -1254,8 +1260,13 @@ "put-back": "Undo", "removed-from-redaction": "Removed from redaction" }, + "highlights": { + "label": "Highlights" + }, "is-excluded": "Redaction is disabled for this document." }, + "text-highlights": "Highlights", + "text-highlights-tooltip": "Shows all text-highlights and allows removing or importing them as redactions", "toggle-analysis": { "disable": "Disable redaction", "enable": "Enable for redaction", @@ -1363,6 +1374,30 @@ "text": "Help Mode", "welcome-to-help-mode": " Welcome to Help Mode!
Clicking on interactive elements will open info about them in new tab.
" }, + "highlight-action-dialog": { + "actions": { + "cancel": "Cancel" + }, + "convert": { + "confirmation": "All highlights in the document will be converted", + "details": "All highlights from the document will be converted to Imported Redactions, using the color set up in the Default Colors section of the app.", + "save": "Convert Highlights", + "title": "Convert highlights to imported redactions" + }, + "form": { + "color": { + "label": "Highlight HEX Color" + } + }, + "remove": { + "confirmation": "All highlights in this HEX Color will be removed from the document", + "details": "Removing highlights from the document will delete all the rectangles and leave a white background behind the highlighted text.", + "save": "Remove Highlights", + "title": "Remove highlights" + }, + "success": "{operation, select, CONVERT{Converting} REMOVE{Removing} other{}} highlights in progress..." + }, + "highlights": "{color} - {length} {length, plural, one{highlight} other{highlights}}", "hint": "Hint", "image-category": { "formula": "Formula", @@ -1697,6 +1732,7 @@ "placeholder": "Search documents...", "this-dossier": "in this dossier" }, + "size": "Size", "smtp-auth-config": { "actions": { "cancel": "Cancel", diff --git a/apps/red-ui/src/assets/styles/red-components.scss b/apps/red-ui/src/assets/styles/red-components.scss index ab69f2933..29cb5e9ed 100644 --- a/apps/red-ui/src/assets/styles/red-components.scss +++ b/apps/red-ui/src/assets/styles/red-components.scss @@ -2,13 +2,13 @@ @use 'common-mixins'; .NEW { - stroke: variables.$grey-5; - background-color: variables.$grey-5; + stroke: var(--iqser-grey-5); + background-color: var(--iqser-grey-5); } .UNPROCESSED { - stroke: variables.$grey-3; - background-color: variables.$grey-3; + stroke: var(--iqser-grey-3); + background-color: var(--iqser-grey-3); } .UNDER_REVIEW, @@ -70,8 +70,8 @@ } .INACTIVE { - stroke: variables.$grey-5; - background-color: variables.$grey-5; + stroke: var(--iqser-grey-5); + background-color: var(--iqser-grey-5); } .MANAGER, @@ -79,3 +79,22 @@ stroke: variables.$primary; background-color: variables.$primary; } + +.workload-separator { + border-bottom: 1px solid var(--iqser-separator); + height: 32px; + box-sizing: border-box; + padding: 0 10px; + display: flex; + align-items: center; + justify-content: space-between; + background-color: var(--iqser-grey-6); + + > div { + display: flex; + + > div:not(:last-child) { + margin-right: 8px; + } + } +} diff --git a/libs/common-ui b/libs/common-ui index dd87dd682..17008f447 160000 --- a/libs/common-ui +++ b/libs/common-ui @@ -1 +1 @@ -Subproject commit dd87dd6821ecc8d591b03191964e77fb5fc6e8f8 +Subproject commit 17008f44757a29ae3d09581a94520c2a05670432 diff --git a/libs/red-domain/src/index.ts b/libs/red-domain/src/index.ts index e2d4bf0e4..2858caf86 100644 --- a/libs/red-domain/src/index.ts +++ b/libs/red-domain/src/index.ts @@ -20,3 +20,4 @@ export * from './lib/signature'; export * from './lib/legal-basis'; export * from './lib/dossier-stats'; export * from './lib/dossier-state'; +export * from './lib/text-highlight'; diff --git a/libs/red-domain/src/lib/shared/view-mode.ts b/libs/red-domain/src/lib/shared/view-mode.ts index e4f649334..6db1dbf5a 100644 --- a/libs/red-domain/src/lib/shared/view-mode.ts +++ b/libs/red-domain/src/lib/shared/view-mode.ts @@ -1 +1 @@ -export type ViewMode = 'STANDARD' | 'DELTA' | 'REDACTED'; +export type ViewMode = 'STANDARD' | 'DELTA' | 'REDACTED' | 'TEXT_HIGHLIGHTS'; diff --git a/libs/red-domain/src/lib/text-highlight/imported-redaction.ts b/libs/red-domain/src/lib/text-highlight/imported-redaction.ts new file mode 100644 index 000000000..9d7cf6c69 --- /dev/null +++ b/libs/red-domain/src/lib/text-highlight/imported-redaction.ts @@ -0,0 +1,6 @@ +import { IRectangle } from '../geometry/rectangle'; + +export interface ImportedRedaction { + id: string; + positions: IRectangle[]; +} diff --git a/libs/red-domain/src/lib/text-highlight/index.ts b/libs/red-domain/src/lib/text-highlight/index.ts new file mode 100644 index 000000000..6010350eb --- /dev/null +++ b/libs/red-domain/src/lib/text-highlight/index.ts @@ -0,0 +1,4 @@ +export * from './imported-redaction'; +export * from './text-highlight-operation'; +export * from './text-highlight.response'; +export * from './text-highlight.request'; diff --git a/libs/red-domain/src/lib/text-highlight/text-highlight-operation.ts b/libs/red-domain/src/lib/text-highlight/text-highlight-operation.ts new file mode 100644 index 000000000..c198d7dda --- /dev/null +++ b/libs/red-domain/src/lib/text-highlight/text-highlight-operation.ts @@ -0,0 +1,5 @@ +export enum TextHighlightOperation { + REMOVE = 'REMOVE', + CONVERT = 'CONVERT', + INFO = 'INFO', +} diff --git a/libs/red-domain/src/lib/text-highlight/text-highlight.request.ts b/libs/red-domain/src/lib/text-highlight/text-highlight.request.ts new file mode 100644 index 000000000..0fe3df4a9 --- /dev/null +++ b/libs/red-domain/src/lib/text-highlight/text-highlight.request.ts @@ -0,0 +1,8 @@ +import { TextHighlightOperation } from './text-highlight-operation'; + +export interface TextHighlightRequest { + dossierId: string; + fileId: string; + operation: TextHighlightOperation; + colors?: string[]; +} diff --git a/libs/red-domain/src/lib/text-highlight/text-highlight.response.ts b/libs/red-domain/src/lib/text-highlight/text-highlight.response.ts new file mode 100644 index 000000000..e87e48612 --- /dev/null +++ b/libs/red-domain/src/lib/text-highlight/text-highlight.response.ts @@ -0,0 +1,9 @@ +import { ImportedRedaction } from './imported-redaction'; +import { TextHighlightOperation } from './text-highlight-operation'; + +export interface TextHighlightResponse { + dossierId?: string; + fileId?: string; + operation?: TextHighlightOperation; + redactionPerColor?: { [key: string]: ImportedRedaction[] }; +} From c807524991ec556cbf61db82d53f0db1342ad9ca Mon Sep 17 00:00:00 2001 From: Timo Bejan Date: Mon, 28 Feb 2022 19:32:21 +0200 Subject: [PATCH 14/19] Text highlight cleanup --- .../file-preview-screen.component.ts | 17 +++++++++++++---- libs/red-domain/src/lib/files/file.model.ts | 4 +++- libs/red-domain/src/lib/files/file.ts | 5 +++++ 3 files changed, 21 insertions(+), 5 deletions(-) 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 a4b57d3b2..2dd141fea 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 @@ -152,10 +152,19 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni return; } + const textHighlightAnnotationIds = this._fileData.textHighlightAnnotations.map(a => a.id); + const textHighlightAnnotations = this._getAnnotations((a: Core.Annotations.Annotation) => + textHighlightAnnotationIds.includes(a.Id), + ); + + this._instance.Core.annotationManager.deleteAnnotations(textHighlightAnnotations, { + imported: true, + force: true, + }); + const ocrAnnotationIds = this._fileData.allAnnotations.filter(a => a.isOCR).map(a => a.id); const annotations = this._getAnnotations(a => a.getCustomData('redact-manager')); const redactions = annotations.filter(a => a.getCustomData('redaction')); - const highlights = annotations.filter(a => a.getCustomData('highlight')); switch (this.viewModeService.viewMode) { case 'STANDARD': { @@ -166,7 +175,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni const nonStandardEntries = annotations.filter(a => a.getCustomData('changeLogRemoved') === 'true'); this._setAnnotationsOpacity(standardEntries, true); this._show(standardEntries); - this._hide([...nonStandardEntries, ...highlights]); + this._hide([...nonStandardEntries]); break; } case 'DELTA': { @@ -175,7 +184,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni this._setAnnotationsColor(redactions, 'annotationColor'); this._setAnnotationsOpacity(changeLogEntries, true); this._show(changeLogEntries); - this._hide([...nonChangeLogEntries, ...highlights]); + this._hide([...nonChangeLogEntries]); break; } case 'REDACTED': { @@ -183,7 +192,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni this._setAnnotationsOpacity(redactions); this._setAnnotationsColor(redactions, 'redactionColor'); this._show(redactions); - this._hide([...nonRedactionEntries, ...highlights]); + this._hide([...nonRedactionEntries]); break; } case 'TEXT_HIGHLIGHTS': { diff --git a/libs/red-domain/src/lib/files/file.model.ts b/libs/red-domain/src/lib/files/file.model.ts index b5930769c..deeddd3fd 100644 --- a/libs/red-domain/src/lib/files/file.model.ts +++ b/libs/red-domain/src/lib/files/file.model.ts @@ -40,6 +40,7 @@ export class File extends Entity implements IFile { readonly hasSuggestions: boolean; readonly processingStatus: ProcessingFileStatus; readonly workflowStatus: WorkflowFileStatus; + readonly fileManipulationDate: string; readonly statusSort: number; readonly cacheIdentifier?: string; @@ -96,9 +97,10 @@ export class File extends Entity implements IFile { this.uploader = file.uploader; this.excludedPages = file.excludedPages || []; this.hasSuggestions = !!file.hasSuggestions; + this.fileManipulationDate = file.fileManipulationDate; this.statusSort = StatusSorter[this.workflowStatus]; - this.cacheIdentifier = btoa((this.lastUploaded ?? '') + (this.lastOCRTime ?? '')); + this.cacheIdentifier = btoa(this.fileManipulationDate ?? ''); this.hintsOnly = this.hasHints && !this.hasRedactions; this.hasNone = !this.hasRedactions && !this.hasHints && !this.hasSuggestions; this.isProcessing = isProcessingStatuses.includes(this.processingStatus); diff --git a/libs/red-domain/src/lib/files/file.ts b/libs/red-domain/src/lib/files/file.ts index 6208d4fab..8f8c29446 100644 --- a/libs/red-domain/src/lib/files/file.ts +++ b/libs/red-domain/src/lib/files/file.ts @@ -147,4 +147,9 @@ export interface IFile { readonly processingStatus: ProcessingFileStatus; readonly workflowStatus: WorkflowFileStatus; + + /** + * Last time the actual file was touched + */ + readonly fileManipulationDate: string; } From e70ef4d59ad6287f46ed7c0f583b52da52e2011d Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Tue, 1 Mar 2022 09:56:21 +0100 Subject: [PATCH 15/19] chore(release) --- package.json | 2 +- paligo-theme.tar.gz | Bin 3215 -> 3214 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index dd9abc9ca..bb5c137d0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redaction", - "version": "3.267.0", + "version": "3.268.0", "private": true, "license": "MIT", "scripts": { diff --git a/paligo-theme.tar.gz b/paligo-theme.tar.gz index 4ef2d94159f194a19940691eeb17701766ed3064..723b589ddaea3ba5d01398db4753a54517d5ed5c 100644 GIT binary patch delta 3126 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 Q+asW^O06qW}`~Uy| delta 3127 zcmV-749N428IKu|cYj$fY(IEqJ9c0%U!mX!p=QvUn&AqeA7iPXW1H*xmp^Lul#%-T zvWC<3?|HU&*8h*u_UgYPF^-rVn@4s1VQX*&FZ?O}dk(0(*T1)LLH~=ucV8j<`(@SK ze&PCm6Q#JS2}75E{rU@Qb$NI3hHlHEVyLOItIL$JvR>cZB!5ND>iMQ9HW|Sst>;m( zy#a%8f0y7b&7MB_b4l{weueXTO&QK+51W*|v1gub-`O)?{0+q4h4{M^e^>C=5px_d z#}RWJF~<>e96skaF|ErCKYda^;PUeN?qbgA!jI&77R_VwxJJ$${7MOh z_1DM`?DFyM;(vJnv0jHHDJmi$Lmb_2s-nqbD=M<0TBDELmFN1-7!IY50O7*0YWj|> z(Zc5o$gT&uEawRNGMW>sBW1O0CvI`Ip}ED15`b4)Usy0!Y=LSc(Wv`b6I?~9AY_Xl ztp^&j6mZ$LifoN=!wUYpENaSV0X-GTFr#nDVchff(|<}R$zrjRT*a~NUvs2kQE@pU zr+h?pkn0N3`i;*q# zGQtUKwh*h3lT`e_e#Qm^3GRUP!D?FgkYk#r6sc%z_8W~aAlGBTT(2yQJBJ* zu8xeQ-a-#`_6g)6d;)>k=;%*at94(etf)A=v4dsgky$Z`iVC+b9du7BE}Lnpnryr~ zdPCeJxr}OX{?2EcXO9d?-PEqV#{@ZWhJQ`4o7Q?#aX9&By3-nrDQvCf}fs zZ!YG5%mN9J%yNvL^zt8xyIfuhZUOr5MRlKK#lryBor1L^r-%I;Xr`&5ym<$UgMXxS z6y6jH$G+`Rd`9wyy(86@bmzc}Q|tndXQmKOKWbNU9`z|80~K=&#Y2qWJ$4&hds+^PM|^T@A<*rsLeXAmMld-7;G6~?{vW1fX94V%qFOw0ij~FtG+`CR61y?o? zZv3BsXfnA*JGWMnQI$E`3G=)%=@o=T&OZ<3_$AoH&GeL7kHE6Kp ztseH}Iz2_bpiKPqlHovT)qhEHxB_%!kikH@V_f@S1vxAZ$E$oldEz*M(^si;T9$-q z0^{jIn=DO3OJlOa3d+c+YPMl*OcWF=Op1bugb<2yB7dpHS6c$@)rnRJwHWqc*T<&H ztszF4CkzOksj|VY2+S-H2mO>h#b zb3+E{_r?<0?^?A(eSZRnwG$`N*n7ZL&IjT!wlxACQdn<|#D|6}16RR0h7YwrYprB7 zzb4>BFyosH#DT9|cLCyXS6n6_7<+zutxo@@q0zksDH{`xuXW_gfn_&uQ;{dgN!5x= z8*({QejAAfLmmuajHA#S4f#g#iJ@ScjD=CMVrXept{7Swb$_|xRf1s5wv)sjg25Q) zEQm;OtF86~c~%L^H-8ep{s@H{gfsa0JfL=-6`R6vMg(EI%}svQUdmv3n5P1-*AN85dkT)W zqeMHhcchCw0An#ht1h>-ndxJ&r4SDHVl&BjtVs2`W9RO7fx|TSN4~x|NWu}f76)<6 zK4_g6+)*4S*j^<|es$n=nPQILTBGf#r5y{o%xLBu#(!x9u0OxmGW!0&22-;9V7S1o(bLeqXn-B0}>`_Ee_*)q=2rK(55cB_dU}uZKXY+4(!|ovLqZ|5DhDW3wgjUOoW$`CEgJERjXoTubI4OR#Cl7~gLqY;PJe8VNuNh^=yo%%MZ3vR=I{f#kvVzh zYqPF)2q6W3wCD=WRPt*oQa(NQw#wYoO$=B3zRpbw?i@>~^c^ zAVK4BcMqfUsaW(r`#s?{T&?+e9Rys#vQT;Pi?Ke5oAJZ4hOYzP7%j)zbj{jy2ig>- zA%Cn_d|MpIR(erMXRG8ty^<#`4<$45Tu<_}`_;3y>yjMqI)G9ASa4`xGEH-(&Gx4R zwqip3ff{Is*TU@+12ulh5E0=lx`GlOS;&EKaji0dQcn`!e(MQue@dd;A6zr3H#%z2 zH^QX*dSKotV7!5HDS9*T4b~K%kY9&i(bkN_0Qr7gF?>fd&pYa;8coZDP{g*A`3^L3gNwBMB<@3tkjVAPw??YL1$|9x>(P+(JF~WMx z`(Kxd_-Njld+tpo^X*&hHM-=lwGn@^>_pc3H=XuBH9R!`O+br=7u0BKhE>*OByx zq3^`!?$2Z84Ka4lY!6}#G>nSwhZwzMG5Vg0Q8Aqt2K?u-<&BcQ(~1U(ahyBu3qAtG z9KpK5qs!k(1W6G!Q Date: Tue, 1 Mar 2022 12:28:37 +0200 Subject: [PATCH 16/19] Add convert highlights icon --- .../annotations-list/annotations-list.component.html | 2 +- apps/red-ui/src/app/modules/icons/icons.module.ts | 1 + apps/red-ui/src/assets/icons/general/convert.svg | 9 +++++++++ 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 apps/red-ui/src/assets/icons/general/convert.svg diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/annotations-list/annotations-list.component.html b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/annotations-list/annotations-list.component.html index 75536064a..304e9de69 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/annotations-list/annotations-list.component.html +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/annotations-list/annotations-list.component.html @@ -12,7 +12,7 @@ [tooltip]="'file-preview.highlights.convert' | translate" [type]="circleButtonTypes.dark" class="mr-2" - icon="iqser:plus" + icon="red:convert" tooltipPosition="above" > 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 7d808ccd7..2d334e6f6 100644 --- a/apps/red-ui/src/app/modules/icons/icons.module.ts +++ b/apps/red-ui/src/app/modules/icons/icons.module.ts @@ -22,6 +22,7 @@ export class IconsModule { 'color-picker', 'comment', 'comment-fill', + 'convert', 'csv', 'dictionary', 'denied', diff --git a/apps/red-ui/src/assets/icons/general/convert.svg b/apps/red-ui/src/assets/icons/general/convert.svg new file mode 100644 index 000000000..dcdeceaa2 --- /dev/null +++ b/apps/red-ui/src/assets/icons/general/convert.svg @@ -0,0 +1,9 @@ + + + + + + + + From 976cde9f5b09b1db7177583ad354ced5837c806b Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Tue, 1 Mar 2022 11:32:58 +0100 Subject: [PATCH 17/19] 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 bb5c137d0..d3ceeecf4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redaction", - "version": "3.268.0", + "version": "3.269.0", "private": true, "license": "MIT", "scripts": { diff --git a/paligo-theme.tar.gz b/paligo-theme.tar.gz index 723b589ddaea3ba5d01398db4753a54517d5ed5c..0f76435ce163be64f13caf2ed817a5bea00a538d 100644 GIT binary patch delta 3128 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 delta 3126 zcmV-649WA58IBo{cYh0(3vcntcI?1eyh6bbLd~ExHNzD`KgLo&$2QmXFMrhRDI@jw zWeun6-}4;ztp6XQ?bUxpVjM9!HjnE1!`9#mUiee`_Z(37PX7xJ^uGxFh(F7Gbh&}~^%3^i4Db(u0&*6W*_q<_d+J>L|?CL_3{^*k!J zH((I%?-IPF+0!R~E=m5|uW(+kDZ|<9VUw~q_RO>GJA3Afzk&F>5Pz5A?+X4pVvZx` zIAV??<~U-G!{_`argfR&r%&n!TwY$^UCcRsII~iMV^X1iT_E(%qIpan*T}hpUn!xm z{u=p#T|VAjJbw=$*6WZYMMVT;h@<;WRWx~QMMYLrYxI%3@?75;!=cm>AY2$$P2Z6< zTKIec+4Ufo8e_agq`lt zb9FkC`hQ{-Z0{0RBxiR<{-dUB?PkuLMM<3 zVgT3-ha?j#NKdv#d6A2KIG#N0Fjwq^a5QZ_?}LAhaEn9Nm9Lwb z0dTJTuxK<%imIm$o#eKber)Fy9o>=jUQsic9(qpmT-rzH_=J9X0d6W9^A7%LF|vhT zMmS;37Gf20l8XP=&)8rf!5y$ZSWOEba!k{dA{C9zexvaPq?>tvuzv}5oDoe>sw=8`PNtI;pzl~A?{Wbbh6#sw1Io^<}9;~yR z)SSQS*ZH!@GFXSp>@!l4Nv2nmM1QaR9@+1Ux~4!b(85TM7xv}@&e#a$?Ig-&q@cWS zK&_0R5HijXOq5Gyi$0GjE2^Qb+LP82L?bF8*N)PRlK20Wgr=lwcv74}!Z{??ncN4q zvopjmq{i#_-+`uTZbL&n(|f|hJ)S>gKqDTpH@O*XH{Q|k>0kc$@Bh^3Dt~?dZIjRq zL0?p09{KeU+w^V-Bu9F(Z&jpjGB%Y!CIS3gwr~=FBgM4yWiq1m5kqE?d)Mis;L7H~ zjsFu6O(xf9=hjMcJdvfHmWk=1(Q{iuN2_*>rVy$!9CeFl!>2SG8_o4I)6zHSAdQTG8jmAjB6jPAcw`_c$M!bPaG$3`YLr!%aSln zU_4!Dlci~BX-rmFK^YlU%{Hu!iGpHSxIF%(Rbu`o(j3@wey6+4A>=A9z zlw{?$h{p-gw`Iebwtv4u$1O} z0P>};DaG2))$k!JKNjT!x;vkOM z2d(phJBs53+pA>BuMWH}Q_S&OYqTA;v|}Nc8O@x-IDd`6_2>6mX5WH2Ey<&F-%(P+ zgWM?@n$-FMLiXQ6c#aqQWC974(DW^VjAh8z2P4wYx@4W9<-+{_)QIFYKho+jbTZ6H zqGn=KKuxv}ysKi40N;JL}%scS%HEAi=K4tdIkSZ^tL5U(oKiGS@e>GNm~-EPLUXg3+k9DX1-GAGY` zZPs-U1S65O+i<4+6gNI*9UE+MY<5HYylp26`w#~JNl^h|4V2tfgljUS?&yPq-EK7< zBxoG&?qPI36^q_yzbD*=t2IBbgMceo7Ah}(G1ez>Gk#ds@O9uDqvcqeu34MzK%2re zgn#vlZ;J!jN-rwuY?b_{SMtQ=p=3s$>q(w=zk1eoU6R9H2QaE13l8l|rfIIU+5VKk zR!oRLPy_AoTDW~;pvEs5A|jkcS5U$u3po%ju2lw5>Ph0;Z$07dPf2w9gKH-BMn?_$ zMws-!#{pkQQ1*fYQ&WaZKWiwHGdm@k%^F``ma)VE^hDh=Hl?y@Z@CDE{0q2 zxx>+Z0F&|4V8va|)};(ah&9OIO5QUSiN&5uay`x>`=d#5DOQC41SY31AJs{nkKK1b z+qokpKY)Ua?=>zIFs%0U!MA6S3e3WQK8^lVSbx51MCTtf;i)_|@8D0=;(M!3Z{#iU>Q0O_~<$}tE>A`|J{)4|$ z*h`EE#s|omOx+G(?t|bV{4aTfpyEE_>47?Z^2LEZ>9~gm1DGS<7YxXG@w0*DMp%z| z|LZalAI&>+&%LQ+zJ05`Mwk4xHsY_fFK4KR5342>6@K?8J{A@1rOphAFMo6RCcE6e z%k8?nzRT;n{JzWYx`Mtd=(-kt*Ftuc-DgF{F6%hawX`337&|fbv@_UABp-bAI+Fe{ z^qu(J{dugsA;#{R?LmxzhEdV|5Tkc2M&DC0DyH+ofd4$UyiwA3TG1dej&sL-!AF3Y zBUm?hboo1pASt3|>eBnC{x4r!&h6aJ?cC1o+|KRX&h6aJ?cC1o+|KRX&h6aJ?cC1o Q+asW^O07^C${Qv*} From 3c4c5c5f7003e2c404b0c5f5407f4ac50f31dc4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adina=20=C8=9Aeudan?= Date: Tue, 1 Mar 2022 12:47:23 +0200 Subject: [PATCH 18/19] Some cleanup --- .../annotations-list.component.html | 26 +----------- .../annotations-list.component.scss | 4 -- .../annotations-list.component.ts | 41 +++---------------- .../highlights-separator.component.html | 25 +++++++++++ .../highlights-separator.component.scss | 7 ++++ .../highlights-separator.component.ts | 41 +++++++++++++++++++ .../file-preview-screen.component.ts | 8 ++-- .../file-preview.module.ts | 41 ++++++++++--------- .../services/annotation-draw.service.ts | 1 - .../lib/text-highlight/imported-redaction.ts | 2 +- .../src/lib/text-highlight/index.ts | 1 + .../text-highlight/text-highlights-group.ts | 5 +++ 12 files changed, 113 insertions(+), 89 deletions(-) create mode 100644 apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/highlights-separator/highlights-separator.component.html create mode 100644 apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/highlights-separator/highlights-separator.component.scss create mode 100644 apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/highlights-separator/highlights-separator.component.ts create mode 100644 libs/red-domain/src/lib/text-highlight/text-highlights-group.ts diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/annotations-list/annotations-list.component.html b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/annotations-list/annotations-list.component.html index 304e9de69..01df0b5df 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/annotations-list/annotations-list.component.html +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/annotations-list/annotations-list.component.html @@ -1,30 +1,6 @@
-
- - -
- -
- - - -
+
div { - display: flex; -} diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/annotations-list/annotations-list.component.ts b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/annotations-list/annotations-list.component.ts index f864b8bb4..4ed710636 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/annotations-list/annotations-list.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/annotations-list/annotations-list.component.ts @@ -1,20 +1,13 @@ import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnChanges, Output, SimpleChanges, TemplateRef } from '@angular/core'; import { AnnotationWrapper } from '@models/file/annotation.wrapper'; -import { CircleButtonTypes, FilterService, IqserEventTarget } from '@iqser/common-ui'; +import { FilterService, IqserEventTarget } from '@iqser/common-ui'; import { MultiSelectService } from '../../services/multi-select.service'; import { AnnotationReferencesService } from '../../services/annotation-references.service'; -import { FilePreviewStateService } from '../../services/file-preview-state.service'; import { UserPreferenceService } from '@services/user-preference.service'; import { ViewModeService } from '../../services/view-mode.service'; import { BehaviorSubject } from 'rxjs'; import { DossiersDialogService } from '../../../../services/dossiers-dialog.service'; -import { TextHighlightOperation } from '@red/domain'; - -interface HighlightGroup { - startIdx: number; - color: string; - length: number; -} +import { TextHighlightsGroup } from '@red/domain'; @Component({ selector: 'redaction-annotations-list', @@ -23,8 +16,6 @@ interface HighlightGroup { changeDetection: ChangeDetectionStrategy.OnPush, }) export class AnnotationsListComponent implements OnChanges { - readonly circleButtonTypes = CircleButtonTypes; - @Input() annotations: AnnotationWrapper[]; @Input() selectedAnnotations: AnnotationWrapper[]; @Input() annotationActionsTemplate: TemplateRef; @@ -34,28 +25,17 @@ export class AnnotationsListComponent implements OnChanges { @Output() readonly selectAnnotations = new EventEmitter(); @Output() readonly deselectAnnotations = new EventEmitter(); - highlightGroups$ = new BehaviorSubject([]); + highlightGroups$ = new BehaviorSubject([]); constructor( readonly multiSelectService: MultiSelectService, readonly annotationReferencesService: AnnotationReferencesService, - readonly state: FilePreviewStateService, private readonly _filterService: FilterService, private readonly _userPreferenceService: UserPreferenceService, private readonly _viewModeService: ViewModeService, private readonly _dialogService: DossiersDialogService, ) {} - convertHighlights(highlightGroup: HighlightGroup): void { - const data = this._getActionData(highlightGroup, TextHighlightOperation.CONVERT); - this._dialogService.openDialog('highlightAction', null, data); - } - - removeHighlights(highlightGroup: HighlightGroup): void { - const data = this._getActionData(highlightGroup, TextHighlightOperation.REMOVE); - this._dialogService.openDialog('highlightAction', null, data); - } - ngOnChanges(changes: SimpleChanges): void { if (changes.annotations && this.annotations && !this._viewModeService.isTextHighlights) { this.annotations = this.annotations.sort(this.annotationsPositionCompare); @@ -109,25 +89,16 @@ export class AnnotationsListComponent implements OnChanges { } } - showHighlightGroup(idx: number): HighlightGroup { + showHighlightGroup(idx: number): TextHighlightsGroup { return this._viewModeService.isTextHighlights && this.highlightGroups$.value.find(h => h.startIdx === idx); } - private _getActionData(highlightGroup: HighlightGroup, operation: TextHighlightOperation) { - return { - dossierId: this.state.dossierId, - fileId: this.state.fileId, - color: highlightGroup.color, - operation, - }; - } - private _updateHighlightGroups(): void { if (!this.annotations?.length) { return; } - const highlightGroups: HighlightGroup[] = []; - let lastGroup: HighlightGroup; + const highlightGroups: TextHighlightsGroup[] = []; + let lastGroup: TextHighlightsGroup; for (let idx = 0; idx < this.annotations.length; ++idx) { if (idx === 0 || this.annotations[idx].color !== this.annotations[idx - 1].color) { if (lastGroup) { diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/highlights-separator/highlights-separator.component.html b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/highlights-separator/highlights-separator.component.html new file mode 100644 index 000000000..3ffe33de5 --- /dev/null +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/highlights-separator/highlights-separator.component.html @@ -0,0 +1,25 @@ +
+ + +
+ +
+ + + +
diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/highlights-separator/highlights-separator.component.scss b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/highlights-separator/highlights-separator.component.scss new file mode 100644 index 000000000..930ad62b5 --- /dev/null +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/highlights-separator/highlights-separator.component.scss @@ -0,0 +1,7 @@ +:host { + display: contents; + + > div { + display: flex; + } +} diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/highlights-separator/highlights-separator.component.ts b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/highlights-separator/highlights-separator.component.ts new file mode 100644 index 000000000..5ebdab14c --- /dev/null +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/highlights-separator/highlights-separator.component.ts @@ -0,0 +1,41 @@ +import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; +import { CircleButtonTypes } from '@iqser/common-ui'; +import { TextHighlightOperation, TextHighlightsGroup } from '@red/domain'; +import { DossiersDialogService } from '../../../../services/dossiers-dialog.service'; +import { FilePreviewStateService } from '../../services/file-preview-state.service'; +import { AnnotationWrapper } from '@models/file/annotation.wrapper'; + +@Component({ + selector: 'redaction-highlights-separator [highlightGroup] [annotation]', + templateUrl: './highlights-separator.component.html', + styleUrls: ['./highlights-separator.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class HighlightsSeparatorComponent { + @Input() highlightGroup: TextHighlightsGroup; + @Input() annotation: AnnotationWrapper; + + readonly circleButtonTypes = CircleButtonTypes; + readonly isWritable$ = this._state.isWritable$; + + constructor(private readonly _dialogService: DossiersDialogService, private readonly _state: FilePreviewStateService) {} + + convertHighlights(highlightGroup: TextHighlightsGroup): void { + const data = this._getActionData(highlightGroup, TextHighlightOperation.CONVERT); + this._dialogService.openDialog('highlightAction', null, data); + } + + removeHighlights(highlightGroup: TextHighlightsGroup): void { + const data = this._getActionData(highlightGroup, TextHighlightOperation.REMOVE); + this._dialogService.openDialog('highlightAction', null, data); + } + + private _getActionData(highlightGroup: TextHighlightsGroup, operation: TextHighlightOperation) { + return { + dossierId: this._state.dossierId, + fileId: this._state.fileId, + color: highlightGroup.color, + operation, + }; + } +} 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 2dd141fea..2c988e34d 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 @@ -175,7 +175,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni const nonStandardEntries = annotations.filter(a => a.getCustomData('changeLogRemoved') === 'true'); this._setAnnotationsOpacity(standardEntries, true); this._show(standardEntries); - this._hide([...nonStandardEntries]); + this._hide(nonStandardEntries); break; } case 'DELTA': { @@ -184,7 +184,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni this._setAnnotationsColor(redactions, 'annotationColor'); this._setAnnotationsOpacity(changeLogEntries, true); this._show(changeLogEntries); - this._hide([...nonChangeLogEntries]); + this._hide(nonChangeLogEntries); break; } case 'REDACTED': { @@ -192,7 +192,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni this._setAnnotationsOpacity(redactions); this._setAnnotationsColor(redactions, 'redactionColor'); this._show(redactions); - this._hide([...nonRedactionEntries]); + this._hide(nonRedactionEntries); break; } case 'TEXT_HIGHLIGHTS': { @@ -725,7 +725,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni } } - private _getAnnotations(predicate: (value) => unknown) { + private _getAnnotations(predicate: (value) => boolean) { const annotations = this._instance.Core.annotationManager.getAnnotationsList(); return predicate ? annotations.filter(predicate) : annotations; } diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview.module.ts b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview.module.ts index 386d9c254..a93b7966c 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview.module.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview.module.ts @@ -23,6 +23,7 @@ import { AnnotationReferencesListComponent } from './components/annotation-refer import { AcceptRecommendationDialogComponent } from './dialogs/accept-recommendation-dialog/accept-recommendation-dialog.component'; import { AnnotationCardComponent } from './components/annotation-card/annotation-card.component'; import { AnnotationReferencesPageIndicatorComponent } from './components/annotation-references-page-indicator/annotation-references-page-indicator.component'; +import { HighlightsSeparatorComponent } from './components/highlights-separator/highlights-separator.component'; const routes: Routes = [ { @@ -33,26 +34,28 @@ const routes: Routes = [ }, ]; +const components = [ + FileWorkloadComponent, + AnnotationDetailsComponent, + AnnotationsListComponent, + PageIndicatorComponent, + PageExclusionComponent, + PdfViewerComponent, + AnnotationActionsComponent, + CommentsComponent, + DocumentInfoComponent, + TypeAnnotationIconComponent, + ViewSwitchComponent, + UserManagementComponent, + AcceptRecommendationDialogComponent, + AnnotationReferencesListComponent, + AnnotationCardComponent, + AnnotationReferencesPageIndicatorComponent, + HighlightsSeparatorComponent, +]; + @NgModule({ - declarations: [ - FilePreviewScreenComponent, - FileWorkloadComponent, - AnnotationDetailsComponent, - AnnotationsListComponent, - PageIndicatorComponent, - PageExclusionComponent, - PdfViewerComponent, - AnnotationActionsComponent, - CommentsComponent, - DocumentInfoComponent, - TypeAnnotationIconComponent, - ViewSwitchComponent, - UserManagementComponent, - AcceptRecommendationDialogComponent, - AnnotationReferencesListComponent, - AnnotationCardComponent, - AnnotationReferencesPageIndicatorComponent, - ], + declarations: [FilePreviewScreenComponent, ...components], imports: [ RouterModule.forChild(routes), CommonModule, diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/services/annotation-draw.service.ts b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/services/annotation-draw.service.ts index 42de352b7..b7cfc0435 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/services/annotation-draw.service.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/services/annotation-draw.service.ts @@ -222,7 +222,6 @@ export class AnnotationDrawService { annotationWrapper.hidden; annotation.setCustomData('redact-manager', 'true'); annotation.setCustomData('redaction', String(annotationWrapper.previewAnnotation)); - annotation.setCustomData('highlight', String(annotationWrapper.isHighlight)); annotation.setCustomData('skipped', String(annotationWrapper.isSkipped)); annotation.setCustomData('changeLog', String(annotationWrapper.isChangeLogEntry)); annotation.setCustomData('changeLogRemoved', String(annotationWrapper.isChangeLogRemoved)); diff --git a/libs/red-domain/src/lib/text-highlight/imported-redaction.ts b/libs/red-domain/src/lib/text-highlight/imported-redaction.ts index 9d7cf6c69..7a08fee0d 100644 --- a/libs/red-domain/src/lib/text-highlight/imported-redaction.ts +++ b/libs/red-domain/src/lib/text-highlight/imported-redaction.ts @@ -1,4 +1,4 @@ -import { IRectangle } from '../geometry/rectangle'; +import { IRectangle } from '../geometry'; export interface ImportedRedaction { id: string; diff --git a/libs/red-domain/src/lib/text-highlight/index.ts b/libs/red-domain/src/lib/text-highlight/index.ts index 6010350eb..f49b5580a 100644 --- a/libs/red-domain/src/lib/text-highlight/index.ts +++ b/libs/red-domain/src/lib/text-highlight/index.ts @@ -2,3 +2,4 @@ export * from './imported-redaction'; export * from './text-highlight-operation'; export * from './text-highlight.response'; export * from './text-highlight.request'; +export * from './text-highlights-group'; diff --git a/libs/red-domain/src/lib/text-highlight/text-highlights-group.ts b/libs/red-domain/src/lib/text-highlight/text-highlights-group.ts new file mode 100644 index 000000000..30755ce59 --- /dev/null +++ b/libs/red-domain/src/lib/text-highlight/text-highlights-group.ts @@ -0,0 +1,5 @@ +export interface TextHighlightsGroup { + startIdx: number; + color: string; + length: number; +} From 7b479acb631e195b9e24e977b1df48e2355a2824 Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Tue, 1 Mar 2022 11:51:35 +0100 Subject: [PATCH 19/19] chore(release) --- package.json | 2 +- paligo-theme.tar.gz | Bin 3216 -> 3215 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d3ceeecf4..357bd0be1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redaction", - "version": "3.269.0", + "version": "3.270.0", "private": true, "license": "MIT", "scripts": { diff --git a/paligo-theme.tar.gz b/paligo-theme.tar.gz index 0f76435ce163be64f13caf2ed817a5bea00a538d..a0399a8f7866a0dead49e08e398f24549a4ef938 100644 GIT binary patch delta 3096 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 delta 3097 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