Compare commits

...

941 Commits

Author SHA1 Message Date
Dominique Eifländer
f182be3db0 Merge branch 'RED10758' into 'master'
RED-10758: Fix remove and recategorize request in applicationType DocuMine

See merge request redactmanager/red-ui!767
2025-01-29 09:30:57 +01:00
Rosario Allegro
81a32f6d58 RED-10758: Fix remove and recategorize request in applicationType DocuMine 2025-01-28 15:34:17 +01:00
Dan Percic
82552b1748 Merge branch 'VM/RED-9580' into 'master'
RED-9580 - added getOne method for stats service to call new users stats...

Closes RED-9580

See merge request redactmanager/red-ui!765
2024-12-13 11:29:39 +01:00
Valentin Mihai
af7a45d739 RED-9580 - added getOne method for stats service to call new users stats endpoint and updated data from "delete user dialog" with new backend data 2024-12-13 12:03:17 +02:00
Valentin-Gabriel Mihai
21013a6fe5 Merge branch 'RED-9885' into 'master'
RED-9885: fixed resize bar behavior & style.

See merge request redactmanager/red-ui!764
2024-12-12 18:13:07 +01:00
Nicoleta Panaghiu
c81ad67844 RED-9885: fixed resize bar behavior & style. 2024-12-12 17:47:56 +02:00
Valentin-Gabriel Mihai
13797f1fb3 Merge branch 'RED-10030' into 'master'
RED-10030: persist the keyColumn value even if csv mapping is disabled.

See merge request redactmanager/red-ui!763
2024-12-12 15:48:47 +01:00
Nicoleta Panaghiu
ef5cd39b16 RED-10030: persist the keyColumn value even if csv mapping is disabled. 2024-12-12 15:59:36 +02:00
Valentin-Gabriel Mihai
e133e944e3 Merge branch 'RED-10589' into 'master'
RED-10589 -  removed file workload from workflow item on documine.

See merge request redactmanager/red-ui!762
2024-12-12 09:34:31 +01:00
Nicoleta Panaghiu
2ffb5bbb63 RED-10589 - removed file workload from workflow item on documine. 2024-12-12 10:30:56 +02:00
Valentin Mihai
0f16644944 Merge branch 'master' into VM/RED-9580 2024-12-11 19:24:25 +02:00
Nicoleta Panaghiu
0b41159ee4 Merge branch 'VM/RED-10301' into 'master'
RED-10301 - set app type config vars based existing tenants from local storage...

Closes RED-10301

See merge request redactmanager/red-ui!761
2024-12-11 17:30:06 +01:00
Valentin Mihai
2a78aea898 RED-10301 - set app type config vars based existing tenants from local storage or used default config if no tenant was set before 2024-12-11 18:27:56 +02:00
Valentin-Gabriel Mihai
4c5face779 Merge branch 'RED-10647' into 'master'
RED-10647: fixed documine helpmode links.

See merge request redactmanager/red-ui!760
2024-12-11 17:15:10 +01:00
Nicoleta Panaghiu
b3a8a8d30c RED-10647: fixed documine helpmode links. 2024-12-11 18:09:56 +02:00
Valentin-Gabriel Mihai
7836750171 Merge branch 'RED-10659' into 'master'
RED-10659: implemented filtering, sorted filters and added search.

See merge request redactmanager/red-ui!759
2024-12-11 16:15:02 +01:00
Nicoleta Panaghiu
ef9d3d2e8f RED-10659: implemented filtering, sorted filters and added search. 2024-12-11 17:10:29 +02:00
Dan Percic
3ca846b2c2 Merge branch 'blah' into 'master'
skip quality gate?

See merge request redactmanager/red-ui!758
2024-12-11 10:09:52 +01:00
Dan Percic
ae7b68bc16 skip quality gate? 2024-12-11 11:07:42 +02:00
Dan Percic
3150134e65 Merge branch 'RED-9856' into 'master'
Resolve RED-9856

Closes RED-9856

See merge request redactmanager/red-ui!757
2024-12-10 18:25:07 +01:00
Nicoleta Panaghiu
b552628b43 RED-9856: implemented revert-changes feature. 2024-12-10 17:58:32 +02:00
Nicoleta Panaghiu
9b3eb4702b RED-9856: class rename. 2024-12-10 17:13:19 +02:00
Nicoleta Panaghiu
52fa98f918 RED-9856: wip; save this for future purposes. 2024-12-10 17:13:19 +02:00
Nicoleta Panaghiu
1d874f37b2 Merge branch 'VM/RED-10627' into 'master'
RED-10627 - updated re processing required color

Closes RED-10627

See merge request redactmanager/red-ui!756
2024-12-10 16:09:03 +01:00
Valentin Mihai
582ba6023e RED-10627 - updated re processing required color 2024-12-10 17:06:55 +02:00
Nicoleta Panaghiu
fbcb522b43 Merge branch 'VM/RED-7772' into 'master'
RED-7772 - shown 'is processing' icon for OCR_PROCESSING_QUEUED status

Closes RED-7772

See merge request redactmanager/red-ui!755
2024-12-10 15:31:59 +01:00
Valentin Mihai
1d3096d82c RED-7772 - shown 'is processing' icon for OCR_PROCESSING_QUEUED status 2024-12-10 16:28:43 +02:00
Valentin-Gabriel Mihai
43ea2e7857 Merge branch 'RED-10614' into 'master'
RED-10614: added missing comma.

See merge request redactmanager/red-ui!754
2024-12-09 17:21:19 +01:00
Nicoleta Panaghiu
92038a1949 RED-10614: added missing comma. 2024-12-09 18:18:49 +02:00
Christoph Schabert
a323ddd5dd add sonar-project props 2024-12-09 15:23:59 +01:00
Christoph Schabert
e70cdd4cc5 Update .gitlab-ci.yml file 2024-12-09 15:21:24 +01:00
Nicoleta Panaghiu
427a81cff6 Merge branch 'release/4.839.x' into 'master'
Add websockets to handle annotations & rules

See merge request redactmanager/red-ui!753
2024-12-09 13:38:42 +01:00
Dan Percic
4933c7a678 RED-9582 finish copilot 2024-12-09 14:37:02 +02:00
Dan Percic
8ee2ec5749 Merge branch 'VM/RED-10575' into 'master'
RED-10575 - added 40px between processing bar and read-only icon

Closes RED-10575

See merge request redactmanager/red-ui!752
2024-12-09 12:07:33 +01:00
Valentin Mihai
ce4216e56c RED-10575 - added 40px between processing bar and read-only icon 2024-12-09 12:47:55 +02:00
Dan Percic
a3526d338f Merge master 2024-12-09 11:33:19 +02:00
Dan Percic
65041f77c3 Merge branch 'nicoleta' into 'master'
RED-3800: fixed sass breaking changes; removed unused imports.

See merge request redactmanager/red-ui!751
2024-12-09 10:28:19 +01:00
Dan Percic
4206993c72 Merge branch 'RED-10512' into 'master'
RED-10512: fixed file attribute text selection.

See merge request redactmanager/red-ui!750
2024-12-09 10:27:29 +01:00
Nicoleta Panaghiu
a7d8dc6a66 RED-3800: fixed sass breaking changes; removed unused imports. 2024-12-09 10:53:04 +02:00
Nicoleta Panaghiu
56bdf1bc4d RED-10512: fixed file attribute text selection. 2024-12-07 11:59:51 +02:00
Dan Percic
acb009a909 Merge branch 'VM/RED-10634' into 'master'
RED-10634 - closed "edit component view" when component is deleted

Closes RED-10634

See merge request redactmanager/red-ui!749
2024-12-06 19:43:46 +01:00
Valentin Mihai
96532fa61e RED-10634 - closed "edit component view" when component is deleted 2024-12-06 20:33:31 +02:00
Dan Percic
eed7f1917e Merge branch 'master' into release/4.839.x 2024-12-06 20:18:56 +02:00
Valentin-Gabriel Mihai
51b99089e4 Merge branch 'RED-10614' into 'master'
RED-10614: fixed UI not loading.

See merge request redactmanager/red-ui!748
2024-12-06 18:31:33 +01:00
Nicoleta Panaghiu
118e35e897 RED-10614: fixed UI not loading. 2024-12-06 19:26:40 +02:00
Dan Percic
b9197b1eb3 Merge remote-tracking branch 'origin/master' into release/4.839.x 2024-12-05 13:37:08 +02:00
Nicoleta Panaghiu
568bb696a7 Merge branch 'ng-updates' into 'master'
Ng 19

See merge request redactmanager/red-ui!747
2024-12-05 11:52:34 +01:00
Dan Percic
43616297c8 lint 2024-12-05 12:51:00 +02:00
Dan Percic
51801a03a0 update other deps 2024-12-05 12:50:21 +02:00
Dan Percic
59254c0294 ng 19 2024-12-05 11:46:40 +02:00
Dan Percic
61b238d511 Merge branch 'VM/RED-10593' into 'master'
RED-10593 - when legalBasisValue = 'n-a' set empty string as param to not...

Closes RED-10593

See merge request redactmanager/red-ui!746
2024-12-05 10:35:25 +01:00
Dan Percic
d5ca5331a7 Merge branch 'VM/RED-10587' into 'master'
RED-10587 - Add auto new line for edit-component textfield

Closes RED-10587

See merge request redactmanager/red-ui!745
2024-12-05 10:34:59 +01:00
Dan Percic
8f72d8608b Merge branch 'VM/RED-9585' into 'master'
RED-9585 - set count param for user roles translations to 1 to not be...

Closes RED-9585

See merge request redactmanager/red-ui!744
2024-12-05 10:20:28 +01:00
Valentin Mihai
425f3da9d4 RED-10587 - Add auto new line for edit-component textfield 2024-12-04 20:05:43 +02:00
Valentin Mihai
34dc025b79 RED-10593 - when legalBasisValue = 'n-a' set empty string as param to not display "Annotation based on rule n-a" 2024-12-04 19:04:25 +02:00
Valentin Mihai
b2f8cda99b RED-9585 - set count param for user roles translations to 1 to not be automatically used the plural form when it is undefined 2024-12-04 18:33:58 +02:00
Nicoleta Panaghiu
dd1e0c672b Merge branch 'VM/RED-9585' into 'master'
RED-9585 - set count param for user roles translations

Closes RED-9585

See merge request redactmanager/red-ui!743
2024-12-04 16:59:57 +01:00
Valentin Mihai
0e3cf56034 RED-9585 - set count param for user roles translations 2024-12-04 17:58:45 +02:00
Valentin Mihai
bfe409305c RED-9580 - use new user stats endpoint for everything related to User Management 2024-12-04 15:47:30 +02:00
Valentin-Gabriel Mihai
b225917a51 Merge branch 'RED-10592' into 'master'
RED-10592: fixed listener to esc key in pdf viewer.

See merge request redactmanager/red-ui!742
2024-12-04 12:09:28 +01:00
Nicoleta Panaghiu
5359f5aca9 RED-10592: fixed listener to esc key in pdf viewer. 2024-12-04 13:07:50 +02:00
Dan Percic
1d2f450ba4 Merge branch 'VM/RED-10554' into 'master'
RED-10554 - stopped event propagation when click on download component button

Closes RED-10554

See merge request redactmanager/red-ui!741
2024-12-04 10:40:20 +01:00
Dan Percic
4aa03ba3c5 Merge branch 'VM/RED-10575' into 'master'
RED-10575 - hid the "read only" text when file is in processing state

Closes RED-10575

See merge request redactmanager/red-ui!740
2024-12-04 10:39:54 +01:00
Dan Percic
118e34b380 Merge branch 'VM/RED-10600' into 'master'
RED-10600 - updated can assign reviewer logic when file is set to done to...

Closes RED-10600

See merge request redactmanager/red-ui!739
2024-12-04 10:39:30 +01:00
Dan Percic
ff3c5768c6 Merge branch 'VM/RED-9585' into 'master'
RED-9585 - updated translation param

Closes RED-9585

See merge request redactmanager/red-ui!738
2024-12-04 10:39:11 +01:00
Valentin Mihai
f293eefe8c RED-10554 - stopped event propagation when click on download component button 2024-12-04 11:25:42 +02:00
Valentin Mihai
49c59897bf RED-10575 - hid the "read only" text when file is in processing state 2024-12-03 23:26:33 +02:00
Valentin Mihai
0e53484b62 RED-10600 - updated can assign reviewer logic when file is set to done to assign user when is moved back to "in review" 2024-12-03 20:13:43 +02:00
Valentin Mihai
842bd4e251 RED-9585 - updated translation param 2024-12-03 17:30:58 +02:00
Dan Percic
003817ed9d Merge branch 'VM/RED-10301' into 'master'
RED-10301 - Use RM/DM UI depending on application type of tenant

Closes RED-10301

See merge request redactmanager/red-ui!737
2024-12-03 13:15:23 +01:00
Valentin Mihai
fb68e63bd0 Merge branch 'master' into VM/RED-10301 2024-12-03 12:39:06 +02:00
Valentin Mihai
e6a03c3b30 RED-10301 - update common ui (lint fix) 2024-12-03 12:38:13 +02:00
Valentin Mihai
fb8b3a3b09 RED-10301 - Use RM/DM UI depending on application type of tenant 2024-12-03 12:36:26 +02:00
Valentin-Gabriel Mihai
43fd966bf1 Merge branch 'RED-10531' into 'master'
RED-10531: disabled more buttons for file with error state.

See merge request redactmanager/red-ui!736
2024-11-29 13:14:16 +01:00
Nicoleta Panaghiu
315fa5a440 RED-10531: disabled more buttons for file with error state. 2024-11-29 14:12:14 +02:00
Valentin-Gabriel Mihai
3be593f464 Merge branch 'RED-10563' into 'master'
RED-10563: fixed key actions not prevented when input is focused.

See merge request redactmanager/red-ui!735
2024-11-29 11:40:02 +01:00
Nicoleta Panaghiu
8c47a8b758 RED-10563: grouped key events and extracted the target check. 2024-11-29 12:38:17 +02:00
Nicoleta Panaghiu
5515a5b4d6 RED-10563: fixed key actions not prevented when input is focused. 2024-11-29 12:27:59 +02:00
Valentin-Gabriel Mihai
cee0a92430 Merge branch 'RED-3800' into 'master'
RED-3800: localazy manual sync for redact.

See merge request redactmanager/red-ui!734
2024-11-29 10:11:04 +01:00
Nicoleta Panaghiu
ddc163f286 RED-3800: localazy manual sync for redact. 2024-11-29 11:09:53 +02:00
Valentin-Gabriel Mihai
81ce0bc708 Merge branch 'RED-10314' into 'master'
RED-10314: added missing help mode toggles and keys in dialogs.

See merge request redactmanager/red-ui!733
2024-11-28 17:35:54 +01:00
Nicoleta Panaghiu
29c870631b RED-10314: added missing help mode toggles and keys in dialogs. 2024-11-28 18:32:17 +02:00
Valentin-Gabriel Mihai
261674339a Merge branch 'RED-10563' into 'master'
RED-10563: fixed pdf search input.

See merge request redactmanager/red-ui!732
2024-11-28 15:26:39 +01:00
Nicoleta Panaghiu
bfb418fdfd RED-10563: fixed pdf search input. 2024-11-28 16:24:58 +02:00
Valentin-Gabriel Mihai
5c8c191151 Merge branch 'RED-3800' into 'master'
RED-3800: redact manager localazy manual sync.

See merge request redactmanager/red-ui!731
2024-11-28 10:14:52 +01:00
Nicoleta Panaghiu
9e558944d1 RED-3800: redact manager localazy manual sync. 2024-11-28 11:10:00 +02:00
Valentin-Gabriel Mihai
d8134f6d42 Merge branch 'RED-10531' into 'master'
RED-10531: enable assignToSelf on error files; display assignee.

See merge request redactmanager/red-ui!730
2024-11-28 09:57:19 +01:00
Nicoleta Panaghiu
aa3ae524f4 RED-10531: enable assignToSelf on error files; display assignee. 2024-11-27 20:18:15 +02:00
Valentin-Gabriel Mihai
cd2b12c35a Merge branch 'RED-10517' into 'master'
RED-10517: disabled scrolling for select all annotations.

See merge request redactmanager/red-ui!729
2024-11-27 16:14:42 +01:00
Nicoleta Panaghiu
b7e1e5764e RED-10517: disabled scrolling for select all annotations. 2024-11-27 16:54:04 +02:00
Valentin-Gabriel Mihai
9ef4ba4af5 Merge branch 'RED-9885' into 'master'
Resolve RED-9885

Closes RED-9885

See merge request redactmanager/red-ui!728
2024-11-27 15:36:10 +01:00
Nicoleta Panaghiu
86deaceade RED-9885: removed unused class, reset the config file to redact. 2024-11-27 16:31:58 +02:00
Nicoleta Panaghiu
fd76d110d4 RED-9885: implemented resize file-preview components. 2024-11-27 16:28:47 +02:00
Nicoleta Panaghiu
21f67651ff Merge branch 'master' into RED-9885 2024-11-27 16:23:53 +02:00
Nicoleta Panaghiu
0cf22e96bc Merge branch 'VM/RED-10373' into 'master'
RED-10373 - fixed bulk remove for multiple text redactions by splitting them...

Closes RED-10373

See merge request redactmanager/red-ui!727
2024-11-26 11:49:23 +01:00
Valentin Mihai
86eeab5e69 RED-10373 - fixed bulk remove for multiple text redactions by splitting them into multiple requests as bulk endpoint do not support a list of redactions 2024-11-26 12:44:24 +02:00
Nicoleta Panaghiu
e8c98be687 RED-9885 - wip 2024-11-25 18:19:43 +02:00
Dan Percic
bf04423524 Merge branch 'RED-10528' into 'master'
RED-10528: added support for F5 when the pdf viewer is focused.

See merge request redactmanager/red-ui!726
2024-11-25 14:58:27 +01:00
Nicoleta Panaghiu
25df51af78 RED-10528: added support for F5 when the pdf viewer is focused. 2024-11-25 15:55:49 +02:00
Nicoleta Panaghiu
6ef4b981fc Merge branch 'RED-10484' into 'master'
RED-10484: conditionally hide value placeholder.

See merge request redactmanager/red-ui!725
2024-11-25 14:45:10 +01:00
Nicoleta Panaghiu
4bd13949f6 RED-10484: conditionally hide value placeholder. 2024-11-25 14:55:32 +02:00
Dan Percic
5fea526d6c Merge branch 'RED-10426' into 'master'
RED-10426: rewrote sorting considering given point as bottom left.

See merge request redactmanager/red-ui!724
2024-11-25 13:54:03 +01:00
Nicoleta Panaghiu
0b367efa27 RED-10426: rewrote sorting considering given point as bottom left. 2024-11-25 14:28:48 +02:00
Dan Percic
8d60e8d864 Merge branch 'RED-10509' into 'master'
RED-10509: disabled stopPropagation on documine .

See merge request redactmanager/red-ui!723
2024-11-25 10:47:12 +01:00
Nicoleta Panaghiu
047a599809 RED-10509: disabled stopPropagation on documine . 2024-11-25 11:03:52 +02:00
Valentin-Gabriel Mihai
44d361b658 Merge branch 'RED-10509' into 'master'
RED-10509: disabled stopPropagation when editing file attribute.

See merge request redactmanager/red-ui!722
2024-11-24 13:05:48 +01:00
Nicoleta Panaghiu
780976243a RED-10509: disabled stopPropagation when editing file attribute. 2024-11-24 13:46:05 +02:00
Nicoleta Panaghiu
820dab3bfb Merge branch 'VM/RED-10504' into 'master'
RED-10504 - displayed all file annotations on documine when devMode is active...

Closes RED-10504

See merge request redactmanager/red-ui!721
2024-11-24 11:19:09 +01:00
Valentin Mihai
67020213ed RED-10504 - displayed all file annotations on documine when devMode is active and removed page filtering 2024-11-23 19:42:31 +02:00
Valentin-Gabriel Mihai
13e019b5e5 Merge branch 'RED-10515' into 'master'
RED-10515: fixed multi select for hidden annotations.

See merge request redactmanager/red-ui!720
2024-11-22 14:50:25 +01:00
Nicoleta Panaghiu
78c8dcb8e6 RED-10515: fixed multi select for hidden annotations. 2024-11-22 15:49:04 +02:00
Valentin-Gabriel Mihai
db90ae538e Merge branch 'RED-10498' into 'master'
RED-10498: included RED_ADMIN permission requirement.

See merge request redactmanager/red-ui!719
2024-11-22 11:33:17 +01:00
Nicoleta Panaghiu
97484c5f1a RED-10498: included RED_ADMIN permission requirement. 2024-11-22 12:31:08 +02:00
Nicoleta Panaghiu
1f6bdc30c8 Merge branch 'RED-10443-update' into 'master'
RED-10443 - 500 Error occurs when selecting ISO-8859-1 as Encoding Type for...

Closes RED-10443

See merge request redactmanager/red-ui!718
2024-11-22 10:30:10 +01:00
corinaolariu
19dd650510 RED-10443 - 500 Error occurs when selecting ISO-8859-1 as Encoding Type for any CSV File Format - update
- update also the key ISO encoding to ISO-8859-1
2024-11-22 11:18:38 +02:00
Corina Olariu
72d57ca342 Merge branch 'RED-10443' into 'master'
RED-10443 - 500 Error occurs when selecting ISO-8859-1 as Encoding Type for any CSV File Format

Closes RED-10443

See merge request redactmanager/red-ui!714
2024-11-22 08:16:57 +01:00
Valentin-Gabriel Mihai
fc3258ad9a Merge branch 'RED-10148' into 'master'
RED-10148: fixed text selection; implemented key listener for shift.

See merge request redactmanager/red-ui!717
2024-11-21 17:14:30 +01:00
Nicoleta Panaghiu
2632675cbe RED-10148: fixed text selection; implemented key listener for shift. 2024-11-21 18:12:45 +02:00
Valentin-Gabriel Mihai
b7c820e87c Merge branch 'RED-10405' into 'master'
RED-10405 - fixed toggle disabled state.

See merge request redactmanager/red-ui!716
2024-11-21 16:32:45 +01:00
Nicoleta Panaghiu
3578ed8512 RED-10405 - fixed toggle disabled state. 2024-11-21 17:29:18 +02:00
Valentin-Gabriel Mihai
7c719b4d26 Merge branch 'RED-10484' into 'master'
RED-10484: removed multiplePages option for imported rectangles.

See merge request redactmanager/red-ui!713
2024-11-21 13:49:21 +01:00
Nicoleta Panaghiu
4e3de53e45 RED-10484: removed multiplePages option for imported rectangles. 2024-11-21 14:47:52 +02:00
corinaolariu
13cba9831c RED-10443 - 500 Error occurs when selecting ISO-8859-1 as Encoding Type for any CSV File Format
- update the value of ISO encoding to ISO-8859-1
2024-11-21 14:47:26 +02:00
Nicoleta Panaghiu
c02863b079 Merge branch 'VM/RED-10483' into 'master'
RED-10483 - stop making additional dossier requests which leads to "Dossier...

Closes RED-10483

See merge request redactmanager/red-ui!712
2024-11-21 10:35:55 +01:00
Valentin Mihai
27e64380b0 RED-10483 - stop making additional dossier requests which leads to "Dossier not found" error when dossier is already deleted 2024-11-21 11:34:00 +02:00
Valentin-Gabriel Mihai
2699b36ab0 Merge branch 'RED-10498' into 'master'
RED-10498 - added the locked rules indicator; implemented the reset

See merge request redactmanager/red-ui!711
2024-11-20 16:28:02 +01:00
Nicoleta Panaghiu
420c59a862 RED-10498 - added the locked rules indicator; implemented the reset 2024-11-20 17:15:15 +02:00
Nicoleta Panaghiu
5ece842b2c Merge branch 'VM/RED-10396' into 'master'
RED-10396 - undefined checks

Closes RED-10396

See merge request redactmanager/red-ui!710
2024-11-20 14:12:07 +01:00
Maverick Studer
6f77cef2ab Merge branch 'feature/RED-10115' into 'master'
RED-10115: Refactoring of justifications

Closes RED-10115

See merge request redactmanager/red-ui!703
2024-11-20 10:38:28 +01:00
Maverick Studer
54b59ab90c RED-10115: Refactoring of justifications 2024-11-20 10:38:27 +01:00
Valentin Mihai
01fb7f0a1a RED-10396 - undefined checks 2024-11-20 10:01:17 +02:00
Valentin-Gabriel Mihai
d7586c2705 Merge branch 'RED-10363' into 'master'
RED-10363: check for rules on analysis btn click; refactor to signals.

See merge request redactmanager/red-ui!709
2024-11-19 17:22:09 +01:00
Nicoleta Panaghiu
b00ff1186d RED-10363: check for rules on analysis btn click; refactor to signals. 2024-11-19 18:05:07 +02:00
Dan Percic
9bea3c487a Merge branch 'VM/RED-10491' into 'master'
RED-10491 - updated view mode when page is changed

Closes RED-10491

See merge request redactmanager/red-ui!707
2024-11-19 09:12:39 +01:00
Valentin Mihai
2b2c72fe04 RED-10491 - updated view mode when page is changed 2024-11-18 20:44:45 +02:00
Nicoleta Panaghiu
edadf1ea41 Merge branch 'VM/RED-9996' into 'master'
RED-9996 - pre-filter available annotation filter types in new DocuMine component view

Closes RED-9996

See merge request redactmanager/red-ui!706
2024-11-18 17:26:16 +01:00
Valentin Mihai
c8e5752395 WIP on master
RED-9996 - pre-filter available annotation filter types in new DocuMine component view
2024-11-18 18:20:57 +02:00
Valentin-Gabriel Mihai
bac2d96605 Merge branch 'RED-10426' into 'master'
RED-10426: implemented another method of sorting rectangles.

See merge request redactmanager/red-ui!705
2024-11-18 17:07:50 +01:00
Nicoleta Panaghiu
063d40f845 RED-10426: implemented another method of sorting rectangles. 2024-11-18 17:31:25 +02:00
Dan Percic
881ad3a110 Merge branch 'RED-10405' into 'master'
RED-10405: removed locked rules pending type and fixed pending count.

See merge request redactmanager/red-ui!704
2024-11-18 11:07:24 +01:00
Nicoleta Panaghiu
c248f55fbd RED-10405: removed locked rules pending type and fixed pending count. 2024-11-18 11:39:35 +02:00
Dan Percic
2501bf5d56 Merge branch 'RED-10363' into 'master'
RED-10363: fixed cosmetical issue, added tooltips to and disabled btns.

See merge request redactmanager/red-ui!702
2024-11-14 10:08:38 +01:00
Dan Percic
48c8613f9b Merge branch 'VM/RED-10460' into 'master'
RED-10460 - enable switching the language in Edit Profile page in non-dev mode

Closes RED-10460

See merge request redactmanager/red-ui!701
2024-11-14 10:08:14 +01:00
Dan Percic
b26053efa4 Merge branch 'VM/RED-10461' into 'master'
RED-10461 - updated message when upload a zip file

Closes RED-10461

See merge request redactmanager/red-ui!700
2024-11-14 10:07:27 +01:00
Nicoleta Panaghiu
32ef5393e2 RED-10363: fixed cosmetical issue, added tooltips to and disabled btns. 2024-11-14 11:04:10 +02:00
Valentin Mihai
abc54fae4f RED-10460 - enable switching the language in Edit Profile page in non-dev mode 2024-11-13 21:51:16 +02:00
Valentin Mihai
d094001792 RED-10461 - updated message when upload a zip file 2024-11-13 20:29:55 +02:00
Valentin-Gabriel Mihai
573e1f3865 Merge branch 'RED-10405' into 'master'
RED-10405: check if file isError, indent pending type, remove unknown.

See merge request redactmanager/red-ui!698
2024-11-13 18:43:38 +01:00
Nicoleta Panaghiu
d99f96b079 RED-10405: check if file isError, indent pending type, remove unknown. 2024-11-13 15:06:34 +02:00
Dan Percic
4b68708624 Merge branch 'RED-10397' into 'master'
RED-10397: changed the active state for redacted btn; hid rectangle btn.

See merge request redactmanager/red-ui!697
2024-11-13 12:43:18 +01:00
Nicoleta Panaghiu
7e764cdf62 RED-10397: changed the active state for redacted btn; hid rectangle btn. 2024-11-13 13:35:33 +02:00
Nicoleta Panaghiu
32dd6e6ced Merge branch 'VM/RED-10453' into 'master'
RED-10453 - reload file or files (bulk case) after approval request

Closes RED-10453

See merge request redactmanager/red-ui!696
2024-11-13 10:43:01 +01:00
Valentin Mihai
fb9242f637 RED-10453 - reload file or files (bulk case) after approval request 2024-11-13 11:28:41 +02:00
Dan Percic
acf4a4f4d7 Merge branch 'RED-10405' into 'master'
RED-10405: added labels and filtering for separate file pending types.

See merge request redactmanager/red-ui!695
2024-11-13 09:38:33 +01:00
Nicoleta Panaghiu
260a53aaf1 RED-10405: added labels and filtering for separate file pending types. 2024-11-13 10:29:34 +02:00
Dan Percic
42d4829f2e Merge branch 'VM/RED-10332' into 'master'
RED-10332 - fixed dictionary dropdown that did not update when another dossier...

Closes RED-10332

See merge request redactmanager/red-ui!694
2024-11-13 08:29:21 +01:00
Valentin Mihai
6ac6f0a441 RED-10332 - fixed dictionary dropdown that did not update when another dossier template was selected 2024-11-12 22:10:05 +02:00
Dan Percic
54ad666355 Merge branch 'VM/RED-10373' into 'master'
RED-10373 - remove redaction dialog updates to be able to create multiple bulk...

Closes RED-10373

See merge request redactmanager/red-ui!693
2024-11-12 16:52:58 +01:00
Valentin Mihai
43f4cc6c9e RED-10373 - remove redaction dialog updates to be able to create multiple bulk requests for rectangle annotations 2024-11-12 17:25:59 +02:00
Dan Percic
6219ceb0a2 Merge branch 'RED-10440' into 'master'
RED-10440: map redacted image hints to redaction.

See merge request redactmanager/red-ui!692
2024-11-12 13:00:57 +01:00
Nicoleta Panaghiu
725c99211b RED-10440: map redacted image hints to redaction. 2024-11-12 13:51:35 +02:00
Dan Percic
bcf29eea45 Merge branch 'RED-10363' into 'master'
RED-10363: fixed distinctUntilChanged comparator.

See merge request redactmanager/red-ui!691
2024-11-12 12:17:56 +01:00
Nicoleta Panaghiu
0d4546bb9e RED-10363: fixed distinctUntilChanged comparator. 2024-11-12 12:55:20 +02:00
Dan Percic
e4ce12057b Merge branch 'nicoleta' into 'master'
RED-3800: fixed generic errors.

See merge request redactmanager/red-ui!690
2024-11-12 11:29:03 +01:00
Nicoleta Panaghiu
19ecd12c5f RED-3800: fixed generic errors. 2024-11-12 12:23:18 +02:00
Dan Percic
b96e55f42c Merge branch 'VM/RED-10396' into 'master'
RED-10396 - fixed current page active annotations re evaluation when they are updated

Closes RED-10396

See merge request redactmanager/red-ui!689
2024-11-12 09:41:59 +01:00
Valentin Mihai
31d4018698 RED-10396 - fixed current page active annotations re evaluation when they are updated 2024-11-12 10:37:13 +02:00
Valentin Mihai
ef26003755 RED-10396 - fixed current page active annotations re evaluation when they are updated 2024-11-11 20:50:04 +02:00
Dan Percic
931d311281 Merge branch 'RED-10440' into 'master'
RED-10440: fixed redacted image hint display color.

See merge request redactmanager/red-ui!688
2024-11-11 16:05:38 +01:00
Nicoleta Panaghiu
01eda98415 RED-10440: fixed redacted image hint display color. 2024-11-11 16:47:08 +02:00
Nicoleta Panaghiu
1b0fe9d352 Merge branch 'VM/RED-10339' into 'master'
RED-10339 - Secondary Save button in redaction dialogs to store selected option as default

Closes RED-10339

See merge request redactmanager/red-ui!687
2024-11-11 14:52:12 +01:00
Valentin Mihai
f31db95241 RED-10339 - Secondary Save button in redaction dialogs to store selected option as default 2024-11-11 15:44:37 +02:00
Dan Percic
ebedde5ed6 Merge branch 'RED-10420' into 'master'
RED-10420: prevent page refresh by using stop propagation.

See merge request redactmanager/red-ui!686
2024-11-11 14:30:04 +01:00
Nicoleta Panaghiu
8e2ab6c2c4 RED-10420: prevent page refresh by using stop propagation. 2024-11-11 15:01:52 +02:00
Dan Percic
e1308b6fd5 Merge branch 'RED-10422' into 'master'
RED-10422 - improved number of requests with help of new changes endpoint

Closes RED-10422

See merge request redactmanager/red-ui!683
2024-11-11 13:05:07 +01:00
Dan Percic
a5b3caea11 Merge branch 'RED-10427' into 'master'
RED-10427: send rectangle updated value for edit on multiple pages.

See merge request redactmanager/red-ui!685
2024-11-11 13:04:48 +01:00
Nicoleta Panaghiu
de1495ee2e RED-10427: send rectangle updated value for edit on multiple pages. 2024-11-11 14:01:28 +02:00
Dan Percic
7a78dd6547 Merge branch 'RED-10363' into 'master'
RED-10363: disable analysis button when rules are locked.

See merge request redactmanager/red-ui!684
2024-11-11 12:46:40 +01:00
Nicoleta Panaghiu
8cdb869a10 RED-10363: disable analysis button when rules are locked. 2024-11-11 12:23:47 +02:00
Dan Percic
f5639ec79d Merge branch 'VM/RED-10332' into 'master'
RED-10332 - Dossier Template not changeable when comparing dossier...

Closes RED-10332

See merge request redactmanager/red-ui!491
2024-11-08 16:08:36 +01:00
Dan Percic
3d31728194 Merge branch 'RED-10426' into 'master'
RED-10426: sort annotations according to visual alignment.

See merge request redactmanager/red-ui!490
2024-11-08 16:08:09 +01:00
Valentin Mihai
a996eaf53c Merge branch 'master' into VM/RED-10332 2024-11-08 17:06:53 +02:00
Valentin Mihai
f0b6cf9712 WIP on VM/RED-10332
RED-10332 - Dossier Template not changeable when comparing dossier dictionaries in Edit dossier modal
2024-11-08 17:06:29 +02:00
Nicoleta Panaghiu
470685a94f RED-10426: sort annotations according to visual alignment. 2024-11-08 17:01:41 +02:00
Dan Percic
c10b2c49b5 Merge branch 'VM/RED-9585' into 'master'
RED-9585 - Incorrect capitalization in German translation + missing singular/plural distinction

Closes RED-9585

See merge request redactmanager/red-ui!489
2024-11-08 13:12:15 +01:00
Valentin Mihai
f1aa0e4817 RED-9585 - Incorrect capitalization in German translation + missing singular/plural distinction 2024-11-08 13:39:20 +02:00
Valentin Mihai
82e31fffd8 RED-10332 - Dossier Template not changeable when comparing dossier dictionaries in Edit dossier modal 2024-11-08 13:27:37 +02:00
Timo Bejan
cdc5d2ee6c RED-10422 - improved number of requests with help of new changes endpoint 2024-11-07 15:41:33 +02:00
Dan Percic
3d26a73b05 Merge branch 'RED-10423' into 'master'
RED-10423: fixed multiple pages rectangle remove action.

See merge request redactmanager/red-ui!682
2024-11-07 12:53:28 +01:00
Nicoleta Panaghiu
b1fb38027d RED-10423: fixed multiple pages rectangle remove action. 2024-11-07 13:19:03 +02:00
Dan Percic
eef1139c0d Merge branch 'RED-9646' into 'master'
RED-9646: enable toaster notifications for zip files.

See merge request redactmanager/red-ui!681
2024-11-06 15:32:04 +01:00
Nicoleta Panaghiu
cb0bdb89c5 RED-9646: enable toaster notifications for zip files. 2024-11-06 16:09:25 +02:00
Timo Bejan
d6a4b11b65 Merge branch 'RED-10414' into 'master'
RED-10414 Removed offset and fixed notification polling

Closes RED-10414

See merge request redactmanager/red-ui!680
2024-11-06 14:49:41 +01:00
Timo Bejan
a80a75ca77 RED-10414 Removed offset and fixed notification polling 2024-11-06 15:49:19 +02:00
Timo Bejan
a56c66d19f Merge branch 'RED-10414' into 'master'
RED-10414 Removed offset and fixed notification polling

Closes RED-10414

See merge request redactmanager/red-ui!679
2024-11-06 14:43:20 +01:00
Timo Bejan
bc7e2483c2 RED-10414 Removed offset and fixed notification polling 2024-11-06 15:42:37 +02:00
Dan Percic
00decf1f6c Merge remote-tracking branch 'origin/master' into release/4.839.x 2024-11-05 22:00:00 +02:00
Dan Percic
306b524dee copilot working as a conversation 2024-11-05 21:58:07 +02:00
Dan Percic
f26772d4a0 Merge branch 'RED-3800' into 'master'
RED-3800: manual localazy sync.

See merge request redactmanager/red-ui!678
2024-11-05 11:19:53 +01:00
Nicoleta Panaghiu
e39ab31397 RED-3800: manual localazy sync. 2024-11-05 12:16:33 +02:00
Dan Percic
208a1568b3 Merge branch 'VM/RED-10373' into 'master'
RED-10373 - Singular-Plural disctinction in translation for remove in document

Closes RED-10373

See merge request redactmanager/red-ui!677
2024-11-04 16:34:38 +01:00
Valentin Mihai
a7a4c18715 RED-10373 - Singular-Plural disctinction in translation for remove in document 2024-11-04 16:56:25 +02:00
Dan Percic
9228976803 Merge branch 'VM/RED-10332' into 'master'
RED-10332 - Dossier Template not changeable when comparing dossier...

Closes RED-10332

See merge request redactmanager/red-ui!676
2024-11-04 15:29:19 +01:00
Valentin Mihai
6619b9f4de RED-10332 - Dossier Template not changeable when comparing dossier dictionaries in Edit dossier modal 2024-11-04 16:07:38 +02:00
Kilian Schüttler
9f1f654521 Merge branch 'ai-creation-placeholders' into 'master'
Update AI creation placeholders

See merge request redactmanager/red-ui!674
2024-11-04 13:39:58 +01:00
Kilian Schuettler
ad974ef07b Update AI creation placeholders 2024-11-04 13:33:45 +01:00
Dan Percic
ff8009167b other fixes 2024-11-04 13:03:12 +02:00
Dan Percic
b3dc8b04c8 wip web socket annotations 2024-11-01 19:22:50 +02:00
Valentin-Gabriel Mihai
5684f97389 Merge branch 'RED-10258' into 'master'
Fix text not displayed in viewer

See merge request redactmanager/red-ui!673
2024-11-01 16:28:48 +01:00
Dan Percic
bce93733c9 fix matTooltip import 2024-11-01 17:15:04 +02:00
Dan Percic
c677bc17e4 Merge branch 'master' into release/4.839.x 2024-11-01 17:04:11 +02:00
Nicoleta Panaghiu
91e344ae28 Merge branch 'RED-10258' into 'master'
Fix text not displayed in viewer

See merge request redactmanager/red-ui!672
2024-11-01 15:48:15 +01:00
Dan Percic
f4ad886a79 RED-10258 Add all available fonts 2024-11-01 16:40:23 +02:00
Valentin-Gabriel Mihai
ef51c2dbe3 Merge branch 'RED-10206' into 'master'
RED-10206: disable new dossier button when the template is invalid.

See merge request redactmanager/red-ui!671
2024-11-01 13:51:10 +01:00
Nicoleta Panaghiu
8984078767 RED-10206: disable new dossier button when the template is invalid. 2024-11-01 14:49:43 +02:00
Nicoleta Panaghiu
59231003ea Merge branch 'VM/RED-9944' into 'master'
RED-9944 - Action Items don't appear in document area in webviewer when...

Closes RED-9944

See merge request redactmanager/red-ui!670
2024-11-01 13:44:21 +01:00
Dan Percic
fb2fa6e6c2 Merge branch 'RED-10363' into 'master'
RED-10363: added a toaster error for locked dossier template rules.

See merge request redactmanager/red-ui!669
2024-11-01 10:21:57 +01:00
Nicoleta Panaghiu
dc253b0254 RED-10363: added a toaster error for locked dossier template rules. 2024-11-01 11:15:09 +02:00
Dan Percic
f3c1de430b Merge branch 'RED-10330' into 'master'
RED-10330: fixed remove in this context option permissions.

See merge request redactmanager/red-ui!668
2024-11-01 09:30:22 +01:00
Nicoleta Panaghiu
af5adade4d RED-10330: fixed remove in this context option permissions. 2024-11-01 10:24:53 +02:00
Dan Percic
d150fe6f80 Merge branch 'RED-10331' into 'master'
RED-10331: quick fix for jumping selection circle button.

See merge request redactmanager/red-ui!667
2024-11-01 07:57:00 +01:00
Nicoleta Panaghiu
ff132b2d87 RED-10331: quick fix for jumping selection circle button. 2024-11-01 08:42:20 +02:00
Valentin Mihai
90e8af9765 RED-9944 - Action Items don't appear in document area in webviewer when bulk-select is still unintenionally active 2024-10-31 19:55:26 +02:00
Valentin-Gabriel Mihai
ab27b6f63b Merge branch 'RED-10163' into 'master'
RED-10163: fix delete justification by using technical_name as id.

See merge request redactmanager/red-ui!666
2024-10-31 13:23:30 +01:00
Nicoleta Panaghiu
dcc711d4eb RED-10163: fix delete justification by using technical_name as id. 2024-10-31 14:02:52 +02:00
Valentin-Gabriel Mihai
95d57642c4 Merge branch 'RED-10258' into 'master'
Fix text not displayed in viewer?

See merge request redactmanager/red-ui!665
2024-10-31 11:35:27 +01:00
Dan Percic
7252119228 update watermarks webviewer 2024-10-31 11:54:06 +02:00
Dan Percic
0adf3288c8 upgrade pdf web viewer 2024-10-31 11:40:09 +02:00
Dan Percic
b30a6e159c update common-ui 2024-10-31 11:28:25 +02:00
Dan Percic
3c8a814abb update common-ui 2024-10-31 11:27:00 +02:00
Dan Percic
42093b81b2 other updates 2024-10-31 11:24:04 +02:00
Dan Percic
f11ffa18a1 ng updates 2024-10-31 11:17:49 +02:00
Dan Percic
8f541081ae Merge branch 'master' into release/4.839.x 2024-10-31 10:32:42 +02:00
Valentin-Gabriel Mihai
6a215c0440 Merge branch 'RED-10331' into 'master'
RED-10331: fixed missing remove-button from pdf-viewer on multi-select.

See merge request redactmanager/red-ui!664
2024-10-30 15:06:59 +01:00
Nicoleta Panaghiu
ada527370f RED-10331: fixed missing remove-button from pdf-viewer on multi-select. 2024-10-30 16:06:13 +02:00
Valentin-Gabriel Mihai
97f0230ac5 Merge branch 'RED-9663' into 'master'
RED-9663: removed UNASSIGNED option from the status filter.

See merge request redactmanager/red-ui!663
2024-10-30 15:03:06 +01:00
Nicoleta Panaghiu
1070d62e47 RED-9663: removed UNASSIGNED option from the status filter. 2024-10-30 15:26:51 +02:00
Dan Percic
ba3cb01f02 Merge branch 'VM/RED-10198' into 'master'
RED-10198 - missleading error message - creating user with existing email

Closes RED-10198

See merge request redactmanager/red-ui!662
2024-10-30 13:38:45 +01:00
Dan Percic
c52116f4e7 Merge branch 'VM/RED-10256' into 'master'
RED-10256 - Bulk-local: Changes should not be filtered + Remove for...

Closes RED-10256

See merge request redactmanager/red-ui!661
2024-10-30 13:38:06 +01:00
Valentin Mihai
c787881c76 RED-10198 - missleading error message - creating user with existing email 2024-10-30 14:36:06 +02:00
Valentin Mihai
fa7fd420a8 RED-10256 - Bulk-local: Changes should not be filtered + Remove for image-based redactions and hints 2024-10-30 14:22:50 +02:00
Dan Percic
12d30af308 Merge branch 'VM/RED-10048' into 'master'
RED-10048 - Improve display of error messages for csv files

Closes RED-10048

See merge request redactmanager/red-ui!660
2024-10-30 12:59:07 +01:00
Valentin Mihai
4695d31c72 RED-10048 - Improve display of error messages for csv files 2024-10-30 13:34:26 +02:00
Dan Percic
866e6ac45a Merge branch 'RED-10218' into 'master'
RED-10218: fixed fileNameColumn width overlap.

See merge request redactmanager/red-ui!659
2024-10-30 11:40:05 +01:00
Nicoleta Panaghiu
b1f8453daf RED-10218: fixed fileNameColumn width overlap. 2024-10-30 12:31:31 +02:00
Dan Percic
317d6d576b Merge branch 'annotation-id' into 'master'
Copy AnotationId to clipboard on ctrl + alt + click

See merge request redactmanager/red-ui!658
2024-10-30 11:00:28 +01:00
Kilian Schuettler
d66ea4e154 Copy AnotationId to clipboard on ctrl + alt + click 2024-10-30 09:19:12 +01:00
Valentin-Gabriel Mihai
bcfb915d93 Merge branch 'RED-10326' into 'master'
RED-10326: fix display of documents in trash on retention capacity chart.

See merge request redactmanager/red-ui!657
2024-10-29 15:40:13 +01:00
Nicoleta Panaghiu
e5c3d9c07b RED-10326: fix display of documents in trash on retention capacity chart. 2024-10-29 16:39:22 +02:00
Valentin-Gabriel Mihai
8a8c1b957f Merge branch 'RED-10320' into 'master'
RED-10320: removed general configuration header subtitle.

See merge request redactmanager/red-ui!656
2024-10-29 14:46:07 +01:00
Nicoleta Panaghiu
76b7ec9bc5 RED-10320: removed general configuration header subtitle. 2024-10-29 15:41:21 +02:00
Valentin-Gabriel Mihai
78fa17dc73 Merge branch 'RED-10275' into 'master'
RED-10275: differentiate available types by applyToAll flag state.

See merge request redactmanager/red-ui!655
2024-10-29 14:26:46 +01:00
Nicoleta Panaghiu
e678f6f4b3 RED-10275: differentiate available types by applyToAll flag state. 2024-10-29 15:23:33 +02:00
Valentin-Gabriel Mihai
2eb6d7b27c Merge branch 'RED-3800' into 'master'
RED-3800: localazy manual sync.

See merge request redactmanager/red-ui!654
2024-10-29 13:21:16 +01:00
Nicoleta Panaghiu
5805bb2a33 RED-3800: localazy manual sync. 2024-10-29 14:19:49 +02:00
Valentin-Gabriel Mihai
e92c7632d5 Merge branch 'RED-9733' into 'master'
RED-9733: translated initials in workload icons.

See merge request redactmanager/red-ui!653
2024-10-29 12:14:16 +01:00
Nicoleta Panaghiu
370b116656 RED-9733: translated initials in workload icons. 2024-10-29 13:11:33 +02:00
Valentin-Gabriel Mihai
35ebe4774f Merge branch 'RED-10244' into 'master'
RED-10244: fix dossier with files not having template field disabled.

See merge request redactmanager/red-ui!652
2024-10-28 17:23:05 +01:00
Nicoleta Panaghiu
8fab3fc04d RED-10244: fix dossier with files not having template field disabled. 2024-10-28 18:21:03 +02:00
Nicoleta Panaghiu
3dc63bf77c Merge branch 'VM/RED-7340' into 'master'
RED-7340 - Rectangle redactions: Use bulk-local redactions + New dialog design

Closes RED-7340

See merge request redactmanager/red-ui!651
2024-10-28 16:49:12 +01:00
Valentin Mihai
305bde5561 RED-7340 - Rectangle redactions: Use bulk-local redactions + New dialog design 2024-10-28 17:47:37 +02:00
Valentin-Gabriel Mihai
048356bf3f Merge branch 'RED-3800' into 'master'
RED-3800: localazy manual sync.

See merge request redactmanager/red-ui!650
2024-10-28 16:45:18 +01:00
Nicoleta Panaghiu
b389b07a6e RED-3800: localazy manual sync. 2024-10-28 17:38:35 +02:00
Nicoleta Panaghiu
7f72ef0021 Merge branch 'VM/RED-10256' into 'master'
RED-10256 - Bulk-local: Changes should not be filtered + Remove for image-based redactions

Closes RED-10256

See merge request redactmanager/red-ui!648
2024-10-28 16:33:36 +01:00
Nicoleta Panaghiu
395c9b0cd3 Merge branch 'RED-10262' into 'master'
RED-10262: fixed cancel resize.

See merge request redactmanager/red-ui!649
2024-10-28 16:27:58 +01:00
Nicoleta Panaghiu
7e44bdf1e2 RED-10262: fixed cancel resize. 2024-10-28 17:25:09 +02:00
Valentin Mihai
9e0ec97845 RED-10256 - Bulk-local: Changes should not be filtered + Remove for image-based redactions 2024-10-28 17:22:54 +02:00
Nicoleta Panaghiu
0259bcee06 Merge branch 'VM/RED-9944' into 'master'
RED-9944 - Action Items don't appear in document area in webviewer when...

Closes RED-9944

See merge request redactmanager/red-ui!647
2024-10-28 16:01:14 +01:00
Valentin Mihai
64e7cce171 RED-9944 - Action Items don't appear in document area in webviewer when bulk-select is still unintenionally active 2024-10-28 16:55:24 +02:00
Nicoleta Panaghiu
4e39914cff Merge branch 'VM/RED-10256' into 'master'
RED-10256 - Bulk-local: Changes should not be filtered + Remove for image-based redactions

Closes RED-10256

See merge request redactmanager/red-ui!646
2024-10-28 12:52:52 +01:00
Valentin Mihai
5347f986e4 Merge branch 'master' into VM/RED-10256 2024-10-28 13:52:11 +02:00
Valentin Mihai
7dd24698b1 WIP on VM/RED-10256
RED-10256 - Bulk-local: Changes should not be filtered + Remove for image-based redactions
2024-10-28 13:47:29 +02:00
Adina Teudan
a8534a8b13 Merge branch 'RED-10264' into 'master'
RED-10264: remove includeUnprocessed from all manual change calls

Closes RED-10264

See merge request redactmanager/red-ui!645
2024-10-28 12:38:44 +01:00
Dan Percic
d15cedd6d1 Merge branch 'RED-3800' into 'master'
RED-3800: manual localazy sync.

See merge request redactmanager/red-ui!643
2024-10-25 13:54:47 +02:00
Kilian Schuettler
51e46f20f4 RED-10264: remove includeUnprocessed from all manual change calls 2024-10-25 13:50:27 +02:00
Nicoleta Panaghiu
3a5a91f1e1 RED-3800: manual localazy sync. 2024-10-25 14:34:26 +03:00
Dan Percic
7e910b9339 Merge branch 'RED-9447' into 'master'
RED-9447 && RED-10244

See merge request redactmanager/red-ui!631
2024-10-25 12:31:51 +02:00
Maverick Studer
0fbf580293 RED-9447 && RED-10244 2024-10-25 12:31:51 +02:00
Dan Percic
d8b20774f4 Merge branch 'VM/RED-7340' into 'master'
RED-7340 - Rectangle redactions: Use bulk-local redactions + New dialog design

Closes RED-7340

See merge request redactmanager/red-ui!642
2024-10-24 10:01:12 +02:00
Dan Percic
63af59e624 Merge branch 'feature/RED-10260' into 'master'
feature/RED-10260: add quoteChar to componentMapping

Closes RED-10260

See merge request redactmanager/red-ui!640
2024-10-24 09:59:22 +02:00
Kilian Schüttler
61e9df1844 feature/RED-10260: add quoteChar to componentMapping 2024-10-24 09:59:21 +02:00
Valentin Mihai
a2823df27e RED-7340 - Rectangle redactions: Use bulk-local redactions + New dialog design 2024-10-23 23:47:20 +03:00
Dan Percic
7557025b01 Merge branch 'RED-8277' into 'master'
RED-8277: update common ui.

See merge request redactmanager/red-ui!639
2024-10-23 15:31:33 +02:00
Nicoleta Panaghiu
96662844b2 RED-8277: update common ui. 2024-10-23 16:10:01 +03:00
Dan Percic
16e7cdaa1f Merge branch 'RED-10255' into 'master'
RED-10255: fixed force ignored hint action.

See merge request redactmanager/red-ui!637
2024-10-22 18:19:53 +02:00
Nicoleta Panaghiu
feffcd5cdc RED-10255: fixed force ignored hint action. 2024-10-22 19:19:01 +03:00
Dan Percic
89d26778f2 Merge branch 'RED-10227' into 'master'
RED-10227: fixed audit log date filters.

See merge request redactmanager/red-ui!636
2024-10-22 18:01:22 +02:00
Nicoleta Panaghiu
b7ea2ac415 RED-10227: fixed audit log date filters. 2024-10-22 19:00:17 +03:00
Dan Percic
bb1f86c9d2 Merge branch 'RED-8277' into 'master'
RED-8277: update common ui.

See merge request redactmanager/red-ui!635
2024-10-22 16:58:59 +02:00
Nicoleta Panaghiu
cc972db41d RED-8277: update common ui. 2024-10-22 17:56:57 +03:00
Dan Percic
d9ce51f7e3 Merge branch 'RED-10220' into 'master'
RED-10220: description and legalBasis fields are no longer required.

See merge request redactmanager/red-ui!634
2024-10-22 16:46:47 +02:00
Nicoleta Panaghiu
5dd75f836c RED-10220: description and legalBasis fields are no longer required. 2024-10-22 17:40:37 +03:00
Dan Percic
b45627b4a7 Merge branch 'VM/RED-7340' into 'master'
RED-7340 - red border around the page input field should only appear after the...

Closes RED-7340

See merge request redactmanager/red-ui!633
2024-10-22 16:27:28 +02:00
Dan Percic
404e783060 Merge branch 'VM/RED-9944' into 'master'
RED-9944 - Action Items don't appear in document area in webviewer when bulk-select is still unintenionally active

Closes RED-9944

See merge request redactmanager/red-ui!632
2024-10-22 16:27:09 +02:00
Valentin Mihai
3515b9a942 RED-7340 - red border around the page input field should only appear after the user has finished entering the page range 2024-10-22 17:20:37 +03:00
Valentin Mihai
b244d1e4b4 WIP on master
RED-9944 - Action Items don't appear in document area in webviewer when bulk-select is still unintenionally active
2024-10-22 16:33:40 +03:00
Dan Percic
c4729167cd Merge branch 'RED-10220' into 'master'
RED-10220: added support for justification technical name.

See merge request redactmanager/red-ui!630
2024-10-22 11:46:41 +02:00
Nicoleta Panaghiu
a7b652c137 RED-10220: added support for justification technical name. 2024-10-22 12:45:34 +03:00
Dan Percic
d396b782a7 Merge branch 'VM/RED-7340' into 'master'
RED-7340 - When a user has entered an invalid page range string, display a...

Closes RED-7340

See merge request redactmanager/red-ui!629
2024-10-21 17:14:40 +02:00
Valentin Mihai
965166a349 RED-7340 - When a user has entered an invalid page range string, display a read border around the input field 2024-10-21 18:06:01 +03:00
Valentin-Gabriel Mihai
733f811f9d Merge branch 'RED-3800' into 'master'
RED-3800: manual localazy sync.

See merge request redactmanager/red-ui!628
2024-10-18 16:34:33 +02:00
Nicoleta Panaghiu
7e42932028 RED-3800: manual localazy sync. 2024-10-18 17:23:12 +03:00
Nicoleta Panaghiu
cdc58066f6 Merge branch 'VM/RED-9944' into 'master'
RED-9944 - Action Items don't appear in document area in webviewer when...

Closes RED-9944

See merge request redactmanager/red-ui!627
2024-10-18 13:34:17 +02:00
Valentin Mihai
224dafcae6 RED-9944 - Action Items don't appear in document area in webviewer when bulk-select is still unintenionally active 2024-10-18 14:32:06 +03:00
Dan Percic
bb3f59f1bb Merge branch 'VM/RED-9585' into 'master'
RED-9585 - Incorrect capitalization in German translation + missing singular/plural distinction

Closes RED-9585

See merge request redactmanager/red-ui!626
2024-10-17 14:01:31 +02:00
Valentin Mihai
876127d1fb RED-9585 - Incorrect capitalization in German translation + missing singular/plural distinction 2024-10-17 14:45:27 +03:00
Dan Percic
f27807097d Merge branch 'RED-8277' into 'master'
RED-8277: fix redirect when intending to open primary file attribute.

See merge request redactmanager/red-ui!625
2024-10-17 11:03:50 +02:00
Nicoleta Panaghiu
68bfcf6700 RED-8277: fix redirect when intending to open primary file attribute. 2024-10-17 12:02:23 +03:00
Nicoleta Panaghiu
829e009d4c Merge branch 'RED-3800' into 'master'
Localazy manual sync

Closes RED-3800

See merge request redactmanager/red-ui!624
2024-10-16 22:14:30 +02:00
Adina Țeudan
6dbe365362 Localazy manual sync 2024-10-16 21:37:30 +03:00
Dan Percic
db1d65e601 Merge branch 'VM/RED-9944' into 'master'
RED-9944 - cancel the bulk-selection mode when a user clicks somewhere else

Closes RED-9944

See merge request redactmanager/red-ui!623
2024-10-16 17:12:00 +02:00
Valentin Mihai
767e688d3c RED-9944 - cancel the bulk-selection mode when a user clicks somewhere else 2024-10-16 17:40:45 +03:00
Dan Percic
e647d4b355 Merge branch 'RED-8277' into 'master'
RED-8277: made it possible to open dossiers and files in a new tab.

See merge request redactmanager/red-ui!622
2024-10-16 14:30:31 +02:00
Nicoleta Panaghiu
b85559c686 RED-8277: made it possible to open dossiers and files in a new tab. 2024-10-16 15:27:33 +03:00
Dan Percic
6f353ce01d Merge branch 'VM/RED-7340' into 'master'
RED-7340 - prefill the range fields in the edit and remove dialogs

Closes RED-7340

See merge request redactmanager/red-ui!621
2024-10-16 13:37:26 +02:00
Valentin Mihai
5dfea0175d WIP on master
RED-7340 - prefill the range fields in the edit and remove dialogs
2024-10-16 14:35:48 +03:00
Dan Percic
b4c0ce17de Merge branch 'RED-10180' into 'master'
RED-10180: sync localazy translation.

See merge request redactmanager/red-ui!620
2024-10-16 13:13:40 +02:00
Dan Percic
c805887bbd Merge branch 'RED-10190' into 'master'
RED-10190: fixed notification padding.

See merge request redactmanager/red-ui!619
2024-10-16 13:13:23 +02:00
Nicoleta Panaghiu
d4b419ded8 RED-10180: sync localazy translation. 2024-10-16 14:09:58 +03:00
Nicoleta Panaghiu
a5e70e9def RED-10190: fixed notification padding. 2024-10-16 13:56:43 +03:00
Dan Percic
d06cd4be54 Merge branch 'VM/RED-7340' into 'master'
RED-7340 - Rectangle redactions: Use bulk-local redactions + New dialog design

Closes RED-7340

See merge request redactmanager/red-ui!618
2024-10-16 11:51:45 +02:00
Valentin Mihai
20d0334489 RED-7340 - Rectangle redactions: Use bulk-local redactions + New dialog design 2024-10-16 11:56:00 +03:00
Dan Percic
5438e800c7 Merge branch 'VM/RED-7340' into 'master'
RED-7340 - Rectangle redactions: Use bulk-local redactions + New dialog design

Closes RED-7340

See merge request redactmanager/red-ui!617
2024-10-15 16:20:01 +02:00
Valentin Mihai
4593b09bf3 RED-7340 - Rectangle redactions: Use bulk-local redactions + New dialog design 2024-10-15 15:43:13 +03:00
Dan Percic
33ed133f9f Merge branch 'RED-10180' into 'master'
RED-10180: update common ui + remove unused import.

See merge request redactmanager/red-ui!616
2024-10-14 16:27:05 +02:00
Nicoleta Panaghiu
fe2214d12c RED-10180: update common ui + remove unused import. 2024-10-14 17:26:09 +03:00
Dan Percic
2e41ac041e Merge branch 'RED-10190' into 'master'
RED-10190: fixed notifications redirect links.

See merge request redactmanager/red-ui!615
2024-10-14 16:11:22 +02:00
Dan Percic
98c3f749d8 Merge branch 'feature/RED-10072' into 'master'
RED-10072: AI description field and toggle for entities

Closes RED-10072

See merge request redactmanager/red-ui!614
2024-10-14 16:05:50 +02:00
Nicoleta Panaghiu
851b9fb3b2 RED-10190: fixed notifications redirect links. 2024-10-14 17:04:27 +03:00
Dan Percic
6aea290693 Merge branch 'RED-10182' into 'master'
RED-10182: fixed scrolling to annotation in workload upon selection.

See merge request redactmanager/red-ui!613
2024-10-14 15:58:07 +02:00
Nicoleta Panaghiu
ace0ecfce1 RED-10182: fixed scrolling to annotation in workload upon selection. 2024-10-14 16:34:00 +03:00
Dan Percic
a8c4f6dd29 Merge branch 'RED-10179' into 'master'
RED-10179 & RED-10177: fixed translations.

See merge request redactmanager/red-ui!612
2024-10-14 15:09:45 +02:00
Nicoleta Panaghiu
3818741453 RED-10179 & RED-10177: fixed translations. 2024-10-14 16:07:55 +03:00
Dan Percic
da3c18fde2 Merge branch 'RED-10132' into 'master'
RED-10132: save comment value for bulkLocal as well.

See merge request redactmanager/red-ui!611
2024-10-14 13:17:59 +02:00
Dan Percic
9836c2aab5 Merge branch 'RED-10183' into 'master'
RED-10183: use the user preferred language + component refactoring.

See merge request redactmanager/red-ui!610
2024-10-14 13:14:42 +02:00
maverickstuder
46202a0b64 RED-10072: AI description field and toggle for entities 2024-10-14 12:30:14 +02:00
Nicoleta Panaghiu
16a8d91815 RED-10132: save comment value for bulkLocal as well. 2024-10-14 13:21:49 +03:00
Nicoleta Panaghiu
6f5cd79a7f RED-10183: use the user preferred language + component refactoring. 2024-10-14 13:10:23 +03:00
Dan Percic
bf7fab3600 Merge branch 'RED-10011' into 'master'
RED-10011: Fixed broken menu after accessing configuration

Closes RED-10011

See merge request redactmanager/red-ui!609
2024-10-11 12:09:51 +02:00
Dominique Eifländer
d4653ca983 RED-10011: Fixed broken menu after accessing configuration 2024-10-11 11:22:24 +02:00
Nicoleta Panaghiu
c9444d7747 Merge branch 'VM/RED-9944' into 'master'
RED-9944 - Action Items don't appear in document area in webviewer when...

Closes RED-9944

See merge request redactmanager/red-ui!608
2024-10-10 15:54:43 +02:00
Valentin Mihai
287b95a538 RED-9944 - Action Items don't appear in document area in webviewer when bulk-select is still unintenionally active 2024-10-10 16:48:06 +03:00
Dan Percic
686f390b1a Merge branch 'RED-9381' into 'master'
RED-9381: added back the watermark pagination translations.

See merge request redactmanager/red-ui!607
2024-10-10 14:01:01 +02:00
Nicoleta Panaghiu
46fba3ca5a RED-9381: added back the watermark pagination translations. 2024-10-10 14:53:22 +03:00
Dan Percic
7d2f07d6b0 Merge branch 'RED-10105' into 'master'
RED-10105: added ids on dossier state related buttons.

See merge request redactmanager/red-ui!606
2024-10-10 11:57:20 +02:00
Nicoleta Panaghiu
6f9d2a7c85 RED-10105: added ids on dossier state related buttons. 2024-10-10 12:49:56 +03:00
Dan Percic
59998396d4 Merge branch 'RED-9554' into 'master'
RED-9554: use backend error message for dossier attributes.

See merge request redactmanager/red-ui!605
2024-10-09 18:07:45 +02:00
Nicoleta Panaghiu
60e151db0f RED-9554: use backend error message for dossier attributes. 2024-10-09 18:20:11 +03:00
Dan Percic
211d81ab7a Merge branch 'RED-9381' into 'master'
RED-9381: recovered translations for pdf viewer and annotation content.

See merge request redactmanager/red-ui!604
2024-10-09 16:58:41 +02:00
Nicoleta Panaghiu
eb255daac2 RED-9381: recovered translations for pdf viewer and annotation content. 2024-10-09 17:57:40 +03:00
Dan Percic
032b1eeabe Merge branch 'RED-10144' into 'master'
RED-10144: fixed multi-selection randomly activating.

See merge request redactmanager/red-ui!603
2024-10-09 16:31:04 +02:00
Nicoleta Panaghiu
4526138fae RED-10144: fixed multi-selection randomly activating. 2024-10-09 16:54:38 +03:00
Adina Teudan
428f1dd5fb Merge branch 'RED-10128' into 'master'
RED-10128: Incorrect File Extension for Downloaded (Multi-file) Reports

Closes RED-10128

See merge request redactmanager/red-ui!601
2024-10-08 16:55:48 +02:00
Nicoleta Panaghiu
4f4f286a5e Merge branch 'VM/RED-7340' into 'master'
RED-7340 - Rectangle redactions: Use bulk-local redactions + New dialog design

Closes RED-7340

See merge request redactmanager/red-ui!602
2024-10-08 14:26:04 +02:00
maverickstuder
05799650e6 RED-10128: Incorrect File Extension for Downloaded (Multi-file) Reports 2024-10-08 14:05:15 +02:00
Valentin Mihai
d67bef3001 Merge branch 'master' into VM/RED-7340 2024-10-08 00:52:34 +03:00
Valentin Mihai
76d329b888 RED-7340 - Rectangle redactions: Use bulk-local redactions + New dialog design 2024-10-08 00:51:21 +03:00
Adina Teudan
0329e74bbd Merge branch 'RED-10034' into 'master'
Resolve RED-10034

Closes RED-10034

See merge request redactmanager/red-ui!600
2024-10-07 18:35:16 +02:00
Adina Țeudan
9fabb7223a RED-10034: More performance improvements 2024-10-07 19:10:33 +03:00
Adina Țeudan
671c44438d RED-10034: File workload improvementes - WIP 2024-10-07 16:23:08 +03:00
Valentin Mihai
2377fbff55 RED-7340 - removed dictionary & false positive logic from rectangle annotation dialog 2024-10-05 22:55:28 +03:00
Valentin Mihai
af17c026ff Merge branch 'master' into VM/RED-7340 2024-10-05 20:51:23 +03:00
Valentin Mihai
7a1e968a52 RED-7340 - converted ManualAnnotationDialog into RectangleAnnotationDialog 2024-10-05 20:50:40 +03:00
Dan Percic
8e9f6e19bf Merge branch 'RED-3800' into 'master'
RED-3800: Localazy manual sync

Closes RED-3800

See merge request redactmanager/red-ui!599
2024-10-03 13:53:15 +02:00
Adina Țeudan
bef117a22c RED-3800: Localazy manual sync 2024-10-03 14:50:58 +03:00
Dan Percic
d4a50efc38 Merge branch 'RED-9559' into 'master'
RED-9559: dashboard skeleton, empty state and stats have the same width.

See merge request redactmanager/red-ui!598
2024-10-03 13:46:04 +02:00
Nicoleta Panaghiu
6693933941 RED-9559: dashboard skeleton, empty state and stats have the same width. 2024-10-03 14:33:09 +03:00
Dan Percic
b627b181e3 Merge branch 'RED-9578' into 'master'
RED-9578: fixed styles.

See merge request redactmanager/red-ui!597
2024-10-02 13:36:20 +02:00
Nicoleta Panaghiu
fcf159d091 RED-9578: fixed styles. 2024-10-02 14:32:57 +03:00
Dan Percic
aa9de3c369 Merge branch 'RED-9578' into 'master'
RED-9578: filter files without warnings.

See merge request redactmanager/red-ui!595
2024-09-30 13:11:32 +02:00
Nicoleta Panaghiu
b989da3f05 RED-9578: filter files without warnings. 2024-09-30 14:10:10 +03:00
Dan Percic
cdf39fd838 Merge branch 'RED-9722' into 'master'
RED-9722: split bulk remove-from-dict request into batches.

See merge request redactmanager/red-ui!594
2024-09-30 12:42:25 +02:00
Nicoleta Panaghiu
c3fbb9100a RED-9722: split bulk remove-from-dict request into batches. 2024-09-30 13:29:00 +03:00
Timo Bejan
fbc7dfce60 Merge branch 'RED-10034' into 'master'
RED-10034: Removed unnecessary draw call?

Closes RED-10034

See merge request redactmanager/red-ui!593
2024-09-28 16:13:35 +02:00
Adina Țeudan
bde8bd8475 Merge remote-tracking branch 'origin/master' into RED-10034 2024-09-28 17:10:10 +03:00
Adina Țeudan
c713b9d2f4 RED-10034: Improved UI components, reduced function calls 2024-09-28 17:06:43 +03:00
Dan Percic
25a0848c3e Merge branch 'RED-9381' into 'master'
Resolve RED-9381

Closes RED-9381

See merge request redactmanager/red-ui!592
2024-09-28 11:11:11 +02:00
Adina Țeudan
ccd008666e RED-10034: Removed unnecessary draw call? 2024-09-27 17:08:11 +03:00
Valentin Mihai
40d9eb15cf Merge branch 'master' into VM/RED-7340 2024-09-27 17:00:59 +03:00
Valentin Mihai
fad870e83e RED-7340 - WIP on Rectangle redactions: Use bulk-local redactions + New dialog design 2024-09-27 16:43:01 +03:00
Nicoleta Panaghiu
0f494b10d0 RED-9381: translations for annotation content tooltip. 2024-09-27 15:40:21 +03:00
Nicoleta Panaghiu
b2091d4f83 Merge remote-tracking branch 'origin/master' into RED-9381 2024-09-27 15:26:00 +03:00
Dan Percic
7b9c0d85cd Merge branch 'RED-9757' into 'master'
Resolve RED-9757

Closes RED-9757

See merge request redactmanager/red-ui!591
2024-09-27 12:35:24 +02:00
Adina Țeudan
5662cccc98 RED-9757: Updated translations 2024-09-26 21:23:28 +03:00
Adina Țeudan
2b6001402a RED-9757: Check for changes in dossier dictionary 2024-09-26 21:22:26 +03:00
Adina Țeudan
8d9df1f397 RED-9757: Fixed button display 2024-09-26 15:14:03 +03:00
Adina Țeudan
aa30982ff1 RED-9757: Show type switch for hints too 2024-09-26 15:11:44 +03:00
Adina Țeudan
c5f072f6b6 RED-9757: Working find panel toggle 2024-09-26 15:11:00 +03:00
Nicoleta Panaghiu
fb8e66e32d RED-9381: translations for pdf-viewer elements and watermarks editor. 2024-09-26 14:42:29 +03:00
Dan Percic
d457f9a46f Merge branch 'RED-7346' into 'master'
RED-7346: bulk-local edit redactions

Closes RED-7346

See merge request redactmanager/red-ui!590
2024-09-26 13:35:30 +02:00
Adina Țeudan
6bbe992940 RED-7346: bulk-local edit redactions 2024-09-26 14:31:11 +03:00
Valentin-Gabriel Mihai
1cb658f9d1 Merge branch 'RED-10064' into 'master'
RED-10064: added id on report container for hover + component refactor.

See merge request redactmanager/red-ui!589
2024-09-26 13:21:13 +02:00
Nicoleta Panaghiu
b3de35eac7 RED-10064: added id on report container for hover + component refactor. 2024-09-26 14:00:06 +03:00
Dan Percic
5bb7c780a1 Merge branch 'RED-9985' into 'master'
RED-9985: prevent filter categories from collapsing upon selection.

See merge request redactmanager/red-ui!588
2024-09-26 11:19:53 +02:00
Nicoleta Panaghiu
5c5d1dc877 RED-9985: prevent filter categories from collapsing upon selection. 2024-09-26 11:52:21 +03:00
Nicoleta Panaghiu
8ab324f69e Merge branch 'VM/RED-7345' into 'master'
RED-7345 - added translation for value

Closes RED-7345

See merge request redactmanager/red-ui!587
2024-09-25 15:17:40 +02:00
Valentin Mihai
e30a54297a RED-7345 - added translation for value 2024-09-25 16:14:00 +03:00
Dan Percic
c4fc832ef6 Merge branch 'RED-9486' into 'master'
RED-9486: fixed naming of images in remove dialog.

See merge request redactmanager/red-ui!586
2024-09-25 13:57:49 +02:00
Nicoleta Panaghiu
750312c59e RED-9486: fixed naming of images in remove dialog. 2024-09-25 14:54:14 +03:00
Dan Percic
e8665f7484 Merge branch 'RED-9578' into 'master'
RED-9578: fixed issues and rewrote the annotations table component.

See merge request redactmanager/red-ui!585
2024-09-25 12:56:21 +02:00
Nicoleta Panaghiu
81669177cd RED-9578: fixed issues and rewrote the annotations table component. 2024-09-25 13:54:26 +03:00
Dan Percic
dc063218ff Merge branch 'RED-10011' into 'master'
RED-10011: Show stmp configuration only if license feature configurableSMTPServer is set to true

Closes RED-10011

See merge request redactmanager/red-ui!584
2024-09-24 10:56:34 +02:00
Dominique Eifländer
004025636c RED-10011: Show stmp configuration only if license feature configurableSMTPServer is set to true 2024-09-24 10:52:20 +02:00
Dan Percic
5a2e806e4a Merge branch 'VM/RED-7345' into 'master'
RED-7345 - Add/Remove bulk-local text redaction option in dialogs

Closes RED-7345

See merge request redactmanager/red-ui!583
2024-09-24 08:48:32 +02:00
Valentin Mihai
b918933665 RED-7345 - Add/Remove bulk-local text redaction option in dialogs 2024-09-24 09:47:07 +03:00
Nicoleta Panaghiu
e39e2522aa Merge branch 'VM/RED-7345' into 'master'
VM/RED-7345 - Add/Remove bulk-local text redaction option in dialogs

Closes RED-7345

See merge request redactmanager/red-ui!582
2024-09-23 16:32:56 +02:00
Valentin Mihai
8caa92d663 Merge branch 'master' into VM/RED-7345 2024-09-23 17:24:03 +03:00
Valentin Mihai
0be67a8589 RED-7345 - added bulk local remove logic for "remove redaction" dialog 2024-09-23 17:23:15 +03:00
Dominique Eifländer
d0250f3fd0 Merge branch 'RED-10084' into 'master'
RED-10084: All members of a dossier are able to reanalyse files in error...

Closes RED-10084

See merge request redactmanager/red-ui!575
2024-09-23 15:47:29 +02:00
Valentin-Gabriel Mihai
a11bb2282f Merge branch 'RED-9822' into 'master'
RED-9822: DocuMine translations

Closes RED-9822

See merge request redactmanager/red-ui!581
2024-09-23 15:05:40 +02:00
Adina Țeudan
664410821c RED-9822: DocuMine translations 2024-09-23 16:04:53 +03:00
Valentin-Gabriel Mihai
a2a0defa23 Merge branch 'RED-9993' into 'master'
RED-9993: fixed license labels.

See merge request redactmanager/red-ui!580
2024-09-23 14:59:22 +02:00
Nicoleta Panaghiu
c6595c6481 RED-9993: fixed license labels. 2024-09-23 15:56:31 +03:00
Valentin-Gabriel Mihai
cbedb8370b Merge branch 'RED-9840' into 'master'
RED-9840: Allow to open global search results in a new browser tab

Closes RED-9840

See merge request redactmanager/red-ui!579
2024-09-23 14:53:11 +02:00
Adina Țeudan
b92d9c9e04 RED-9840: Allow to open global search results in a new browser tab 2024-09-23 15:52:20 +03:00
Valentin-Gabriel Mihai
bd054ecedd Merge branch 'RED-9757' into 'master'
Revision of the dossier dictionary presentation

Closes RED-9757

See merge request redactmanager/red-ui!576
2024-09-23 14:45:37 +02:00
Valentin-Gabriel Mihai
9dfa101afe Merge branch 'RED-9170' into 'master'
Use new transactional endpoint for updating dictionaries

Closes RED-9170

See merge request redactmanager/red-ui!578
2024-09-23 14:45:26 +02:00
Valentin Mihai
f52a378280 WIP on VM/RED-7345
RED-7345 - adapted "force redaction" and "accept recommendation" dialogs to use new bulk-local api
2024-09-23 14:45:54 +03:00
Adina Țeudan
bda96f952e Use new transactional endpoint for updating dictionaries 2024-09-23 14:12:29 +03:00
Valentin-Gabriel Mihai
79fb9bd785 Merge branch 'RED-9830' into 'master'
RED-9830: Don't send additional comment request for annotation edit

Closes RED-9830

See merge request redactmanager/red-ui!577
2024-09-23 12:26:04 +02:00
Adina Țeudan
5de6b359ee Revision of the dossier dictionary presentation 2024-09-23 13:18:05 +03:00
Dominique Eifländer
b5f1afb81e RED-10084: All members of a dossier are able to reanalyse files in error state, no only the owner or assignee 2024-09-23 11:53:26 +02:00
Christoph Schabert
63e53cb2ed Update .gitlab-ci.yml file 2024-09-23 11:31:08 +02:00
Christoph Schabert
7f08355311 Update .gitlab-ci.yml file 2024-09-23 11:25:36 +02:00
Valentin-Gabriel Mihai
76403ef8ea Merge branch 'RED-10028' into 'master'
RED-10028: added OPTIMIZED_PREVIEW file type in download selection.

See merge request redactmanager/red-ui!574
2024-09-23 11:25:01 +02:00
Christoph Schabert
12768b5219 Update .gitlab-ci.yml file 2024-09-23 11:22:16 +02:00
Christoph Schabert
aa2012bbda Update .gitlab-ci.yml file 2024-09-23 11:19:06 +02:00
Nicoleta Panaghiu
179abe4f37 RED-10028: added OPTIMIZED_PREVIEW file type in download selection. 2024-09-23 11:58:39 +03:00
Adina Țeudan
43154346e3 RED-9830: Don't send additional comment request for annotation edit 2024-09-23 11:54:00 +03:00
Valentin Mihai
1b9128a68f Merge branch 'master' into VM/RED-7345 2024-09-23 11:12:25 +03:00
Valentin Mihai
b5b465d56f RED-7345 - update common ui 2024-09-23 11:11:02 +03:00
Dan Percic
94cbb2cf3d Merge branch 'RED-9900' into 'master'
RED-9900: removed help mode helper elements from hidden buttons.

See merge request redactmanager/red-ui!573
2024-09-19 16:59:11 +02:00
Dan Percic
a51e68c3d8 Merge branch 'RED-9578' into 'master'
RED-9578: implemented the new approval modal layout.

See merge request redactmanager/red-ui!572
2024-09-19 16:58:56 +02:00
Nicoleta Panaghiu
7208126584 RED-9900: removed help mode helper elements from hidden buttons. 2024-09-19 17:36:15 +03:00
Nicoleta Panaghiu
256305d12f RED-9578: implemented the new approval modal layout. 2024-09-19 15:03:32 +03:00
Dan Percic
7996bc7e23 Merge branch 'RED-10050' into 'master'
RED-10050: fixed navigating to doc with filtered annotations issue.

See merge request redactmanager/red-ui!571
2024-09-18 13:06:24 +02:00
Nicoleta Panaghiu
e86a7cf59f RED-10050: fixed navigating to doc with filtered annotations issue. 2024-09-18 13:57:54 +03:00
Dan Percic
6abcbc96ac Merge branch 'RED-10064' into 'master'
RED-10064: added ids for report documents.

See merge request redactmanager/red-ui!570
2024-09-17 16:39:41 +02:00
Nicoleta Panaghiu
b23c3e60d7 RED-10064: added ids for report documents. 2024-09-17 17:38:35 +03:00
Valentin Mihai
2f6d460442 RED-7345 - WIP Add/Remove bulk-local text redaction option in dialogs 2024-09-16 21:16:06 +03:00
Dan Percic
3cd1eaeddc Merge branch 'RED-9993' into 'master'
RED-9993: fixed license information.

See merge request redactmanager/red-ui!569
2024-09-13 10:04:40 +02:00
Nicoleta Panaghiu
feb3aa34e9 RED-9993: fixed license information. 2024-09-13 10:58:25 +03:00
Dan Percic
7f8c622f6b Merge branch 'RED-9372' into 'master'
Resolve RED-9372

Closes RED-9372

See merge request redactmanager/red-ui!568
2024-09-10 10:45:56 +02:00
Nicoleta Panaghiu
6628cf3495 RED-9372: update common ui. 2024-09-10 11:38:23 +03:00
Nicoleta Panaghiu
e6f3cd77de RED-9372: fixed scrolling on dossier details. 2024-09-10 11:36:29 +03:00
Dan Percic
8705524a4b Merge branch 'VM/RED-10016' into 'master'
RED-10016 - DM: Permanent loading triggerd when trying to edit the component

Closes RED-10016

See merge request redactmanager/red-ui!567
2024-09-10 09:12:54 +02:00
Valentin Mihai
4475f5979e RED-10016 - DM: Permanent loading triggerd when trying to edit the component 2024-09-10 09:45:35 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
93321437c1 push back localazy update 2024-09-10 01:03:26 +00:00
Dan Percic
0bf7f5f9ce Merge branch 'RED-9372' into 'master'
Resolve RED-9372

Closes RED-9372

See merge request redactmanager/red-ui!566
2024-09-05 16:19:56 +02:00
Nicoleta Panaghiu
ef8b1bc58e RED-9372: update common ui. 2024-09-05 17:17:49 +03:00
Nicoleta Panaghiu
8f938c825d RED-9372: fixed annotation details moving on hover. 2024-09-05 17:17:32 +03:00
Dan Percic
766ba97a0e Merge branch 'RED-9950' into 'master'
RED-9950: increased component management section width by 5%.

See merge request redactmanager/red-ui!565
2024-09-05 14:06:50 +02:00
Nicoleta Panaghiu
24c433dd5b RED-9950: increased component management section width by 5%. 2024-09-05 14:58:44 +03:00
Valentin-Gabriel Mihai
570dc20e8e Merge branch 'VM/RED-9548' into 'master'
RED-9548 - updated isModifyDictionary check

Closes RED-9548

See merge request redactmanager/red-ui!564
2024-09-05 13:25:24 +02:00
Valentin Mihai
34be5155c4 RED-9548 - updated isModifyDictionary check 2024-09-05 14:23:41 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
e752e4607c push back localazy update 2024-09-05 01:03:30 +00:00
Dan Percic
9e5ab63434 Merge branch 'VM/RED-9962' into 'master'
RED-9962 - RM-163: Components values are not updated in the UI until page is refreshed

Closes RED-9962

See merge request redactmanager/red-ui!563
2024-09-04 14:55:22 +02:00
Valentin Mihai
66cd961fc3 WIP on master
RED-9962 - RM-163: Components values are not updated in the UI until page is refreshed
2024-09-04 15:49:41 +03:00
Dan Percic
6216dd8bac Merge branch 'RED-9950' into 'master'
RED-9950: decreased component management width.

See merge request redactmanager/red-ui!562
2024-09-04 14:32:42 +02:00
Nicoleta Panaghiu
3677b7d761 RED-9950: decreased component management width. 2024-09-04 14:39:44 +03:00
Dan Percic
eae53022ee Merge branch 'RED-9937' into 'master'
RED-9937: made preview tab available & trigger reanalysis when required.

See merge request redactmanager/red-ui!561
2024-09-04 12:39:59 +02:00
Nicoleta Panaghiu
24e793582d RED-9937: made preview tab available & trigger reanalysis when required. 2024-09-04 13:29:36 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
01b8948b6a push back localazy update 2024-09-04 01:03:33 +00:00
Dan Percic
1b3dbfc98d Merge branch 'RED-9987' into 'master'
RED-9987: added sendSetPasswordMail flag in add user dialog.

See merge request redactmanager/red-ui!560
2024-09-03 13:44:04 +02:00
Nicoleta Panaghiu
a2930ccfdd RED-9987: added sendSetPasswordMail flag in add user dialog. 2024-09-03 14:42:59 +03:00
Dan Percic
201f4ca07f Merge branch 'VM/RED-9454' into 'master'
RED-9454 - Differences between Add Hint- and Add Redaction-Dialog

Closes RED-9454

See merge request redactmanager/red-ui!559
2024-09-03 13:06:11 +02:00
Valentin Mihai
e81e8e7252 RED-9454 - Differences between Add Hint- and Add Redaction-Dialog 2024-09-03 13:34:48 +03:00
Dan Percic
9d01fb5784 Merge branch 'RED-9950' into 'master'
RED-9950: removed more margins.

See merge request redactmanager/red-ui!558
2024-09-03 11:26:42 +02:00
Nicoleta Panaghiu
9921e868bc RED-9950: removed more margins. 2024-09-03 12:24:44 +03:00
Dan Percic
9dd6085bcf Merge branch 'master' into release/4.839.x 2024-09-02 16:48:59 +03:00
Dan Percic
2d1928ebd0 Merge branch 'RED-9950' into 'master'
RED-9950: increased document viewer space.

See merge request redactmanager/red-ui!557
2024-08-29 16:22:00 +02:00
Nicoleta Panaghiu
095853d090 RED-9950: increased document viewer space. 2024-08-29 17:19:27 +03:00
Dan Percic
fe46e69c53 Merge branch 'RED-9951' into 'master'
RED-9951: made document info scrollable & fixed paginator position.

See merge request redactmanager/red-ui!556
2024-08-29 12:08:40 +02:00
Nicoleta Panaghiu
a55571a381 RED-9951: made document info scrollable & fixed paginator position. 2024-08-29 13:03:14 +03:00
Dan Percic
7d449d3ff7 Merge branch 'RED-9887' into 'master'
RED-9887: fixed save button being disabled.

See merge request redactmanager/red-ui!555
2024-08-28 12:46:00 +02:00
Nicoleta Panaghiu
db1257751a RED-9887: fixed save button being disabled. 2024-08-28 13:22:37 +03:00
Dan Percic
43830f463d Merge branch 'RED-9946' into 'master'
RED-9946: added tooltip with valueDescription.

See merge request redactmanager/red-ui!554
2024-08-27 14:10:38 +02:00
Nicoleta Panaghiu
e798197110 RED-9946: added tooltip with valueDescription. 2024-08-27 15:09:41 +03:00
Dan Percic
35f2161913 Merge branch 'RED-9887' into 'master'
RED-9887: fixed component fields cancel and revert actions.

See merge request redactmanager/red-ui!553
2024-08-27 13:34:35 +02:00
Nicoleta Panaghiu
6f8edaf4ba RED-9887: fixed component fields cancel and revert actions. 2024-08-27 14:28:40 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
80a713d850 push back localazy update 2024-08-22 01:03:26 +00:00
Dan Percic
ed518d6910 Merge branch 'RED-9824' into 'master'
RED-9824: fixed toaster notification message for edit annotation action.

See merge request redactmanager/red-ui!552
2024-08-21 10:35:12 +02:00
Nicoleta Panaghiu
7ad36ea6f6 RED-9824: fixed toaster notification message for edit annotation action. 2024-08-21 11:33:33 +03:00
Dan Percic
65fc2971ac Merge branch 'RED-9893' into 'master'
RED-9893: show missing type toaster only once.

See merge request redactmanager/red-ui!551
2024-08-21 09:59:10 +02:00
Nicoleta Panaghiu
4438f90af4 RED-9893: show missing type toaster only once. 2024-08-21 10:53:13 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
2daa033b8e push back localazy update 2024-08-21 01:03:27 +00:00
Dan Percic
726f909589 Merge branch 'RED-9889' into 'master'
RED-9889: escape html in component values.

See merge request redactmanager/red-ui!550
2024-08-20 14:13:06 +02:00
Nicoleta Panaghiu
6a6db17d2c RED-9889: escape html in component values. 2024-08-20 15:11:30 +03:00
Dan Percic
021775d3a7 Merge branch 'RED-9916' into 'master'
RED-9916: update common ui.

See merge request redactmanager/red-ui!549
2024-08-20 12:26:58 +02:00
Nicoleta Panaghiu
88ef8830c2 RED-9916: update common ui. 2024-08-20 13:22:40 +03:00
Dan Percic
eb9bd777e0 fix merge 2024-08-19 12:03:29 +03:00
Dan Percic
e3ef820bac Merge branch 'release/4.839.x' of https://gitlab.knecon.com/redactmanager/red-ui into release/4.839.x 2024-08-19 12:02:30 +03:00
Dan Percic
9317f55d81 fix delete annotation 2024-08-19 12:01:09 +03:00
Dan Percic
5d7849be45 filter removed entries 2024-08-19 10:21:49 +03:00
Dan Percic
74b4c1a11f reload entity log when file is assigned to current user 2024-08-19 10:19:53 +03:00
Dan Percic
0f79f04f52 Merge remote-tracking branch 'origin/master' into RED-9747 2024-08-18 01:38:11 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
ea07686946 push back localazy update 2024-08-16 01:03:28 +00:00
Nicoleta Panaghiu
3df6005549 Merge branch 'VM/RED-9862' into 'master'
RED-9862 - Broken resize dialog for imported redaction from preview file with disabled auto-analysis on upload

Closes RED-9862

See merge request redactmanager/red-ui!548
2024-08-15 12:27:25 +02:00
Nicoleta Panaghiu
511f24e3ef Merge branch 'VM/RED-9260' into 'master'
RED-9260 - Component Management UI

Closes RED-9260

See merge request redactmanager/red-ui!547
2024-08-15 12:22:11 +02:00
Valentin Mihai
4e49d2d7a6 WIP on master
RED-9862 - Broken resize dialog for imported redaction from preview file with disabled auto-analysis on upload
2024-08-15 09:48:00 +03:00
Valentin Mihai
c7e03043e0 RED-9890 - New created component-definition is not displayed in the list of component-definitions 2024-08-15 09:15:03 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
f85626a8e4 push back localazy update 2024-08-15 01:03:23 +00:00
Dan Percic
6282675682 merge fixes 2024-08-14 15:40:40 +03:00
Dan Percic
747d8157b5 Merge remote-tracking branch 'origin/master' into RED-9747 2024-08-14 15:37:28 +03:00
Valentin Mihai
1bcd1869f0 RED-9260 - Component Management UI 2024-08-14 12:46:50 +03:00
Valentin-Gabriel Mihai
95c273e7b2 Merge branch 'RED-9777' into 'master'
RED-9777: added help button on edit and remove annotation dialogs.

See merge request redactmanager/red-ui!546
2024-08-14 10:50:16 +02:00
Nicoleta Panaghiu
6236275528 RED-9777: added help button on edit and remove annotation dialogs. 2024-08-14 11:43:22 +03:00
Valentin-Gabriel Mihai
d654bcfc4b Merge branch 'RED-9589' into 'master'
RED-9589: removed FP option for locally removed and forced redactions.

See merge request redactmanager/red-ui!545
2024-08-14 10:06:26 +02:00
Nicoleta Panaghiu
fcbffdad8f RED-9589: removed FP option for locally removed and forced redactions. 2024-08-14 11:02:28 +03:00
Nicoleta Panaghiu
8079079217 Merge branch 'VM/RED-9201' into 'master'
RED-9201 - UI for Component Mapping Tables

Closes RED-9201

See merge request redactmanager/red-ui!544
2024-08-14 09:47:09 +02:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
87fa2df399 push back localazy update 2024-08-14 01:03:23 +00:00
Valentin-Gabriel Mihai
5d6d69c8c4 Merge branch 'RED-9572' into 'master'
RED-9572: Format audit log values

Closes RED-9572

See merge request redactmanager/red-ui!543
2024-08-13 20:06:19 +02:00
Valentin Mihai
538f36aebc WIP on master
RED-9201 - UI for Component Mapping Tables
2024-08-13 21:04:47 +03:00
Adina Țeudan
9067272382 RED-9572: Format audit log values 2024-08-13 18:57:09 +03:00
Valentin-Gabriel Mihai
bc430a796f Merge branch 'RED-9874' into 'master'
RED-9874: added user preference for overwrite file option.

See merge request redactmanager/red-ui!542
2024-08-13 14:03:55 +02:00
Nicoleta Panaghiu
24fc875cc9 RED-9874: added user preference for overwrite file option. 2024-08-13 15:02:32 +03:00
Nicoleta Panaghiu
fc8a9da8cd Merge branch 'VM/RED-9201' into 'master'
RED-9201 - UI for Component Mapping Tables

Closes RED-9201

See merge request redactmanager/red-ui!541
2024-08-13 10:01:43 +02:00
Nicoleta Panaghiu
486ef92b07 Merge branch 'VM/RED-9260' into 'master'
RED-9260 - Component Management UI

See merge request redactmanager/red-ui!540
2024-08-13 09:52:27 +02:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
630db9071a push back localazy update 2024-08-13 01:03:23 +00:00
Valentin Mihai
8e2219235d RED-9201 - UI for Component Mapping Tables 2024-08-12 21:36:04 +03:00
Valentin-Gabriel Mihai
0a05d02623 Merge branch 'RED-7270' into 'master'
RED-7270: Display backend provided error message for dossier states

Closes RED-7270

See merge request redactmanager/red-ui!539
2024-08-12 20:09:19 +02:00
Valentin Mihai
f242c52a0c RED-9260 - update config 2024-08-12 21:00:21 +03:00
Valentin Mihai
6e115038b0 RED-9260 - Component Management UI 2024-08-12 20:54:30 +03:00
Adina Țeudan
428debcd6f RED-7270: Display backend provided error message for dossier states 2024-08-12 20:51:53 +03:00
Valentin Mihai
ddbef9bd11 Merge branch 'master' into VM/RED-9260 2024-08-12 19:24:41 +03:00
Valentin-Gabriel Mihai
1dc013e46b Merge branch 'RED-9835' into 'master'
RED-9835: removed experimental feature warning.

See merge request redactmanager/red-ui!538
2024-08-12 14:12:01 +02:00
Nicoleta Panaghiu
d409811aa6 RED-9835: removed experimental feature warning. 2024-08-12 15:08:10 +03:00
Valentin-Gabriel Mihai
ecb7b89f31 Merge branch 'RED-9762' into 'master'
RED-9762: removed open component view preference.

See merge request redactmanager/red-ui!537
2024-08-12 13:58:38 +02:00
Nicoleta Panaghiu
8a3d372223 RED-9762: removed open component view preference. 2024-08-12 13:42:29 +03:00
Valentin-Gabriel Mihai
3544538c19 Merge branch 'RED-9861' into 'master'
RED-9861: fixed bulk-select issues.

See merge request redactmanager/red-ui!536
2024-08-12 12:24:33 +02:00
Nicoleta Panaghiu
f82cdcf5bb RED-9861: fixed bulk-select issues. 2024-08-12 13:22:47 +03:00
Nicoleta Panaghiu
e6a3b1a585 Merge branch 'RED-9866' into 'master'
RED-9866: remove version limit on ARCHIVE DOSSIER feature.

See merge request redactmanager/red-ui!535
2024-08-12 10:45:17 +02:00
Nicoleta Panaghiu
8d970779f5 RED-9866: remove version limit on ARCHIVE DOSSIER feature. 2024-08-12 11:29:23 +03:00
Nicoleta Panaghiu
954fba26f7 Merge branch 'VM/RED-8748' into 'master'
RED-8748 - Integrated component view in DocuMine

Closes RED-8748

See merge request redactmanager/red-ui!533
2024-08-12 10:29:02 +02:00
Valentin-Gabriel Mihai
25418ced4a Merge branch 'RED-9777' into 'master'
RED-9777: added help mode missing links.

See merge request redactmanager/red-ui!534
2024-08-12 10:25:27 +02:00
Nicoleta Panaghiu
591b6eee36 RED-9777: fix. 2024-08-12 11:20:23 +03:00
Nicoleta Panaghiu
d7cc8e3232 RED-9777: update common ui. 2024-08-12 11:16:24 +03:00
Nicoleta Panaghiu
0d7adb4e6b RED-9777: added help mode missing links. 2024-08-12 11:12:31 +03:00
Valentin Mihai
62b8a55406 RED-8748 - Integrated component view in DocuMine 2024-08-11 21:05:20 +03:00
Dan Percic
c4c549fe1b fix 2024-08-10 14:21:27 +02:00
Dan Percic
e41ac70dfe copilot ws implementation, wip 2024-08-10 14:18:22 +02:00
Dan Percic
59ce4177d2 Merge remote-tracking branch 'origin/master' into RED-9747 2024-08-10 14:17:26 +02:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
926d14056b push back localazy update 2024-08-10 01:03:32 +00:00
Valentin-Gabriel Mihai
937803fd75 Merge branch 'RED-9817' into 'master'
RED-9817: removed HTML code for space.

See merge request redactmanager/red-ui!532
2024-08-09 11:17:58 +02:00
Nicoleta Panaghiu
168730cfca RED-9817: removed HTML code for space. 2024-08-09 12:16:42 +03:00
Nicoleta Panaghiu
87c4becbe6 Merge branch 'VM/RED-9788-2' into 'master'
RED-9788 - Adapt Annotation column to display only annotations per component...

Closes RED-9788

See merge request redactmanager/red-ui!531
2024-08-09 09:31:21 +02:00
Valentin Mihai
f0535eb47f Merge branch 'master' into VM/RED-9788-2 2024-08-09 10:29:16 +03:00
Valentin Mihai
522a78d6a2 RED-9788 - update config 2024-08-09 09:02:53 +03:00
Valentin Mihai
4f955bcd50 RED-9788 - Adapt Annotation column to display only annotations per component if component is selected 2024-08-09 08:58:36 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
d9ccf89166 push back localazy update 2024-08-09 01:03:30 +00:00
Dan Percic
0af6e45868 Merge remote-tracking branch 'origin/master' into RED-9747 2024-08-08 13:57:34 +02:00
Nicoleta Panaghiu
b1c40806c5 Merge branch 'VM/RED-9201' into 'master'
RED-9201 - UI for Component Mapping Tables

Closes RED-9201

See merge request redactmanager/red-ui!530
2024-08-08 10:27:15 +02:00
Valentin Mihai
826c564af6 RED-9201 - UI for Component Mapping Tables 2024-08-08 11:06:20 +03:00
Valentin Mihai
b623449efb RED-9788 - remove active listing entity service 2024-08-07 21:25:43 +03:00
Valentin Mihai
221948411a Merge branch 'master' into VM/RED-9788-2 2024-08-07 21:15:11 +03:00
Valentin Mihai
fcba520003 RED-9788 - Adapt Annotation column to display only annotations per component if component is selected 2024-08-07 21:14:37 +03:00
Adina Teudan
f9c8571c31 Merge branch 'VM/RED-3800' into 'master'
RED-3800 - Refactoring / Code Cleanup

Closes RED-3800

See merge request redactmanager/red-ui!529
2024-08-07 19:51:26 +02:00
Valentin Mihai
90ba67a79c RED-3800 - Refactoring / Code Cleanup 2024-08-07 20:34:32 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
e78dcff3a7 push back localazy update 2024-08-07 01:03:26 +00:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
40897cf2b3 push back localazy update 2024-08-06 01:03:21 +00:00
Dan Percic
1bbef9eb37 Merge remote-tracking branch 'origin/master' into RED-9747 2024-08-05 17:54:22 +02:00
Nicoleta Panaghiu
9b770b2be7 Merge branch 'VM/RED-9776' into 'master'
RED-9776 - Consolidate components export and report download in one button

Closes RED-9776

See merge request redactmanager/red-ui!528
2024-08-05 12:59:45 +02:00
Valentin Mihai
77b133757e Merge branch 'master' into VM/RED-9776 2024-08-04 13:26:51 +03:00
Valentin Mihai
37b692c260 RED-9776 - Consolidate components export and report download in one button 2024-08-04 13:22:37 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
dc2ad98120 push back localazy update 2024-08-03 01:03:22 +00:00
Valentin-Gabriel Mihai
91d1ee28f6 Merge branch 'RED-9504' into 'master'
RED-9504: fix some translations.

See merge request redactmanager/red-ui!527
2024-08-02 11:23:30 +02:00
Nicoleta Panaghiu
e2b7807cf3 RED-9504: fix some translations. 2024-08-02 11:34:39 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
46375a3db4 push back localazy update 2024-08-02 01:03:42 +00:00
Dan Percic
0585800532 Merge branch 'RED-9731' into 'master'
RED-9731: fixed help button position on resize.

See merge request redactmanager/red-ui!526
2024-08-01 13:45:33 +02:00
Nicoleta Panaghiu
eccb00345a RED-9731: fixed help button position on resize. 2024-08-01 14:39:27 +03:00
Dan Percic
621b8185fd Merge branch 'VM/RED-9776' into 'master'
RED-9776 - Consolidate components export and report download in one button

Closes RED-9776

See merge request redactmanager/red-ui!525
2024-08-01 13:23:43 +02:00
Valentin Mihai
907249cc40 RED-9776 - Consolidate components export and report download in one button 2024-08-01 13:35:15 +03:00
Nicoleta Panaghiu
35342707f0 RED-9772: delete saved entity log on file overwrite. 2024-08-01 11:55:54 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
0a7919f786 push back localazy update 2024-08-01 01:03:27 +00:00
Dan Percic
c1fc52223b Merge remote-tracking branch 'origin/master' into RED-9747 2024-07-31 14:32:08 +03:00
Valentin-Gabriel Mihai
246e69d754 Merge branch 'RED-9742' into 'master'
RED-9742: fixed logo router link.

See merge request redactmanager/red-ui!524
2024-07-31 12:43:24 +02:00
Nicoleta Panaghiu
16927903cd RED-9742: fixed logo router link. 2024-07-31 13:20:22 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
862b420488 push back localazy update 2024-07-31 01:03:34 +00:00
Valentin Mihai
d445c5f31c Merge branch 'master' into VM/RED-9260 2024-07-30 20:40:10 +03:00
Valentin-Gabriel Mihai
c4625d2e7e Merge branch 'RED-9516' into 'master'
RED-9516: fixed filter options alignment.

See merge request redactmanager/red-ui!522
2024-07-30 16:07:31 +02:00
Nicoleta Panaghiu
3f14690c39 RED-9516: fixed filter options alignment. 2024-07-30 17:04:34 +03:00
Dan Percic
30c1f8628b Merge remote-tracking branch 'origin/master' into RED-9747 2024-07-30 16:21:46 +03:00
Nicoleta Panaghiu
f18cd31a72 Merge branch 'VM/RED-8748' into 'master'
RED-8748 - updated filtering when a component is selected

Closes RED-8748

See merge request redactmanager/red-ui!521
2024-07-30 14:15:23 +02:00
Valentin Mihai
9b197811d1 RED-8748 - updated filtering when a component is selected 2024-07-30 15:07:57 +03:00
Valentin-Gabriel Mihai
e2846a3178 Merge branch 'RED-9433' into 'master'
RED-9433: added auto line-break for checkbox label overflow.

See merge request redactmanager/red-ui!520
2024-07-30 13:16:48 +02:00
Nicoleta Panaghiu
ed8eb4840e RED-9433: added auto line-break for checkbox label overflow. 2024-07-30 14:14:58 +03:00
Valentin Mihai
f1b7effe3a Merge branch 'master' into VM/RED-9260 2024-07-30 12:51:51 +03:00
Dan Percic
8390687c5a Merge branch 'RED-9571' into 'master'
RED-9571: fixed initials-avatar not updating in some cases.

See merge request redactmanager/red-ui!519
2024-07-30 10:17:14 +02:00
Nicoleta Panaghiu
7f7148c859 RED-9571: fixed initials-avatar not updating in some cases. 2024-07-30 11:13:59 +03:00
Dan Percic
66df5f807c Merge remote-tracking branch 'origin/master' into RED-9747 2024-07-30 10:33:58 +03:00
Dan Percic
53044bd391 Merge branch 'VM/RED-8748' into 'master'
RED-8748 - Integrated component view in DocuMine

Closes RED-8748

See merge request redactmanager/red-ui!518
2024-07-29 17:12:59 +02:00
Valentin Mihai
2b4c52c13b RED-8748 - Integrated component view in DocuMine 2024-07-29 18:02:04 +03:00
Dan Percic
6540684063 Merge branch 'VM/RED-8748' into 'master'
RED-8748 - update export button

Closes RED-8748

See merge request redactmanager/red-ui!517
2024-07-29 15:03:51 +02:00
Valentin Mihai
171e18c8a9 RED-8748 - update export button 2024-07-29 15:51:05 +03:00
Nicoleta Panaghiu
5ddae5f664 Merge branch 'VM/RED-8748' into 'master'
RED-8748 - Integrated component view in DocuMine

Closes RED-8748

See merge request redactmanager/red-ui!516
2024-07-29 13:43:41 +02:00
Dan Percic
f25d134590 Merge remote-tracking branch 'origin/master' into RED-9747 2024-07-29 11:40:49 +03:00
Valentin Mihai
dbc609765b WIP on master
RED-8748 - Integrated component view in DocuMine
2024-07-29 01:02:46 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
aaef6c7649 push back localazy update 2024-07-27 01:03:29 +00:00
Dan Percic
333f5c7fc5 Merge branch 'RED-9754' into 'master'
RED-9754: removed document version in dossier templates in documine.

See merge request redactmanager/red-ui!515
2024-07-26 15:31:23 +02:00
Nicoleta Panaghiu
47b16d2287 RED-9754: removed document version in dossier templates in documine. 2024-07-26 16:28:36 +03:00
Dan Percic
c1a8898e92 Merge branch 'VM/RED-9201' into 'master'
RED-9201 - UI for Component Mapping Tables

Closes RED-9201

See merge request redactmanager/red-ui!514
2024-07-26 15:17:24 +02:00
Valentin Mihai
456ca8cc46 RED-9201 - UI for Component Mapping Tables 2024-07-26 16:14:37 +03:00
Dan Percic
10fa81e77c Merge remote-tracking branch 'origin/master' into RED-9747 2024-07-26 16:02:19 +03:00
Dan Percic
b015b804a1 Merge branch 'VM/RED-9201' into 'master'
VM/RED-9201 - UI for Component Mapping Tables

Closes RED-9201

See merge request redactmanager/red-ui!513
2024-07-26 15:01:37 +02:00
Valentin Mihai
c5fd581a62 RED-9201 - UI for Component Mapping Tables 2024-07-26 15:36:24 +03:00
Dan Percic
613a7429b8 RED-9747 add initial ws entity log refresh 2024-07-26 12:25:13 +03:00
Valentin Mihai
9010677c6d RED-9201 - UI for Component Mapping Tables 2024-07-26 12:13:05 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
2b00876e6b push back localazy update 2024-07-26 01:03:27 +00:00
Dan Percic
a87e4c7472 Merge branch 'RED-9542' into 'master'
RED-9542: fixed resize dialog header.

See merge request redactmanager/red-ui!511
2024-07-25 15:47:08 +02:00
Nicoleta Panaghiu
ebc074c308 RED-9542: fixed resize dialog header. 2024-07-25 16:44:57 +03:00
Nicoleta Panaghiu
e3325bb620 Merge branch 'VM/RED-9201' into 'master'
RED-9201 - UI for Component Mapping Tables

Closes RED-9201

See merge request redactmanager/red-ui!510
2024-07-25 11:14:38 +02:00
Valentin Mihai
0bcb3829c7 RED-9201 - displayed all column labels string in a tooltip 2024-07-25 12:12:50 +03:00
Dan Percic
848a44276f Merge branch 'RED-9589' into 'master'
RED-9589: enabled false positive option for some annotation configs.

See merge request redactmanager/red-ui!509
2024-07-25 11:09:11 +02:00
Nicoleta Panaghiu
299be2364e RED-9589: enabled false positive option for some annotation configs. 2024-07-25 12:06:23 +03:00
Valentin Mihai
a9b399ebbd RED-9201 - UI for Component Mapping Tables 2024-07-25 11:49:40 +03:00
Valentin Mihai
87e2e27e56 RED-9260 - Component Management UI 2024-07-25 00:35:48 +03:00
Dan Percic
4f2d320553 Merge branch 'RED-9716' into 'master'
RED-9716: removed analyse button for archived files.

See merge request redactmanager/red-ui!508
2024-07-24 12:03:25 +02:00
Nicoleta Panaghiu
425c982865 RED-9716: removed analyse button for archived files. 2024-07-24 13:00:45 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
804fbf7b05 push back localazy update 2024-07-24 01:03:22 +00:00
Dan Percic
111b354a58 Merge branch 'RED-9657' into 'master'
RED-9657: additional fixes for help mode links.

Closes RED-9657

See merge request redactmanager/red-ui!507
2024-07-23 11:04:55 +02:00
Nicoleta Panaghiu
7b4c6b42ae RED-9657: additional fixes for help mode links. 2024-07-23 11:54:14 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
d21abaad3f push back localazy update 2024-07-23 01:03:25 +00:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
e7670e65b3 push back localazy update 2024-07-20 01:03:25 +00:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
c0e59a58c5 push back localazy update 2024-07-19 01:03:24 +00:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
4f7e5c8259 push back localazy update 2024-07-18 01:03:20 +00:00
Nicoleta Panaghiu
2b93d00833 Merge branch 'VM/RED-9260' into 'master'
RED-9260 - Component Management UI

Closes RED-9260

See merge request redactmanager/red-ui!506
2024-07-17 08:56:24 +02:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
1b95e0e82a push back localazy update 2024-07-17 01:03:19 +00:00
Valentin Mihai
cfbc6bc83c RED-9260 - Component Management UI 2024-07-16 20:18:55 +03:00
Valentin-Gabriel Mihai
23df273ae6 Merge branch 'RED-9657' into 'master'
RED-9657: fixed help mode links.

See merge request redactmanager/red-ui!505
2024-07-16 12:43:05 +02:00
Nicoleta Panaghiu
f00127f3f4 RED-9657: fixed help mode links. 2024-07-16 13:33:45 +03:00
Valentin-Gabriel Mihai
6c1c58e641 Merge branch 'VM/RED-9701' into 'master'
RED-9701 - File view vanishes after file is opened

Closes RED-9701

See merge request redactmanager/red-ui!504
2024-07-15 17:32:14 +02:00
Valentin Mihai
1b46ab0811 RED-9701 - File view vanishes after file is opened 2024-07-15 18:30:56 +03:00
Valentin-Gabriel Mihai
dab2340c19 Merge branch 'RED-9372' into 'master'
RED-9372: update common ui.

See merge request redactmanager/red-ui!503
2024-07-15 15:20:09 +02:00
Nicoleta Panaghiu
959710675f RED-9372: update common ui. 2024-07-15 16:11:55 +03:00
Valentin-Gabriel Mihai
6057a904ca Merge branch 'RED-9452' into 'master'
RED-9452: add cancel on esc & confirm on enter on delete dossier state.

See merge request redactmanager/red-ui!502
2024-07-15 12:26:27 +02:00
Nicoleta Panaghiu
16163eb7cd RED-9452: add cancel on esc & confirm on enter on delete dossier state. 2024-07-15 13:25:22 +03:00
Nicoleta Panaghiu
489de89e85 Merge branch 'RED-9642' into 'master'
RED-9642: fixed soft deleted dossier stats display.

See merge request redactmanager/red-ui!501
2024-07-15 11:56:09 +02:00
Nicoleta Panaghiu
765c8234e3 RED-9642: fixed soft deleted dossier stats display. 2024-07-15 12:53:35 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
697d6e9014 push back localazy update 2024-07-14 01:03:24 +00:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
985e2c86ef push back localazy update 2024-07-13 01:03:26 +00:00
Valentin-Gabriel Mihai
5779539c94 Merge branch 'RED-9605' into 'master'
RED-9605: remove it again.

See merge request redactmanager/red-ui!500
2024-07-12 15:31:29 +02:00
Nicoleta Panaghiu
7f5a453f26 RED-9605: remove it again. 2024-07-12 16:30:41 +03:00
Nicoleta Panaghiu
0ef1f3d61e Merge branch 'VM/RED-9201' into 'master'
RED-9201 - UI for Component Mapping Tables

Closes RED-9201

See merge request redactmanager/red-ui!499
2024-07-12 15:29:03 +02:00
Valentin-Gabriel Mihai
384c847a90 Merge branch 'RED-9605' into 'master'
RED-9605: show edit dossier template button on other screens.

See merge request redactmanager/red-ui!498
2024-07-12 14:03:25 +02:00
Nicoleta Panaghiu
a091a96b69 RED-9605: show edit dossier template button on other screens. 2024-07-12 15:01:37 +03:00
Dan Percic
366f8cd2bf Merge branch 'RED-9634' into 'master'
RED-9634: fixed OCR action.

See merge request redactmanager/red-ui!497
2024-07-11 14:41:39 +02:00
Dan Percic
fd78f0b177 Merge branch 'VM/RED-9401' into 'master'
RED-9401 - Show manual changes icon in workload for all entries with MANUAL engine

Closes RED-9401

See merge request redactmanager/red-ui!496
2024-07-11 13:59:18 +02:00
Nicoleta Panaghiu
8572830c69 RED-9634: fixed OCR action. 2024-07-11 14:59:04 +03:00
Valentin Mihai
8a045a4879 RED-9401 - Show manual changes icon in workload for all entries with MANUAL engine 2024-07-11 14:55:38 +03:00
Dan Percic
85faea9ea5 Merge branch 'VM/RED-9464' into 'master'
RED-9464 - In dictionary search is not cleared when pressing X

Closes RED-9464

See merge request redactmanager/red-ui!495
2024-07-11 13:01:06 +02:00
Dan Percic
0a1ab112ee Merge branch 'RED-9437' into 'master'
RED-9437: made watermark selector shorter and fixed help mode button.

See merge request redactmanager/red-ui!494
2024-07-11 13:00:35 +02:00
Dan Percic
6846ff5ad1 Merge branch 'RED-9605' into 'master'
RED-9605: removed redundant edit button.

See merge request redactmanager/red-ui!493
2024-07-11 13:00:09 +02:00
Dan Percic
e0e581c1b8 Merge branch 'RED-9597' into 'master'
RED-9597: fixed missing labels.

See merge request redactmanager/red-ui!492
2024-07-11 12:59:39 +02:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
65808ccf58 push back localazy update 2024-07-10 01:03:34 +00:00
Valentin Mihai
d6d2d1157b RED-9201 - UI for Component Mapping Tables 2024-07-09 16:42:22 +03:00
Nicoleta Panaghiu
f5c46b23b9 RED-9437: made watermark selector shorter and fixed help mode button. 2024-07-09 14:55:19 +03:00
Valentin Mihai
db90287c1f WIP on master
RED-9464 - In dictionary search is not cleared when pressing X
2024-07-09 14:49:41 +03:00
Dan Percic
33e0daee77 Merge branch 'VM/RED-9401' into 'master'
RED-9401 - Show manual changes icon in workload for all entries with MANUAL engine

Closes RED-9401

See merge request redactmanager/red-ui!491
2024-07-09 13:28:11 +02:00
Nicoleta Panaghiu
7276966af9 RED-9597: fixed missing labels. 2024-07-09 14:16:46 +03:00
Nicoleta Panaghiu
1fe2efca4d RED-9605: removed redundant edit button. 2024-07-09 14:14:40 +03:00
Dan Percic
f6346c27bc Merge branch 'RED-5108' into 'master'
RED-5108: map IGNORED IMAGE_HINT to Hint instead of IngoredHint.

See merge request redactmanager/red-ui!489
2024-07-09 13:03:13 +02:00
Nicoleta Panaghiu
0b693fbcb7 Merge branch 'updates' into 'master'
Imports fixes

See merge request redactmanager/red-ui!490
2024-07-09 13:02:47 +02:00
Dan Percic
ad4016f6d0 fix help mode keys import 2024-07-09 12:55:44 +03:00
Valentin Mihai
78d6328af8 WIP on master
RED-9401 - Show manual changes icon in workload for all entries with MANUAL engine
2024-07-09 12:53:02 +03:00
Dan Percic
48c3a4ee63 update imports 2024-07-09 12:26:13 +03:00
Nicoleta Panaghiu
0f5411ab46 RED-5108: map IGNORED IMAGE_HINT to Hint instead of IngoredHint. 2024-07-05 14:38:19 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
14b268c796 push back localazy update 2024-07-05 09:41:16 +00:00
Dan Percic
e9c0b6e458 Merge branch 'VM/RED-9513' into 'master'
RED-9513 - Enter Key Not Working: Unable to Add Terms to Dictionary

Closes RED-9513

See merge request redactmanager/red-ui!488
2024-07-04 12:12:08 +02:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
f6f9e96c26 push back localazy update 2024-07-04 10:03:36 +00:00
Valentin Mihai
ca24134c6e RED-9513 - Enter Key Not Working: Unable to Add Terms to Dictionary 2024-07-04 12:53:53 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
8163dc96ca push back localazy update 2024-07-04 01:03:49 +00:00
Dan Percic
2eb5d81e74 Merge branch 'RED-9527' into 'master'
RED-9527: fixed enter not saving the file attribute.

See merge request redactmanager/red-ui!495
2024-07-03 16:00:04 +02:00
Nicoleta Panaghiu
4700ec8098 RED-9527: fixed enter not saving the file attribute. 2024-07-03 16:31:42 +03:00
Dan Percic
47325b387e Merge branch 'RED-9431' into 'master'
RED-9431: fixed missing translations.

See merge request redactmanager/red-ui!494
2024-07-03 13:28:20 +02:00
Nicoleta Panaghiu
1d04a5b7b1 RED-9431: fixed missing translations. 2024-07-03 13:56:50 +03:00
Dan Percic
0e2b9f136a Merge branch 'RED-9525' into 'master'
RED-9525: use backend error for add dossier & import mat-dialog-close.

See merge request redactmanager/red-ui!493
2024-07-03 12:11:36 +02:00
Nicoleta Panaghiu
a37dc2feef RED-9525: use backend error for add dossier & import mat-dialog-close. 2024-07-03 13:01:49 +03:00
Dan Percic
7a2551f71f Merge branch 'VM/RED-9508' into 'master'
RED-9508 - Page not responsive after switching Dossier view from active to archived

Closes RED-9508

See merge request redactmanager/red-ui!492
2024-07-03 10:48:33 +02:00
Valentin Mihai
3a3973744f RED-9508 - Page not responsive after switching Dossier view from active to archived 2024-07-03 11:46:10 +03:00
Dan Percic
66831fe655 Merge branch 'VM/RED-9484' into 'master'
RED-9484 - Missing legalBasis for images in reports

Closes RED-9484

See merge request redactmanager/red-ui!491
2024-07-03 08:54:10 +02:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
484f219270 push back localazy update 2024-07-03 01:04:09 +00:00
Valentin Mihai
4636520cb4 RED-9484 - Missing legalBasis for images in reports 2024-07-03 00:30:04 +03:00
Dan Percic
64d57e3263 Merge branch 'VM/RED-9401' into 'master'
RED-9401 - Show manual changes icon in workload for all entries with MANUAL engine

Closes RED-9401

See merge request redactmanager/red-ui!490
2024-07-02 13:17:14 +02:00
Valentin Mihai
07a78fcc26 RED-9401 - removed 'hasBeenAddedLocally' check 2024-07-02 10:59:46 +03:00
Valentin Mihai
b5fc95bfed RED-9401 - Show manual changes icon in workload for all entries with MANUAL engine 2024-07-02 10:13:39 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
f28dd40242 push back localazy update 2024-07-02 01:04:17 +00:00
Dan Percic
423f7c1c12 Merge branch 'RED-9422' into 'master'
RED-9422: fixed unnecessary horizontal scrollbar.

See merge request redactmanager/red-ui!489
2024-07-01 12:08:18 +02:00
Nicoleta Panaghiu
76f0b9315a RED-9422: fixed unnecessary horizontal scrollbar. 2024-07-01 12:29:02 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
41695edc45 push back localazy update 2024-06-29 01:04:11 +00:00
Dan Percic
2685c82ec6 Merge branch 'RED-9422' into 'master'
RED-9422: re-add scrollbar for edit dossier members list.

See merge request redactmanager/red-ui!488
2024-06-28 14:34:48 +02:00
Nicoleta Panaghiu
ba2fcf6ad8 RED-9422: re-add scrollbar for edit dossier members list. 2024-06-28 15:33:30 +03:00
Dan Percic
e35d20e57e Merge branch 'VM/RED-9400' into 'master'
RED-9400 - Forced redaction shows two force entries in manual changes tooltip

Closes RED-9400

See merge request redactmanager/red-ui!487
2024-06-28 09:09:25 +02:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
61c37e7fb3 push back localazy update 2024-06-28 01:04:20 +00:00
Valentin Mihai
fd8ea88d31 RED-9400 - Forced redaction shows two force entries in manual changes tooltip 2024-06-27 18:02:21 +03:00
Dan Percic
8daacfcf9a Merge branch 'VM/RED-9453' into 'master'
RED-9453 - New dossier state gets created twice when saving with Enter key

Closes RED-9453

See merge request redactmanager/red-ui!485
2024-06-27 14:35:08 +02:00
Nicoleta Panaghiu
24f030591b Merge branch 'VM/RED-9362' into 'master'
RED-9362 - Help Mode tooltip missing

Closes RED-9362

See merge request redactmanager/red-ui!486
2024-06-27 14:34:31 +02:00
Valentin Mihai
3719cc70e7 RED-9362 - Help Mode tooltip missing 2024-06-27 15:32:53 +03:00
Valentin Mihai
53fb99f8f2 RED-9453 - New dossier state gets created twice when saving with Enter key 2024-06-27 14:54:48 +03:00
Dan Percic
830722904b Merge branch 'VM/RED-9390' into 'master'
RED-9390 - Workload filter does not remember previous ALL or NONE selection

Closes RED-9390

See merge request redactmanager/red-ui!484
2024-06-27 13:32:48 +02:00
Valentin Mihai
3dec406733 RED-9390 - Workload filter does not remember previous ALL or NONE selection 2024-06-27 13:24:29 +03:00
Dan Percic
0b68d071a1 Merge branch 'RED-9460' into 'master'
RED-9460: display all types which have a dictionary in dossier settings.

See merge request redactmanager/red-ui!483
2024-06-27 10:20:48 +02:00
Nicoleta Panaghiu
9cae140cb1 RED-9460: display all types which have a dictionary in dossier settings. 2024-06-27 11:17:49 +03:00
Dan Percic
d43f46ceb9 Merge branch 'RED-9373' into 'master'
RED-9373: removed fixed width property on dashboard card.

See merge request redactmanager/red-ui!482
2024-06-27 10:08:31 +02:00
Nicoleta Panaghiu
1c400d6685 RED-9373: removed fixed width property on dashboard card. 2024-06-27 11:05:24 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
ac910efbda push back localazy update 2024-06-27 01:03:51 +00:00
Dan Percic
a1e1a123f3 Merge branch 'VM/RED-8748' into 'master'
RED-8748 - Integrated component view in DocuMine

Closes RED-8748

See merge request redactmanager/red-ui!480
2024-06-26 14:50:42 +02:00
Dan Percic
4c4032b5ad Merge branch 'RED-9437' into 'master'
RED-9437: fixed watermarks not available on creating first dossier.

See merge request redactmanager/red-ui!481
2024-06-26 14:48:36 +02:00
Nicoleta Panaghiu
9c5a66b80e RED-9437: fixed watermarks not available on creating first dossier. 2024-06-26 15:37:33 +03:00
Valentin Mihai
1ba99def41 RED-8748 - fixed revert value dialog 2024-06-26 15:31:30 +03:00
Dan Percic
eeca03ae61 Merge branch 'RED-9443' into 'master'
RED-9443: filter out experimental types from type selection options.

See merge request redactmanager/red-ui!479
2024-06-26 12:12:36 +02:00
Nicoleta Panaghiu
3aa7ba1629 RED-9443: filter out experimental types from type selection options. 2024-06-26 12:42:26 +03:00
Dan Percic
ea06f4940a Merge branch 'RED-9431' into 'master'
RED-9431:  recovered missing translation keys.

See merge request redactmanager/red-ui!478
2024-06-26 11:04:17 +02:00
Nicoleta Panaghiu
e9b89b377a RED-9431: recovered missing translation keys. 2024-06-26 11:42:38 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
eb1a592abe push back localazy update 2024-06-26 01:03:36 +00:00
Dan Percic
797a4d6afd Merge branch 'VM/RED-9444' into 'master'
RED-9444 - Download button in dossier list view not working

Closes RED-9444

See merge request redactmanager/red-ui!477
2024-06-25 22:33:35 +02:00
Valentin Mihai
a0ab248479 RED-9444 - Download button in dossier list view not working 2024-06-25 23:06:00 +03:00
Dan Percic
6b7a089057 Merge branch 'VM/RED-9446' into 'master'
RED-9446 - Rectangle Redaction blocks File view and Freezes session

Closes RED-9446

See merge request redactmanager/red-ui!476
2024-06-25 17:42:18 +02:00
Valentin Mihai
c634d46b06 RED-9446 - Rectangle Redaction blocks File view and Freezes session 2024-06-25 18:33:51 +03:00
Valentin Mihai
6d7f6cbe2b Merge branch 'master' into VM/RED-8748 2024-06-25 13:05:35 +03:00
Dan Percic
0673ab6ce7 Merge branch 'RED-9306' into 'master'
RED-9306: display remove everywhere options for DICTIONARY engine.

See merge request redactmanager/red-ui!475
2024-06-25 11:05:17 +02:00
Nicoleta Panaghiu
87441ab0ec RED-9306: display remove everywhere options for DICTIONARY engine. 2024-06-25 11:54:24 +03:00
Dan Percic
c8bc0e7328 Merge branch 'RED-9443' into 'master'
RED-9443: fixed add hint dialog type select.

See merge request redactmanager/red-ui!474
2024-06-25 10:18:00 +02:00
Nicoleta Panaghiu
00dfb87c17 RED-9443: fixed add hint dialog type select. 2024-06-25 11:16:42 +03:00
Dan Percic
64187bd254 Merge branch 'RED-9370' into 'master'
RED-9370 & RED-9439: reverted changes to dossier href.

See merge request redactmanager/red-ui!473
2024-06-25 10:12:32 +02:00
Nicoleta Panaghiu
2173737132 RED-9370 & RED-9439: reverted changes to dossier href. 2024-06-25 11:02:40 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
b32573f9b7 push back localazy update 2024-06-25 01:03:34 +00:00
Valentin Mihai
797ffeff2a Merge branch 'master' into VM/RED-8748 2024-06-25 00:26:01 +03:00
Valentin Mihai
26a70a8398 RED-8748 - fixed workload annotations filtering, updated default textarea height for component values 2024-06-25 00:25:16 +03:00
Dan Percic
fe4e67b953 Merge branch 'RED-9337' into 'master'
RED-9337: display reanalyse button for bulk select.

See merge request redactmanager/red-ui!471
2024-06-24 11:20:17 +02:00
Nicoleta Panaghiu
3d481e5e47 RED-9337: display reanalyse button for bulk select. 2024-06-24 12:17:34 +03:00
Dan Percic
6e60cff400 Merge branch 'RED-9370' into 'master'
RED-9370: open download link in the same tab; fix back button.

See merge request redactmanager/red-ui!470
2024-06-24 10:38:11 +02:00
Nicoleta Panaghiu
4f196eb27d RED-9370: open download link in the same tab; fix back button. 2024-06-24 06:44:53 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
54b07d1e43 push back localazy update 2024-06-21 01:04:14 +00:00
Valentin Mihai
d7bbf20585 WIP on VM/RED-8748
RED-8748 - fixed document info view
2024-06-20 18:59:38 +03:00
Valentin Mihai
6f80f5f4ad Merge branch 'master' into VM/RED-8748 2024-06-20 16:46:12 +03:00
Dan Percic
aacca45da6 Merge branch 'updates' into 'master'
add pdftron version to assets

See merge request redactmanager/red-ui!469
2024-06-20 14:14:24 +02:00
Dan Percic
d0f95923a3 add pdftron version to assets 2024-06-20 15:10:20 +03:00
Dan Percic
91ab867792 Merge branch 'RED-3800' into 'master'
RED-3800: Moved fullscreen icons to common-ui

Closes RED-3800

See merge request redactmanager/red-ui!468
2024-06-20 14:07:51 +02:00
Adina Țeudan
0654558b6b RED-3800: Moved fullscreen icons to common-ui 2024-06-20 14:57:56 +03:00
Dan Percic
be756b3fe9 Merge branch 'updates' into 'master'
fix skip paths?

See merge request redactmanager/red-ui!467
2024-06-20 13:47:42 +02:00
Dan Percic
6202c0c462 fix skip paths? 2024-06-20 14:44:30 +03:00
Dan Percic
d92d346de3 Merge branch 'updates' into 'master'
skip web viewer scripts from sw caches

See merge request redactmanager/red-ui!466
2024-06-20 13:36:11 +02:00
Dan Percic
7f686c28c6 skip web-viewer scripts from sw caches 2024-06-20 14:34:18 +03:00
Dan Percic
dba8663e18 Merge branch 'updates' into 'master'
migrate inputs to signal inputs

See merge request redactmanager/red-ui!465
2024-06-20 10:51:11 +02:00
Dan Percic
f0b4070ae2 migrate inputs to signal inputs 2024-06-20 11:38:38 +03:00
Dan Percic
ab550a2831 Merge branch 'RED-9321' into 'master'
Migrate to lazy load routes

See merge request redactmanager/red-ui!464
2024-06-20 09:37:16 +02:00
Dan Percic
7b836c2894 update lockfile 2024-06-20 10:32:36 +03:00
Dan Percic
b7dbac0695 unfuck circular imports 2024-06-20 10:28:34 +03:00
Dan Percic
04e3f5b522 almost unfuck circular imports 2024-06-20 10:28:34 +03:00
Nicoleta Panaghiu
ffd02c787d RED-9321: added missing imports. 2024-06-20 10:28:34 +03:00
Nicoleta Panaghiu
c3662f6bc5 RED-9321: refactored shared and file-upload-download modules. 2024-06-20 10:28:34 +03:00
Nicoleta Panaghiu
5d3af7e3cb RED-9321: fixed import. 2024-06-20 10:28:34 +03:00
Nicoleta Panaghiu
ae01864e0d RED-9321: deleted shared-dossiers module. 2024-06-20 10:28:34 +03:00
Nicoleta Panaghiu
0e9dcc2b1f RED-9321: refactored admin module. 2024-06-20 10:28:34 +03:00
Nicoleta Panaghiu
28b3301063 RED-9321: refactored account and archive modules. 2024-06-20 10:28:34 +03:00
Nicoleta Panaghiu
c4912ffd8f RED-9321: refactored trash and search modules. 2024-06-20 10:28:34 +03:00
Nicoleta Panaghiu
0fe7584f4b RED-9321: refactored account, dossier-listing and dashboard. 2024-06-20 10:28:34 +03:00
Nicoleta Panaghiu
6469e3de36 RED-9321: move resolve inside license.routes. 2024-06-20 10:28:34 +03:00
Nicoleta Panaghiu
6924cc1799 RED-9321: lazy load watermarks routes. 2024-06-20 10:28:34 +03:00
Nicoleta Panaghiu
1378543bf7 RED-9321: get the latest changes and adapt to standalone. 2024-06-20 10:28:34 +03:00
Nicoleta Panaghiu
cf6b7b4d24 RED-9321: lazy load entities routes, standalone components. 2024-06-20 10:28:34 +03:00
Nicoleta Panaghiu
9409261f3b RED-9321: removed file-preview and dossier-overview modules, use standalone. 2024-06-20 10:28:34 +03:00
Nicoleta Panaghiu
3d7dca1f43 RED-9321: refactored submodules of admin to standalone components. 2024-06-20 10:28:34 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
5cd5c39916 push back localazy update 2024-06-20 01:03:49 +00:00
Valentin-Gabriel Mihai
b0ab6bd302 Merge branch 'RED-9370' into 'master'
RED-9370: fixed notification links not working.

See merge request redactmanager/red-ui!463
2024-06-19 17:56:08 +02:00
Nicoleta Panaghiu
7dad19f8be RED-9370: fixed notification links not working. 2024-06-19 18:28:49 +03:00
Dan Percic
681cf01bd4 Merge branch 'RED-9337' into 'master'
RED-9337: owner and file assignee can reanalyse error file.

See merge request redactmanager/red-ui!462
2024-06-19 16:10:49 +02:00
Nicoleta Panaghiu
403d890140 RED-9337: owner and file assignee can reanalyse error file. 2024-06-19 17:01:20 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
0fcd8a45b6 push back localazy update 2024-06-19 07:34:23 +00:00
Dan Percic
a63dd4a846 Merge branch 'RED-9171' into 'master'
RED-9171: removed error toaster for non-existing dossier template.

See merge request redactmanager/red-ui!461
2024-06-18 17:59:00 +02:00
Nicoleta Panaghiu
cdd4cecb5b RED-9171: removed error toaster for non-existing dossier template. 2024-06-18 18:58:11 +03:00
Valentin-Gabriel Mihai
57a650cf6b Merge branch 'RED-3800' into 'master'
RED-3800: Updated translate extract lib

Closes RED-3800

See merge request redactmanager/red-ui!460
2024-06-18 17:36:23 +02:00
Adina Țeudan
e39ba6e62f RED-3800: Updated translate extract lib 2024-06-18 18:34:56 +03:00
Dan Percic
59b1219128 Merge branch 'RED-5108' into 'master'
RED-5108: use default redaction color for redacted image hints.

See merge request redactmanager/red-ui!459
2024-06-18 17:13:03 +02:00
Nicoleta Panaghiu
244ec6626f RED-5108: use default redaction color for redacted image hints. 2024-06-18 16:53:59 +03:00
Dan Percic
d797f57751 Merge branch 'RED-3800' into 'master'
fix docker file

See merge request redactmanager/red-ui!458
2024-06-18 15:18:37 +02:00
Dan Percic
bc2c700ca5 fix docker file 2024-06-18 16:17:05 +03:00
Valentin Mihai
bc8ba16b6b Merge branch 'master' into VM/RED-8748 2024-06-18 16:15:36 +03:00
Dan Percic
640297867f Merge branch 'VM/RED-9201' into 'master'
RED-9201 - UI for Component Mapping Tables

Closes RED-9201

See merge request redactmanager/red-ui!457
2024-06-18 13:26:05 +02:00
Valentin Mihai
cf3aa9f0cf RED-9201 - UI for Component Mapping Tables 2024-06-18 13:57:53 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
2663c36dc2 push back localazy update 2024-06-18 01:03:38 +00:00
Dan Percic
1179d9330a Merge branch 'updates' into 'master'
Updates

See merge request redactmanager/red-ui!456
2024-06-17 21:26:52 +02:00
Dan Percic
d0b401d3cf lint 2024-06-17 21:27:24 +03:00
Dan Percic
aa6bc36b89 migrate buttons to signal inputs 2024-06-17 21:26:49 +03:00
Valentin Mihai
19dc8f2704 RED-8748 - Integrated component view in DocuMine 2024-06-17 20:41:12 +03:00
Dan Percic
939b40b014 other updates 2024-06-17 19:49:18 +03:00
Dan Percic
f1ece3a89e update common-ui 2024-06-17 19:49:18 +03:00
Dan Percic
97ebca5046 ng 18 2024-06-17 19:49:18 +03:00
Dan Percic
20a80933b5 update lock file 2024-06-17 19:49:18 +03:00
Dan Percic
adf3b6b663 Merge branch 'VM/RED-8748-fix' into 'master'
RED-8748 - added back button for rectangle redaction

Closes RED-8748

See merge request redactmanager/red-ui!455
2024-06-17 13:58:54 +02:00
Valentin Mihai
b546929c9c RED-8748 - added back button for rectangle redaction 2024-06-17 14:36:49 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
c5b515bb35 push back localazy update 2024-06-15 01:03:50 +00:00
Dan Percic
223575c232 Merge branch 'VM/RED-8742' into 'master'
VM/RED-8742 - fixed hide button

Closes RED-8742

See merge request redactmanager/red-ui!454
2024-06-14 14:35:08 +02:00
Valentin Mihai
466139fadf WIP on master
RED-8742 - fixed hide button
2024-06-14 13:41:52 +03:00
Dan Percic
cfc882f303 Merge branch 'RED-8748' into 'master'
RED-8748 - Integrated component view in DocuMine

Closes RED-8748

See merge request redactmanager/red-ui!453
2024-06-14 12:02:26 +02:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
717861057f push back localazy update 2024-06-14 01:03:52 +00:00
Valentin Mihai
4841bfc690 RED-8748 - Integrated component view in DocuMine 2024-06-13 18:30:25 +03:00
Valentin Mihai
b8fe0bca90 RED-8748 - Integrated component view in DocuMine 2024-06-13 18:03:18 +03:00
Dan Percic
072d9e3538 Merge branch 'VM/RED-9201' into 'master'
RED-9201 - fixed sorting and search by name

Closes RED-9201

See merge request redactmanager/red-ui!452
2024-06-13 12:22:26 +02:00
Valentin Mihai
2eb371fcd6 RED-9201 - fixed sorting and search by name 2024-06-13 12:25:59 +03:00
Dan Percic
190b040b1a Merge branch 'RED-9191' into 'master'
RED-9191 & RED-8396.

See merge request redactmanager/red-ui!451
2024-06-13 09:34:32 +02:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
3c9904ddd5 push back localazy update 2024-06-13 01:03:50 +00:00
Nicoleta Panaghiu
27597e9a5a RED-9191 & RED-8396. 2024-06-12 20:17:06 +03:00
Dan Percic
3b29c0613a Merge branch 'RED-5108' into 'master'
RED-5108: update tooltips and header.

See merge request redactmanager/red-ui!450
2024-06-12 12:37:50 +02:00
Nicoleta Panaghiu
6b4f1b91d5 RED-5108: update tooltips and header. 2024-06-12 13:04:38 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
039b5540a9 push back localazy update 2024-06-12 01:03:46 +00:00
Dan Percic
463fddefd3 Merge branch 'VM/RED-8748' into 'master'
RED-8748 - Integrated component view in DocuMine

Closes RED-8748

See merge request redactmanager/red-ui!449
2024-06-11 20:03:54 +02:00
Valentin Mihai
6da2e35e5b RED-8748 - removed unused code 2024-06-11 20:57:25 +03:00
Valentin Mihai
d003283939 Merge branch 'master' into VM/RED-8748 2024-06-11 20:17:34 +03:00
Valentin Mihai
f560322547 RED-8748 - updates for override, revertOverride actions 2024-06-11 20:15:29 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
e09663aa71 push back localazy update 2024-06-11 01:03:43 +00:00
Dan Percic
93f8a0a4d3 Merge branch 'RED-3800' into 'master'
RED-3800: Moved visibility icons to common-ui

Closes RED-3800

See merge request redactmanager/red-ui!448
2024-06-10 15:56:51 +02:00
Adina Țeudan
ff16ae33c5 RED-3800: Moved visibility icons to common-ui 2024-06-10 16:26:54 +03:00
Valentin Mihai
b8a3f81859 RED-8748 2024-06-10 14:41:42 +03:00
Valentin Mihai
d0c6bef6b5 Merge branch 'master' into VM/RED-8748 2024-06-10 14:41:12 +03:00
Dan Percic
355b8edd86 Merge branch 'RED-9196' into 'master'
RED-9196: fixed due date checkbox not being reverted.

See merge request redactmanager/red-ui!447
2024-06-10 13:12:21 +02:00
Nicoleta Panaghiu
bbe8ac9742 RED-9196: fixed due date checkbox not being reverted. 2024-06-10 14:07:48 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
b9c9e8af98 push back localazy update 2024-06-09 01:03:39 +00:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
820a3cb4d0 push back localazy update 2024-06-08 01:03:57 +00:00
Dan Percic
aaa1d7f0a4 Merge branch 'RED-9125' into 'master'
RED-9125: upgrade webviewer.

See merge request redactmanager/red-ui!446
2024-06-07 15:39:23 +02:00
Nicoleta Panaghiu
ea6a0c4d5f RED-9125: forgot yarn lock. 2024-06-07 16:35:18 +03:00
Nicoleta Panaghiu
dbdce02e79 RED-9125: upgrade webviewer. 2024-06-07 16:08:17 +03:00
Dan Percic
99b31ba9a2 Merge branch 'RED-8623' into 'master'
RED-8623: fix side effect.

See merge request redactmanager/red-ui!445
2024-06-07 14:57:50 +02:00
Nicoleta Panaghiu
f84fb52609 RED-8623: fix side effect. 2024-06-07 15:56:18 +03:00
Dan Percic
a035b9dbb0 Merge branch 'VM/RED-9201' into 'master'
RED-9201 - UI for Component Mapping Tables

Closes RED-9201

See merge request redactmanager/red-ui!444
2024-06-07 12:05:44 +02:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
96223eee10 push back localazy update 2024-06-07 01:03:57 +00:00
Valentin Mihai
ce015babec Merge branch 'master' into VM/RED-9201 2024-06-06 18:41:30 +03:00
Valentin Mihai
3dfe705da1 RED-9201 - update config 2024-06-06 18:39:31 +03:00
Valentin Mihai
13c1a2a0b0 RED-9201 - added all mapping actions 2024-06-06 18:33:18 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
eefbe0f7c1 push back localazy update 2024-06-06 01:03:55 +00:00
Dan Percic
53123e05e0 Merge branch 'RED-7593' into 'master'
RED-7593: added warning notification in case of missing admin email.

See merge request redactmanager/red-ui!443
2024-06-05 13:32:36 +02:00
Nicoleta Panaghiu
54835866a7 Merge remote-tracking branch 'origin/master' into RED-7593 2024-06-05 14:25:58 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
8f3ed70a57 push back localazy update 2024-06-05 01:03:28 +00:00
Valentin Mihai
6b7c0e4ac9 Merge branch 'master' into VM/RED-8748 2024-06-05 00:24:56 +03:00
Valentin Mihai
40cc4a3d37 Merge branch 'master' into VM/RED-9201 2024-06-05 00:17:02 +03:00
Valentin Mihai
a960b837df RED-9201 - UI for Component Mapping Tables 2024-06-05 00:09:32 +03:00
Nicoleta Panaghiu
47342ee739 RED-7593: added warning notification in case of missing admin email. 2024-06-04 22:10:13 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
435c4e0ed4 push back localazy update 2024-06-04 01:03:52 +00:00
Dan Percic
597b613e2d Merge branch 'RED-9237' into 'master'
RED-9237: Escape "{" in translation string

Closes RED-9237

See merge request redactmanager/red-ui!442
2024-06-03 21:03:17 +02:00
Adina Țeudan
7f51609b72 RED-9237: Escape "{" in translation string 2024-06-03 22:01:32 +03:00
Dan Percic
8f2484e736 Merge branch 'RED-8979' into 'master'
RED-8979: Indicate dossier dictionary-based annotations in workload

Closes RED-8979

See merge request redactmanager/red-ui!441
2024-06-03 20:42:49 +02:00
Adina Țeudan
8a32910084 RED-8979: Indicate dossier dictionary-based annotations in workload 2024-06-03 21:41:38 +03:00
Dan Percic
6b30ac27ea Merge branch 'RED-9237' into 'master'
RED-9237: Added placeholders in reports page

Closes RED-9237

See merge request redactmanager/red-ui!440
2024-06-03 20:40:05 +02:00
Adina Țeudan
51c4dd05ae RED-9237: Added placeholders in reports page 2024-06-03 21:37:13 +03:00
Dan Percic
98f53cddc8 Merge branch 'RED-6143' into 'master'
RED-6143: Updates according to comment

Closes RED-6143

See merge request redactmanager/red-ui!436
2024-06-03 15:53:43 +02:00
Dan Percic
25d8815c17 Merge branch 'RED-9175' into 'master'
Resolve RED-9175

Closes RED-9175

See merge request redactmanager/red-ui!439
2024-06-03 15:14:30 +02:00
Nicoleta Panaghiu
8220f502e6 RED-9175: removed unnecessary brackets. 2024-06-03 16:10:10 +03:00
Nicoleta Panaghiu
129f2d97d6 RED-9175: remove unused import. 2024-06-03 15:20:59 +03:00
Nicoleta Panaghiu
1ea03ac015 RED-9175: prevent search re-trigger upon navigating the file pages. 2024-06-03 15:20:59 +03:00
Dan Percic
f02323561c Merge branch 'RED-5108' into 'master'
RED-5108: added redact functionality for hint images.

See merge request redactmanager/red-ui!438
2024-06-03 12:15:24 +02:00
Nicoleta Panaghiu
050b0bc55a RED-5108: added redact functionality for hint images. 2024-06-03 13:07:14 +03:00
Valentin-Gabriel Mihai
ca7c145457 Merge branch 'RED-9191' into 'master'
RED-9191: toggle icons design fine-tuning.

See merge request redactmanager/red-ui!437
2024-05-30 16:16:07 +02:00
Nicoleta Panaghiu
668dff4620 RED-9191: toggle icons design fine-tuning. 2024-05-30 17:14:47 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
85560cc438 push back localazy update 2024-05-30 01:03:52 +00:00
Valentin Mihai
d3f293f622 RED-9201 - UI for Component Mapping Tables 2024-05-29 20:16:23 +03:00
Adina Țeudan
9922526fc6 RED-6143: Updates according to comment 2024-05-29 15:04:12 +03:00
Nicoleta Panaghiu
4cdfc97a9f Merge branch 'VM/RED-8882' into 'master'
RED-8882 - Help Mode design improvements

Closes RED-8882

See merge request redactmanager/red-ui!435
2024-05-29 09:55:46 +02:00
Nicoleta Panaghiu
4bcc5c5b38 Merge branch 'VM/RED-9208' into 'master'
RED-9208 - Rule editor: Display of error disappears when saving before...

Closes RED-9208

See merge request redactmanager/red-ui!434
2024-05-29 09:55:34 +02:00
Valentin Mihai
cfe897c3a3 RED-8882 - Help Mode design improvements 2024-05-29 10:53:33 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
b6491f9d6a push back localazy update 2024-05-29 01:04:14 +00:00
Valentin Mihai
d3d042e539 RED-9208 - Rule editor: Display of error disappears when saving before checking for warnings (dry run) 2024-05-28 14:24:22 +03:00
Valentin Mihai
26a3a2abb6 Merge branch 'master' into VM/RED-8748 2024-05-28 14:03:52 +03:00
Nicoleta Panaghiu
d98b55c7ff Merge branch 'VM/RED-8742' into 'master'
RED-8742 - Display red border around hidden annotations when they are selected in workload

Closes RED-8742

See merge request redactmanager/red-ui!433
2024-05-28 08:46:53 +02:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
a0ebd52c0a push back localazy update 2024-05-28 01:03:27 +00:00
Valentin Mihai
d74f501f4c RED-8742 - Display red border around hidden annotations when they are selected in workload 2024-05-27 21:28:23 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
ee2d53f10b push back localazy update 2024-05-25 01:03:49 +00:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
ad64637a0d push back localazy update 2024-05-24 01:04:03 +00:00
Valentin-Gabriel Mihai
7abcd054aa Merge branch 'RED-9204' into 'master'
RED-9204: fixed edit dossier dialog buttons functionalities.

See merge request redactmanager/red-ui!432
2024-05-23 15:04:49 +02:00
Nicoleta Panaghiu
3dd0740222 RED-9204: fixed edit dossier dialog buttons functionalities. 2024-05-23 16:01:11 +03:00
Nicoleta Panaghiu
185d421074 Merge branch 'VM/RED-8882' into 'master'
RED-8882 - Help Mode design improvements

Closes RED-8882

See merge request redactmanager/red-ui!431
2024-05-23 10:04:46 +02:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
a94d8bfbc3 push back localazy update 2024-05-23 01:03:37 +00:00
Valentin Mihai
29b23cc862 VM/RED-8748 - update common ui 2024-05-22 21:42:55 +03:00
Valentin Mihai
18ca33e9d2 Merge branch 'master' into VM/RED-8748 2024-05-22 21:42:26 +03:00
Valentin Mihai
4e4aa23552 RED-8882 - Help Mode design improvements 2024-05-22 21:38:08 +03:00
Valentin-Gabriel Mihai
32d45c9097 Merge branch 'RED-6959' into 'master'
RED-6959: Added selected items count to table header

Closes RED-6959

See merge request redactmanager/red-ui!430
2024-05-22 13:51:35 +02:00
Valentin-Gabriel Mihai
b107237a90 Merge branch 'RED-8872' into 'master'
RED-8872: More readonly tabs in edit dossier, rework to signals

Closes RED-8872

See merge request redactmanager/red-ui!429
2024-05-22 13:49:13 +02:00
Adina Țeudan
0ff7c16d0d RED-6959: Added selected items count to table header 2024-05-22 14:37:40 +03:00
Adina Țeudan
19c51fa721 RED-3800: Remove commented css 2024-05-22 14:18:07 +03:00
Adina Țeudan
7319cc7cc9 RED-8872: More readonly tabs in edit dossier, rework to signals 2024-05-22 14:16:35 +03:00
Valentin-Gabriel Mihai
29cc0d9a11 Merge branch 'RED-6143' into 'master'
RED-6143: Redo dossier template settings / dialogs

Closes RED-6143

See merge request redactmanager/red-ui!420
2024-05-22 09:37:05 +02:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
977213c70e push back localazy update 2024-05-22 01:03:37 +00:00
Valentin-Gabriel Mihai
fd4b9c2ab1 Merge branch 'RED-9151' into 'master'
RED-9151: change text ordering to rendering order of the text

Closes RED-9151

See merge request redactmanager/red-ui!418
2024-05-21 14:28:51 +02:00
Kilian Schüttler
81ef952451 RED-9151: change text ordering to rendering order of the text 2024-05-21 14:28:51 +02:00
Adina Țeudan
a3748a6ae8 Merge remote-tracking branch 'origin/master' into RED-6143 2024-05-21 12:06:07 +03:00
Nicoleta Panaghiu
6dd46ca19f Merge branch 'VM/RED-8882' into 'master'
RED-8882 - removed base dialog

Closes RED-8882

See merge request redactmanager/red-ui!428
2024-05-21 09:33:53 +02:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
ef62fbe44a push back localazy update 2024-05-21 01:03:53 +00:00
Valentin Mihai
db18d9ad81 Merge branch 'master' into VM/RED-8748 2024-05-20 19:59:37 +03:00
Valentin Mihai
019d0994c8 RED-8748 - update common ui 2024-05-20 19:57:38 +03:00
Valentin Mihai
f9ca725899 RED-8882 - update common ui 2024-05-20 19:07:23 +03:00
Nicoleta Panaghiu
cfde7dc6a8 Merge branch 'VM/RED-8882' into 'master'
RED-8882 - moved help mode dialog preference into iqser-user-preferences.service

Closes RED-8882

See merge request redactmanager/red-ui!427
2024-05-20 16:13:31 +02:00
Valentin Mihai
0630b0e078 RED-8882 - moved help mode dialog preference into iqser-user-preferences.service 2024-05-20 17:10:55 +03:00
Nicoleta Panaghiu
d5a8b13b0e Merge branch 'VM/RED-8882' into 'master'
RED-8882 - removed user preferences service from help mode service

Closes RED-8882

See merge request redactmanager/red-ui!426
2024-05-20 15:32:29 +02:00
Valentin Mihai
bea47cc003 RED-8882 - removed user preferences service from help mode service 2024-05-20 16:27:41 +03:00
Nicoleta Panaghiu
28d354b90a Merge branch 'VM/RED-8882' into 'master'
RED-8882 - Help Mode design improvements

Closes RED-8882

See merge request redactmanager/red-ui!425
2024-05-20 13:44:34 +02:00
Valentin Mihai
10140556e6 RED-8882 - removed base dialog from help mode dialog 2024-05-20 14:31:58 +03:00
Valentin-Gabriel Mihai
63ee7e17b8 Merge branch 'RED-9131' into 'master'
RED-9131: more design improvements.

See merge request redactmanager/red-ui!424
2024-05-20 10:43:47 +02:00
Nicoleta Panaghiu
84c8aa4129 RED-9131: more design improvements. 2024-05-20 11:42:11 +03:00
Nicoleta Panaghiu
460046c732 Merge branch 'VM/RED-8882' into 'master'
RED-8882 - Help Mode design improvements

Closes RED-8882

See merge request redactmanager/red-ui!423
2024-05-20 09:41:33 +02:00
Valentin Mihai
239f2d0269 RED-8882 - update common ui 2024-05-20 10:40:13 +03:00
Valentin Mihai
0f89a490de Merge branch 'master' into VM/RED-8748 2024-05-17 19:14:48 +03:00
Valentin Mihai
b8ebbcbb6c RED-8882 - update common ui 2024-05-17 19:05:13 +03:00
Valentin Mihai
8088c32218 Merge branch 'master' into VM/RED-8882 2024-05-17 17:52:11 +03:00
Valentin Mihai
912f66883a WIP on VM/RED-8882
RED-8882 - Help Mode design improvements
2024-05-17 17:51:09 +03:00
Valentin-Gabriel Mihai
fd4ba25f1b Merge branch 'RED-9012' into 'master'
RED-9012: fixed cosmetical issue.

See merge request redactmanager/red-ui!422
2024-05-17 13:56:04 +02:00
Nicoleta Panaghiu
d4706a62bd RED-9012: fixed cosmetical issue. 2024-05-17 14:55:00 +03:00
Valentin-Gabriel Mihai
df859686bf Merge branch 'RED-9131' into 'master'
RED-9131: implemented design changes.

See merge request redactmanager/red-ui!421
2024-05-17 12:15:38 +02:00
Nicoleta Panaghiu
9a651e3725 RED-9131: implemented design changes. 2024-05-17 13:11:02 +03:00
project_703_bot_497bb7eb186ca592c63b3e50cd5c69e1
5dd9cd5831 push back localazy update 2024-05-17 01:03:44 +00:00
Adina Țeudan
c7658527d5 RED-6143: Redo dossier template settings / dialogs 2024-05-16 23:38:32 +03:00
Valentin Mihai
cd3ead7ac2 Merge branch 'master' into VM/RED-8882 2024-05-16 18:49:00 +03:00
Valentin Mihai
d8dca25a0e RED-8882 - update common ui 2024-05-16 18:47:50 +03:00
Valentin Mihai
836dae0c0e RED-8882 - Help Mode design improvements 2024-05-16 18:46:41 +03:00
Nicoleta Panaghiu
da4c9e6331 Merge branch 'RED-9012' into 'master'
RED-9012: style adjustments to the edit selected value feature.

See merge request redactmanager/red-ui!419
2024-05-16 12:59:05 +02:00
Nicoleta Panaghiu
d0e6f325c4 RED-9012: style adjustments to the edit selected value feature. 2024-05-16 13:56:46 +03:00
Valentin Mihai
bbd337fa1f Merge branch 'master' into VM/RED-8748 2024-05-07 22:32:57 +03:00
Valentin Mihai
3c64d2ebcf RED-8786 - Preserve New-Lines in Component values in the UI 2024-05-07 22:32:06 +03:00
Valentin Mihai
ee70abbfbe RED-8748 - added CdkDropList to be able to reorder component log values 2024-04-30 17:30:14 +03:00
Valentin Mihai
0a8147cee2 RED-8748 - update common ui 2024-04-30 16:09:48 +03:00
Valentin Mihai
722794c425 RED-8748 - added revert value dialog 2024-04-30 16:08:54 +03:00
Valentin Mihai
033c473199 Merge branch 'master' into VM/RED-8748 2024-04-30 13:17:18 +03:00
Valentin Mihai
52c6dfed5b Merge branch 'master' into VM/RED-8748 2024-04-30 13:14:08 +03:00
Valentin Mihai
64bd9ba86f RED-8748 - update common-ui 2024-04-29 22:27:18 +03:00
Valentin Mihai
c2f40a8d50 RED-8748 - filtered components using popup filter, filtered annotations based on selected component, wip on revert value dialog 2024-04-29 22:22:01 +03:00
Valentin Mihai
cae3f2dec3 Merge branch 'master' into VM/RED-8748 2024-04-24 21:49:45 +03:00
Valentin Mihai
f709edb2ee RED-8748 - WIP on filtering components 2024-04-24 21:48:35 +03:00
Valentin Mihai
1d2485db3c Merge branch 'master' into VM/RED-8748 2024-04-21 21:15:40 +03:00
Valentin Mihai
45a3729ae1 RED-8748 - WIP on component management view 2024-04-21 21:14:57 +03:00
Valentin Mihai
b157980d8a Merge branch 'master' into VM/RED-8748 2024-04-18 17:38:14 +03:00
Valentin Mihai
73438f493b RED-8748 - WIP on component management view 2024-04-18 17:37:26 +03:00
Valentin Mihai
3a51868d2d Merge branch 'master' into VM/RED-8748 2024-04-16 17:08:23 +03:00
Valentin Mihai
c024d06806 Merge branch 'master' into VM/RED-8748 2024-04-12 13:52:03 +03:00
Valentin Mihai
7c940010fd RED-8748 - WIP on component management view 2024-04-12 13:29:48 +03:00
Valentin Mihai
09fce959d4 Merge branch 'master' into VM/RED-8748 2024-04-10 12:31:53 +03:00
Valentin Mihai
e4502ea55c Merge branch 'master' into VM/RED-8748 2024-04-08 19:51:10 +03:00
Valentin Mihai
18b3da9c1e Merge branch 'master' into VM/RED-8748 2024-04-08 14:39:27 +03:00
Valentin Mihai
7cc64d6aa2 RED-8748 - update common ui 2024-04-08 14:00:50 +03:00
Valentin Mihai
a41f4a6639 RED-8748 - updated DocuMine component view based on active tenant 2024-04-08 13:59:14 +03:00
Valentin Mihai
5e548798a5 Merge branch 'master' into VM/RED-8748 2024-04-02 22:25:46 +03:00
Valentin Mihai
48bc514f5b RED-8748 - added DocuMine component view 2024-04-02 21:57:50 +03:00
Valentin Mihai
46e016d55e RED-8748 - extracted file preview header logic in another component 2024-03-28 12:27:36 +02:00
Valentin Mihai
690ffea6c5 Merge branch 'master' into VM/RED-8748 2024-03-28 12:22:56 +02:00
873 changed files with 20235 additions and 16194 deletions

View File

@ -16,6 +16,7 @@
},
"rules": {
"rxjs/no-ignored-subscription": "warn",
"@angular-eslint/prefer-standalone": "off",
"@angular-eslint/no-conflicting-lifecycle": "error",
"@angular-eslint/no-host-metadata-property": "error",
"@angular-eslint/no-input-rename": "error",

1
.gitignore vendored
View File

@ -47,3 +47,4 @@ paligo-styles/style.css*
migrations.json
*.iml
/.nx/

View File

@ -4,38 +4,60 @@ variables:
PROJECT: red-ui
DOCKERFILELOCATION: 'docker/$PROJECT/Dockerfile'
include:
- project: 'gitlab/gitlab'
ref: 'main'
file: 'ci-templates/docker_build_nexus_v2.yml'
rules:
- if: $CI_PIPELINE_SOURCE != "schedule"
- if: $CI_PIPELINE_SOURCE != "schedule"
sonarqube:
stage: test
image:
name: sonarsource/sonar-scanner-cli:11.1
entrypoint:
- ''
variables:
SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar"
GIT_DEPTH: '0'
cache:
key: "${CI_JOB_NAME}"
paths:
- ".sonar/cache"
script:
- sonar-scanner
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH"
- if: "$CI_COMMIT_BRANCH =~ /^release/"
localazy update:
image: node:20.5
cache:
- key:
files:
- yarn.lock
paths:
- .yarn-cache/
script:
- git config user.email "${CI_EMAIL}"
- git config user.name "${CI_USERNAME}"
- git remote add gitlab_origin https://${CI_USERNAME}:${CI_ACCESS_TOKEN}@gitlab.knecon.com/redactmanager/red-ui.git
- cd tools/localazy
- yarn install --cache-folder .yarn-cache
- yarn start
- cd ../..
- git add .
- |-
CHANGES=$(git status --porcelain | wc -l)
if [ "$CHANGES" -gt "0" ]
then
git status
git commit -m "push back localazy update"
git push gitlab_origin HEAD:${CI_COMMIT_REF_NAME}
fi
rules:
- if: $CI_PIPELINE_SOURCE == "schedule"
image: node:20.5
cache:
- key:
files:
- yarn.lock
paths:
- .yarn-cache/
script:
# - git config user.email "${CI_EMAIL}"
# - git config user.name "${CI_USERNAME}"
# - git remote add gitlab_origin https://${CI_USERNAME}:${CI_ACCESS_TOKEN}@gitlab.knecon.com/redactmanager/red-ui.git
- git push https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.knecon.com/redactmanager/red-ui.git
- cd tools/localazy
- yarn install --cache-folder .yarn-cache
- yarn start
- cd ../..
- git add .
- |-
CHANGES=$(git status --porcelain | wc -l)
if [ "$CHANGES" -gt "0" ]
then
git status
git commit -m "push back localazy update"
git push gitlab_origin HEAD:${CI_COMMIT_REF_NAME}
# git push https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.knecon.com/redactmanager/red-ui.git
# git push
fi
rules:
- if: $CI_PIPELINE_SOURCE == "schedule"

View File

@ -2,13 +2,12 @@
### To Create a new Stack in rancher check [this Wiki page](https://wiki.iqser.com/pages/viewpage.action?spaceKey=RED&title=Work+with+kubectl)
## Code style
# Dependencies update guide
* When updating @pdftron/webviewer, make sure to change the version also in the angular.json and everywhere where the path to /assets/wv-recources is used
* Make sure the keycloak.js version is the same with the keycloak version from helm chart
* Always use `trackBy` in `*ngFor` loops (see shorthand below)
```typescript
readonly trackBy = trackByFactory();
```
* Don't use `setInterval` without calling `clearInterval` in `ngOnDestroy`
## Code style
* Don't use `setInterval` without calling `clearInterval` in `ngOnDestroy` or in `destroyRef.onDestroy(() => clearInterval(intervalId))`
* Never call getters in HTML templates
## Keycloak Staging Config

View File

@ -36,12 +36,13 @@
"prefix": "redaction",
"targets": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"builder": "@angular/build:application",
"options": {
"outputPath": "dist/apps/red-ui",
"outputPath": {
"base": "dist/apps/red-ui"
},
"index": "apps/red-ui/src/index.html",
"main": "apps/red-ui/src/main.ts",
"polyfills": "apps/red-ui/src/polyfills.ts",
"polyfills": ["apps/red-ui/src/polyfills.ts"],
"tsConfig": "tsconfig.json",
"baseHref": "/ui/",
"assets": [
@ -49,7 +50,7 @@
{
"glob": "**/*",
"input": "node_modules/@pdftron/webviewer/public/",
"output": "/assets/wv-resources/"
"output": "/assets/wv-resources/11.1.0/"
},
{
"glob": "**/*",
@ -72,13 +73,12 @@
"stylePreprocessorOptions": {
"includePaths": ["./apps/red-ui/src/assets/styles", "./libs/common-ui/src/assets/styles"]
},
"scripts": ["node_modules/@pdftron/webviewer/webviewer.min.js", "node_modules/chart.js/dist/chart.js"],
"vendorChunk": true,
"scripts": ["node_modules/chart.js/auto/auto.cjs"],
"extractLicenses": false,
"buildOptimizer": false,
"sourceMap": true,
"optimization": false,
"namedChunks": true
"namedChunks": true,
"browser": "apps/red-ui/src/main.ts"
},
"configurations": {
"production": {
@ -100,8 +100,6 @@
"sourceMap": false,
"namedChunks": false,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true,
"budgets": [
{
"type": "initial",
@ -114,13 +112,12 @@
"maximumError": "20kb"
}
],
"serviceWorker": true,
"ngswConfigPath": "ngsw-config.json"
"serviceWorker": "ngsw-config.json"
}
}
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"builder": "@angular/build:dev-server",
"options": {
"buildTarget": "red-ui:build"
},

View File

@ -8,7 +8,7 @@ import { DossierFilesGuard } from '@guards/dossier-files-guard';
import { templateExistsWhenEnteringDossierList } from '@guards/dossier-template-exists.guard';
import { DossierTemplatesGuard } from '@guards/dossier-templates.guard';
import { loadActiveDossiersGuard, loadAllDossiersGuard, loadArchivedDossiersGuard } from '@guards/dossiers.guard';
import { editAttributeGuard } from '@guards/edit-attribute.guard';
import { isNotEditingFileAttributeGuard } from '@guards/file-attribute.guard';
import { FeaturesGuard } from '@guards/features-guard.service';
import { ifLoggedIn } from '@guards/if-logged-in.guard';
import { TrashGuard } from '@guards/trash.guard';
@ -16,7 +16,7 @@ import { CompositeRouteGuard, DEFAULT_REDIRECT_KEY, IqserPermissionsGuard, Iqser
import { TenantSelectComponent } from '@iqser/common-ui/lib/tenants';
import { doesNotHaveAnyRole, hasAnyRole, IqserAuthGuard } from '@iqser/common-ui/lib/users';
import { CustomRouteReuseStrategy } from '@iqser/common-ui/lib/utils';
import { ARCHIVE_ROUTE, BreadcrumbTypes, DOSSIER_ID, DOSSIER_TEMPLATE_ID, DOSSIERS_ARCHIVE, DOSSIERS_ROUTE, FILE_ID } from '@red/domain';
import { ARCHIVE_ROUTE, BreadcrumbTypes, DOSSIER_ID, DOSSIER_TEMPLATE_ID, DOSSIERS_ROUTE, FILE_ID } from '@red/domain';
import { RedRoleGuard } from '@users/red-role.guard';
import { Roles } from '@users/roles';
import { mainGuard } from '@utils/main.guard';
@ -38,7 +38,7 @@ const dossierTemplateIdRoutes: IqserRoutes = [
{
path: `:${DOSSIER_ID}`,
canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
canDeactivate: [editAttributeGuard],
canDeactivate: [isNotEditingFileAttributeGuard],
data: {
routeGuards: [DossierFilesGuard],
breadcrumbs: [BreadcrumbTypes.dossierTemplate, BreadcrumbTypes.dossier],
@ -49,7 +49,7 @@ const dossierTemplateIdRoutes: IqserRoutes = [
},
skeleton: 'dossier',
},
loadChildren: () => import('./modules/dossier-overview/dossier-overview.module').then(m => m.DossierOverviewModule),
loadChildren: () => import('./modules/dossier-overview/dossier-overview.routes'),
},
{
path: `:${DOSSIER_ID}/file/:${FILE_ID}`,
@ -63,12 +63,12 @@ const dossierTemplateIdRoutes: IqserRoutes = [
redirectTo: '/auth-error',
},
},
loadChildren: () => import('./modules/file-preview/file-preview.module').then(m => m.FilePreviewModule),
loadChildren: () => import('./modules/file-preview/file-preview.routes'),
},
{
path: '',
pathMatch: 'full',
loadChildren: () => import('./modules/dossiers-listing/dossiers-listing.module').then(m => m.DossiersListingModule),
loadChildren: () => import('./modules/dossiers-listing/dossiers-listing.routes'),
data: {
breadcrumbs: [BreadcrumbTypes.dossierTemplate],
},
@ -77,11 +77,10 @@ const dossierTemplateIdRoutes: IqserRoutes = [
},
{
path: `${ARCHIVE_ROUTE}`,
loadChildren: () => import('./modules/archive/archive.module').then(m => m.ArchiveModule),
canActivate: [CompositeRouteGuard, webViewerLoadedGuard(), loadArchivedDossiersGuard()],
loadChildren: () => import('./modules/archive/archive.routes'),
canActivate: [CompositeRouteGuard, loadArchivedDossiersGuard()],
data: {
routeGuards: [FeaturesGuard],
features: [DOSSIERS_ARCHIVE],
},
},
{
@ -99,16 +98,16 @@ const mainRoutes: IqserRoutes = [
},
{
path: 'account',
loadChildren: () => import('./modules/account/account.module').then(m => m.AccountModule),
loadChildren: () => import('./modules/account/account.routes'),
},
{
path: 'admin',
loadChildren: () => import('./modules/admin/admin.module').then(m => m.AdminModule),
loadChildren: () => import('./modules/admin/admin.routes'),
canActivate: [RedRoleGuard],
},
{
path: 'dashboard',
loadChildren: () => import('./modules/dashboard/dashboard.module').then(m => m.DashboardModule),
loadChildren: () => import('./modules/dashboard/dashboard.routes'),
canActivate: [CompositeRouteGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard, IqserPermissionsGuard, DossierTemplatesGuard, DashboardGuard],
@ -147,7 +146,7 @@ const mainRoutes: IqserRoutes = [
},
{
path: 'search',
loadChildren: () => import('./modules/search/search.module').then(m => m.SearchModule),
loadComponent: () => import('./modules/search/search-screen/search-screen.component'),
canActivate: [CompositeRouteGuard, IqserPermissionsGuard, loadAllDossiersGuard()],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
@ -159,7 +158,7 @@ const mainRoutes: IqserRoutes = [
},
{
path: 'trash',
loadChildren: () => import('./modules/trash/trash.module').then(m => m.TrashModule),
loadChildren: () => import('./modules/trash/trash.routes'),
canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard, TrashGuard],

View File

@ -4,26 +4,27 @@ import { UserPreferenceService } from '@users/user-preference.service';
import { getConfig } from '@iqser/common-ui';
import { AppConfig } from '@red/domain';
import { NavigationEnd, Router } from '@angular/router';
import { filter, map, switchMap, take } from 'rxjs/operators';
import { filter, map, switchMap, take, tap } from 'rxjs/operators';
import { APP_TYPE_PATHS } from '@common-ui/utils/constants';
import { MatIconRegistry } from '@angular/material/icon';
import { DomSanitizer } from '@angular/platform-browser';
import { TenantsService } from '@common-ui/tenants';
function loadCustomTheme() {
const cssFileName = getConfig<AppConfig>().THEME;
if (cssFileName) {
const head = document.getElementsByTagName('head')[0];
const link = document.createElement('link');
link.id = cssFileName;
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = 'assets/styles/themes/' + cssFileName + '.css';
link.media = 'all';
head.appendChild(link);
}
export function loadCustomTheme(cssFileName: string) {
const head = document.getElementsByTagName('head')[0];
const link = document.createElement('link');
link.id = cssFileName;
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = 'assets/styles/themes/' + cssFileName + '.css';
link.media = 'all';
head.appendChild(link);
}
@Component({
selector: 'redaction-root',
templateUrl: './app.component.html',
standalone: false,
})
export class AppComponent {
constructor(
@ -34,9 +35,12 @@ export class AppComponent {
userPreferenceService: UserPreferenceService,
renderer: Renderer2,
private readonly _router: Router,
private readonly _iconRegistry: MatIconRegistry,
private readonly _sanitizer: DomSanitizer,
private readonly _tenantsService: TenantsService,
) {
const config = getConfig<AppConfig>();
renderer.addClass(document.body, userPreferenceService.getTheme());
loadCustomTheme();
const removeQueryParams = _router.events.pipe(
filter((event): event is NavigationEnd => event instanceof NavigationEnd),
@ -47,9 +51,25 @@ export class AppComponent {
);
removeQueryParams.subscribe();
if (getConfig().IS_DOCUMINE) {
document.getElementById('favicon').setAttribute('href', 'assets/icons/documine-logo.ico');
}
this._tenantsService
.waitForSettingTenant()
.pipe(
tap(() => {
const isDocumine = this._tenantsService.activeTenant.documine;
const logo = isDocumine ? 'documine' : 'redaction';
_iconRegistry.addSvgIconInNamespace(
'iqser',
'logo',
_sanitizer.bypassSecurityTrustResourceUrl(`/assets/icons/general/${logo}-logo.svg`),
);
if (isDocumine) {
document.getElementById('favicon').setAttribute('href', 'assets/icons/documine-logo.ico');
}
loadCustomTheme(isDocumine ? APP_TYPE_PATHS.SCM : APP_TYPE_PATHS.REDACT);
}),
take(1),
)
.subscribe();
}
#removeKeycloakQueryParams() {

View File

@ -1,12 +1,21 @@
import { APP_BASE_HREF, DatePipe as BaseDatePipe } from '@angular/common';
import { HTTP_INTERCEPTORS } from '@angular/common/http';
import { ENVIRONMENT_INITIALIZER, ErrorHandler, inject, NgModule } from '@angular/core';
import { ErrorHandler, inject, NgModule, provideEnvironmentInitializer } from '@angular/core';
import { MatDividerModule } from '@angular/material/divider';
import { MAT_TOOLTIP_DEFAULT_OPTIONS } from '@angular/material/tooltip';
import { MatIcon } from '@angular/material/icon';
import { MatMenu, MatMenuContent, MatMenuItem, MatMenuTrigger } from '@angular/material/menu';
import { MatProgressSpinner } from '@angular/material/progress-spinner';
import { MAT_TOOLTIP_DEFAULT_OPTIONS, MatTooltip } from '@angular/material/tooltip';
import { BrowserModule } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { ServiceWorkerModule } from '@angular/service-worker';
import { ChevronButtonComponent } from '@common-ui/buttons/chevron-button';
import { EmptyStateComponent } from '@common-ui/empty-state';
import { HelpModeKey } from '@common-ui/help-mode/types';
import { InputWithActionComponent } from '@common-ui/inputs/input-with-action/input-with-action.component';
import { RoundCheckboxComponent } from '@common-ui/inputs/round-checkbox/round-checkbox.component';
import { GET_TENANT_FROM_PATH_FN, UI_ROOT } from '@common-ui/utils';
import { AuthErrorComponent } from '@components/auth-error/auth-error.component';
import { BaseScreenComponent } from '@components/base-screen/base-screen.component';
import { BreadcrumbsComponent } from '@components/breadcrumbs/breadcrumbs.component';
import { DownloadsListScreenComponent } from '@components/downloads-list-screen/downloads-list-screen.component';
@ -21,54 +30,51 @@ import { UserMenuComponent } from '@components/user-menu/user-menu.component';
import { environment } from '@environments/environment';
import {
CachingModule,
ChevronButtonComponent,
CircleButtonComponent,
EmptyStateComponent,
HelpModeKey,
HelpButtonComponent,
HelpModeComponent,
HiddenActionDirective,
IconButtonComponent,
InputWithActionComponent,
IqserAllowDirective,
IqserDenyDirective,
IqserHelpModeModule,
IqserListingModule,
IqserLoadingModule,
IqserTranslateModule,
LanguageService,
MAX_RETRIES_ON_SERVER_ERROR,
RoundCheckboxComponent,
SERVER_ERROR_SKIP_PATHS,
ServerErrorInterceptor,
StopPropagationDirective,
} from '@iqser/common-ui';
import { CommonUiModule } from '@iqser/common-ui/lib/common-ui.module';
import { provideHelpMode } from '@iqser/common-ui/lib/help-mode/utils/help-mode.provider';
import { LogoComponent, SkeletonComponent, ToastComponent } from '@iqser/common-ui/lib/shared';
import { TenantsModule } from '@iqser/common-ui/lib/tenants';
import { IqserUsersModule } from '@iqser/common-ui/lib/users';
import { InitialsAvatarComponent, IqserUsersModule } from '@iqser/common-ui/lib/users';
import { MonacoEditorModule } from '@materia-ui/ngx-monaco-editor';
import { MissingTranslationHandler } from '@ngx-translate/core';
import { TranslateModule } from '@ngx-translate/core';
import { AppConfig, ILoggerConfig } from '@red/domain';
import { ConfigService } from '@services/config.service';
import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service';
import { ArchivedDossiersService } from '@services/dossiers/archived-dossiers.service';
import { GlobalErrorHandler } from '@services/global-error-handler.service';
import { LoggerRulesService } from '@services/logger-rules.service';
import { provideCustomDateFormatter } from '@shared/custom-date-formatting.provider';
import { NavigateLastDossiersScreenDirective } from '@shared/directives/navigate-last-dossiers-screen.directive';
import { DatePipe } from '@shared/pipes/date.pipe';
import { SharedModule } from '@shared/shared.module';
import { FileUploadDownloadModule } from '@upload-download/file-upload-download.module';
import { RedRoleGuard } from '@users/red-role.guard';
import { UserPreferenceService } from '@users/user-preference.service';
import { UserService } from '@users/user.service';
import { UI_CACHES } from '@utils/constants';
import { REDMissingTranslationHandler } from '@utils/missing-translations-handler';
import { ColorPickerService } from 'ngx-color-picker';
import { LoggerModule, NGXLogger, NgxLoggerLevel, TOKEN_LOGGER_CONFIG, TOKEN_LOGGER_RULES_SERVICE } from 'ngx-logger';
import { ToastrModule } from 'ngx-toastr';
import * as helpModeKeys from '../assets/help-mode/help-mode-keys.json';
import helpModeKeys from '../assets/help-mode/help-mode-keys.json';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { IconsModule } from './modules/icons/icons.module';
import { PdfViewerModule } from './modules/pdf-viewer/pdf-viewer.module';
import { ACTIVE_DOSSIERS_SERVICE, ARCHIVED_DOSSIERS_SERVICE } from './tokens';
import { AuthErrorComponent } from '@components/auth-error/auth-error.component';
export const appModuleFactory = (config: AppConfig) => {
@NgModule({
@ -90,8 +96,6 @@ export const appModuleFactory = (config: AppConfig) => {
imports: [
BrowserModule,
BrowserAnimationsModule,
SharedModule,
FileUploadDownloadModule,
AppRoutingModule,
MonacoEditorModule,
CommonUiModule.forRoot({
@ -104,7 +108,6 @@ export const appModuleFactory = (config: AppConfig) => {
existingRoleGuard: RedRoleGuard,
}),
CachingModule.forRoot(UI_CACHES),
IqserHelpModeModule.forRoot(helpModeKeys as HelpModeKey[]),
PdfViewerModule,
ToastrModule.forRoot({
closeButton: true,
@ -114,7 +117,7 @@ export const appModuleFactory = (config: AppConfig) => {
resetTimeoutOnDuplicate: true,
}),
TenantsModule.forRoot(),
IqserTranslateModule.forRoot({ pathPrefix: config.BASE_TRANSLATIONS_DIRECTORY || '/assets/i18n/redact/' }),
IqserTranslateModule.forRoot({ pathPrefix: config.BASE_TRANSLATIONS_DIRECTORY }),
IqserLoadingModule.forRoot(),
ServiceWorkerModule.register('ngsw-worker.js', { enabled: environment.production }),
LoggerModule.forRoot(undefined, {
@ -132,20 +135,20 @@ export const appModuleFactory = (config: AppConfig) => {
features: {
ANNOTATIONS: {
color: 'aqua',
enabled: true,
enabled: false,
level: NgxLoggerLevel.DEBUG,
},
FILTERS: {
enabled: false,
},
TENANTS: {
enabled: true,
enabled: false,
},
ROUTES: {
enabled: true,
enabled: false,
},
PDF: {
enabled: true,
enabled: false,
},
FILE: {
enabled: false,
@ -168,6 +171,9 @@ export const appModuleFactory = (config: AppConfig) => {
DOSSIERS_CHANGES: {
enabled: false,
},
GUARDS: {
enabled: false,
},
},
} as ILoggerConfig,
},
@ -186,6 +192,20 @@ export const appModuleFactory = (config: AppConfig) => {
IconButtonComponent,
MatDividerModule,
ChevronButtonComponent,
InitialsAvatarComponent,
HelpModeComponent,
HelpButtonComponent,
MatMenuTrigger,
MatMenuItem,
MatIcon,
MatMenu,
MatMenuContent,
MatTooltip,
MatProgressSpinner,
IconsModule,
NavigateLastDossiersScreenDirective,
DatePipe,
TranslateModule,
],
providers: [
{
@ -213,18 +233,10 @@ export const appModuleFactory = (config: AppConfig) => {
provide: ErrorHandler,
useClass: GlobalErrorHandler,
},
{
provide: ENVIRONMENT_INITIALIZER,
multi: true,
useValue: async () => {
const languageService = inject(LanguageService);
return languageService.setInitialLanguage();
},
},
{
provide: MissingTranslationHandler,
useClass: REDMissingTranslationHandler,
},
provideEnvironmentInitializer(async () => {
const languageService = inject(LanguageService);
return languageService.setInitialLanguage();
}),
{
provide: MAX_RETRIES_ON_SERVER_ERROR,
useFactory: () => config.MAX_RETRIES_ON_SERVER_ERROR,
@ -245,10 +257,14 @@ export const appModuleFactory = (config: AppConfig) => {
provide: MAT_TOOLTIP_DEFAULT_OPTIONS,
useValue: {
disableTooltipInteractivity: true,
showDelay: 1,
},
},
BaseDatePipe,
DatePipe,
...provideCustomDateFormatter(),
...provideHelpMode(helpModeKeys as HelpModeKey[]),
ColorPickerService,
],
bootstrap: [AppComponent],
})

View File

@ -7,6 +7,7 @@ import { AppConfig } from '@red/domain';
selector: 'redaction-auth-error',
templateUrl: './auth-error.component.html',
styleUrls: ['./auth-error.component.scss'],
standalone: false,
})
export class AuthErrorComponent {
readonly #config = getConfig<AppConfig>();

View File

@ -9,7 +9,7 @@
<redaction-breadcrumbs></redaction-breadcrumbs>
</div>
<a [matTooltip]="'top-bar.navigation-items.back-to-dashboard' | translate" [routerLink]="['/']" class="logo">
<a [matTooltip]="'top-bar.navigation-items.back-to-dashboard' | translate" [routerLink]="['/main']" class="logo">
<div [attr.help-mode-key]="'home'" class="actions">
<iqser-logo (iqserHiddenAction)="userPreferenceService.toggleDevFeatures()" icon="iqser:logo"></iqser-logo>
<div class="app-name">{{ titleService.getTitle() }}</div>
@ -25,7 +25,7 @@
[placeholder]="'search.placeholder' | translate"
></redaction-spotlight-search>
<iqser-help-button [attr.help-mode-key]="'help_mode'" id="help-mode-button"></iqser-help-button>
<iqser-help-button [dialogButton]="false"></iqser-help-button>
<redaction-notifications
*ngIf="currentUser.isUser || currentUser.isManager"

View File

@ -8,8 +8,7 @@ import { SpotlightSearchAction } from '@components/spotlight-search/spotlight-se
import { filter, map, startWith } from 'rxjs/operators';
import { getConfig, IqserPermissionsService } from '@iqser/common-ui';
import { BreadcrumbsService } from '@services/breadcrumbs.service';
import { FeaturesService } from '@services/features.service';
import { ARCHIVE_ROUTE, DOSSIERS_ARCHIVE, DOSSIERS_ROUTE } from '@red/domain';
import { ARCHIVE_ROUTE, DOSSIERS_ROUTE } from '@red/domain';
import { Roles } from '@users/roles';
import { REDDocumentViewer } from '../../modules/pdf-viewer/services/document-viewer.service';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
@ -21,6 +20,7 @@ const isSearchScreen: (url: string) => boolean = url => url.includes('/search');
@Component({
templateUrl: './base-screen.component.html',
styleUrls: ['./base-screen.component.scss'],
standalone: false,
})
export class BaseScreenComponent {
readonly roles = Roles;
@ -36,7 +36,6 @@ export class BaseScreenComponent {
{
text: this._translateService.instant('search.active-dossiers'),
icon: 'red:enter',
hide: () => !this._featuresService.isEnabled(DOSSIERS_ARCHIVE),
action: (query): void => this.#search(query, [], true),
},
{
@ -58,7 +57,6 @@ export class BaseScreenComponent {
private readonly _router: Router,
activatedRoute: ActivatedRoute,
private readonly _translateService: TranslateService,
private readonly _featuresService: FeaturesService,
readonly permissionsService: IqserPermissionsService,
readonly userService: UserService,
readonly userPreferenceService: UserPreferenceService,

View File

@ -7,6 +7,7 @@ import { Breadcrumb, BreadcrumbDisplayType, BreadcrumbsService } from '@services
selector: 'redaction-breadcrumbs',
templateUrl: './breadcrumbs.component.html',
styleUrls: ['./breadcrumbs.component.scss'],
standalone: false,
})
export class BreadcrumbsComponent {
constructor(readonly breadcrumbsService: BreadcrumbsService) {}

View File

@ -13,6 +13,7 @@ import { firstValueFrom } from 'rxjs';
entitiesService: FileDownloadService,
component: DownloadsListScreenComponent,
}),
standalone: false,
})
export class DownloadsListScreenComponent extends ListingComponent<DownloadStatus> implements OnDestroy {
readonly #interval: number;

View File

@ -32,19 +32,18 @@
</div>
<div
(click)="markRead([notification], true)"
(click)="handleMarkReadEvent($event, [notification], true)"
*ngFor="let notification of group.notifications; trackBy: trackBy"
[class.unread]="!notification.readDate"
[id]="'notifications-mark-as-read-' + notification.id + '-btn'"
class="notification"
iqserStopPropagation
mat-menu-item
>
<iqser-initials-avatar [user]="notification.userId"></iqser-initials-avatar>
<div class="notification-content">
<div [innerHTML]="notification.message"></div>
<div class="small-label mt-2">{{ notification.creationDate | date : 'exactDate' }}</div>
<div class="small-label mt-2">{{ notification.creationDate | date: 'exactDate' }}</div>
</div>
<div
@ -52,7 +51,7 @@
[id]="'notifications-mark-' + notification.id"
class="dot"
iqserStopPropagation
matTooltip="{{ 'notifications.mark-as' | translate : { type: notification.readDate ? 'unread' : 'read' } }}"
matTooltip="{{ 'notifications.mark-as' | translate: { type: notification.readDate ? 'unread' : 'read' } }}"
matTooltipPosition="before"
></div>
</div>

View File

@ -22,7 +22,7 @@
}
.mat-mdc-menu-item.notification {
padding: 8px 26px 10px 8px;
padding: 8px 26px 10px 8px !important;
margin: 2px 0 0 0;
height: fit-content;
position: relative;

View File

@ -25,6 +25,7 @@ function chronologically(first: string, second: string) {
selector: 'redaction-notifications',
templateUrl: './notifications.component.html',
styleUrls: ['./notifications.component.scss'],
standalone: false,
})
export class NotificationsComponent {
readonly hasUnreadNotifications$: Observable<boolean>;
@ -58,6 +59,15 @@ export class NotificationsComponent {
await this._notificationsService.toggleNotificationRead(notificationsIds, isRead);
}
async handleMarkReadEvent(event: MouseEvent, notifications: Notification[] = this._notificationsService.all, isRead = true) {
if (!(event.target as HTMLBaseElement).href) {
event.stopPropagation();
event.preventDefault();
}
await this.markRead(notifications, isRead);
}
#groupNotifications(notifications: Notification[]): NotificationsGroup[] {
const todayTranslation = this._translateService.instant('today');
const groupedMap = notifications.groupBy(n => {

View File

@ -9,7 +9,7 @@
.container {
padding: 32px;
width: 900px;
width: 1000px;
max-width: 100%;
box-sizing: border-box;
}

View File

@ -5,5 +5,6 @@ import { ChangeDetectionStrategy, Component } from '@angular/core';
templateUrl: './dashboard-skeleton.component.html',
styleUrls: ['./dashboard-skeleton.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: false,
})
export class DashboardSkeletonComponent {}

View File

@ -5,6 +5,7 @@ import { ChangeDetectionStrategy, Component, OnInit, TemplateRef, ViewChild } fr
templateUrl: './dossier-skeleton.component.html',
styleUrls: ['./dossier-skeleton.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: false,
})
export class DossierSkeletonComponent implements OnInit {
@ViewChild('workload1', { static: true }) workload1: TemplateRef<unknown>;

View File

@ -5,5 +5,6 @@ import { ChangeDetectionStrategy, Component } from '@angular/core';
templateUrl: './skeleton-stats.component.html',
styleUrls: ['./skeleton-stats.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: false,
})
export class SkeletonStatsComponent {}

View File

@ -6,6 +6,7 @@ import { Title } from '@angular/platform-browser';
templateUrl: './skeleton-top-bar.component.html',
styleUrls: ['./skeleton-top-bar.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: false,
})
export class SkeletonTopBarComponent {
constructor(readonly titleService: Title) {}

View File

@ -9,6 +9,7 @@ import { MatMenuTrigger } from '@angular/material/menu';
templateUrl: './spotlight-search.component.html',
styleUrls: ['./spotlight-search.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: false,
})
export class SpotlightSearchComponent {
@Input() actions: readonly SpotlightSearchAction[];

View File

@ -9,6 +9,7 @@ interface ITenant extends IStoredTenantId {
selector: 'app-tenants-menu',
templateUrl: './tenants-menu.component.html',
styleUrls: ['./tenants-menu.component.scss'],
standalone: false,
})
export class TenantsMenuComponent {
readonly tenantsService = inject(TenantsService);

View File

@ -20,6 +20,7 @@ interface MenuItem {
selector: 'app-user-menu',
templateUrl: './user-menu.component.html',
styleUrls: ['./user-menu.component.scss'],
standalone: false,
})
export class UserMenuComponent {
readonly currentUser = getCurrentUser<User>();

View File

@ -11,7 +11,9 @@ import { DictionaryService } from '@services/entity-services/dictionary.service'
import { DefaultColorsService } from '@services/entity-services/default-colors.service';
import { WatermarkService } from '@services/entity-services/watermark.service';
import { FileAttributesService } from '@services/entity-services/file-attributes.service';
import { getConfig } from '@iqser/common-ui';
import { getConfig, Toaster } from '@iqser/common-ui';
import { RulesService } from '../modules/admin/services/rules.service';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
export function templateExistsWhenEnteringAdmin(): CanActivateFn {
return async function (route: ActivatedRouteSnapshot): Promise<boolean> {
@ -21,12 +23,14 @@ export function templateExistsWhenEnteringAdmin(): CanActivateFn {
const defaultColorsService = inject(DefaultColorsService);
const watermarksService = inject(WatermarkService);
const router = inject(Router);
const rulesService = inject(RulesService);
const isDocumine = getConfig().IS_DOCUMINE;
const dossierTemplate = inject(DossierTemplateStatsService).get(dossierTemplateId);
await firstValueFrom(fileAttributesService.loadFileAttributesConfig(dossierTemplateId));
await firstValueFrom(dictionaryService.loadDictionaryDataForDossierTemplate(dossierTemplateId));
await firstValueFrom(defaultColorsService.loadForDossierTemplate(dossierTemplateId));
await firstValueFrom(rulesService.getFor(dossierTemplateId));
if (!isDocumine) {
await firstValueFrom(watermarksService.loadForDossierTemplate(dossierTemplateId));
}
@ -50,6 +54,8 @@ export function templateExistsWhenEnteringDossierList(): CanActivateFn {
const dictionaryService = inject(DictionaryService);
const defaultColorsService = inject(DefaultColorsService);
const watermarksService = inject(WatermarkService);
const rulesService = inject(RulesService);
const toaster = inject(Toaster);
const isDocumine = getConfig().IS_DOCUMINE;
await firstValueFrom(dashboardStatsService.loadForTemplate(dossierTemplateId));
@ -64,6 +70,10 @@ export function templateExistsWhenEnteringDossierList(): CanActivateFn {
await firstValueFrom(fileAttributesService.loadFileAttributesConfig(dossierTemplateId));
await firstValueFrom(dictionaryService.loadDictionaryDataForDossierTemplate(dossierTemplateId));
await firstValueFrom(defaultColorsService.loadForDossierTemplate(dossierTemplateId));
const rules = await firstValueFrom(rulesService.getFor(dossierTemplateId));
if (rules.timeoutDetected) {
toaster.error(_('dossier-listing.rules.timeoutError'));
}
if (!isDocumine) {
await firstValueFrom(watermarksService.loadForDossierTemplate(dossierTemplateId));
}

View File

@ -1,8 +0,0 @@
import { inject } from '@angular/core';
import { CanDeactivateFn } from '@angular/router';
import { FileAttributesService } from '@services/entity-services/file-attributes.service';
import { DossierOverviewScreenComponent } from '../modules/dossier-overview/screen/dossier-overview-screen.component';
// TODO: rename to something like "isNotEditingFileAttributeGuard"
export const editAttributeGuard: CanDeactivateFn<DossierOverviewScreenComponent> = () =>
!inject(FileAttributesService).isEditingFileAttribute();

View File

@ -0,0 +1,7 @@
import { inject } from '@angular/core';
import { CanDeactivateFn } from '@angular/router';
import { FileAttributesService } from '@services/entity-services/file-attributes.service';
import DossierOverviewScreenComponent from '../modules/dossier-overview/screen/dossier-overview-screen.component';
export const isNotEditingFileAttributeGuard: CanDeactivateFn<DossierOverviewScreenComponent> = () =>
!inject(FileAttributesService).isEditingFileAttribute();

View File

@ -40,8 +40,7 @@ export function ifLoggedIn(): AsyncGuard {
logger.info('[KEYCLOAK] Keycloak init...');
await keycloakInitializer(tenant);
logger.info('[KEYCLOAK] Keycloak init done!');
console.log({ tenant });
logger.info('[KEYCLOAK] Keycloak init done for tenant: ', { tenant });
await tenantsService.selectTenant(tenant);
await usersService.initialize();
await licenseService.loadLicenses();
@ -51,6 +50,7 @@ export function ifLoggedIn(): AsyncGuard {
const jwtToken = jwtDecode(token) as JwtToken;
const authTime = (jwtToken.auth_time || jwtToken.iat).toString();
localStorage.setItem('authTime', authTime);
localStorage.setItem('token', token);
}
}

View File

@ -1,7 +1,7 @@
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivate } from '@angular/router';
import { firstValueFrom } from 'rxjs';
import { EntityPermissionsService } from '@services/entity-permissions/entity-permissions.service';
import { firstValueFrom } from 'rxjs';
@Injectable({ providedIn: 'root' })
export class PermissionsGuard implements CanActivate {

View File

@ -1,6 +1,6 @@
import { AnnotationPermissions } from '@models/file/annotation.permissions';
import { AnnotationWrapper } from '@models/file/annotation.wrapper';
import { Dictionary } from '@red/domain';
import { Dictionary, SuperTypes } from '@red/domain';
export const canUndo = (annotation: AnnotationWrapper, isApprover: boolean) => !isApprover && annotation.pending;
@ -8,15 +8,15 @@ export const canForceHint = (annotation: AnnotationWrapper, canAddRedaction: boo
canAddRedaction && annotation.isIgnoredHint && !annotation.pending;
export const canForceRedaction = (annotation: AnnotationWrapper, canAddRedaction: boolean) =>
canAddRedaction && annotation.isSkipped && !annotation.isFalsePositive && !annotation.pending;
canAddRedaction &&
(annotation.isSkipped || (annotation.IMAGE_HINT && annotation.superType === SuperTypes.Hint)) &&
!annotation.isFalsePositive &&
!annotation.pending;
export const canAcceptRecommendation = (annotation: AnnotationWrapper) => annotation.isRecommendation && !annotation.pending;
export const canMarkAsFalsePositive = (annotation: AnnotationWrapper, annotationEntity: Dictionary) =>
annotation.canBeMarkedAsFalsePositive &&
!annotation.hasBeenForcedRedaction &&
!annotation.hasBeenResizedLocally &&
annotationEntity?.hasDictionary;
annotation.canBeMarkedAsFalsePositive && !annotation.hasBeenResizedLocally && annotationEntity?.hasDictionary;
export const canRemoveOnlyHere = (annotation: AnnotationWrapper, canAddRedaction: boolean, autoAnalysisDisabled: boolean) =>
canAddRedaction &&
@ -24,11 +24,10 @@ export const canRemoveOnlyHere = (annotation: AnnotationWrapper, canAddRedaction
(annotation.isRedacted || (annotation.isHint && !annotation.isImage));
export const canRemoveFromDictionary = (annotation: AnnotationWrapper, autoAnalysisDisabled: boolean) =>
annotation.isModifyDictionary &&
(annotation.isModifyDictionary || annotation.engines.includes('DICTIONARY') || annotation.engines.includes('DOSSIER_DICTIONARY')) &&
(annotation.isRedacted || annotation.isSkipped || annotation.isHint || (annotation.isIgnoredHint && !annotation.isRuleBased)) &&
(autoAnalysisDisabled || !annotation.pending) &&
!annotation.hasBeenResizedLocally &&
!(annotation.hasBeenForcedHint || annotation.hasBeenForcedRedaction);
annotation.isDictBased;
export const canRemoveRedaction = (annotation: AnnotationWrapper, permissions: AnnotationPermissions) =>
(!annotation.isIgnoredHint || !annotation.isRuleBased) &&
@ -70,3 +69,5 @@ export const canEditHint = (annotation: AnnotationWrapper) =>
((annotation.isHint && !annotation.isRuleBased) || annotation.isIgnoredHint) && !annotation.isImage;
export const canEditImage = (annotation: AnnotationWrapper) => annotation.isImage;
export const canRevertChanges = (annotation: AnnotationWrapper) => annotation.hasRedactionChanges;

View File

@ -17,6 +17,7 @@ import {
canRemoveRedaction,
canResizeAnnotation,
canResizeInDictionary,
canRevertChanges,
canUndo,
} from './annotation-permissions.utils';
import { AnnotationWrapper } from './annotation.wrapper';
@ -37,6 +38,7 @@ export class AnnotationPermissions {
canEditAnnotations = true;
canEditHints = true;
canEditImages = true;
canRevertChanges = true;
static forUser(
isApprover: boolean,
@ -75,6 +77,7 @@ export class AnnotationPermissions {
permissions.canEditAnnotations = canEditAnnotation(annotation);
permissions.canEditHints = canEditHint(annotation);
permissions.canEditImages = canEditImage(annotation);
permissions.canRevertChanges = canRevertChanges(annotation);
summedPermissions._merge(permissions);
}
return summedPermissions;
@ -97,6 +100,7 @@ export class AnnotationPermissions {
result.canEditAnnotations = permissions.reduce((acc, next) => acc && next.canEditAnnotations, true);
result.canEditHints = permissions.reduce((acc, next) => acc && next.canEditHints, true);
result.canEditImages = permissions.reduce((acc, next) => acc && next.canEditImages, true);
result.canRevertChanges = permissions.reduce((acc, next) => acc && next.canRevertChanges, true);
return result;
}

View File

@ -26,6 +26,12 @@ import {
} from '@red/domain';
import { annotationTypesTranslations } from '@translations/annotation-types-translations';
interface AnnotationContent {
translation: string;
params: { [key: string]: string };
untranslatedContent: string;
}
export class AnnotationWrapper implements IListable {
id: string;
superType: SuperType;
@ -34,9 +40,9 @@ export class AnnotationWrapper implements IListable {
typeLabel?: string;
color: string;
numberOfComments = 0;
firstTopLeftPoint: IPoint;
firstBottomLeftPoint: IPoint;
shortContent: string;
content: string;
content: AnnotationContent;
value: string;
pageNumber: number;
dictionaryOperation = false;
@ -74,7 +80,18 @@ export class AnnotationWrapper implements IListable {
}
get isDictBased() {
return this.engines.includes(LogEntryEngines.DICTIONARY);
return [LogEntryEngines.DICTIONARY, LogEntryEngines.DOSSIER_DICTIONARY].some(engine => this.engines.includes(engine));
}
get isRedactedImageHint() {
return (
(this.IMAGE_HINT && this.superType === SuperTypes.Redaction) ||
(this.IMAGE_HINT && this.superType === SuperTypes.ManualRedaction)
);
}
get isSkippedImageHint() {
return this.IMAGE_HINT && this.superType === SuperTypes.Hint;
}
get searchKey(): string {
@ -95,7 +112,10 @@ export class AnnotationWrapper implements IListable {
get canBeMarkedAsFalsePositive() {
return (
(this.isRecommendation || this.superType === SuperTypes.Redaction || (this.isSkipped && this.isDictBased)) &&
(this.isRecommendation ||
this.superType === SuperTypes.Redaction ||
(this.isSkipped && this.isDictBased) ||
(this.isRemovedLocally && this.isDictBased)) &&
!this.isImage &&
!this.imported &&
!this.pending &&
@ -179,11 +199,11 @@ export class AnnotationWrapper implements IListable {
}
get x() {
return this.firstTopLeftPoint.x;
return this.firstBottomLeftPoint.x;
}
get y() {
return this.firstTopLeftPoint.y;
return this.firstBottomLeftPoint.y;
}
get legalBasis() {
@ -208,7 +228,7 @@ export class AnnotationWrapper implements IListable {
annotationWrapper.value = 'Imported';
annotationWrapper.color = earmark.hexColor;
annotationWrapper.positions = earmark.positions;
annotationWrapper.firstTopLeftPoint = earmark.positions[0]?.topLeft;
annotationWrapper.firstBottomLeftPoint = earmark.positions[0]?.topLeft;
annotationWrapper.superTypeLabel = annotationTypesTranslations[annotationWrapper.superType];
return annotationWrapper;
@ -229,7 +249,7 @@ export class AnnotationWrapper implements IListable {
annotationWrapper.isChangeLogEntry = logEntry.state === EntryStates.REMOVED || !!changeLogType;
annotationWrapper.type = logEntry.type;
annotationWrapper.value = logEntry.value;
annotationWrapper.firstTopLeftPoint = { x: logEntry.positions[0].rectangle[0], y: logEntry.positions[0].rectangle[1] };
annotationWrapper.firstBottomLeftPoint = { x: logEntry.positions[0].rectangle[0], y: logEntry.positions[0].rectangle[1] };
annotationWrapper.pageNumber = logEntry.positions[0].pageNumber;
annotationWrapper.positions = logEntry.positions.map(p => ({
page: p.pageNumber,
@ -262,16 +282,16 @@ export class AnnotationWrapper implements IListable {
annotationWrapper.hasLegalBasisChanged = !!logEntry.manualChanges?.find(
c => c.manualRedactionType === ManualRedactionTypes.LEGAL_BASIS_CHANGE,
);
annotationWrapper.hasBeenForcedHint = !!logEntry.manualChanges?.find(c => c.manualRedactionType === ManualRedactionTypes.FORCE);
annotationWrapper.hasBeenForcedRedaction = !!logEntry.manualChanges?.find(
c => c.manualRedactionType === ManualRedactionTypes.FORCE,
);
annotationWrapper.hasBeenForcedHint =
!!logEntry.manualChanges?.find(c => c.manualRedactionType === ManualRedactionTypes.FORCE) && annotationWrapper.HINT;
annotationWrapper.hasBeenForcedRedaction =
!!logEntry.manualChanges?.find(c => c.manualRedactionType === ManualRedactionTypes.FORCE) && !annotationWrapper.HINT;
annotationWrapper.hasBeenRemovedByManualOverride = !!logEntry.manualChanges?.find(
c => c.manualRedactionType === ManualRedactionTypes.REMOVE,
);
const content = this.#createContent(annotationWrapper, logEntry, isDocumine);
annotationWrapper.shortContent = this.#getShortContent(annotationWrapper, legalBasisList) || content;
annotationWrapper.shortContent = this.#getShortContent(annotationWrapper, legalBasisList) || content.untranslatedContent;
annotationWrapper.content = content;
const lastRelevantManualChange = logEntry.manualChanges?.at(-1);
@ -291,7 +311,10 @@ export class AnnotationWrapper implements IListable {
} else {
const colorKey = annotationEntityColorConfig[annotationWrapper.superType];
const defaultColor = annotationDefaultColorConfig[annotationWrapper.superType];
annotationWrapper.color = dictionary ? (dictionary[colorKey] as string) : (defaultColors[defaultColor] as string);
annotationWrapper.color =
dictionary && !annotationWrapper.isRedactedImageHint
? (dictionary[colorKey] as string)
: (defaultColors[defaultColor] as string);
}
annotationWrapper.entry = logEntry;
@ -300,44 +323,62 @@ export class AnnotationWrapper implements IListable {
}
static #createContent(annotationWrapper: AnnotationWrapper, logEntry: IEntityLogEntry, isDocumine: boolean) {
let content = '';
let untranslatedContent = '';
const params: { [key: string]: string } = {};
if (logEntry.matchedRule) {
content += `Rule ${logEntry.matchedRule} matched${isDocumine ? ':' : ''} \n\n`;
params['hasRule'] = 'true';
params['matchedRule'] = logEntry.matchedRule.replace(/(^[, ]*)|([, ]*$)/g, '');
params['ruleSymbol'] = isDocumine ? ':' : '';
untranslatedContent += `Rule ${logEntry.matchedRule} matched${isDocumine ? ':' : ''} \n\n`;
}
if (logEntry.reason) {
params['hasReason'] = 'true';
if (isDocumine && logEntry.reason.slice(-1) === '.') {
logEntry.reason = logEntry.reason.slice(0, -1);
}
content += logEntry.reason + '\n\n';
if (!params['hasRule']) {
params['reason'] = logEntry.reason.substring(0, 1).toUpperCase() + logEntry.reason.substring(1);
} else {
params['reason'] = logEntry.reason;
}
params['reason'] = params['reason'].replace(/(^[, ]*)|([, ]*$)/g, '');
untranslatedContent += logEntry.reason + '\n\n';
//remove leading and trailing commas and whitespaces
content = content.replace(/(^[, ]*)|([, ]*$)/g, '');
content = content.substring(0, 1).toUpperCase() + content.substring(1);
untranslatedContent = untranslatedContent.replace(/(^[, ]*)|([, ]*$)/g, '');
untranslatedContent = untranslatedContent.substring(0, 1).toUpperCase() + untranslatedContent.substring(1);
}
if (annotationWrapper.legalBasis && !isDocumine) {
content += 'Legal basis: ' + annotationWrapper.legalBasis + '\n\n';
params['hasLb'] = 'true';
params['legalBasis'] = annotationWrapper.legalBasis;
untranslatedContent += 'Legal basis: ' + annotationWrapper.legalBasis + '\n\n';
}
if (annotationWrapper.hasBeenRemovedByManualOverride) {
content += 'Removed by manual override';
params['hasOverride'] = 'true';
untranslatedContent += 'Removed by manual override';
}
if (logEntry.section) {
params['hasSection'] = 'true';
params['sectionSymbol'] = isDocumine ? '' : ':';
params['shouldLower'] = untranslatedContent.length.toString();
params['section'] = logEntry.section;
let prefix = `In section${isDocumine ? '' : ':'} `;
if (content.length) {
if (untranslatedContent.length) {
prefix = ` ${prefix.toLowerCase()}`;
}
content += `${prefix} "${logEntry.section}"`;
untranslatedContent += `${prefix} "${logEntry.section}"`;
}
return content;
return { translation: _('annotation-content'), params: params, untranslatedContent: untranslatedContent };
}
static #getShortContent(annotationWrapper: AnnotationWrapper, legalBasisList: ILegalBasis[]) {
if (annotationWrapper.legalBasis) {
const lb = legalBasisList.find(lbm => lbm.reason?.toLowerCase().includes(annotationWrapper.legalBasis.toLowerCase()));
const lb = legalBasisList.find(lbm => lbm.technicalName?.toLowerCase().includes(annotationWrapper.legalBasis.toLowerCase()));
if (lb) {
return lb.name;
}

View File

@ -4,6 +4,10 @@ import { IqserPermissionsService } from '@iqser/common-ui';
import { Roles } from '@users/roles';
import { User } from '@red/domain';
import { getCurrentUser } from '@iqser/common-ui/lib/users';
import { SideNavComponent } from '@common-ui/shared';
import { TranslateModule } from '@ngx-translate/core';
import { NgForOf, NgIf } from '@angular/common';
import { RouterLink, RouterLinkActive } from '@angular/router';
interface NavItem {
readonly label: string;
@ -17,6 +21,7 @@ interface NavItem {
templateUrl: './account-side-nav.component.html',
styleUrls: ['./account-side-nav.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [SideNavComponent, TranslateModule, NgForOf, NgIf, RouterLinkActive, RouterLink],
})
export class AccountSideNavComponent {
readonly currentUser = getCurrentUser<User>();

View File

@ -1,28 +0,0 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { SharedModule } from '@shared/shared.module';
import { AccountRoutingModule } from './account-routing.module';
import { AccountSideNavComponent } from './account-side-nav/account-side-nav.component';
import { BaseAccountScreenComponent } from './base-account-screen/base-account-screen-component';
import { NotificationPreferencesService } from './services/notification-preferences.service';
import { TranslateModule } from '@ngx-translate/core';
import { IconButtonComponent, IqserAllowDirective, IqserHelpModeModule } from '@iqser/common-ui';
import { PreferencesComponent } from './screens/preferences/preferences.component';
import { SideNavComponent } from '@iqser/common-ui/lib/shared';
import { DialogDefaultsComponent } from './screens/preferences/dialog-defaults/dialog-defaults.component';
@NgModule({
declarations: [AccountSideNavComponent, BaseAccountScreenComponent, PreferencesComponent, DialogDefaultsComponent],
imports: [
CommonModule,
SharedModule,
AccountRoutingModule,
TranslateModule,
IqserHelpModeModule,
IconButtonComponent,
SideNavComponent,
IqserAllowDirective,
],
providers: [NotificationPreferencesService],
})
export class AccountModule {}

View File

@ -1,13 +1,13 @@
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { CompositeRouteGuard, IqserPermissionsGuard, IqserRoutes } from '@iqser/common-ui';
import { RedRoleGuard } from '@users/red-role.guard';
import { BaseAccountScreenComponent } from './base-account-screen/base-account-screen-component';
import { PreferencesComponent } from './screens/preferences/preferences.component';
import { Roles } from '@users/roles';
import { IqserAuthGuard } from '@iqser/common-ui/lib/users';
import { PendingChangesGuard } from '@guards/can-deactivate.guard';
import { NotificationPreferencesService } from './services/notification-preferences.service';
const routes: IqserRoutes = [
export default [
{ path: '', redirectTo: 'user-profile', pathMatch: 'full' },
{
path: 'user-profile',
@ -16,12 +16,13 @@ const routes: IqserRoutes = [
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
loadChildren: () => import('./screens/user-profile/user-profile.module').then(m => m.UserProfileModule),
loadChildren: () => import('./screens/user-profile/user-profile.routes'),
},
{
path: 'notifications',
component: BaseAccountScreenComponent,
canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
canDeactivate: [PendingChangesGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
permissions: {
@ -29,7 +30,8 @@ const routes: IqserRoutes = [
redirectTo: '/',
},
},
loadChildren: () => import('./screens/notifications/notifications.module').then(m => m.NotificationsModule),
providers: [NotificationPreferencesService],
loadChildren: () => import('./screens/notifications/notifications.routes'),
},
{
path: 'preferences',
@ -61,10 +63,4 @@ const routes: IqserRoutes = [
},
],
},
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule],
})
export class AccountRoutingModule {}
] satisfies IqserRoutes;

View File

@ -7,11 +7,12 @@
<div class="content-inner">
<div class="content-container full-height">
<div class="overlay-shadow"></div>
<div class="dialog">
<div class="dialog-header">
<div class="heading-l" [translate]="translations[path]"></div>
</div>
<div [ngClass]="!isWarningsScreen && 'dialog'">
@if (!isWarningsScreen) {
<div class="dialog-header">
<div class="heading-l" [translate]="translations[path]"></div>
</div>
}
<router-outlet></router-outlet>
</div>
</div>

View File

@ -1,26 +1,35 @@
import { ChangeDetectionStrategy, Component, OnInit, ViewContainerRef } from '@angular/core';
import { Router } from '@angular/router';
import { Router, RouterOutlet } from '@angular/router';
import { accountTranslations } from '@translations/account-translations';
import { NgClass } from '@angular/common';
import { AccountSideNavComponent } from '../account-side-nav/account-side-nav.component';
import { TranslateModule } from '@ngx-translate/core';
@Component({
selector: 'redaction-base-account-screen',
templateUrl: './base-account-screen-component.html',
styleUrls: ['./base-account-screen-component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [NgClass, RouterOutlet, AccountSideNavComponent, TranslateModule],
})
export class BaseAccountScreenComponent implements OnInit {
readonly translations = accountTranslations;
readonly path: string;
readonly isWarningsScreen: boolean;
constructor(private readonly _router: Router, private readonly _hostRef: ViewContainerRef) {
constructor(
private readonly _router: Router,
private readonly _hostRef: ViewContainerRef,
) {
this.path = this._router.url.split('/').pop();
this.isWarningsScreen = this.path === 'warnings-preferences';
}
ngOnInit(): void {
this._setDialogWidth();
this.#setDialogWidth();
}
private _setDialogWidth() {
#setDialogWidth() {
const element = this._hostRef.element.nativeElement as HTMLElement;
element.style.setProperty('--width', this.path === 'user-profile' ? 'unset' : '100%');
}

View File

@ -1,7 +1,7 @@
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, inject, OnInit } from '@angular/core';
import { UntypedFormBuilder } from '@angular/forms';
import { ReactiveFormsModule, UntypedFormBuilder } from '@angular/forms';
import { NotificationPreferencesService } from '../../../services/notification-preferences.service';
import { BaseFormComponent, getConfig, LoadingService, Toaster } from '@iqser/common-ui';
import { BaseFormComponent, getConfig, IconButtonComponent, LoadingService, Toaster } from '@iqser/common-ui';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import {
DocumentNotificationsTypes,
@ -14,6 +14,10 @@ import {
import { firstValueFrom } from 'rxjs';
import { notificationsSettingsTranslations } from '@translations/notifications-settings-translations';
import { getCurrentUser } from '@iqser/common-ui/lib/users';
import { NgForOf, NgIf } from '@angular/common';
import { MatSlideToggle } from '@angular/material/slide-toggle';
import { TranslateModule } from '@ngx-translate/core';
import { MatCheckbox } from '@angular/material/checkbox';
const RSS_EXCLUDED_SETTINGS = ['USER_PROMOTED_TO_APPROVER', 'USER_DEGRADED_TO_REVIEWER', 'ASSIGN_REVIEWER'];
@ -21,6 +25,7 @@ const RSS_EXCLUDED_SETTINGS = ['USER_PROMOTED_TO_APPROVER', 'USER_DEGRADED_TO_RE
templateUrl: './notifications-screen.component.html',
styleUrls: ['./notifications-screen.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [ReactiveFormsModule, NgForOf, MatSlideToggle, TranslateModule, NgIf, MatCheckbox, IconButtonComponent],
})
export class NotificationsScreenComponent extends BaseFormComponent implements OnInit {
readonly #toaster = inject(Toaster);

View File

@ -1,16 +0,0 @@
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { CommonModule } from '@angular/common';
import { SharedModule } from '@shared/shared.module';
import { NotificationsScreenComponent } from './notifications-screen/notifications-screen.component';
import { PendingChangesGuard } from '@guards/can-deactivate.guard';
import { TranslateModule } from '@ngx-translate/core';
import { IconButtonComponent } from '@iqser/common-ui';
const routes = [{ path: '', component: NotificationsScreenComponent, canDeactivate: [PendingChangesGuard] }];
@NgModule({
declarations: [NotificationsScreenComponent],
imports: [RouterModule.forChild(routes), CommonModule, SharedModule, TranslateModule, IconButtonComponent],
})
export class NotificationsModule {}

View File

@ -0,0 +1,11 @@
import { NotificationsScreenComponent } from './notifications-screen/notifications-screen.component';
import { PendingChangesGuard } from '@guards/can-deactivate.guard';
import { IqserRoutes } from '@iqser/common-ui';
export default [
{
path: '',
component: NotificationsScreenComponent,
canDeactivate: [PendingChangesGuard],
},
] satisfies IqserRoutes;

View File

@ -1,77 +1,79 @@
<form [formGroup]="form">
<div class="dialog-content">
<h1>{{ 'dialog-defaults-form.title' | translate }}</h1>
<h2>{{ 'dialog-defaults-form.redaction.title' | translate }}</h2>
<div class="iqser-input-group w-450">
<label translate="dialog-defaults-form.redaction.add-dialog"></label>
<mat-form-field>
<mat-select formControlName="addRedaction">
<mat-option *ngFor="let option of redactionAddOptions" [value]="option.value">{{
option.label | translate
}}</mat-option>
</mat-select>
</mat-form-field>
<mat-checkbox *ngIf="displayExtraOptionAddRedaction" formControlName="addRedactionApplyToAll">{{
'dialog-defaults-form.extra-option-label' | translate
}}</mat-checkbox>
<div class="dialog">
<form [formGroup]="form">
<div class="dialog-content">
<h1>{{ 'dialog-defaults-form.title' | translate }}</h1>
<h3>{{ 'dialog-defaults-form.redaction.title' | translate }}</h3>
<div class="iqser-input-group w-450">
<label translate="dialog-defaults-form.redaction.add-dialog"></label>
<mat-form-field>
<mat-select formControlName="addRedaction">
<mat-option *ngFor="let option of redactionAddOptions" [value]="option.value">{{
option.label | translate
}}</mat-option>
</mat-select>
</mat-form-field>
<mat-checkbox *ngIf="displayExtraOptionAddRedaction" formControlName="addRedactionApplyToAll">{{
'dialog-defaults-form.extra-option-label' | translate
}}</mat-checkbox>
</div>
<div class="iqser-input-group w-450">
<label translate="dialog-defaults-form.redaction.remove-dialog"></label>
<mat-form-field>
<mat-select formControlName="removeRedaction">
<mat-option *ngFor="let option of redactionRemoveOptions" [value]="option.value">{{
option.label | translate
}}</mat-option>
</mat-select>
</mat-form-field>
<mat-checkbox *ngIf="displayExtraOptionRemoveRedaction" formControlName="removeRedactionApplyToAll">{{
'dialog-defaults-form.extra-option-label' | translate
}}</mat-checkbox>
</div>
<h3>{{ 'dialog-defaults-form.recommendation.title' | translate }}</h3>
<div class="iqser-input-group w-450">
<label translate="dialog-defaults-form.recommendation.remove-dialog"></label>
<mat-form-field>
<mat-select formControlName="removeRecommendation">
<mat-option *ngFor="let option of recommendationRemoveOptions" [value]="option.value">{{
option.label | translate
}}</mat-option>
</mat-select>
</mat-form-field>
<mat-checkbox *ngIf="displayExtraOptionRemoveRecommendation" formControlName="removeRecommendationApplyToAll">{{
'dialog-defaults-form.extra-option-label' | translate
}}</mat-checkbox>
</div>
<h3>{{ 'dialog-defaults-form.hint.title' | translate }}</h3>
<div class="iqser-input-group w-450">
<label translate="dialog-defaults-form.hint.add-dialog"></label>
<mat-form-field>
<mat-select formControlName="addHint">
<mat-option *ngFor="let option of hintAddOptions" [value]="option.value">{{ option.label | translate }}</mat-option>
</mat-select>
</mat-form-field>
<mat-checkbox *ngIf="displayExtraOptionAddHint" formControlName="addHintApplyToAll">{{
'dialog-defaults-form.extra-option-label' | translate
}}</mat-checkbox>
</div>
<div class="iqser-input-group w-450">
<label translate="dialog-defaults-form.hint.remove-dialog"></label>
<mat-form-field>
<mat-select formControlName="removeHint">
<mat-option *ngFor="let option of removeOptions" [value]="option.value">{{ option.label | translate }}</mat-option>
</mat-select>
</mat-form-field>
<mat-checkbox *ngIf="displayExtraOptionRemoveHint" formControlName="removeHintApplyToAll">{{
'dialog-defaults-form.extra-option-label' | translate
}}</mat-checkbox>
</div>
</div>
<div class="iqser-input-group w-450">
<label translate="dialog-defaults-form.redaction.remove-dialog"></label>
<mat-form-field>
<mat-select formControlName="removeRedaction">
<mat-option *ngFor="let option of redactionRemoveOptions" [value]="option.value">{{
option.label | translate
}}</mat-option>
</mat-select>
</mat-form-field>
<mat-checkbox *ngIf="displayExtraOptionRemoveRedaction" formControlName="removeRedactionApplyToAll">{{
'dialog-defaults-form.extra-option-label' | translate
}}</mat-checkbox>
<div class="dialog-actions">
<iqser-icon-button
(action)="save()"
[disabled]="!valid || !changed"
[label]="'preferences-screen.actions.save' | translate"
[type]="iconButtonTypes.primary"
></iqser-icon-button>
</div>
<h2>{{ 'dialog-defaults-form.recommendation.title' | translate }}</h2>
<div class="iqser-input-group w-450">
<label translate="dialog-defaults-form.recommendation.remove-dialog"></label>
<mat-form-field>
<mat-select formControlName="removeRecommendation">
<mat-option *ngFor="let option of recommendationRemoveOptions" [value]="option.value">{{
option.label | translate
}}</mat-option>
</mat-select>
</mat-form-field>
<mat-checkbox *ngIf="displayExtraOptionRemoveRecommendation" formControlName="removeRecommendationApplyToAll">{{
'dialog-defaults-form.extra-option-label' | translate
}}</mat-checkbox>
</div>
<h2>{{ 'dialog-defaults-form.hint.title' | translate }}</h2>
<div class="iqser-input-group w-450">
<label translate="dialog-defaults-form.hint.add-dialog"></label>
<mat-form-field>
<mat-select formControlName="addHint">
<mat-option *ngFor="let option of hintAddOptions" [value]="option.value">{{ option.label | translate }}</mat-option>
</mat-select>
</mat-form-field>
<mat-checkbox *ngIf="displayExtraOptionAddHint" formControlName="addHintApplyToAll">{{
'dialog-defaults-form.extra-option-label' | translate
}}</mat-checkbox>
</div>
<div class="iqser-input-group w-450">
<label translate="dialog-defaults-form.hint.remove-dialog"></label>
<mat-form-field>
<mat-select formControlName="removeHint">
<mat-option *ngFor="let option of removeOptions" [value]="option.value">{{ option.label | translate }}</mat-option>
</mat-select>
</mat-form-field>
<mat-checkbox *ngIf="displayExtraOptionRemoveHint" formControlName="removeHintApplyToAll">{{
'dialog-defaults-form.extra-option-label' | translate
}}</mat-checkbox>
</div>
</div>
<div class="dialog-actions">
<iqser-icon-button
(action)="save()"
[disabled]="!valid || !changed"
[label]="'preferences-screen.actions.save' | translate"
[type]="iconButtonTypes.primary"
></iqser-icon-button>
</div>
</form>
</form>
</div>

View File

@ -1,3 +1,16 @@
mat-checkbox {
margin: 8px 0 0 8px;
}
h3 {
margin-top: 24px;
margin-bottom: 4px;
}
form .iqser-input-group:not(first-of-type) {
margin-top: 8px;
}
.dialog {
margin-bottom: 0;
}

View File

@ -1,14 +1,20 @@
import { NgForOf, NgIf } from '@angular/common';
import { ChangeDetectorRef, Component, inject } from '@angular/core';
import { FormBuilder, FormGroup, ReactiveFormsModule } from '@angular/forms';
import { MatCheckbox } from '@angular/material/checkbox';
import { MatFormField } from '@angular/material/form-field';
import { MatOption, MatSelect } from '@angular/material/select';
import { BaseFormComponent } from '@common-ui/form';
import { FormBuilder, FormGroup } from '@angular/forms';
import { AsControl } from '@common-ui/utils';
import { IconButtonComponent } from '@iqser/common-ui';
import { TranslateModule } from '@ngx-translate/core';
import { PreferencesKeys, UserPreferenceService } from '@users/user-preference.service';
import {
RedactOrHintOption,
RedactOrHintOptions,
RemoveRedactionOption,
RemoveRedactionOptions,
} from '../../../../file-preview/utils/dialog-options';
import { PreferencesKeys, UserPreferenceService } from '@users/user-preference.service';
import { AsControl } from '@common-ui/utils';
} from '../../../../file-preview/utils/dialog-types';
import {
hintAddOptions,
recommendationRemoveOptions,
@ -35,6 +41,7 @@ interface DefaultOptionsForm {
selector: 'redaction-dialog-defaults',
templateUrl: './dialog-defaults.component.html',
styleUrl: './dialog-defaults.component.scss',
imports: [ReactiveFormsModule, TranslateModule, MatFormField, MatSelect, MatOption, NgForOf, MatCheckbox, NgIf, IconButtonComponent],
})
export class DialogDefaultsComponent extends BaseFormComponent {
readonly #formBuilder = inject(FormBuilder);
@ -60,6 +67,10 @@ export class DialogDefaultsComponent extends BaseFormComponent {
readonly redactionRemoveOptions = redactionRemoveOptions;
readonly recommendationRemoveOptions = recommendationRemoveOptions;
constructor() {
super();
}
get displayExtraOptionAddRedaction() {
return RedactOrHintOptions.IN_DOSSIER === this.form.controls.addRedaction.value;
}
@ -84,10 +95,6 @@ export class DialogDefaultsComponent extends BaseFormComponent {
return RemoveRedactionOptions.DO_NOT_RECOMMEND === this.form.controls.removeRecommendation.value;
}
constructor() {
super();
}
async save(): Promise<any> {
const formValue = this.form.value;

View File

@ -1,46 +1,52 @@
<redaction-dialog-defaults *ngIf="currentScreen === screens.WARNING_PREFERENCES && !config.IS_DOCUMINE"></redaction-dialog-defaults>
<form [formGroup]="form">
<div class="dialog-content">
<div class="dialog-content-left">
<ng-container *ngIf="currentScreen === screens.PREFERENCES">
<div class="iqser-input-group">
<mat-slide-toggle color="primary" formControlName="autoExpandFiltersOnActions">
{{ 'preferences-screen.form.auto-expand-filters-on-action' | translate }}
</mat-slide-toggle>
</div>
<div [ngClass]="currentScreen === screens.WARNING_PREFERENCES && 'dialog'">
<form [formGroup]="form">
<div class="dialog-content">
<div class="dialog-content-left">
<ng-container *ngIf="currentScreen === screens.PREFERENCES">
<div class="iqser-input-group">
<mat-slide-toggle color="primary" formControlName="autoExpandFiltersOnActions">
{{ 'preferences-screen.form.auto-expand-filters-on-action' | translate }}
</mat-slide-toggle>
</div>
<div *ngIf="config.IS_DOCUMINE" class="iqser-input-group">
<mat-slide-toggle color="primary" formControlName="openScmDialogByDefault">
{{ 'preferences-screen.form.open-structured-view-by-default' | translate }}
</mat-slide-toggle>
</div>
<div *allow="roles.getTables" class="iqser-input-group">
<label [translate]="'preferences-screen.form.table-extraction-type'"></label>
<input formControlName="tableExtractionType" />
</div>
</ng-container>
<div *allow="roles.getTables" class="iqser-input-group">
<label [translate]="'preferences-screen.form.table-extraction-type'"></label>
<input formControlName="tableExtractionType" />
</div>
</ng-container>
<ng-container *ngIf="currentScreen === screens.WARNING_PREFERENCES">
<h1>{{ 'preferences-screen.warnings-subtitle' | translate }}</h1>
<p class="warnings-description">{{ 'preferences-screen.warnings-description' | translate }}</p>
<ng-container *ngIf="currentScreen === screens.WARNING_PREFERENCES">
<h1>{{ 'preferences-screen.warnings-subtitle' | translate }}</h1>
<p class="warnings-description">{{ 'preferences-screen.warnings-description' | translate }}</p>
<div class="iqser-input-group">
<mat-checkbox color="primary" formControlName="loadAllAnnotationsWarning">
{{ 'preferences-screen.form.load-all-annotations-warning' | translate }}
</mat-checkbox>
</div>
</ng-container>
<div class="iqser-input-group">
<mat-checkbox color="primary" formControlName="loadAllAnnotationsWarning">
{{ 'preferences-screen.form.load-all-annotations-warning' | translate }}
</mat-checkbox>
</div>
<div class="iqser-input-group">
<mat-checkbox color="primary" formControlName="helpModeDialog">
{{ 'preferences-screen.form.help-mode-dialog' | translate }}
</mat-checkbox>
</div>
<div class="iqser-input-group">
<mat-checkbox color="primary" formControlName="overwriteFileOption">
{{ 'preferences-screen.form.overwrite-file-option' | translate }}
</mat-checkbox>
</div>
</ng-container>
</div>
</div>
</div>
<div class="dialog-actions">
<iqser-icon-button
(action)="save()"
[disabled]="!valid || !changed"
[label]="'preferences-screen.actions.save' | translate"
[type]="iconButtonTypes.primary"
></iqser-icon-button>
</div>
</form>
<div class="dialog-actions">
<iqser-icon-button
(action)="save()"
[disabled]="!valid || !changed"
[label]="'preferences-screen.actions.save' | translate"
[type]="iconButtonTypes.primary"
></iqser-icon-button>
</div>
</form>
</div>

View File

@ -1,10 +1,3 @@
@use 'variables';
.content-delimiter {
border-top: 1px solid var(--iqser-separator);
margin-bottom: 15px;
}
.warnings-description {
width: 105%;
}

View File

@ -1,18 +1,33 @@
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup } from '@angular/forms';
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, inject, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, ReactiveFormsModule } from '@angular/forms';
import { ActivatedRoute } from '@angular/router';
import { BaseFormComponent, getConfig, IqserPermissionsService, isIqserDevMode, LoadingService } from '@iqser/common-ui';
import {
BaseFormComponent,
getConfig,
IconButtonComponent,
IqserAllowDirective,
IqserPermissionsService,
isIqserDevMode,
KEYS,
LoadingService,
} from '@iqser/common-ui';
import { AsControl } from '@iqser/common-ui/lib/utils';
import { Roles } from '@users/roles';
import { PreferencesKeys, UserPreferenceService } from '@users/user-preference.service';
import { DialogDefaultsComponent } from './dialog-defaults/dialog-defaults.component';
import { NgClass, NgIf } from '@angular/common';
import { MatSlideToggle } from '@angular/material/slide-toggle';
import { TranslateModule } from '@ngx-translate/core';
import { MatCheckbox } from '@angular/material/checkbox';
interface PreferencesForm {
// preferences
autoExpandFiltersOnActions: boolean;
openScmDialogByDefault: boolean;
tableExtractionType: string;
// warnings preferences
loadAllAnnotationsWarning: boolean;
helpModeDialog: boolean;
overwriteFileOption: boolean;
[k: string]: any;
}
@ -29,8 +44,25 @@ const Screens = {
templateUrl: './preferences.component.html',
styleUrls: ['./preferences.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [
DialogDefaultsComponent,
NgClass,
NgIf,
ReactiveFormsModule,
MatSlideToggle,
TranslateModule,
IqserAllowDirective,
MatCheckbox,
IconButtonComponent,
],
})
export class PreferencesComponent extends BaseFormComponent implements OnInit {
readonly #formBuilder = inject(FormBuilder);
readonly #permissionsService = inject(IqserPermissionsService);
readonly #changeRef = inject(ChangeDetectorRef);
readonly #loadingService = inject(LoadingService);
readonly #userPreferenceService = inject(UserPreferenceService);
readonly form: FormGroup<AsControl<PreferencesForm>>;
readonly currentScreen: Screen;
readonly screens = Screens;
@ -39,75 +71,87 @@ export class PreferencesComponent extends BaseFormComponent implements OnInit {
readonly config = getConfig();
readonly isIqserDevMode = isIqserDevMode();
constructor(
route: ActivatedRoute,
readonly userPreferenceService: UserPreferenceService,
private readonly _formBuilder: FormBuilder,
private readonly _permissionsService: IqserPermissionsService,
private readonly _changeRef: ChangeDetectorRef,
private readonly _loadingService: LoadingService,
) {
get #isOverwriteFileOptionActive() {
return !(this.#userPreferenceService.getOverwriteFileOption() === 'undefined');
}
constructor(route: ActivatedRoute) {
super();
this.form = this._formBuilder.group({
this.form = this.#formBuilder.group({
// preferences
autoExpandFiltersOnActions: [this.userPreferenceService.getAutoExpandFiltersOnActions()],
openScmDialogByDefault: [this.userPreferenceService.getOpenScmDialogByDefault()],
tableExtractionType: [this.userPreferenceService.getTableExtractionType()],
autoExpandFiltersOnActions: [this.#userPreferenceService.getAutoExpandFiltersOnActions()],
tableExtractionType: [this.#userPreferenceService.getTableExtractionType()],
// warnings preferences
loadAllAnnotationsWarning: [this.userPreferenceService.getBool(PreferencesKeys.loadAllAnnotationsWarning)],
loadAllAnnotationsWarning: [this.#userPreferenceService.getBool(PreferencesKeys.loadAllAnnotationsWarning)],
helpModeDialog: [this.#userPreferenceService.getBool(KEYS.helpModeDialog)],
overwriteFileOption: [this.#isOverwriteFileOptionActive],
});
if (!this._permissionsService.has(Roles.managePreferences)) {
if (!this.#permissionsService.has(Roles.managePreferences)) {
this.form.disable();
}
if (!this._permissionsService.has(Roles.getTables)) {
if (!this.#permissionsService.has(Roles.getTables)) {
this.form.controls.tableExtractionType.disable();
}
if (!this.#isOverwriteFileOptionActive) {
this.form.controls.overwriteFileOption.disable();
}
this.initialFormValue = this.form.getRawValue();
this.currentScreen = route.snapshot.data.screen;
}
ngOnInit() {
this._loadingService.stop();
this.#loadingService.stop();
}
async save(): Promise<any> {
if (this.form.controls.autoExpandFiltersOnActions.value !== this.userPreferenceService.getAutoExpandFiltersOnActions()) {
await this.userPreferenceService.toggleAutoExpandFiltersOnActions();
}
if (this.form.controls.openScmDialogByDefault.value !== this.userPreferenceService.getOpenScmDialogByDefault()) {
await this.userPreferenceService.toggleOpenScmDialogByDefault();
if (this.form.controls.autoExpandFiltersOnActions.value !== this.#userPreferenceService.getAutoExpandFiltersOnActions()) {
await this.#userPreferenceService.toggleAutoExpandFiltersOnActions();
}
if (this.form.controls.tableExtractionType.value !== this.userPreferenceService.getTableExtractionType()) {
await this.userPreferenceService.save(PreferencesKeys.tableExtractionType, this.form.controls.tableExtractionType.value);
if (this.form.controls.tableExtractionType.value !== this.#userPreferenceService.getTableExtractionType()) {
await this.#userPreferenceService.save(PreferencesKeys.tableExtractionType, this.form.controls.tableExtractionType.value);
}
if (
this.form.controls.loadAllAnnotationsWarning.value !==
this.userPreferenceService.getBool(PreferencesKeys.loadAllAnnotationsWarning)
this.#userPreferenceService.getBool(PreferencesKeys.loadAllAnnotationsWarning)
) {
await this.userPreferenceService.save(
await this.#userPreferenceService.save(
PreferencesKeys.loadAllAnnotationsWarning,
String(this.form.controls.loadAllAnnotationsWarning.value),
);
}
await this.userPreferenceService.reload();
if (this.form.controls.helpModeDialog.value !== this.#userPreferenceService.getBool(KEYS.helpModeDialog)) {
await this.#userPreferenceService.save(KEYS.helpModeDialog, String(this.form.controls.helpModeDialog.value));
}
if (this.form.controls.overwriteFileOption.enabled && !this.form.controls.overwriteFileOption.value) {
await this.#userPreferenceService.saveOverwriteFileOption('undefined');
}
await this.#userPreferenceService.reload();
this.#patchValues();
this.initialFormValue = this.form.getRawValue();
this._changeRef.markForCheck();
this.#changeRef.markForCheck();
}
#patchValues() {
this.form.patchValue({
autoExpandFiltersOnActions: this.userPreferenceService.getAutoExpandFiltersOnActions(),
openScmDialogByDefault: this.userPreferenceService.getOpenScmDialogByDefault(),
tableExtractionType: this.userPreferenceService.getTableExtractionType(),
loadAllAnnotationsWarning: this.userPreferenceService.getBool(PreferencesKeys.loadAllAnnotationsWarning),
autoExpandFiltersOnActions: this.#userPreferenceService.getAutoExpandFiltersOnActions(),
tableExtractionType: this.#userPreferenceService.getTableExtractionType(),
loadAllAnnotationsWarning: this.#userPreferenceService.getBool(PreferencesKeys.loadAllAnnotationsWarning),
helpModeDialog: this.#userPreferenceService.getBool(KEYS.helpModeDialog),
overwriteFileOption: this.#isOverwriteFileOptionActive,
});
if (!this.#isOverwriteFileOptionActive) {
this.form.controls.overwriteFileOption.disable();
}
}
}

View File

@ -1,7 +1,8 @@
import { Component } from '@angular/core';
import { BaseDialogComponent } from '@iqser/common-ui';
import { BaseDialogComponent, CircleButtonComponent, IconButtonComponent } from '@iqser/common-ui';
import { MatDialogRef } from '@angular/material/dialog';
import { AbstractControl, FormGroup, Validators } from '@angular/forms';
import { AbstractControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';
import { TranslateModule } from '@ngx-translate/core';
interface FormType {
password: AbstractControl<string>;
@ -9,6 +10,7 @@ interface FormType {
@Component({
templateUrl: './confirm-password-dialog.component.html',
imports: [ReactiveFormsModule, IconButtonComponent, TranslateModule, CircleButtonComponent],
})
export class ConfirmPasswordDialogComponent extends BaseDialogComponent {
constructor(protected readonly _dialogRef: MatDialogRef<ConfirmPasswordDialogComponent>) {

View File

@ -16,13 +16,16 @@
<input formControlName="lastName" name="lastName" type="text" />
</div>
<div *ngIf="devMode" class="iqser-input-group">
<div class="iqser-input-group">
<label [translate]="'top-bar.navigation-items.my-account.children.language.label'"></label>
<mat-form-field>
<mat-select formControlName="language">
<mat-option *ngFor="let language of languages" [value]="language">
{{ translations[language] | translate }}
</mat-option>
<mat-select-trigger>{{ languageSelectLabel() | translate }}</mat-select-trigger>
@for (language of languages; track language) {
<mat-option [value]="language">
{{ translations[language] | translate }}
</mat-option>
}
</mat-select>
</mat-form-field>
</div>
@ -31,17 +34,19 @@
<a (click)="resetPassword()" target="_blank"> {{ 'user-profile-screen.actions.change-password' | translate }}</a>
</div>
<div *ngIf="devMode" class="iqser-input-group">
<mat-slide-toggle color="primary" formControlName="darkTheme">
{{ 'user-profile-screen.form.dark-theme' | translate }}
</mat-slide-toggle>
</div>
@if (devMode) {
<div class="iqser-input-group">
<mat-slide-toggle color="primary" formControlName="darkTheme">
{{ 'user-profile-screen.form.dark-theme' | translate }}
</mat-slide-toggle>
</div>
}
</div>
</div>
<div class="dialog-actions">
<iqser-icon-button
[disabled]="form.invalid || !(profileChanged || languageChanged || themeChanged)"
[disabled]="disabled"
[label]="'user-profile-screen.actions.save' | translate"
[submit]="true"
[type]="iconButtonTypes.primary"

View File

@ -1,8 +1,15 @@
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core';
import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, computed } from '@angular/core';
import { FormGroup, ReactiveFormsModule, UntypedFormBuilder, Validators } from '@angular/forms';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { BaseFormComponent, IqserPermissionsService, LanguageService, LoadingService, Toaster } from '@iqser/common-ui';
import { TranslateService } from '@ngx-translate/core';
import {
BaseFormComponent,
IconButtonComponent,
IqserPermissionsService,
LanguageService,
LoadingService,
Toaster,
} from '@iqser/common-ui';
import { TranslateModule, TranslateService } from '@ngx-translate/core';
import { IProfile } from '@red/domain';
import { languagesTranslations } from '@translations/languages-translations';
import { Roles } from '@users/roles';
@ -10,17 +17,47 @@ import { UserPreferenceService } from '@users/user-preference.service';
import { UserService } from '@users/user.service';
import { firstValueFrom } from 'rxjs';
import { UserProfileDialogService } from '../services/user-profile-dialog.service';
import { MatFormField } from '@angular/material/form-field';
import { MatOption, MatSelect, MatSelectTrigger } from '@angular/material/select';
import { MatSlideToggle } from '@angular/material/slide-toggle';
import { PdfViewer } from '../../../../pdf-viewer/services/pdf-viewer.service';
import { formControlToSignal } from '@utils/functions';
import { AsControl } from '@common-ui/utils';
interface UserProfileForm {
email: string;
firstName: string;
lastName: string;
language: string;
darkTheme: boolean;
}
@Component({
templateUrl: './user-profile-screen.component.html',
styleUrls: ['./user-profile-screen.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [
ReactiveFormsModule,
MatFormField,
MatSelect,
MatOption,
TranslateModule,
MatSlideToggle,
IconButtonComponent,
MatSelectTrigger,
],
})
export class UserProfileScreenComponent extends BaseFormComponent implements OnInit {
#profileModel: IProfile;
export class UserProfileScreenComponent extends BaseFormComponent {
readonly form: FormGroup<AsControl<UserProfileForm>> = this.#getForm();
initialFormValue = this.form.getRawValue();
readonly translations = languagesTranslations;
readonly devMode = this._userPreferenceService.isIqserDevMode;
readonly profileKeys = ['email', 'firstName', 'lastName'];
readonly languages = this._translateService.langs;
readonly language = formControlToSignal<UserProfileForm['language']>(this.form.controls.language);
readonly languageSelectLabel = computed(() => this.translations[this.language()]);
constructor(
private readonly _userService: UserService,
private readonly _loadingService: LoadingService,
@ -32,43 +69,29 @@ export class UserProfileScreenComponent extends BaseFormComponent implements OnI
protected readonly _userPreferenceService: UserPreferenceService,
private readonly _changeRef: ChangeDetectorRef,
private readonly _toaster: Toaster,
private readonly _pdfViewer: PdfViewer,
) {
super();
this._loadingService.start();
if (!this._permissionsService.has(Roles.updateMyProfile)) {
this.form.disable();
}
this._loadingService.stop();
}
get languageChanged(): boolean {
return this.#profileModel['language'] !== this.form.get('language').value;
return this.initialFormValue['language'] !== this.form.controls.language.value;
}
get themeChanged(): boolean {
return this.#profileModel['darkTheme'] !== this.form.get('darkTheme').value;
return this.initialFormValue['darkTheme'] !== this.form.controls.darkTheme.value;
}
get emailChanged(): boolean {
return this.#profileModel['email'] !== this.form.get('email').value;
return this.initialFormValue['email'] !== this.form.controls.email.value;
}
get profileChanged(): boolean {
const keys = Object.keys(this.form.getRawValue());
keys.splice(keys.indexOf('language'), 1);
keys.splice(keys.indexOf('darkTheme'), 1);
for (const key of keys) {
if (this.#profileModel[key] !== this.form.get(key).value) {
return true;
}
}
return false;
}
get languages(): string[] {
return this._translateService.langs;
}
ngOnInit() {
this._initializeForm();
return this.profileKeys.some(key => this.initialFormValue[key] !== this.form.get(key).value);
}
async save(): Promise<void> {
@ -93,15 +116,17 @@ export class UserProfileScreenComponent extends BaseFormComponent implements OnI
}
if (this.languageChanged) {
await this._languageService.change(this.form.get('language').value);
await this._languageService.change(this.form.controls.language.value);
await this._pdfViewer.instance?.UI.setLanguage(this._languageService.currentLanguage);
}
if (this.themeChanged) {
await this._userPreferenceService.saveTheme(this.form.get('darkTheme').value ? 'dark' : 'light');
await this._userPreferenceService.saveTheme(this.form.controls.darkTheme.value ? 'dark' : 'light');
}
this._initializeForm();
this.initialFormValue = this.form.getRawValue();
this._changeRef.markForCheck();
this._loadingService.stop();
this._toaster.success(_('user-profile-screen.update.success'));
} catch (e) {
this._loadingService.stop();
@ -112,35 +137,13 @@ export class UserProfileScreenComponent extends BaseFormComponent implements OnI
await this._userService.createResetPasswordAction();
}
private _getForm(): UntypedFormGroup {
#getForm() {
return this._formBuilder.group({
email: ['', [Validators.required, Validators.email]],
firstName: [''],
lastName: [''],
language: [''],
darkTheme: [false],
email: [this._userService.currentUser.email ?? '', [Validators.required, Validators.email]],
firstName: [this._userService.currentUser.firstName ?? ''],
lastName: [this._userService.currentUser.lastName ?? ''],
language: [this._userPreferenceService.getLanguage()],
darkTheme: [this._userPreferenceService.getTheme() === 'dark'],
});
}
private _initializeForm(): void {
try {
this.form = this._getForm();
if (!this._permissionsService.has(Roles.updateMyProfile)) {
this.form.disable();
}
this.#profileModel = {
email: this._userService.currentUser.email ?? '',
firstName: this._userService.currentUser.firstName ?? '',
lastName: this._userService.currentUser.lastName ?? '',
language: this._languageService.currentLanguage ?? '',
darkTheme: this._userPreferenceService.getTheme() === 'dark',
};
this.form.patchValue(this.#profileModel, { emitEvent: false });
this.initialFormValue = this.form.getRawValue();
} catch (e) {
} finally {
this._loadingService.stop();
this._changeRef.markForCheck();
}
}
}

View File

@ -1,19 +0,0 @@
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { CommonModule } from '@angular/common';
import { SharedModule } from '@shared/shared.module';
import { UserProfileScreenComponent } from './user-profile-screen/user-profile-screen.component';
import { PendingChangesGuard } from '@guards/can-deactivate.guard';
import { TranslateModule } from '@ngx-translate/core';
import { ConfirmPasswordDialogComponent } from './confirm-password-dialog/confirm-password-dialog.component';
import { UserProfileDialogService } from './services/user-profile-dialog.service';
import { CircleButtonComponent, IconButtonComponent } from '@iqser/common-ui';
const routes = [{ path: '', component: UserProfileScreenComponent, canDeactivate: [PendingChangesGuard] }];
@NgModule({
declarations: [UserProfileScreenComponent, ConfirmPasswordDialogComponent],
imports: [RouterModule.forChild(routes), CommonModule, SharedModule, TranslateModule, IconButtonComponent, CircleButtonComponent],
providers: [UserProfileDialogService],
})
export class UserProfileModule {}

View File

@ -0,0 +1,8 @@
import { UserProfileScreenComponent } from './user-profile-screen/user-profile-screen.component';
import { PendingChangesGuard } from '@guards/can-deactivate.guard';
import { UserProfileDialogService } from './services/user-profile-dialog.service';
import { IqserRoutes } from '@iqser/common-ui';
export default [
{ path: '', component: UserProfileScreenComponent, canDeactivate: [PendingChangesGuard], providers: [UserProfileDialogService] },
] satisfies IqserRoutes;

View File

@ -1,12 +1,19 @@
import { redactTextTranslations } from '@translations/redact-text-translations';
import { RedactOrHintOptions, RemoveRedactionOptions } from '../../file-preview/utils/dialog-options';
import { removeRedactionTranslations } from '@translations/remove-redaction-translations';
import { addHintTranslations } from '@translations/add-hint-translations';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { addHintTranslations } from '@translations/add-hint-translations';
import { redactTextTranslations } from '@translations/redact-text-translations';
import { removeRedactionTranslations } from '@translations/remove-redaction-translations';
import {
ForceAnnotationOptions,
RectangleRedactOptions,
RedactOrHintOptions,
RemoveRedactionOptions,
} from '../../file-preview/utils/dialog-types';
export const SystemDefaults = {
RECTANGLE_REDACT_DEFAULT: RectangleRedactOptions.ONLY_THIS_PAGE,
ADD_REDACTION_DEFAULT: RedactOrHintOptions.IN_DOSSIER,
ADD_HINT_DEFAULT: RedactOrHintOptions.IN_DOSSIER,
FORCE_REDACTION_DEFAULT: ForceAnnotationOptions.ONLY_HERE,
REMOVE_REDACTION_DEFAULT: RemoveRedactionOptions.ONLY_HERE,
REMOVE_HINT_DEFAULT: RemoveRedactionOptions.ONLY_HERE,
REMOVE_RECOMMENDATION_DEFAULT: RemoveRedactionOptions.DO_NOT_RECOMMEND,
@ -28,6 +35,10 @@ export const redactionAddOptions = [
label: redactTextTranslations.onlyHere.label,
value: RedactOrHintOptions.ONLY_HERE,
},
{
label: redactTextTranslations.inDocument.label,
value: RedactOrHintOptions.IN_DOCUMENT,
},
{
label: redactTextTranslations.inDossier.label,
value: RedactOrHintOptions.IN_DOSSIER,

View File

@ -1,282 +0,0 @@
import { NgModule } from '@angular/core';
import { CompositeRouteGuard, IqserPermissionsGuard, IqserRoutes } from '@iqser/common-ui';
import { RedRoleGuard } from '@users/red-role.guard';
import { EntitiesListingScreenComponent } from './screens/entities-listing/entities-listing-screen.component';
import { PendingChangesGuard } from '@guards/can-deactivate.guard';
import { DefaultColorsScreenComponent } from './screens/default-colors/default-colors-screen.component';
import { UserListingScreenComponent } from './screens/user-listing/user-listing-screen.component';
import { DigitalSignatureScreenComponent } from './screens/digital-signature/digital-signature-screen.component';
import { AuditScreenComponent } from './screens/audit/audit-screen.component';
import { RouterModule } from '@angular/router';
import { GeneralConfigScreenComponent } from './screens/general-config/general-config-screen.component';
import { BaseAdminScreenComponent } from './base-admin-screen/base-admin-screen.component';
import { BaseDossierTemplateScreenComponent } from './base-dossier-templates-screen/base-dossier-template-screen.component';
import { DossierTemplatesGuard } from '@guards/dossier-templates.guard';
import { DOSSIER_TEMPLATE_ID, ENTITY_TYPE } from '@red/domain';
import { templateExistsWhenEnteringAdmin } from '@guards/dossier-template-exists.guard';
import { entityExistsGuard } from '@guards/entity-exists-guard.service';
import { BaseEntityScreenComponent } from './base-entity-screen/base-entity-screen.component';
import { PermissionsGuard } from '@guards/permissions-guard';
import { Roles } from '@users/roles';
import { IqserAuthGuard } from '@iqser/common-ui/lib/users';
const dossierTemplateIdRoutes: IqserRoutes = [
{
path: 'info',
component: BaseDossierTemplateScreenComponent,
loadChildren: () => import('./screens/info/dossier-template-info.module').then(m => m.DossierTemplateInfoModule),
},
{
path: 'entities',
children: [
{
path: '',
component: EntitiesListingScreenComponent,
canActivate: [CompositeRouteGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
},
{
path: `:${ENTITY_TYPE}`,
component: BaseEntityScreenComponent,
canActivate: [CompositeRouteGuard, entityExistsGuard()],
loadChildren: () => import('./screens/entities/entities.module').then(m => m.EntitiesModule),
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
},
],
},
{
path: 'entity-rules',
component: BaseDossierTemplateScreenComponent,
canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
permissions: {
allow: [Roles.rules.read],
redirectTo: 'info',
},
type: 'ENTITY',
},
loadChildren: () => import('./screens/rules/rules.module').then(m => m.RulesModule),
},
{
path: 'component-rules',
component: BaseDossierTemplateScreenComponent,
canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
permissions: {
allow: [Roles.rules.read],
redirectTo: 'info',
},
type: 'COMPONENT',
},
loadChildren: () => import('./screens/rules/rules.module').then(m => m.RulesModule),
},
{
path: 'file-attributes',
component: BaseDossierTemplateScreenComponent,
loadChildren: () =>
import('./screens/file-attributes-listing/file-attributes-listing.module').then(m => m.FileAttributesListingModule),
canActivate: [CompositeRouteGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
},
{
path: 'watermarks',
component: BaseDossierTemplateScreenComponent,
loadChildren: () => import('./screens/watermark/watermark.module').then(m => m.WatermarkModule),
},
{
path: 'reports',
component: BaseDossierTemplateScreenComponent,
loadChildren: () => import('./screens/reports/reports.module').then(m => m.ReportsModule),
canActivate: [IqserAuthGuard, IqserPermissionsGuard],
data: {
permissions: {
allow: [Roles.reportTemplates.read],
redirectTo: '/auth-error',
},
},
},
{
path: 'dossier-attributes',
component: BaseDossierTemplateScreenComponent,
loadChildren: () =>
import('./screens/dossier-attributes-listing/dossier-attributes-listing.module').then(m => m.DossierAttributesListingModule),
canActivate: [CompositeRouteGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
},
{
path: 'dossier-states',
component: BaseDossierTemplateScreenComponent,
loadChildren: () =>
import('./screens/dossier-states-listing/dossier-states-listing.module').then(m => m.DossierStatesListingModule),
canActivate: [CompositeRouteGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
},
{
path: 'default-colors',
component: DefaultColorsScreenComponent,
canActivate: [CompositeRouteGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
},
{
path: 'justifications',
component: BaseDossierTemplateScreenComponent,
loadChildren: () => import('./screens/justifications/justifications.module').then(m => m.JustificationsModule),
canActivate: [IqserPermissionsGuard],
data: {
permissions: {
allow: [Roles.legalBasis.read],
redirectTo: '/auth-error',
},
},
},
{ path: '', redirectTo: 'info', pathMatch: 'full' },
];
const dossierTemplatesRoutes: IqserRoutes = [
{
path: '',
component: BaseAdminScreenComponent,
canActivate: [IqserAuthGuard],
loadChildren: () =>
import('./screens/dossier-templates-listing/dossier-templates-listing.module').then(m => m.DossierTemplatesListingModule),
},
{
path: `:${DOSSIER_TEMPLATE_ID}`,
children: dossierTemplateIdRoutes,
canActivate: [templateExistsWhenEnteringAdmin()],
},
];
const routes: IqserRoutes = [
{ path: '', redirectTo: 'dossier-templates', pathMatch: 'full' },
{
path: 'dossier-templates',
children: dossierTemplatesRoutes,
canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard, DossierTemplatesGuard],
requiredRoles: ['RED_MANAGER', 'RED_ADMIN'],
permissions: {
allow: [Roles.templates.read],
redirectTo: '/',
},
},
},
{
path: 'users',
component: BaseAdminScreenComponent,
children: [
{
path: '',
component: UserListingScreenComponent,
},
],
canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
permissions: {
allow: [Roles.users.read, 'RED_USER_ADMIN'],
redirectTo: '/',
},
},
},
{
path: 'dossier-permissions',
component: BaseAdminScreenComponent,
canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard, PermissionsGuard],
permissionsObject: 'Dossier',
permissions: {
allow: [Roles.manageAclPermissions, 'RED_ADMIN'],
redirectTo: '/',
},
},
loadChildren: () => import('./screens/permissions/permissions.module').then(m => m.PermissionsModule),
},
{
path: 'license-info',
component: BaseAdminScreenComponent,
canActivate: [IqserAuthGuard, IqserPermissionsGuard, RedRoleGuard],
data: {
permissions: {
allow: [Roles.license.readReport, 'RED_ADMIN'],
redirectTo: '/',
},
},
loadChildren: () => import('./screens/license/license.module').then(m => m.LicenseModule),
},
{
path: 'digital-signature',
component: BaseAdminScreenComponent,
children: [
{
path: '',
component: DigitalSignatureScreenComponent,
},
],
canActivate: [IqserAuthGuard, IqserPermissionsGuard, RedRoleGuard],
data: {
permissions: {
allow: [Roles.digitalSignature.read, 'RED_ADMIN'],
redirectTo: '/',
},
},
},
{
path: 'audit',
component: BaseAdminScreenComponent,
children: [
{
path: '',
component: AuditScreenComponent,
},
],
canActivate: [IqserAuthGuard, IqserPermissionsGuard, RedRoleGuard],
data: {
permissions: {
allow: [Roles.searchAudit, 'RED_ADMIN'],
redirectTo: '/',
},
},
},
{
path: 'general-config',
component: BaseAdminScreenComponent,
children: [
{
path: '',
component: GeneralConfigScreenComponent,
},
],
canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
canDeactivate: [PendingChangesGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
permissions: {
allow: [Roles.generalConfiguration.read, Roles.smtp.read, 'RED_ADMIN'],
redirectTo: '/',
},
},
},
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule],
})
export class AdminRoutingModule {}

View File

@ -1,130 +0,0 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { AdminRoutingModule } from './admin-routing.module';
import { SharedModule } from '@shared/shared.module';
import { AuditScreenComponent } from './screens/audit/audit-screen.component';
import { DefaultColorsScreenComponent } from './screens/default-colors/default-colors-screen.component';
import { EntitiesListingScreenComponent } from './screens/entities-listing/entities-listing-screen.component';
import { DigitalSignatureScreenComponent } from './screens/digital-signature/digital-signature-screen.component';
import { UserListingScreenComponent } from './screens/user-listing/user-listing-screen.component';
import { DossierTemplateBreadcrumbsComponent } from './shared/components/dossier-template-breadcrumbs/dossier-template-breadcrumbs.component';
import { AddEditCloneDossierTemplateDialogComponent } from './dialogs/add-edit-dossier-template-dialog/add-edit-clone-dossier-template-dialog.component';
import { AddEntityDialogComponent } from './dialogs/add-entity-dialog/add-entity-dialog.component';
import { EditColorDialogComponent } from './dialogs/edit-color-dialog/edit-color-dialog.component';
import { AdminDialogService } from './services/admin-dialog.service';
import { GeneralConfigScreenComponent } from './screens/general-config/general-config-screen.component';
import { SmtpAuthDialogComponent } from './dialogs/smtp-auth-dialog/smtp-auth-dialog.component';
import { AddEditUserDialogComponent } from './dialogs/add-edit-user-dialog/add-edit-user-dialog.component';
import { UsersStatsComponent } from './components/users-stats/users-stats.component';
import { ResetPasswordComponent } from './dialogs/add-edit-user-dialog/reset-password/reset-password.component';
import { UserDetailsComponent } from './dialogs/add-edit-user-dialog/user-details/user-details.component';
import { AuditService } from './services/audit.service';
import { DigitalSignatureService } from './services/digital-signature.service';
import { BaseAdminScreenComponent } from './base-admin-screen/base-admin-screen.component';
import { RulesService } from './services/rules.service';
import { SmtpConfigService } from './services/smtp-config.service';
import { UploadDictionaryDialogComponent } from './dialogs/upload-dictionary-dialog/upload-dictionary-dialog.component';
import { GeneralConfigFormComponent } from './screens/general-config/general-config-form/general-config-form.component';
import { SmtpFormComponent } from './screens/general-config/smtp-form/smtp-form.component';
import { BaseDossierTemplateScreenComponent } from './base-dossier-templates-screen/base-dossier-template-screen.component';
import { A11yModule } from '@angular/cdk/a11y';
import { BaseEntityScreenComponent } from './base-entity-screen/base-entity-screen.component';
import { AdminSideNavComponent } from './shared/components/admin-side-nav/admin-side-nav.component';
import { SystemPreferencesFormComponent } from './screens/general-config/system-preferences-form/system-preferences-form.component';
import { ConfigureCertificateDialogComponent } from './dialogs/configure-digital-signature-dialog/configure-certificate-dialog.component';
import { PkcsSignatureConfigurationComponent } from './dialogs/configure-digital-signature-dialog/form/pkcs-signature-configuration/pkcs-signature-configuration.component';
import { KmsSignatureConfigurationComponent } from './dialogs/configure-digital-signature-dialog/form/kms-signature-configuration/kms-signature-configuration.component';
import {
ChevronButtonComponent,
CircleButtonComponent,
DetailsRadioComponent,
EditableInputComponent,
EmptyStateComponent,
HasScrollbarDirective,
HumanizePipe,
IconButtonComponent,
InputWithActionComponent,
IqserAllowDirective,
IqserDenyDirective,
IqserHelpModeModule,
IqserListingModule,
IqserUploadFileModule,
RoundCheckboxComponent,
} from '@iqser/common-ui';
import { TranslateModule } from '@ngx-translate/core';
import { AuditInfoDialogComponent } from './dialogs/audit-info-dialog/audit-info-dialog.component';
import { DossierTemplateActionsComponent } from './shared/components/dossier-template-actions/dossier-template-actions.component';
import { IqserUsersModule } from '@iqser/common-ui/lib/users';
import { SelectComponent } from '@shared/components/select/select.component';
import { PaginationComponent } from '@common-ui/pagination/pagination.component';
const dialogs = [
AddEditCloneDossierTemplateDialogComponent,
AddEntityDialogComponent,
EditColorDialogComponent,
SmtpAuthDialogComponent,
AddEditUserDialogComponent,
UploadDictionaryDialogComponent,
ConfigureCertificateDialogComponent,
AuditInfoDialogComponent,
];
const screens = [
AuditScreenComponent,
DefaultColorsScreenComponent,
EntitiesListingScreenComponent,
DigitalSignatureScreenComponent,
UserListingScreenComponent,
GeneralConfigScreenComponent,
];
const components = [
UsersStatsComponent,
ResetPasswordComponent,
UserDetailsComponent,
BaseAdminScreenComponent,
BaseDossierTemplateScreenComponent,
BaseEntityScreenComponent,
GeneralConfigFormComponent,
SmtpFormComponent,
SystemPreferencesFormComponent,
PkcsSignatureConfigurationComponent,
KmsSignatureConfigurationComponent,
...dialogs,
...screens,
];
@NgModule({
declarations: [...components],
providers: [AdminDialogService, AuditService, DigitalSignatureService, RulesService, SmtpConfigService],
imports: [
CommonModule,
SharedModule,
AdminRoutingModule,
A11yModule,
IqserUsersModule,
TranslateModule,
HumanizePipe,
IqserListingModule,
IqserUploadFileModule,
IqserHelpModeModule,
AdminSideNavComponent,
DossierTemplateActionsComponent,
DossierTemplateBreadcrumbsComponent,
IconButtonComponent,
CircleButtonComponent,
ChevronButtonComponent,
EmptyStateComponent,
HasScrollbarDirective,
RoundCheckboxComponent,
InputWithActionComponent,
EditableInputComponent,
DetailsRadioComponent,
IqserAllowDirective,
IqserDenyDirective,
SelectComponent,
PaginationComponent,
],
})
export class AdminModule {}

View File

@ -0,0 +1,302 @@
import { inject, provideEnvironmentInitializer } from '@angular/core';
import { PendingChangesGuard } from '@guards/can-deactivate.guard';
import { templateExistsWhenEnteringAdmin } from '@guards/dossier-template-exists.guard';
import { DossierTemplatesGuard } from '@guards/dossier-templates.guard';
import { entityExistsGuard } from '@guards/entity-exists-guard.service';
import { PermissionsGuard } from '@guards/permissions-guard';
import { CompositeRouteGuard, IqserPermissionsGuard, IqserRoutes } from '@iqser/common-ui';
import { IqserAuthGuard } from '@iqser/common-ui/lib/users';
import { DOSSIER_TEMPLATE_ID, ENTITY_TYPE } from '@red/domain';
import { CopilotService } from '@services/copilot.service';
import { RedRoleGuard } from '@users/red-role.guard';
import { Roles } from '@users/roles';
import { BaseAdminScreenComponent } from './base-admin-screen/base-admin-screen.component';
import { BaseDossierTemplateScreenComponent } from './base-dossier-templates-screen/base-dossier-template-screen.component';
import { BaseEntityScreenComponent } from './base-entity-screen/base-entity-screen.component';
import { AuditScreenComponent } from './screens/audit/audit-screen.component';
import { DefaultColorsScreenComponent } from './screens/default-colors/default-colors-screen.component';
import { DigitalSignatureScreenComponent } from './screens/digital-signature/digital-signature-screen.component';
import { EntitiesListingScreenComponent } from './screens/entities-listing/entities-listing-screen.component';
import { GeneralConfigScreenComponent } from './screens/general-config/general-config-screen.component';
import { UserListingScreenComponent } from './screens/user-listing/user-listing-screen.component';
import { AdminDialogService } from './services/admin-dialog.service';
import { AuditService } from './services/audit.service';
import { DigitalSignatureService } from './services/digital-signature.service';
import { RulesService } from './services/rules.service';
import { SmtpConfigService } from './services/smtp-config.service';
const entityRoutes: IqserRoutes = [
{
path: '',
component: BaseDossierTemplateScreenComponent,
children: [{ path: '', component: EntitiesListingScreenComponent }],
canActivate: [CompositeRouteGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
},
{
path: `:${ENTITY_TYPE}`,
component: BaseEntityScreenComponent,
canActivate: [CompositeRouteGuard, entityExistsGuard()],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
loadChildren: () => import('./screens/entities/entities.routes'),
},
];
const dossierTemplateIdRoutes: IqserRoutes = [
{ path: '', redirectTo: 'info', pathMatch: 'full' },
{
path: 'info',
component: BaseDossierTemplateScreenComponent,
children: [
{
path: '',
canDeactivate: [PendingChangesGuard],
loadComponent: () => import('./screens/info/dossier-template-info-screen/dossier-template-info-screen.component'),
},
],
},
{
path: 'entities',
children: entityRoutes,
},
{
path: '',
component: BaseDossierTemplateScreenComponent,
children: [
{
path: 'entity-rules',
loadComponent: () => import('./screens/rules/rules-screen/rules-screen.component'),
canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
canDeactivate: [PendingChangesGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
permissions: {
allow: [Roles.rules.read],
redirectTo: 'info',
},
type: 'ENTITY',
},
providers: [
RulesService,
provideEnvironmentInitializer(() => {
return inject(CopilotService).connectAsync('/api/llm/llm-websocket');
}),
],
},
{
path: 'component-rules',
loadComponent: () => import('./screens/rules/rules-screen/rules-screen.component'),
canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
canDeactivate: [PendingChangesGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
permissions: {
allow: [Roles.rules.read],
redirectTo: 'info',
},
type: 'COMPONENT',
},
providers: [RulesService],
},
{
path: 'component-mappings',
loadComponent: () => import('./screens/component-mappings/component-mappings-screen.component'),
canActivate: [CompositeRouteGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
},
{
path: 'components',
loadComponent: () => import('./screens/component-definitions/component-definitions.component'),
canActivate: [CompositeRouteGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
},
{
path: 'file-attributes',
loadComponent: () => import('./screens/file-attributes-listing/file-attributes-listing-screen.component'),
canActivate: [CompositeRouteGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
},
{
path: 'watermarks',
loadChildren: () => import('./screens/watermark/watermark.routes'),
},
{
path: 'reports',
loadComponent: () => import('./screens/reports/reports-screen/reports-screen.component'),
canActivate: [IqserAuthGuard, IqserPermissionsGuard],
data: {
permissions: {
allow: [Roles.reportTemplates.read],
redirectTo: '/auth-error',
},
},
},
{
path: 'dossier-attributes',
loadComponent: () => import('./screens/dossier-attributes-listing/dossier-attributes-listing-screen.component'),
canActivate: [CompositeRouteGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
},
{
path: 'dossier-states',
loadComponent: () =>
import('./screens/dossier-states-listing/dossier-states-listing-screen/dossier-states-listing-screen.component'),
canActivate: [CompositeRouteGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
},
{
path: 'default-colors',
component: DefaultColorsScreenComponent,
canActivate: [CompositeRouteGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
},
},
{
path: 'justifications',
loadComponent: () => import('./screens/justifications/justifications-screen/justifications-screen.component'),
canActivate: [IqserPermissionsGuard],
data: {
permissions: {
allow: [Roles.legalBasis.read],
redirectTo: '/auth-error',
},
},
},
],
},
];
const dossierTemplatesRoutes: IqserRoutes = [
{
path: '',
component: BaseAdminScreenComponent,
children: [
{
path: '',
loadComponent: () =>
import(
'./screens/dossier-templates-listing/dossier-templates-listing-screen/dossier-templates-listing-screen.component'
),
},
],
canActivate: [IqserAuthGuard],
},
{
path: `:${DOSSIER_TEMPLATE_ID}`,
children: dossierTemplateIdRoutes,
canActivate: [templateExistsWhenEnteringAdmin()],
},
];
export default [
{ path: '', redirectTo: 'dossier-templates', pathMatch: 'full' },
{
path: 'dossier-templates',
children: dossierTemplatesRoutes,
canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard, DossierTemplatesGuard],
requiredRoles: ['RED_MANAGER', 'RED_ADMIN'],
permissions: {
allow: [Roles.templates.read],
redirectTo: '/',
},
},
},
{
path: '',
component: BaseAdminScreenComponent,
providers: [AdminDialogService],
children: [
{
path: 'users',
component: UserListingScreenComponent,
canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
permissions: {
allow: [Roles.users.read, 'RED_USER_ADMIN'],
redirectTo: '/',
},
},
},
{
path: 'dossier-permissions',
loadComponent: () => import('./screens/permissions/permissions-screen/permissions-screen.component'),
canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard, PermissionsGuard],
permissionsObject: 'Dossier',
permissions: {
allow: [Roles.manageAclPermissions, 'RED_ADMIN'],
redirectTo: '/',
},
},
},
{
path: 'license-info',
loadChildren: () => import('./screens/license/license.routes'),
canActivate: [IqserAuthGuard, IqserPermissionsGuard, RedRoleGuard],
data: {
permissions: {
allow: [Roles.license.readReport, 'RED_ADMIN'],
redirectTo: '/',
},
},
},
{
path: 'digital-signature',
component: DigitalSignatureScreenComponent,
canActivate: [IqserAuthGuard, IqserPermissionsGuard, RedRoleGuard],
data: {
permissions: {
allow: [Roles.digitalSignature.read, 'RED_ADMIN'],
redirectTo: '/',
},
},
providers: [DigitalSignatureService],
},
{
path: 'audit',
component: AuditScreenComponent,
canActivate: [IqserAuthGuard, IqserPermissionsGuard, RedRoleGuard],
data: {
permissions: {
allow: [Roles.searchAudit, 'RED_ADMIN'],
redirectTo: '/',
},
},
providers: [AuditService],
},
{
path: 'general-config',
component: GeneralConfigScreenComponent,
canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
canDeactivate: [PendingChangesGuard],
data: {
routeGuards: [IqserAuthGuard, RedRoleGuard],
permissions: {
allow: [Roles.generalConfiguration.read, Roles.smtp.read, 'RED_ADMIN'],
redirectTo: '/',
},
},
providers: [SmtpConfigService],
},
],
},
] satisfies IqserRoutes;

View File

@ -1,7 +1,10 @@
import { Component } from '@angular/core';
import { AdminSideNavComponent } from '../shared/components/admin-side-nav/admin-side-nav.component';
import { RouterOutlet } from '@angular/router';
@Component({
templateUrl: './base-admin-screen.component.html',
styleUrls: ['./base-admin-screen.component.scss'],
imports: [AdminSideNavComponent, RouterOutlet],
})
export class BaseAdminScreenComponent {}

View File

@ -1,5 +1,3 @@
<!--TODO: Use this for all dossier template screens -->
<section>
<div class="page-header">
<redaction-dossier-template-breadcrumbs class="flex-1"></redaction-dossier-template-breadcrumbs>

View File

@ -1,7 +1,22 @@
import { ChangeDetectionStrategy, Component } from '@angular/core';
import { DossierTemplateBreadcrumbsComponent } from '../shared/components/dossier-template-breadcrumbs/dossier-template-breadcrumbs.component';
import { DossierTemplateActionsComponent } from '../shared/components/dossier-template-actions/dossier-template-actions.component';
import { CircleButtonComponent } from '@iqser/common-ui';
import { RouterLink, RouterOutlet } from '@angular/router';
import { TranslateModule } from '@ngx-translate/core';
import { AdminSideNavComponent } from '../shared/components/admin-side-nav/admin-side-nav.component';
@Component({
templateUrl: './base-dossier-template-screen.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [
DossierTemplateBreadcrumbsComponent,
DossierTemplateActionsComponent,
CircleButtonComponent,
RouterLink,
TranslateModule,
AdminSideNavComponent,
RouterOutlet,
],
})
export class BaseDossierTemplateScreenComponent {}

View File

@ -1,19 +1,33 @@
import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';
import { DOSSIER_TEMPLATE_ID, ENTITY_TYPE } from '@red/domain';
import { Router } from '@angular/router';
import { Router, RouterLink, RouterOutlet } from '@angular/router';
import { firstValueFrom, Observable } from 'rxjs';
import { AdminDialogService } from '../services/admin-dialog.service';
import { DictionaryService } from '@services/entity-services/dictionary.service';
import { LoadingService } from '@iqser/common-ui';
import { CircleButtonComponent, LoadingService } from '@iqser/common-ui';
import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service';
import { DictionariesMapService } from '@services/entity-services/dictionaries-map.service';
import { map } from 'rxjs/operators';
import { PermissionsService } from '@services/permissions.service';
import { getParam } from '@iqser/common-ui/lib/utils';
import { DossierTemplateBreadcrumbsComponent } from '../shared/components/dossier-template-breadcrumbs/dossier-template-breadcrumbs.component';
import { AsyncPipe, NgIf } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core';
import { AdminSideNavComponent } from '../shared/components/admin-side-nav/admin-side-nav.component';
@Component({
templateUrl: './base-entity-screen.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [
DossierTemplateBreadcrumbsComponent,
CircleButtonComponent,
NgIf,
AsyncPipe,
TranslateModule,
RouterLink,
AdminSideNavComponent,
RouterOutlet,
],
})
export class BaseEntityScreenComponent implements OnInit {
readonly disabledItems$: Observable<string[]>;

View File

@ -23,7 +23,7 @@
<div class="mt-44">
<redaction-donut-chart
[config]="chartConfig"
[config]="chartConfig()"
[radius]="63"
[strokeWidth]="15"
[subtitles]="['user-stats.chart.users' | translate]"

View File

@ -1,12 +1,16 @@
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { Component, EventEmitter, input, Input, output, Output } from '@angular/core';
import { DonutChartConfig } from '@red/domain';
import { CircleButtonComponent } from '@iqser/common-ui';
import { TranslateModule } from '@ngx-translate/core';
import { DonutChartComponent } from '@shared/components/donut-chart/donut-chart.component';
@Component({
selector: 'redaction-users-stats',
templateUrl: './users-stats.component.html',
styleUrls: ['./users-stats.component.scss'],
imports: [CircleButtonComponent, TranslateModule, DonutChartComponent],
})
export class UsersStatsComponent {
@Output() toggleCollapse = new EventEmitter();
@Input() chartConfig: DonutChartConfig[];
readonly chartConfig = input.required<DonutChartConfig[]>();
readonly toggleCollapse = output();
}

View File

@ -0,0 +1,48 @@
<section class="dialog">
<div [innerHTML]="'add-clone-dossier-template.title' | translate: translateParams" class="dialog-header heading-l"></div>
<form [formGroup]="form">
<div class="dialog-content">
<div class="iqser-input-group required w-300">
<label [translate]="'add-edit-clone-dossier-template.form.name'"></label>
<input
[placeholder]="'add-edit-clone-dossier-template.form.name-placeholder' | translate"
formControlName="name"
name="name"
type="text"
/>
</div>
<div class="iqser-input-group w-400">
<label [translate]="'add-edit-clone-dossier-template.form.description'"></label>
<textarea
[placeholder]="'add-edit-clone-dossier-template.form.description-placeholder' | translate"
formControlName="description"
name="description"
rows="4"
type="text"
></textarea>
</div>
</div>
<div class="dialog-actions">
<iqser-icon-button
(action)="save()"
[buttonId]="'saveButton'"
[disabled]="disabled"
[label]="'add-clone-dossier-template.save' | translate: translateParams"
[type]="iconButtonTypes.primary"
></iqser-icon-button>
<iqser-icon-button
(action)="save({ nextAction: true })"
[buttonId]="'saveButton'"
[disabled]="disabled"
[label]="'add-clone-dossier-template.save-and-edit' | translate"
[type]="iconButtonTypes.dark"
></iqser-icon-button>
</div>
</form>
<iqser-circle-button (action)="close()" class="dialog-close" icon="iqser:close"></iqser-circle-button>
</section>

View File

@ -0,0 +1,103 @@
import { HttpStatusCode } from '@angular/common/http';
import { Component, Inject } from '@angular/core';
import { ReactiveFormsModule, Validators } from '@angular/forms';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { BaseDialogComponent, CircleButtonComponent, getConfig, IconButtonComponent, SaveOptions } from '@iqser/common-ui';
import { DossierTemplate } from '@red/domain';
import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service';
import { Router } from '@angular/router';
import { TranslateModule } from '@ngx-translate/core';
export interface CloneTemplateData {
dossierTemplateId?: string;
}
@Component({
templateUrl: './add-clone-dossier-template-dialog.component.html',
styleUrls: ['./add-clone-dossier-template-dialog.component.scss'],
imports: [TranslateModule, ReactiveFormsModule, IconButtonComponent, CircleButtonComponent],
})
export class AddCloneDossierTemplateDialogComponent extends BaseDialogComponent {
readonly dossierTemplate?: DossierTemplate;
readonly isDocumine = getConfig().IS_DOCUMINE;
readonly translateParams: { type: string; dossierTemplateName?: string };
constructor(
private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _router: Router,
protected readonly _dialogRef: MatDialogRef<AddCloneDossierTemplateDialogComponent>,
@Inject(MAT_DIALOG_DATA) readonly data: CloneTemplateData,
) {
super(_dialogRef);
this.dossierTemplate = this._dossierTemplatesService.find(this.data.dossierTemplateId);
this.translateParams = {
type: this.dossierTemplate ? 'clone' : 'create',
dossierTemplateName: this.dossierTemplate?.name,
};
this.form = this.#getForm();
this.initialFormValue = this.form.getRawValue();
}
override get disabled(): boolean {
// Ignore 'changed' value, doesn't make sense in this context
return !this.valid || this._hasErrors();
}
async save(options?: SaveOptions): Promise<void> {
let dossierTemplate: DossierTemplate;
this._loadingService.start();
const body = {
...this.dossierTemplate,
...this.form.getRawValue(),
};
try {
if (this.dossierTemplate) {
dossierTemplate = await this._dossierTemplatesService.clone(this.dossierTemplate.id, body);
} else {
dossierTemplate = await this._dossierTemplatesService.createOrUpdate(body);
}
if (options?.nextAction) {
await this._router.navigate([dossierTemplate.routerLink]);
}
this._dialogRef.close(true);
} catch (error) {
if (error.status === HttpStatusCode.Conflict) {
this._toaster.error(_('add-edit-clone-dossier-template.error.conflict'), { error });
} else {
this._toaster.rawError(error.error.message);
}
}
this._loadingService.stop();
}
#getForm() {
return this._formBuilder.group({
name: [this.dossierTemplate ? this.#getCloneName(this.dossierTemplate) : undefined, Validators.required],
description: [this.dossierTemplate?.description],
});
}
#getCloneName(initialTemplate: DossierTemplate): string {
const templateName = initialTemplate.name.trim();
let nameOfClonedTemplate: string = templateName.split('Copy of ').filter(n => n)[0];
nameOfClonedTemplate = nameOfClonedTemplate.split(/\(\s*\d+\s*\)$/)[0].trim();
const allTemplatesNames = this._dossierTemplatesService.all.map(t => t.name);
let clonesCount = 0;
for (const name of allTemplatesNames) {
const splitName = name.split(nameOfClonedTemplate);
const suffixRegExp = new RegExp(/^\(\s*\d+\s*\)$/);
if (splitName[0] === 'Copy of ' && (splitName[1].trim().match(suffixRegExp) || splitName[1] === '')) {
clonesCount++;
}
}
if (clonesCount >= 1) {
return `Copy of ${nameOfClonedTemplate} (${clonesCount})`;
}
return `Copy of ${nameOfClonedTemplate}`;
}
}

View File

@ -1,58 +0,0 @@
.validity {
width: 230px;
display: flex;
> div {
display: flex;
flex-direction: column;
margin-top: 16px;
mat-checkbox {
margin-right: 16px;
height: 100%;
align-items: center;
display: flex;
min-height: 42px;
}
.iqser-input-group {
min-height: 42px;
justify-content: center;
}
}
}
redaction-select {
flex: 1;
}
.download-includes {
margin: 16px 0 10px;
font-weight: 500;
}
.hidden-elements {
display: flex;
gap: 40px;
.iqser-input-group {
margin-top: 0;
flex: 1;
mat-checkbox {
font-weight: 500;
}
.info {
margin-left: 24px;
}
}
}
.half-flex-basis {
flex-basis: 50%;
}
.pl-75 {
padding: 0 0 0 75px;
}

View File

@ -1,173 +0,0 @@
import { HttpStatusCode } from '@angular/common/http';
import { Component, Inject } from '@angular/core';
import { AbstractControl, Validators } from '@angular/forms';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { BaseDialogComponent, getConfig } from '@iqser/common-ui';
import { DossierTemplate, IDossierTemplate } from '@red/domain';
import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service';
import { downloadTypesTranslations } from '@translations/download-types-translations';
import { applyIntervalConstraints } from '@utils/date-inputs-utils';
import dayjs, { Dayjs } from 'dayjs';
interface EditCloneTemplateData {
dossierTemplateId: string;
clone?: boolean;
}
const downloadTypes = ['ORIGINAL', 'PREVIEW', 'DELTA_PREVIEW', 'REDACTED'].map(type => ({
key: type,
label: downloadTypesTranslations[type],
}));
@Component({
templateUrl: './add-edit-clone-dossier-template-dialog.component.html',
styleUrls: ['./add-edit-clone-dossier-template-dialog.component.scss'],
})
export class AddEditCloneDossierTemplateDialogComponent extends BaseDialogComponent {
readonly isDocumine = getConfig().IS_DOCUMINE;
hasValidFrom: boolean;
hasValidTo: boolean;
readonly downloadTypes = downloadTypes;
readonly dossierTemplate: DossierTemplate;
private _previousValidFrom: Dayjs;
private _previousValidTo: Dayjs;
private _lastValidFrom: Dayjs;
private _lastValidTo: Dayjs;
get disabled(): boolean {
if (!this.data?.clone) {
return super.disabled;
}
return !this.valid;
}
get translateParams() {
return {
type: this.dossierTemplate ? (this.data.clone ? 'clone' : 'edit') : 'create',
name: this.dossierTemplate?.name,
};
}
constructor(
private readonly _dossierTemplatesService: DossierTemplatesService,
protected readonly _dialogRef: MatDialogRef<AddEditCloneDossierTemplateDialogComponent>,
@Inject(MAT_DIALOG_DATA) readonly data: EditCloneTemplateData,
) {
super(_dialogRef, !!data && !data.clone);
this.dossierTemplate = this._dossierTemplatesService.find(this.data?.dossierTemplateId);
this.form = this.#getForm();
this.initialFormValue = this.form.getRawValue();
this.hasValidFrom = !!this.dossierTemplate?.validFrom;
this.hasValidTo = !!this.dossierTemplate?.validTo;
this._previousValidFrom = this._lastValidFrom = this.form.get('validFrom').value;
this._previousValidTo = this._lastValidTo = this.form.get('validTo').value;
}
toggleHasValid(extremity: string) {
if (extremity === 'from') {
this.hasValidFrom = !this.hasValidFrom;
this.form.controls['validFrom'].setValue(this.hasValidFrom ? this._lastValidFrom : null);
} else {
this.hasValidTo = !this.hasValidTo;
this.form.controls['validTo'].setValue(this.hasValidTo ? this._lastValidTo : null);
}
this.applyValidityIntervalConstraints();
}
async save() {
this._loadingService.start();
const dossierTemplate = {
dossierTemplateId: this.dossierTemplate?.dossierTemplateId,
...this.form.getRawValue(),
validFrom: this.hasValidFrom ? this.form.get('validFrom').value : null,
validTo: this.hasValidTo ? this.form.get('validTo').value : null,
} as IDossierTemplate;
try {
if (this.data?.clone) {
await this._dossierTemplatesService.clone(this.dossierTemplate.id, dossierTemplate);
} else {
await this._dossierTemplatesService.createOrUpdate(dossierTemplate);
}
this._dialogRef.close(true);
} catch (error) {
if (error.status === HttpStatusCode.Conflict) {
this._toaster.error(_('add-edit-clone-dossier-template.error.conflict'), { error });
} else {
this._toaster.rawError(error.error.message);
}
}
this._loadingService.stop();
}
applyValidityIntervalConstraints(): void {
const formValue = this.form.value;
applyIntervalConstraints(formValue, this._previousValidFrom, this._previousValidTo, this.form, 'validFrom', 'validTo');
this._previousValidFrom = this.form.get('validFrom').value;
this._previousValidTo = this.form.get('validTo').value;
this._lastValidFrom = this._previousValidFrom || this._lastValidFrom;
this._lastValidTo = this._previousValidTo || this._lastValidTo;
}
#getForm() {
return this._formBuilder.group({
name: [this.#getCloneName(), Validators.required],
description: [this.dossierTemplate?.description],
validFrom: [
this.dossierTemplate?.validFrom ? dayjs(this.dossierTemplate?.validFrom) : null,
this.#requiredIfValidator(() => this.hasValidFrom),
],
validTo: [
this.dossierTemplate?.validTo ? dayjs(this.dossierTemplate?.validTo) : null,
this.#requiredIfValidator(() => this.hasValidTo),
],
applyDictionaryUpdatesToAllDossiersByDefault: [this.dossierTemplate?.applyDictionaryUpdatesToAllDossiersByDefault],
ocrByDefault: [this.dossierTemplate?.ocrByDefault],
removeWatermark: [this.dossierTemplate?.removeWatermark],
downloadFileTypes: [this.dossierTemplate?.downloadFileTypes || ['PREVIEW', 'REDACTED']],
keepHiddenText: [this.dossierTemplate?.keepHiddenText],
keepImageMetadata: [this.dossierTemplate?.keepImageMetadata],
keepOverlappingObjects: [this.dossierTemplate?.keepOverlappingObjects],
});
}
#getCloneName(): string {
if (!this.data?.clone) {
return this.dossierTemplate?.name;
}
const templateName = this.dossierTemplate.name.trim();
let nameOfClonedTemplate: string = templateName.split('Copy of ').filter(n => n)[0];
nameOfClonedTemplate = nameOfClonedTemplate.split(/\(\s*\d+\s*\)$/)[0].trim();
const allTemplatesNames = this._dossierTemplatesService.all.map(t => t.name);
let clonesCount = 0;
for (const name of allTemplatesNames) {
const splitName = name.split(nameOfClonedTemplate);
const suffixRegExp = new RegExp(/^\(\s*\d+\s*\)$/);
if (splitName[0] === 'Copy of ' && (splitName[1].trim().match(suffixRegExp) || splitName[1] === '')) {
clonesCount++;
}
}
if (clonesCount >= 1) {
return `Copy of ${nameOfClonedTemplate} (${clonesCount})`;
}
return `Copy of ${nameOfClonedTemplate}`;
}
#requiredIfValidator(predicate) {
return (formControl: AbstractControl) => {
if (!formControl.parent) {
return null;
}
if (predicate()) {
return Validators.required(formControl);
}
return null;
};
}
}

View File

@ -1,18 +1,23 @@
import { Component, Inject, ViewChild } from '@angular/core';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { BaseDialogComponent, CircleButtonComponent } from '@iqser/common-ui';
import { User } from '@red/domain';
import { ResetPasswordComponent } from './reset-password/reset-password.component';
import { UserDetailsComponent } from './user-details/user-details.component';
import { BaseDialogComponent } from '@iqser/common-ui';
@Component({
selector: 'redaction-add-edit-user-dialog',
templateUrl: './add-edit-user-dialog.component.html',
imports: [UserDetailsComponent, ResetPasswordComponent, CircleButtonComponent],
})
export class AddEditUserDialogComponent extends BaseDialogComponent {
resettingPassword = false;
@ViewChild(UserDetailsComponent) private readonly _userDetailsComponent: UserDetailsComponent;
resettingPassword = false;
constructor(protected readonly _dialogRef: MatDialogRef<AddEditUserDialogComponent>, @Inject(MAT_DIALOG_DATA) readonly user: User) {
constructor(
protected readonly _dialogRef: MatDialogRef<AddEditUserDialogComponent>,
@Inject(MAT_DIALOG_DATA) readonly user: User,
) {
super(_dialogRef, !!user);
}

View File

@ -1,13 +1,16 @@
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
import { ReactiveFormsModule, UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
import { UserService } from '@users/user.service';
import { IconButtonTypes, LoadingService } from '@iqser/common-ui';
import { IconButtonComponent, IconButtonTypes, LoadingService } from '@iqser/common-ui';
import { User } from '@red/domain';
import { firstValueFrom } from 'rxjs';
import { TranslateModule } from '@ngx-translate/core';
import { NamePipe } from '@common-ui/users/name.pipe';
@Component({
selector: 'redaction-reset-password',
templateUrl: './reset-password.component.html',
imports: [TranslateModule, NamePipe, ReactiveFormsModule, IconButtonComponent],
})
export class ResetPasswordComponent {
readonly iconButtonTypes = IconButtonTypes;

View File

@ -1,6 +1,6 @@
<div
[translateParams]="{
type: user ? 'edit' : 'create'
type: !!user() ? 'edit' : 'create',
}"
[translate]="'add-edit-user.title'"
class="dialog-header heading-l"
@ -32,14 +32,22 @@
[formControlName]="role"
color="primary"
>
{{ translations[role] | translate }}
{{ translations[role] | translate: { count: 1 } }}
</mat-checkbox>
</div>
</div>
@if (!user()) {
<div class="iqser-input-group">
<label [translate]="'add-edit-user.form.account-setup'"></label>
<mat-checkbox formControlName="sendSetPasswordMail">{{ 'add-edit-user.form.send-email' | translate }}</mat-checkbox>
<span [translate]="'add-edit-user.form.send-email-explanation'" class="hint"></span>
</div>
}
<div
(click)="toggleResetPassword.emit()"
*ngIf="!!user"
*ngIf="!!user()"
[translate]="'add-edit-user.form.reset-password'"
class="mt-24 fit-content link-action"
></div>
@ -48,14 +56,14 @@
<div class="dialog-actions">
<iqser-icon-button
[disabled]="form.invalid || !changed"
[label]="(user ? 'add-edit-user.actions.save-changes' : 'add-edit-user.actions.save') | translate"
[label]="(user() ? 'add-edit-user.actions.save-changes' : 'add-edit-user.actions.save') | translate"
[submit]="true"
[type]="iconButtonTypes.primary"
></iqser-icon-button>
<iqser-icon-button
(action)="delete()"
*ngIf="user && !disabledDelete(user)"
*ngIf="user() && !disabledDelete(user())"
[label]="'add-edit-user.actions.delete' | translate"
[type]="iconButtonTypes.dark"
icon="iqser:trash"

View File

@ -5,3 +5,7 @@
margin-top: 8px;
width: 300px;
}
.hint {
margin-left: 23px;
}

View File

@ -1,29 +1,31 @@
import { Component, EventEmitter, Input, OnChanges, Output } from '@angular/core';
import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
import { Component, input, OnInit, output } from '@angular/core';
import { ReactiveFormsModule, UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
import { AdminDialogService } from '../../../services/admin-dialog.service';
import { BaseFormComponent, LoadingService, Toaster } from '@iqser/common-ui';
import { BaseFormComponent, IconButtonComponent, LoadingService, Toaster } from '@iqser/common-ui';
import { rolesTranslations } from '@translations/roles-translations';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { User } from '@red/domain';
import { UserService } from '@users/user.service';
import { HttpStatusCode } from '@angular/common/http';
import { firstValueFrom } from 'rxjs';
import { IProfileUpdateRequest } from '@iqser/common-ui/lib/users';
import { TranslateModule } from '@ngx-translate/core';
import { MatCheckbox } from '@angular/material/checkbox';
import { NgForOf, NgIf } from '@angular/common';
@Component({
selector: 'redaction-user-details',
templateUrl: './user-details.component.html',
styleUrls: ['./user-details.component.scss'],
imports: [TranslateModule, ReactiveFormsModule, MatCheckbox, NgForOf, IconButtonComponent, NgIf],
})
export class UserDetailsComponent extends BaseFormComponent implements OnChanges {
/** e.g. a RED_ADMIN is automatically a RED_USER_ADMIN => can't disable RED_USER_ADMIN as long as RED_ADMIN is checked */
private readonly _ROLE_REQUIREMENTS = { RED_MANAGER: 'RED_USER', RED_ADMIN: 'RED_USER_ADMIN' };
@Input() user: User;
@Output() readonly toggleResetPassword = new EventEmitter();
@Output() readonly closeDialog = new EventEmitter();
@Output() readonly cancel = new EventEmitter();
export class UserDetailsComponent extends BaseFormComponent implements OnInit {
user = input<User>();
readonly toggleResetPassword = output();
readonly closeDialog = output<boolean>();
readonly cancel = output();
readonly ROLES = ['RED_USER', 'RED_MANAGER', 'RED_USER_ADMIN', 'RED_ADMIN'];
readonly translations = rolesTranslations;
/** e.g. a RED_ADMIN is automatically a RED_USER_ADMIN => can't disable RED_USER_ADMIN as long as RED_ADMIN is checked */
readonly #ROLE_REQUIREMENTS = { RED_MANAGER: 'RED_USER', RED_ADMIN: 'RED_USER_ADMIN' };
constructor(
private readonly _formBuilder: UntypedFormBuilder,
@ -44,13 +46,17 @@ export class UserDetailsComponent extends BaseFormComponent implements OnChanges
}, []);
}
private get _rolesControls(): any {
get sendSetPasswordMail() {
return !this.form.controls.sendSetPasswordMail.value;
}
get #rolesControls() {
return this.ROLES.reduce(
(prev, role) => ({
...prev,
[role]: [
{
value: this.user && this.user.has(role),
value: this.user() && this.user().has(role),
disabled: this.shouldBeDisabled(role),
},
],
@ -59,20 +65,20 @@ export class UserDetailsComponent extends BaseFormComponent implements OnChanges
);
}
ngOnChanges() {
this.form = this._getForm();
ngOnInit() {
this.form = this.#getForm();
this.initialFormValue = this.form.getRawValue();
}
shouldBeDisabled(role: string): boolean {
const isCurrentAdminUser = this.user && this.user.isAdmin && this.user.id === this._userService.currentUser.id;
const isCurrentAdminUser = this.user() && this.user().isAdmin && this.user().id === this._userService.currentUser.id;
return (
// RED_ADMIN can't remove own RED_ADMIN role
(role === 'RED_ADMIN' && isCurrentAdminUser) ||
// only RED_ADMINs can edit RED_ADMIN roles
(role === 'RED_ADMIN' && !this._userService.currentUser.isAdmin) ||
Object.keys(this._ROLE_REQUIREMENTS).reduce(
(value, key) => value || (role === this._ROLE_REQUIREMENTS[key] && this.user?.roles.includes(key)),
Object.keys(this.#ROLE_REQUIREMENTS).reduce(
(value, key) => value || (role === this.#ROLE_REQUIREMENTS[key] && this.user()?.roles.includes(key)),
false,
)
);
@ -80,38 +86,38 @@ export class UserDetailsComponent extends BaseFormComponent implements OnChanges
async save() {
this._loadingService.start();
const userData: IProfileUpdateRequest = { ...this.form.getRawValue(), roles: this.activeRoles };
const userData: IProfileUpdateRequest = {
...this.form.getRawValue(),
roles: this.activeRoles,
sendSetPasswordMail: this.sendSetPasswordMail,
};
if (!this.user) {
if (!this.user()) {
await firstValueFrom(this._userService.create(userData))
.then(() => {
this.closeDialog.emit(true);
})
.catch(error => {
if (error.status === HttpStatusCode.Conflict) {
this._toaster.error(_('add-edit-user.error.email-already-used'));
} else {
this._toaster.error(_('add-edit-user.error.generic'));
}
this._toaster.error(null, { error });
this._loadingService.stop();
});
} else {
await firstValueFrom(this._userService.updateProfile(userData, this.user.id));
await firstValueFrom(this._userService.updateProfile(userData, this.user().id));
this.closeDialog.emit(true);
}
}
delete() {
this._dialogService.deleteUsers([this.user.id], () => this.closeDialog.emit(true));
this._dialogService.deleteUsers([this.user().id], () => this.closeDialog.emit(true));
}
setRolesRequirements(checked: boolean, role: string): void {
if (Object.keys(this._ROLE_REQUIREMENTS).includes(role)) {
if (Object.keys(this.#ROLE_REQUIREMENTS).includes(role)) {
if (checked) {
this.form.patchValue({ [this._ROLE_REQUIREMENTS[role]]: true });
this.form.controls[this._ROLE_REQUIREMENTS[role]].disable();
this.form.patchValue({ [this.#ROLE_REQUIREMENTS[role]]: true });
this.form.controls[this.#ROLE_REQUIREMENTS[role]].disable();
} else {
this.form.controls[this._ROLE_REQUIREMENTS[role]].enable();
this.form.controls[this.#ROLE_REQUIREMENTS[role]].enable();
}
}
}
@ -122,18 +128,19 @@ export class UserDetailsComponent extends BaseFormComponent implements OnChanges
return user.id === this._userService.currentUser.id || (userAdmin && !currentUserAdmin);
}
private _getForm(): UntypedFormGroup {
#getForm(): UntypedFormGroup {
return this._formBuilder.group({
firstName: [this.user?.firstName, Validators.required],
lastName: [this.user?.lastName, Validators.required],
firstName: [this.user()?.firstName, Validators.required],
lastName: [this.user()?.lastName, Validators.required],
email: [
{
value: this.user?.email,
disabled: !!this.user?.email,
value: this.user()?.email,
disabled: !!this.user()?.email,
},
[Validators.required, Validators.email],
],
...this._rolesControls,
...this.#rolesControls,
sendSetPasswordMail: [false],
});
}
}

View File

@ -16,7 +16,7 @@
[type]="iconButtonTypes.primary"
></iqser-icon-button>
<iqser-help-button *ngIf="!config.IS_DOCUMINE" [helpButtonKey]="'create_new_entity'"></iqser-help-button>
<iqser-help-button *ngIf="!config.IS_DOCUMINE"></iqser-help-button>
</div>
<iqser-circle-button (action)="close()" class="dialog-close" icon="iqser:close"></iqser-circle-button>

View File

@ -1,7 +1,16 @@
import { Component, inject, ViewChild } from '@angular/core';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { BaseDialogComponent, getConfig, IconButtonTypes } from '@iqser/common-ui';
import {
BaseDialogComponent,
CircleButtonComponent,
getConfig,
HelpButtonComponent,
IconButtonComponent,
IconButtonTypes,
} from '@iqser/common-ui';
import { AddEditEntityComponent } from '@shared/components/add-edit-entity/add-edit-entity.component';
import { TranslateModule } from '@ngx-translate/core';
import { NgIf } from '@angular/common';
interface DialogData {
readonly dossierTemplateId: string;
@ -10,6 +19,7 @@ interface DialogData {
@Component({
templateUrl: './add-entity-dialog.component.html',
styleUrls: ['./add-entity-dialog.component.scss'],
imports: [AddEditEntityComponent, TranslateModule, IconButtonComponent, NgIf, CircleButtonComponent, HelpButtonComponent],
})
export class AddEntityDialogComponent extends BaseDialogComponent {
@ViewChild(AddEditEntityComponent, { static: true }) private readonly _addEditEntityComponent: AddEditEntityComponent;

View File

@ -6,9 +6,11 @@
<div class="table-header">Key</div>
<div class="table-header">Value</div>
<ng-container *ngFor="let entry of data.auditEntry.details | keyvalue : originalOrder">
<ng-container *ngFor="let entry of data.auditEntry.details | keyvalue: originalOrder">
<div class="bold">{{ entry.key | humanize }}</div>
<div>{{ entry.value }}</div>
<div>
<pre>{{ entry.value | json }}</pre>
</div>
</ng-container>
</div>
</div>

View File

@ -1,8 +1,9 @@
import { KeyValue } from '@angular/common';
import { JsonPipe, KeyValue, KeyValuePipe, NgForOf } from '@angular/common';
import { ChangeDetectionStrategy, Component, Inject } from '@angular/core';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { BaseDialogComponent } from '@iqser/common-ui';
import { BaseDialogComponent, CircleButtonComponent, HumanizePipe } from '@iqser/common-ui';
import { IAudit } from '@red/domain';
import { TranslateModule } from '@ngx-translate/core';
interface DialogData {
readonly auditEntry: IAudit;
@ -15,6 +16,7 @@ type OrderFn = (a: KeyValue<string, string>, b: KeyValue<string, string>) => num
templateUrl: './audit-info-dialog.component.html',
styleUrls: ['./audit-info-dialog.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [TranslateModule, NgForOf, KeyValuePipe, HumanizePipe, CircleButtonComponent, JsonPipe],
})
export class AuditInfoDialogComponent extends BaseDialogComponent {
constructor(

View File

@ -1,12 +1,18 @@
import { ChangeDetectorRef, Component, ViewChild } from '@angular/core';
import { digitalSignatureDialogTranslations } from '../../translations/digital-signature-dialog-translations';
import { BaseDialogComponent, DetailsRadioOption } from '@iqser/common-ui';
import { MatDialogRef } from '@angular/material/dialog';
import { PkcsSignatureConfigurationComponent } from './form/pkcs-signature-configuration/pkcs-signature-configuration.component';
import { KmsSignatureConfigurationComponent } from './form/kms-signature-configuration/kms-signature-configuration.component';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { NgIf } from '@angular/common';
import { HttpStatusCode } from '@angular/common/http';
import { ChangeDetectorRef, Component, ViewChild } from '@angular/core';
import { ReactiveFormsModule } from '@angular/forms';
import { MatDialogClose, MatDialogRef } from '@angular/material/dialog';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { DetailsRadioOption } from '@common-ui/inputs/details-radio/details-radio-option';
import { DetailsRadioComponent } from '@common-ui/inputs/details-radio/details-radio.component';
import { BaseDialogComponent, CircleButtonComponent, IconButtonComponent } from '@iqser/common-ui';
import { TranslateModule } from '@ngx-translate/core';
import { DigitalSignatureOption, DigitalSignatureOptions } from '@red/domain';
import { DigitalSignatureService } from '../../services/digital-signature.service';
import { digitalSignatureDialogTranslations } from '../../translations/digital-signature-dialog-translations';
import { KmsSignatureConfigurationComponent } from './form/kms-signature-configuration/kms-signature-configuration.component';
import { PkcsSignatureConfigurationComponent } from './form/pkcs-signature-configuration/pkcs-signature-configuration.component';
const DEFAULT_DIALOG_WIDTH = '662px';
const KMS_SIGNATURE_DIALOG_WIDTH = '810px';
@ -14,6 +20,18 @@ const KMS_SIGNATURE_DIALOG_WIDTH = '810px';
@Component({
templateUrl: './configure-certificate-dialog.component.html',
styleUrls: ['./configure-certificate-dialog.component.scss'],
imports: [
DetailsRadioComponent,
NgIf,
ReactiveFormsModule,
TranslateModule,
PkcsSignatureConfigurationComponent,
KmsSignatureConfigurationComponent,
IconButtonComponent,
MatDialogClose,
CircleButtonComponent,
],
providers: [DigitalSignatureService],
})
export class ConfigureCertificateDialogComponent extends BaseDialogComponent {
@ViewChild(PkcsSignatureConfigurationComponent) pkcsSignatureConfigurationComponent: PkcsSignatureConfigurationComponent;

View File

@ -1,20 +1,27 @@
import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core';
import { UntypedFormBuilder, Validators } from '@angular/forms';
import { ReactiveFormsModule, UntypedFormBuilder, Validators } from '@angular/forms';
import { BaseSignatureConfigurationComponent } from '../base-signature-configuration-component';
import { DigitalSignatureOptions, IKmsDigitalSignature, IKmsDigitalSignatureRequest } from '@red/domain';
import { firstValueFrom } from 'rxjs';
import { DigitalSignatureService } from '../../../../services/digital-signature.service';
import { UploadFileComponent } from '@iqser/common-ui';
import { NgIf } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core';
@Component({
selector: 'redaction-kms-signature-configuration',
templateUrl: './kms-signature-configuration.component.html',
styleUrls: ['./kms-signature-configuration.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [UploadFileComponent, ReactiveFormsModule, NgIf, TranslateModule],
})
export class KmsSignatureConfigurationComponent extends BaseSignatureConfigurationComponent implements OnInit {
@Input() digitalSignature!: IKmsDigitalSignatureRequest;
constructor(protected readonly _digitalSignatureService: DigitalSignatureService, private readonly _formBuilder: UntypedFormBuilder) {
constructor(
protected readonly _digitalSignatureService: DigitalSignatureService,
private readonly _formBuilder: UntypedFormBuilder,
) {
super(_digitalSignatureService, DigitalSignatureOptions.KMS);
}

View File

@ -1,16 +1,20 @@
import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core';
import { UntypedFormBuilder, Validators } from '@angular/forms';
import { ReactiveFormsModule, UntypedFormBuilder, Validators } from '@angular/forms';
import { DigitalSignatureOptions, IPkcsDigitalSignature, IPkcsDigitalSignatureRequest } from '@red/domain';
import { lastIndexOfEnd } from '@utils/functions';
import { firstValueFrom } from 'rxjs';
import { DigitalSignatureService } from '../../../../services/digital-signature.service';
import { BaseSignatureConfigurationComponent } from '../base-signature-configuration-component';
import { UploadFileComponent } from '@iqser/common-ui';
import { NgIf } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core';
@Component({
selector: 'redaction-pkcs-signature-configuration',
templateUrl: './pkcs-signature-configuration.component.html',
styleUrls: ['./pkcs-signature-configuration.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [UploadFileComponent, ReactiveFormsModule, NgIf, TranslateModule],
})
export class PkcsSignatureConfigurationComponent extends BaseSignatureConfigurationComponent implements OnInit {
@Input() digitalSignature!: IPkcsDigitalSignatureRequest;

View File

@ -1,12 +1,16 @@
import { Component, Inject } from '@angular/core';
import { DefaultColorType } from '@red/domain';
import { BaseDialogComponent, IconButtonTypes } from '@iqser/common-ui';
import { UntypedFormGroup, Validators } from '@angular/forms';
import { BaseDialogComponent, CircleButtonComponent, IconButtonComponent, IconButtonTypes } from '@iqser/common-ui';
import { ReactiveFormsModule, UntypedFormGroup, Validators } from '@angular/forms';
import { defaultColorsTranslations } from '@translations/default-colors-translations';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { firstValueFrom } from 'rxjs';
import { DefaultColorsService } from '@services/entity-services/default-colors.service';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { TranslateModule } from '@ngx-translate/core';
import { ColorPickerModule } from 'ngx-color-picker';
import { MatIcon } from '@angular/material/icon';
import { NgIf } from '@angular/common';
interface IEditColorData {
colorKey: DefaultColorType;
@ -16,6 +20,7 @@ interface IEditColorData {
@Component({
templateUrl: './edit-color-dialog.component.html',
styleUrls: ['./edit-color-dialog.component.scss'],
imports: [ReactiveFormsModule, TranslateModule, ColorPickerModule, MatIcon, NgIf, IconButtonComponent, CircleButtonComponent],
})
export class EditColorDialogComponent extends BaseDialogComponent {
readonly iconButtonTypes = IconButtonTypes;

View File

@ -1,13 +1,15 @@
import { Component, Inject } from '@angular/core';
import { Validators } from '@angular/forms';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { BaseDialogComponent } from '@iqser/common-ui';
import { ReactiveFormsModule, Validators } from '@angular/forms';
import { MAT_DIALOG_DATA, MatDialogClose, MatDialogRef } from '@angular/material/dialog';
import { BaseDialogComponent, CircleButtonComponent, IconButtonComponent } from '@iqser/common-ui';
import { ISmtpConfiguration } from '@red/domain';
import { getCurrentUser } from '@users/user.service';
import { TranslateModule } from '@ngx-translate/core';
@Component({
selector: 'redaction-smtp-auth-dialog',
templateUrl: './smtp-auth-dialog.component.html',
imports: [ReactiveFormsModule, TranslateModule, IconButtonComponent, CircleButtonComponent, MatDialogClose],
})
export class SmtpAuthDialogComponent extends BaseDialogComponent {
readonly #currentUser = getCurrentUser();

View File

@ -1,11 +1,13 @@
import { ChangeDetectionStrategy, Component } from '@angular/core';
import { MatDialogRef } from '@angular/material/dialog';
import { IconButtonTypes } from '@iqser/common-ui';
import { IconButtonComponent, IconButtonTypes } from '@iqser/common-ui';
import { TranslateModule } from '@ngx-translate/core';
@Component({
templateUrl: './upload-dictionary-dialog.component.html',
styleUrls: ['./upload-dictionary-dialog.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [IconButtonComponent, TranslateModule],
})
export class UploadDictionaryDialogComponent {
readonly iconButtonTypes = IconButtonTypes;

View File

@ -1,17 +1,34 @@
import { Component, inject, OnDestroy, OnInit } from '@angular/core';
import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';
import { ReactiveFormsModule, UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { IqserPermissionsService, ListingComponent, listingProvidersFactory, LoadingService, TableColumnConfig } from '@iqser/common-ui';
import { getCurrentUser } from '@iqser/common-ui/lib/users';
import {
CircleButtonComponent,
HumanizePipe,
IqserListingModule,
IqserPermissionsService,
ListingComponent,
listingProvidersFactory,
LoadingService,
TableColumnConfig,
} from '@iqser/common-ui';
import { getCurrentUser, InitialsAvatarComponent } from '@iqser/common-ui/lib/users';
import { Audit, IAudit, IAuditResponse, IAuditSearchRequest, User } from '@red/domain';
import { RouterHistoryService } from '@services/router-history.service';
import { auditCategoriesTranslations } from '@translations/audit-categories-translations';
import { Roles } from '@users/roles';
import { applyIntervalConstraints } from '@utils/date-inputs-utils';
import { Dayjs } from 'dayjs';
import dayjs, { Dayjs } from 'dayjs';
import { firstValueFrom } from 'rxjs';
import { AdminDialogService } from '../../services/admin-dialog.service';
import { AuditService } from '../../services/audit.service';
import { TranslateModule } from '@ngx-translate/core';
import { PaginationComponent } from '@common-ui/pagination';
import { MatFormField, MatSuffix } from '@angular/material/form-field';
import { MatOption, MatSelect, MatSelectTrigger } from '@angular/material/select';
import { AsyncPipe, NgForOf, NgIf } from '@angular/common';
import { MatDatepickerModule } from '@angular/material/datepicker';
import { MatIcon } from '@angular/material/icon';
import { DatePipe } from '@shared/pipes/date.pipe';
const PAGE_SIZE = 50;
@ -19,6 +36,26 @@ const PAGE_SIZE = 50;
templateUrl: './audit-screen.component.html',
styleUrls: ['./audit-screen.component.scss'],
providers: listingProvidersFactory(AuditScreenComponent),
imports: [
IqserListingModule,
TranslateModule,
PaginationComponent,
ReactiveFormsModule,
MatFormField,
MatOption,
NgForOf,
InitialsAvatarComponent,
NgIf,
MatIcon,
MatSuffix,
AsyncPipe,
DatePipe,
HumanizePipe,
CircleButtonComponent,
MatSelectTrigger,
MatSelect,
MatDatepickerModule,
],
})
export class AuditScreenComponent extends ListingComponent<Audit> implements OnInit, OnDestroy {
private _previousFrom: Dayjs;
@ -26,7 +63,7 @@ export class AuditScreenComponent extends ListingComponent<Audit> implements OnI
readonly ALL_CATEGORIES = 'allCategories';
readonly ALL_USERS = _('audit-screen.all-users');
readonly translations = auditCategoriesTranslations;
readonly form: UntypedFormGroup = this._getForm();
readonly form: UntypedFormGroup = this.#getForm();
readonly routerHistoryService = inject(RouterHistoryService);
readonly permissionsService = inject(IqserPermissionsService);
readonly roles = Roles;
@ -59,17 +96,17 @@ export class AuditScreenComponent extends ListingComponent<Audit> implements OnI
}
async pageChanged(page: number) {
await this._fetchData(page);
await this.#fetchData(page);
}
async ngOnInit() {
this.sortingService.setSortingOption({ column: 'recordDate', order: 'desc' });
await this._fetchData();
await this.#fetchData();
}
async filterChange() {
if (!this._updateDateFilters(this.form.value)) {
await this._fetchData();
if (!this.#updateDateFilters(this.form.value)) {
await this.#fetchData();
}
}
@ -77,7 +114,7 @@ export class AuditScreenComponent extends ListingComponent<Audit> implements OnI
this._dialogService.openDialog('auditInfo', { auditEntry: log });
}
private _getForm(): UntypedFormGroup {
#getForm(): UntypedFormGroup {
return this._formBuilder.group({
category: [this.ALL_CATEGORIES],
userId: [this.ALL_USERS],
@ -86,7 +123,7 @@ export class AuditScreenComponent extends ListingComponent<Audit> implements OnI
});
}
private _updateDateFilters(value): boolean {
#updateDateFilters(value): boolean {
if (applyIntervalConstraints(value, this._previousFrom, this._previousTo, this.form, 'from', 'to')) {
return true;
}
@ -96,21 +133,14 @@ export class AuditScreenComponent extends ListingComponent<Audit> implements OnI
return false;
}
private async _fetchData(page?: number) {
async #fetchData(page?: number) {
this._loadingService.start();
const promises = [];
const category = this.form.get('category').value;
const userId = this.form.get('userId').value;
const from = this.form.get('from').value;
let to = this.form.get('to').value;
if (to) {
const hoursLeft = new Date(to).getHours();
const minutesLeft = new Date(to).getMinutes();
to = to
.clone()
.add(24 - hoursLeft - 1, 'h')
.add(60 - minutesLeft - 1);
}
const from = this.form.get('from').value ? dayjs(this.form.get('from').value).startOf('day').toISOString() : null;
const to = this.form.get('to').value ? dayjs(this.form.get('to').value).endOf('day').toISOString() : null;
const logsRequestBody: IAuditSearchRequest = {
pageSize: PAGE_SIZE,
page: page,

View File

@ -0,0 +1,130 @@
@if (componentDefinitions$ | async; as componentDefinitions) {
<div class="content-container">
<div class="content-header">
<div class="header-title">
<span
class="all-caps-label"
[innerHTML]="'component-definitions.title' | translate: { length: componentDefinitions.length }"
></span>
</div>
<div class="actions">
@if (permissionsService.canEditEntities()) {
<iqser-icon-button
(action)="createEmptyComponentDefinition()"
[label]="'component-definitions.add-new' | translate"
[type]="iconButtonTypes.primary"
icon="iqser:plus"
></iqser-icon-button>
}
</div>
</div>
<div class="content">
<div class="components-list">
<div class="header">
<div class="item-content">
<div class="all-caps-label">{{ 'component-definitions.columns.position' | translate }}</div>
<div class="all-caps-label">{{ 'component-definitions.columns.name' | translate }}</div>
</div>
</div>
<div (cdkDropListDropped)="drop($event)" cdkDropList class="list-content">
@for (component of componentDefinitions; track component) {
<div
class="list-item"
[class.selected]="selectedComponent?.id === component.id"
cdkDrag
(click)="selectComponent(component)"
>
<div class="item-content">
<div class="table-item-title heading">
<mat-icon cdkDragHandle class="draggable" svgIcon="red:draggable-dots"></mat-icon>
<span> {{ component.rank }} </span>
</div>
<div class="table-item-title heading">{{ component.displayName }}</div>
<div class="right-content">
@if (permissionsService.canEditEntities()) {
<iqser-circle-button
[class]="'delete-component-definition'"
(action)="deleteComponent(component.id)"
[tooltip]="'trash.action.delete' | translate"
icon="iqser:trash"
></iqser-circle-button>
}
<mat-icon
[class.not-visible]="selectedComponent?.id !== component.id"
class="arrow-right"
svgIcon="red:arrow-right"
></mat-icon>
</div>
</div>
</div>
}
</div>
</div>
@if (selectedComponent) {
<section class="dialog">
<div class="dialog-header">
@if (selectedComponent.id) {
<div
class="heading-l"
[innerHTML]="'component-definitions.edit-title' | translate: { displayName: selectedComponent.displayName }"
></div>
} @else {
<div class="heading-l" [innerHTML]="'component-definitions.add-title' | translate"></div>
}
</div>
@if (form) {
<form (submit)="save()" [formGroup]="form">
<div class="dialog-content">
<div class="iqser-input-group w-300 required">
<label [translate]="'component-definitions.form.display-name'"></label>
<input
formControlName="displayName"
name="displayName"
placeholder="{{ 'component-definitions.form.display-name-placeholder' | translate }}"
type="text"
/>
</div>
<div class="iqser-input-group w-450">
<label [translate]="'component-definitions.form.description'"></label>
<textarea
[placeholder]="'component-definitions.form.description-placeholder' | translate"
formControlName="description"
iqserHasScrollbar
name="description"
rows="5"
type="text"
></textarea>
</div>
<div class="iqser-input-group w-450">
<label [translate]="'component-definitions.form.technical-name-label'"></label>
<span class="technical-name"> {{ technicalName }} </span>
<label [translate]="'component-definitions.form.autogenerated-label'"></label>
</div>
</div>
<div class="dialog-actions">
<iqser-icon-button
[disabled]="disabled"
[label]="'component-definitions.actions.save' | translate"
[submit]="true"
[type]="iconButtonTypes.primary"
></iqser-icon-button>
@if (selectedComponent.id) {
<div
(click)="initForm()"
[class.disabled]="disabled"
[translate]="'component-definitions.actions.revert'"
class="all-caps-label cancel"
></div>
}
</div>
</form>
}
</section>
}
</div>
</div>
}

View File

@ -0,0 +1,145 @@
%item-content-style {
position: relative;
display: flex;
flex: 1;
margin: 5px;
div:first-child {
width: 100px;
}
div {
display: flex;
align-items: center;
justify-content: center;
.draggable {
cursor: grab;
transform: scale(0.7);
width: 40px;
margin-left: -30px;
::ng-deep svg {
fill: var(--iqser-grey-7);
}
}
}
.right-content {
visibility: hidden;
flex: 1;
justify-content: flex-end;
align-items: center;
gap: 5px;
iqser-circle-button {
visibility: hidden;
}
.arrow-right {
transform: scale(0.7);
&.not-visible {
visibility: hidden;
}
}
}
}
.content-container {
background-color: var(--iqser-grey-6);
height: 100vh;
display: flex;
flex-direction: column;
.content-header {
display: flex;
height: 50px;
background-color: var(--iqser-grey-6);
align-items: center;
padding: 0 24px;
.actions {
display: flex;
flex: 1;
justify-content: flex-end;
}
}
.content {
flex: 1;
display: flex;
gap: 20px;
overflow: hidden;
.components-list {
flex: 1;
background-color: var(--iqser-white);
display: flex;
flex-direction: column;
.header {
height: 30px;
}
.list-content {
overflow-y: auto;
height: calc(100vh - 30px);
outline: none;
}
.list-item {
height: 80px;
transition: background 0.3s ease;
}
.header,
.list-item {
display: flex;
border-bottom: 1px solid var(--iqser-separator);
.item-content {
@extend %item-content-style;
}
}
.list-item:hover,
.selected {
cursor: pointer;
.item-content {
background-color: var(--iqser-grey-8);
.right-content {
visibility: visible;
}
}
}
.list-item:hover > .item-content > .right-content > iqser-circle-button {
visibility: visible;
}
}
section {
background-color: var(--iqser-white);
border-radius: 8px;
width: 700px;
height: 470px;
margin-right: 150px;
.technical-name {
min-height: 16px;
}
}
}
}
.cdk-drag-preview {
.list-item {
transition: background 0.3s ease;
}
.item-content {
@extend %item-content-style;
}
}

View File

@ -0,0 +1,138 @@
import { Component, OnInit, signal } from '@angular/core';
import {
BaseFormComponent,
CircleButtonComponent,
HasScrollbarDirective,
IconButtonComponent,
listingProvidersFactory,
LoadingService,
} from '@iqser/common-ui';
import { ComponentDefinitionsService } from '@services/entity-services/component-definitions.service';
import { firstValueFrom } from 'rxjs';
import { getParam } from '@common-ui/utils';
import { DOSSIER_TEMPLATE_ID, IComponentDefinition } from '@red/domain';
import { toObservable } from '@angular/core/rxjs-interop';
import { CommonModule } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core';
import { PermissionsService } from '@services/permissions.service';
import { MatIcon } from '@angular/material/icon';
import { CdkDrag, CdkDragDrop, CdkDragHandle, CdkDropList, moveItemInArray } from '@angular/cdk/drag-drop';
import { FormBuilder, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';
import { AdminDialogService } from '../../services/admin-dialog.service';
@Component({
templateUrl: './component-definitions.component.html',
styleUrls: ['./component-definitions.component.scss'],
providers: listingProvidersFactory(ComponentDefinitionsComponent),
imports: [
IconButtonComponent,
TranslateModule,
CommonModule,
MatIcon,
CdkDragHandle,
CdkDropList,
CdkDrag,
FormsModule,
ReactiveFormsModule,
CircleButtonComponent,
HasScrollbarDirective,
],
})
export default class ComponentDefinitionsComponent extends BaseFormComponent implements OnInit {
readonly #dossierTemplateId = getParam(DOSSIER_TEMPLATE_ID);
readonly #componentDefinitions = signal<IComponentDefinition[]>([]);
protected readonly componentDefinitions$ = toObservable(this.#componentDefinitions);
protected selectedComponent: IComponentDefinition | null = null;
constructor(
private readonly _loadingService: LoadingService,
private readonly _componentDefinitionsService: ComponentDefinitionsService,
private readonly _formBuilder: FormBuilder,
private readonly _dialogService: AdminDialogService,
protected readonly permissionsService: PermissionsService,
) {
super();
}
async ngOnInit() {
this._loadingService.stop();
await this.#loadData();
}
async #loadData() {
const componentDefinitions = await firstValueFrom(
this._componentDefinitionsService.getComponentDefinitions(this.#dossierTemplateId),
);
this.#componentDefinitions.set(componentDefinitions);
}
async createEmptyComponentDefinition() {
this.selectedComponent = {
displayName: '',
description: '',
} as IComponentDefinition;
this.initForm();
}
async save() {
if (this.selectedComponent.id) {
const component = { ...this.form.getRawValue(), id: this.selectedComponent.id };
await firstValueFrom(this._componentDefinitionsService.updateComponentDefinition(this.#dossierTemplateId, component));
} else {
const component = {
...this.form.getRawValue(),
dossierTemplateId: this.#dossierTemplateId,
technicalName: this.technicalName,
};
await firstValueFrom(this._componentDefinitionsService.createComponentDefinition(this.#dossierTemplateId, component));
}
await this.#loadData();
this.selectComponent();
await this.initForm();
}
async drop(event: CdkDragDrop<string>) {
if (event.isPointerOverContainer) {
moveItemInArray(this.#componentDefinitions(), event.previousIndex, event.currentIndex);
const componentIds = this.#componentDefinitions().map(c => c.id);
const componentDefinitions = await firstValueFrom(
this._componentDefinitionsService.reorderComponentDefinitions(this.#dossierTemplateId, componentIds),
);
this.#componentDefinitions.set(componentDefinitions);
}
}
async deleteComponent(componentId: string) {
this._dialogService.openDialog('confirm', null, async () => {
await firstValueFrom(this._componentDefinitionsService.deleteComponentDefinitions(this.#dossierTemplateId, [componentId]));
await this.#loadData();
this.selectedComponent = null;
});
}
initForm() {
this.form = this.#getForm();
this.initialFormValue = this.form.getRawValue();
}
#getForm() {
return this._formBuilder.group({
displayName: [this.selectedComponent?.displayName, Validators.required],
description: [this.selectedComponent?.description],
});
}
selectComponent(component?: IComponentDefinition) {
if (component && this.selectedComponent?.id !== component.id) {
this.selectedComponent = component;
this.initForm();
return;
}
this.selectedComponent = null;
}
get technicalName() {
return this.selectedComponent.technicalName ?? this.form.get('displayName')?.value?.toLowerCase().trim().replace(/\s+/g, '_');
}
}

View File

@ -0,0 +1,79 @@
<section class="dialog">
<div
[innerHTML]="'add-edit-component-mapping.dialog.title' | translate: { type: data.mapping ? 'edit' : 'add' }"
class="dialog-header heading-l"
></div>
<form (submit)="save()" [formGroup]="form">
<div class="dialog-content">
<div class="row">
<div class="iqser-input-group required w-300">
<label translate="add-edit-component-mapping.form.name"></label>
<input
[placeholder]="'add-edit-component-mapping.form.name-placeholder' | translate"
formControlName="name"
name="label"
type="text"
/>
</div>
<div class="iqser-input-group w-100 version" *ngIf="data?.mapping?.id">
<label translate="add-edit-component-mapping.form.version"></label>
<span> {{ data.mapping.version }} </span>
</div>
</div>
<div class="iqser-input-group required">
<label translate="add-edit-component-mapping.form.file"></label>
<iqser-upload-file (fileChanged)="changeFile($event)" [file]="activeFile" [accept]="'.csv'" />
</div>
<div
class="row"
[matTooltip]="'add-edit-component-mapping.disabled-file-options' | translate"
[matTooltipDisabled]="!form.get('encoding')?.disabled"
[matTooltipPosition]="'above'"
>
<div class="iqser-input-group required w-150">
<label translate="add-edit-component-mapping.form.delimiter"></label>
<input
[placeholder]="'add-edit-component-mapping.form.delimiter-placeholder' | translate"
formControlName="delimiter"
name="delimiter"
type="text"
/>
</div>
<div class="iqser-input-group required w-150">
<label translate="add-edit-component-mapping.form.quote-char"></label>
<input
[placeholder]="'add-edit-component-mapping.form.quote-char-placeholder' | translate"
formControlName="quoteChar"
name="quoteChar"
type="text"
/>
</div>
<div class="iqser-input-group required w-150">
<label translate="add-edit-component-mapping.form.encoding-type"></label>
<mat-form-field>
<mat-select formControlName="encoding">
<mat-option *ngFor="let type of encodingTypeOptions" [value]="type">
{{ translations[type] | translate }}
</mat-option>
</mat-select>
</mat-form-field>
</div>
</div>
</div>
<div class="dialog-actions">
<iqser-icon-button
(action)="save()"
[disabled]="disabled"
[label]="'add-edit-component-mapping.actions.save' | translate"
[type]="iconButtonTypes.primary"
></iqser-icon-button>
</div>
</form>
<iqser-circle-button class="dialog-close" icon="iqser:close" mat-dialog-close></iqser-circle-button>
</section>

View File

@ -0,0 +1,25 @@
.row {
display: flex;
margin-top: 14px;
> *:not(:last-child) {
margin-right: 16px;
}
.iqser-input-group {
margin-top: 0;
}
.version {
margin-left: 50px;
span {
margin-top: 10px;
font-size: 15px;
}
}
}
.row:last-child {
max-width: 300px;
}

View File

@ -0,0 +1,111 @@
import { Component, OnInit } from '@angular/core';
import { CircleButtonComponent, IconButtonComponent, IqserDialogComponent, UploadFileComponent } from '@iqser/common-ui';
import { FileAttributeEncodingTypes, IComponentMapping } from '@red/domain';
import { FormBuilder, ReactiveFormsModule, UntypedFormGroup, Validators } from '@angular/forms';
import { TranslateModule } from '@ngx-translate/core';
import { NgForOf, NgIf } from '@angular/common';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatDialogModule } from '@angular/material/dialog';
import { MatOption } from '@angular/material/autocomplete';
import { MatSelect } from '@angular/material/select';
import { fileAttributeEncodingTypesTranslations } from '@translations/file-attribute-encoding-types-translations';
import { firstValueFrom } from 'rxjs';
import { ComponentMappingsService } from '@services/entity-services/component-mappings.service';
import { MatTooltip } from '@angular/material/tooltip';
interface DialogData {
dossierTemplateId: string;
mapping: IComponentMapping;
}
interface DialogResult {
id: string;
name: string;
file: Blob;
encoding: string;
delimiter: string;
quoteChar: string;
fileName?: string;
}
@Component({
templateUrl: './add-edit-component-mapping-dialog.component.html',
styleUrls: ['./add-edit-component-mapping-dialog.component.scss'],
imports: [
TranslateModule,
ReactiveFormsModule,
NgIf,
MatFormFieldModule,
NgForOf,
CircleButtonComponent,
MatDialogModule,
MatOption,
MatSelect,
IconButtonComponent,
UploadFileComponent,
MatTooltip,
],
})
export class AddEditComponentMappingDialogComponent
extends IqserDialogComponent<AddEditComponentMappingDialogComponent, DialogData, DialogResult>
implements OnInit
{
protected readonly encodingTypeOptions = Object.keys(FileAttributeEncodingTypes);
protected readonly translations = fileAttributeEncodingTypesTranslations;
activeFile: File;
form!: UntypedFormGroup;
constructor(
private readonly _formBuilder: FormBuilder,
private readonly _componentMappingService: ComponentMappingsService,
) {
super();
this.form = this.#getForm();
}
async ngOnInit() {
if (this.data.mapping?.fileName) {
this.activeFile = { name: this.data.mapping.fileName } as File;
const fileContent = await firstValueFrom(
this._componentMappingService.getComponentMappingFile(this.data.dossierTemplateId, this.data.mapping.id),
);
const file = new Blob([fileContent.body as Blob], { type: 'text/csv' });
this.form.get('file').setValue(file);
this.initialFormValue = this.form.getRawValue();
this.#disableEncodingAndQuoteCharAndDelimiter();
}
}
changeFile(file: File) {
this.form.get('file').setValue(file);
this.form.get('fileName').setValue(file?.name);
this.#enableEncodingAndQuoteCharAndDelimiter();
}
save() {
this.dialogRef.close({ ...this.data.mapping, ...this.form.getRawValue() });
}
#getForm(): UntypedFormGroup {
return this._formBuilder.group({
name: [this.data?.mapping?.name, Validators.required],
file: [null, Validators.required],
fileName: [this.data?.mapping?.fileName, Validators.required],
encoding: this.encodingTypeOptions.find(e => e === this.data?.mapping?.encoding) ?? this.encodingTypeOptions[0],
delimiter: [this.data?.mapping?.delimiter ?? ',', Validators.required],
quoteChar: [this.data?.mapping?.quoteChar ?? '"', Validators.required],
});
}
#disableEncodingAndQuoteCharAndDelimiter() {
this.form.get('encoding').disable();
this.form.get('delimiter').disable();
this.form.get('quoteChar').disable();
}
#enableEncodingAndQuoteCharAndDelimiter() {
this.form.get('encoding').enable();
this.form.get('delimiter').enable();
this.form.get('quoteChar').enable();
}
}

View File

@ -0,0 +1,73 @@
<div class="content-container" *ngIf="context$ | async as context">
<iqser-table
(noDataAction)="openAddEditComponentMappingDialog()"
[headerTemplate]="headerTemplate"
[itemSize]="80"
[tableColumnConfigs]="tableColumnConfigs"
[noDataText]="'component-mappings-screen.no-data.title' | translate"
[showNoDataButton]="roles.componentMappings.write && currentUser.isAdmin"
[noDataButtonLabel]="'component-mappings-screen.no-data.action' | translate"
emptyColumnWidth="2fr"
noDataIcon="iqser:csv"
></iqser-table>
</div>
<ng-template #headerTemplate>
<div class="table-header-actions">
<iqser-input-with-action
[(value)]="searchService.searchValue"
[placeholder]="'component-mappings-screen.search' | translate"
></iqser-input-with-action>
<div class="actions">
<iqser-icon-button
(action)="openAddEditComponentMappingDialog()"
*allow="roles.componentMappings.write; if: currentUser.isAdmin"
[label]="'component-mappings-screen.add-new' | translate"
[type]="iconButtonTypes.primary"
icon="iqser:plus"
></iqser-icon-button>
</div>
</div>
</ng-template>
<ng-template #tableItemTemplate let-entity="entity">
<div>
<div class="label cell">
<span>{{ entity.name }}</span>
</div>
<div class="cell">
<span>{{ entity.version }}</span>
</div>
<div class="cell">
<span>{{ entity.numberOfLines }}</span>
</div>
<div class="cell" [matTooltip]="entity.columnLabelsString" [matTooltipPosition]="'above'" [matTooltipClass]="'custom-tooltip'">
<span class="ellipsis">{{ entity.columnLabelsString }}</span>
</div>
<div class="cell">
<div *allow="roles.componentMappings.write; if: currentUser.isAdmin" class="action-buttons">
<iqser-circle-button
(action)="openAddEditComponentMappingDialog(entity)"
[tooltip]="'component-mappings-screen.action.edit' | translate"
icon="iqser:edit"
></iqser-circle-button>
<iqser-circle-button
(action)="downloadMapping(entity)"
[tooltip]="'component-mappings-screen.action.download' | translate"
icon="iqser:download"
></iqser-circle-button>
<iqser-circle-button
(action)="openDeleteComponentMappingDialog(entity)"
[tooltip]="'component-mappings-screen.action.delete' | translate"
icon="iqser:trash"
></iqser-circle-button>
</div>
</div>
</div>
</ng-template>

View File

@ -0,0 +1,11 @@
.ellipsis {
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
::ng-deep .custom-tooltip {
max-width: 300px;
white-space: normal;
word-wrap: break-word;
}

View File

@ -0,0 +1,120 @@
import { AsyncPipe, NgIf } from '@angular/common';
import { Component, OnInit } from '@angular/core';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { InputWithActionComponent } from '@common-ui/inputs/input-with-action/input-with-action.component';
import { getCurrentUser } from '@common-ui/users';
import { getParam } from '@common-ui/utils';
import {
CircleButtonComponent,
IconButtonComponent,
IconButtonTypes,
IqserAllowDirective,
IqserDialog,
IqserListingModule,
ListingComponent,
listingProvidersFactory,
LoadingService,
TableColumnConfig,
} from '@iqser/common-ui';
import { TranslateModule } from '@ngx-translate/core';
import { ComponentMapping, DOSSIER_TEMPLATE_ID, User } from '@red/domain';
import { ComponentMappingsService } from '@services/entity-services/component-mappings.service';
import { defaultColorsTranslations } from '@translations/default-colors-translations';
import { Roles } from '@users/roles';
import { combineLatest, firstValueFrom } from 'rxjs';
import { map, tap } from 'rxjs/operators';
import { AdminDialogService } from '../../services/admin-dialog.service';
import { AddEditComponentMappingDialogComponent } from './add-edit-component-mapping-dialog/add-edit-component-mapping-dialog.component';
import { download } from '@utils/file-download-utils';
import { MatTooltip } from '@angular/material/tooltip';
@Component({
templateUrl: './component-mappings-screen.component.html',
styleUrls: ['./component-mappings-screen.component.scss'],
providers: listingProvidersFactory(ComponentMappingsScreenComponent),
imports: [
AsyncPipe,
NgIf,
CircleButtonComponent,
TranslateModule,
IqserListingModule,
InputWithActionComponent,
IconButtonComponent,
IqserAllowDirective,
MatTooltip,
],
})
export default class ComponentMappingsScreenComponent extends ListingComponent<ComponentMapping> implements OnInit {
readonly #dossierTemplateId = getParam(DOSSIER_TEMPLATE_ID);
protected readonly context$;
protected readonly currentUser = getCurrentUser<User>();
protected readonly translations = defaultColorsTranslations;
protected readonly roles = Roles;
protected readonly iconButtonTypes = IconButtonTypes;
tableColumnConfigs: readonly TableColumnConfig<ComponentMapping>[] = [
{ label: _('component-mappings-screen.table-col-names.name'), sortByKey: 'searchKey' },
{ label: _('component-mappings-screen.table-col-names.version') },
{ label: _('component-mappings-screen.table-col-names.number-of-lines') },
{ label: _('component-mappings-screen.table-col-names.column-labels') },
];
readonly tableHeaderLabel = _('component-mappings-screen.table-header.title');
constructor(
private readonly _loadingService: LoadingService,
private readonly _componentMappingService: ComponentMappingsService,
private readonly _iqserDialog: IqserDialog,
private readonly _dialogService: AdminDialogService,
) {
super();
this.context$ = this.loadData$();
}
loadData$() {
return combineLatest([this._componentMappingService.getComponentMappings(this.#dossierTemplateId)]).pipe(
map(([mappingList]) => mappingList.componentMappingList),
tap(mappings => this.entitiesService.setEntities(mappings)),
);
}
ngOnInit() {
this._loadingService.stop();
}
async openAddEditComponentMappingDialog(mapping?: ComponentMapping) {
const dialog = this._iqserDialog.openDefault(AddEditComponentMappingDialogComponent, {
data: {
dossierTemplateId: this.#dossierTemplateId,
mapping,
},
});
const result = await dialog.result();
if (result) {
this._loadingService.start();
const { id, name, encoding, delimiter, fileName, quoteChar } = result;
const newMapping = { id, name, encoding, delimiter, fileName, quoteChar };
await firstValueFrom(
this._componentMappingService.createUpdateComponentMapping(this.#dossierTemplateId, newMapping, result.file),
);
await firstValueFrom(this.loadData$());
this._loadingService.stop();
}
}
async downloadMapping(entity: ComponentMapping) {
const componentMappingFile = await firstValueFrom(
this._componentMappingService.getComponentMappingFile(this.#dossierTemplateId, entity.id),
);
download(componentMappingFile, entity.fileName);
}
openDeleteComponentMappingDialog(entity: ComponentMapping) {
this._dialogService.openDialog('confirm', null, async confirmation => {
if (confirmation) {
this._loadingService.start();
await firstValueFrom(this._componentMappingService.deleteComponentMapping(this.#dossierTemplateId, entity.id));
await firstValueFrom(this.loadData$());
this._loadingService.stop();
}
});
}
}

View File

@ -1,29 +1,6 @@
<section *ngIf="context$ | async as context">
<div class="page-header">
<redaction-dossier-template-breadcrumbs class="flex-1"></redaction-dossier-template-breadcrumbs>
<div class="flex-1 actions">
<redaction-dossier-template-actions></redaction-dossier-template-actions>
<iqser-circle-button
[routerLink]="['../..']"
[tooltip]="'common.close' | translate"
icon="iqser:close"
tooltipPosition="below"
></iqser-circle-button>
</div>
</div>
<div class="content-inner">
<div class="overlay-shadow"></div>
<redaction-admin-side-nav type="dossierTemplates"></redaction-admin-side-nav>
<div class="content-container">
<iqser-table [itemSize]="80" [tableColumnConfigs]="tableColumnConfigs" emptyColumnWidth="2fr"></iqser-table>
</div>
</div>
</section>
<div class="content-container" *ngIf="context$ | async as context">
<iqser-table [itemSize]="80" [tableColumnConfigs]="tableColumnConfigs" emptyColumnWidth="2fr"></iqser-table>
</div>
<ng-template #tableItemTemplate let-entity="entity">
<div>

View File

@ -1,6 +1,16 @@
import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { getConfig, IListable, ListingComponent, listingProvidersFactory, LoadingService, TableColumnConfig } from '@iqser/common-ui';
import {
CircleButtonComponent,
getConfig,
IListable,
IqserAllowDirective,
IqserListingModule,
ListingComponent,
listingProvidersFactory,
LoadingService,
TableColumnConfig,
} from '@iqser/common-ui';
import { getCurrentUser } from '@iqser/common-ui/lib/users';
import { getParam } from '@iqser/common-ui/lib/utils';
import { DefaultColorTypes, DOSSIER_TEMPLATE_ID, User } from '@red/domain';
@ -10,6 +20,8 @@ import { Roles } from '@users/roles';
import { combineLatest } from 'rxjs';
import { map, tap } from 'rxjs/operators';
import { AdminDialogService } from '../../services/admin-dialog.service';
import { AsyncPipe, NgIf, NgStyle } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core';
interface ListItem extends IListable {
readonly key: string;
@ -21,6 +33,7 @@ interface ListItem extends IListable {
styleUrls: ['./default-colors-screen.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
providers: listingProvidersFactory(DefaultColorsScreenComponent),
imports: [IqserListingModule, NgStyle, CircleButtonComponent, IqserAllowDirective, TranslateModule, AsyncPipe, NgIf],
})
export class DefaultColorsScreenComponent extends ListingComponent<ListItem> implements OnInit {
readonly #dossierTemplateId = getParam(DOSSIER_TEMPLATE_ID);

View File

@ -1,20 +1,40 @@
import { AsyncPipe, NgIf } from '@angular/common';
import { ChangeDetectorRef, Component, computed, OnInit, ViewChild } from '@angular/core';
import { IconButtonTypes, IqserPermissionsService, LoadingService, Toaster } from '@iqser/common-ui';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { RouterHistoryService } from '@services/router-history.service';
import { DigitalSignatureService } from '../../services/digital-signature.service';
import { firstValueFrom } from 'rxjs';
import { AdminDialogService } from '../../services/admin-dialog.service';
import { PkcsSignatureConfigurationComponent } from '../../dialogs/configure-digital-signature-dialog/form/pkcs-signature-configuration/pkcs-signature-configuration.component';
import { KmsSignatureConfigurationComponent } from '../../dialogs/configure-digital-signature-dialog/form/kms-signature-configuration/kms-signature-configuration.component';
import { DigitalSignatureOptions, IKmsDigitalSignatureRequest, IPkcsDigitalSignatureRequest, User } from '@red/domain';
import { Roles } from '@users/roles';
import { EmptyStateComponent } from '@common-ui/empty-state';
import {
IconButtonComponent,
IconButtonTypes,
IqserListingModule,
IqserPermissionsService,
LoadingService,
Toaster,
} from '@iqser/common-ui';
import { getCurrentUser } from '@iqser/common-ui/lib/users';
import { TranslateModule } from '@ngx-translate/core';
import { DigitalSignatureOptions, IKmsDigitalSignatureRequest, IPkcsDigitalSignatureRequest, User } from '@red/domain';
import { RouterHistoryService } from '@services/router-history.service';
import { Roles } from '@users/roles';
import { firstValueFrom } from 'rxjs';
import { KmsSignatureConfigurationComponent } from '../../dialogs/configure-digital-signature-dialog/form/kms-signature-configuration/kms-signature-configuration.component';
import { PkcsSignatureConfigurationComponent } from '../../dialogs/configure-digital-signature-dialog/form/pkcs-signature-configuration/pkcs-signature-configuration.component';
import { AdminDialogService } from '../../services/admin-dialog.service';
import { DigitalSignatureService } from '../../services/digital-signature.service';
@Component({
selector: 'redaction-digital-signature-screen',
templateUrl: './digital-signature-screen.component.html',
styleUrls: ['./digital-signature-screen.component.scss'],
imports: [
IqserListingModule,
EmptyStateComponent,
NgIf,
TranslateModule,
AsyncPipe,
PkcsSignatureConfigurationComponent,
KmsSignatureConfigurationComponent,
IconButtonComponent,
],
})
export class DigitalSignatureScreenComponent implements OnInit {
@ViewChild(PkcsSignatureConfigurationComponent) pkcsSignatureConfigurationComponent: PkcsSignatureConfigurationComponent;

View File

@ -20,7 +20,6 @@ export interface AddEditDossierAttributeDialogData {
@Component({
templateUrl: './add-edit-dossier-attribute-dialog.component.html',
styleUrls: ['./add-edit-dossier-attribute-dialog.component.scss'],
standalone: true,
imports: [
TranslateModule,
ReactiveFormsModule,
@ -91,7 +90,7 @@ export class AddEditDossierAttributeDialogComponent extends BaseDialogComponent
const createOrUpdate = this._dossierAttributesService.createOrUpdate(attribute, this.data.dossierTemplateId);
const result = await createOrUpdate.catch((error: HttpErrorResponse) => {
this._loadingService.stop();
this._toaster.error(_('add-edit-dossier-attribute.error.generic'), { error });
this._toaster.rawError(error.error.message);
return undefined;
});

View File

@ -1,9 +1,14 @@
import { AsyncPipe, NgForOf, NgIf } from '@angular/common';
import { Component, OnInit, TemplateRef, ViewChild } from '@angular/core';
import { MatDialog } from '@angular/material/dialog';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { InputWithActionComponent } from '@common-ui/inputs/input-with-action/input-with-action.component';
import {
CircleButtonComponent,
defaultDialogConfig,
IconButtonComponent,
IconButtonTypes,
IqserListingModule,
ListingComponent,
listingProvidersFactory,
LoadingService,
@ -11,6 +16,7 @@ import {
} from '@iqser/common-ui';
import { getCurrentUser } from '@iqser/common-ui/lib/users';
import { getParam } from '@iqser/common-ui/lib/utils';
import { TranslateModule } from '@ngx-translate/core';
import { DOSSIER_TEMPLATE_ID, DossierAttributeConfig, IDossierAttributeConfig, User } from '@red/domain';
import { DossierAttributesService } from '@services/entity-services/dossier-attributes.service';
import { PermissionsService } from '@services/permissions.service';
@ -20,6 +26,7 @@ import {
AddEditDossierAttributeDialogComponent,
AddEditDossierAttributeDialogData,
} from './add-edit-dossier-attribute-dialog/add-edit-dossier-attribute-dialog.component';
import { TableItemComponent } from './table-item/table-item.component';
@Component({
templateUrl: './dossier-attributes-listing-screen.component.html',
@ -28,8 +35,19 @@ import {
entitiesService: DossierAttributesService,
component: DossierAttributesListingScreenComponent,
}),
imports: [
IqserListingModule,
TranslateModule,
CircleButtonComponent,
AsyncPipe,
NgIf,
InputWithActionComponent,
IconButtonComponent,
NgForOf,
TableItemComponent,
],
})
export class DossierAttributesListingScreenComponent extends ListingComponent<DossierAttributeConfig> implements OnInit {
export default class DossierAttributesListingScreenComponent extends ListingComponent<DossierAttributeConfig> implements OnInit {
readonly #dossierTemplateId = getParam(DOSSIER_TEMPLATE_ID);
readonly iconButtonTypes = IconButtonTypes;
readonly currentUser = getCurrentUser<User>();

View File

@ -1,38 +0,0 @@
import { NgModule } from '@angular/core';
import { DossierAttributesListingScreenComponent } from './dossier-attributes-listing-screen.component';
import { CommonModule } from '@angular/common';
import {
CircleButtonComponent,
IconButtonComponent,
InputWithActionComponent,
IqserHelpModeModule,
IqserListingModule,
IqserRoutes,
} from '@iqser/common-ui';
import { RouterModule } from '@angular/router';
import { TranslateModule } from '@ngx-translate/core';
import { MatTooltipModule } from '@angular/material/tooltip';
import { TableItemComponent } from './table-item/table-item.component';
const routes: IqserRoutes = [
{
path: '',
component: DossierAttributesListingScreenComponent,
},
];
@NgModule({
declarations: [DossierAttributesListingScreenComponent, TableItemComponent],
imports: [
CommonModule,
RouterModule.forChild(routes),
TranslateModule,
CircleButtonComponent,
InputWithActionComponent,
IconButtonComponent,
IqserHelpModeModule,
MatTooltipModule,
IqserListingModule,
],
})
export class DossierAttributesListingModule {}

View File

@ -1,11 +1,16 @@
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { DossierAttributeConfig, IDossierAttributeConfig } from '@red/domain';
import { dossierAttributeTypesTranslations } from '@translations/dossier-attribute-types-translations';
import { MatTooltip } from '@angular/material/tooltip';
import { TranslateModule } from '@ngx-translate/core';
import { CircleButtonComponent } from '@iqser/common-ui';
import { NgIf } from '@angular/common';
@Component({
selector: 'redaction-table-item [attribute] [canEditDossierAttributes]',
templateUrl: './table-item.component.html',
styleUrls: ['./table-item.component.scss'],
imports: [MatTooltip, TranslateModule, CircleButtonComponent, NgIf],
})
export class TableItemComponent {
readonly translations = dossierAttributeTypesTranslations;

View File

@ -47,6 +47,7 @@
<div class="dialog-actions">
<iqser-icon-button
(action)="save()"
[buttonId]="'save-dossier-state'"
[disabled]="disabled"
[label]="'add-edit-dossier-state.save' | translate"
[submit]="true"

View File

@ -1,10 +1,14 @@
import { Component, Inject } from '@angular/core';
import { BaseDialogComponent } from '@iqser/common-ui';
import { Validators } from '@angular/forms';
import { BaseDialogComponent, CircleButtonComponent, IconButtonComponent } from '@iqser/common-ui';
import { ReactiveFormsModule, Validators } from '@angular/forms';
import { IDossierState } from '@red/domain';
import { DossierStatesService } from '@services/entity-services/dossier-states.service';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { TranslateModule } from '@ngx-translate/core';
import { ColorPickerModule } from 'ngx-color-picker';
import { MatIcon } from '@angular/material/icon';
import { NgIf } from '@angular/common';
export interface AddEditDossierStateDialogData {
readonly dossierState?: IDossierState;
@ -14,6 +18,7 @@ export interface AddEditDossierStateDialogData {
@Component({
templateUrl: './add-edit-dossier-state-dialog.component.html',
styleUrls: ['./add-edit-dossier-state-dialog.component.scss'],
imports: [TranslateModule, ReactiveFormsModule, ColorPickerModule, MatIcon, NgIf, IconButtonComponent, CircleButtonComponent],
})
export class AddEditDossierStateDialogComponent extends BaseDialogComponent {
readonly type = this.data.dossierState ? 'edit' : 'create';

Some files were not shown because too many files have changed in this diff Show More