Compare commits

...

528 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
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
Dan Percic
0af6e45868 Merge remote-tracking branch 'origin/master' into RED-9747 2024-08-08 13:57:34 +02:00
Dan Percic
1bbef9eb37 Merge remote-tracking branch 'origin/master' into RED-9747 2024-08-05 17:54:22 +02:00
Nicoleta Panaghiu
35342707f0 RED-9772: delete saved entity log on file overwrite. 2024-08-01 11:55:54 +03:00
Dan Percic
c1fc52223b Merge remote-tracking branch 'origin/master' into RED-9747 2024-07-31 14:32:08 +03:00
Dan Percic
30c1f8628b Merge remote-tracking branch 'origin/master' into RED-9747 2024-07-30 16:21:46 +03:00
Dan Percic
66df5f807c Merge remote-tracking branch 'origin/master' into RED-9747 2024-07-30 10:33:58 +03:00
Dan Percic
f25d134590 Merge remote-tracking branch 'origin/master' into RED-9747 2024-07-29 11:40:49 +03:00
Dan Percic
10fa81e77c Merge remote-tracking branch 'origin/master' into RED-9747 2024-07-26 16:02:19 +03:00
Dan Percic
613a7429b8 RED-9747 add initial ws entity log refresh 2024-07-26 12:25:13 +03:00
720 changed files with 11405 additions and 10939 deletions

View File

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

View File

@ -4,38 +4,60 @@ variables:
PROJECT: red-ui PROJECT: red-ui
DOCKERFILELOCATION: 'docker/$PROJECT/Dockerfile' DOCKERFILELOCATION: 'docker/$PROJECT/Dockerfile'
include: include:
- project: 'gitlab/gitlab' - project: 'gitlab/gitlab'
ref: 'main' ref: 'main'
file: 'ci-templates/docker_build_nexus_v2.yml' file: 'ci-templates/docker_build_nexus_v2.yml'
rules: 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: localazy update:
image: node:20.5 image: node:20.5
cache: cache:
- key: - key:
files: files:
- yarn.lock - yarn.lock
paths: paths:
- .yarn-cache/ - .yarn-cache/
script: script:
- git config user.email "${CI_EMAIL}" # - git config user.email "${CI_EMAIL}"
- git config user.name "${CI_USERNAME}" # - 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 remote add gitlab_origin https://${CI_USERNAME}:${CI_ACCESS_TOKEN}@gitlab.knecon.com/redactmanager/red-ui.git
- cd tools/localazy - git push https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.knecon.com/redactmanager/red-ui.git
- yarn install --cache-folder .yarn-cache - cd tools/localazy
- yarn start - yarn install --cache-folder .yarn-cache
- cd ../.. - yarn start
- git add . - cd ../..
- |- - git add .
CHANGES=$(git status --porcelain | wc -l) - |-
if [ "$CHANGES" -gt "0" ] CHANGES=$(git status --porcelain | wc -l)
then if [ "$CHANGES" -gt "0" ]
git status then
git commit -m "push back localazy update" git status
git push gitlab_origin HEAD:${CI_COMMIT_REF_NAME} git commit -m "push back localazy update"
fi git push gitlab_origin HEAD:${CI_COMMIT_REF_NAME}
rules: # git push https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.knecon.com/redactmanager/red-ui.git
- if: $CI_PIPELINE_SOURCE == "schedule" # git push
fi
rules:
- if: $CI_PIPELINE_SOURCE == "schedule"

View File

@ -50,7 +50,7 @@
{ {
"glob": "**/*", "glob": "**/*",
"input": "node_modules/@pdftron/webviewer/public/", "input": "node_modules/@pdftron/webviewer/public/",
"output": "/assets/wv-resources/10.10.1/" "output": "/assets/wv-resources/11.1.0/"
}, },
{ {
"glob": "**/*", "glob": "**/*",
@ -73,7 +73,7 @@
"stylePreprocessorOptions": { "stylePreprocessorOptions": {
"includePaths": ["./apps/red-ui/src/assets/styles", "./libs/common-ui/src/assets/styles"] "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/auto/auto.cjs"], "scripts": ["node_modules/chart.js/auto/auto.cjs"],
"extractLicenses": false, "extractLicenses": false,
"sourceMap": true, "sourceMap": true,
"optimization": false, "optimization": false,

View File

@ -4,26 +4,27 @@ import { UserPreferenceService } from '@users/user-preference.service';
import { getConfig } from '@iqser/common-ui'; import { getConfig } from '@iqser/common-ui';
import { AppConfig } from '@red/domain'; import { AppConfig } from '@red/domain';
import { NavigationEnd, Router } from '@angular/router'; 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() { export function loadCustomTheme(cssFileName: string) {
const cssFileName = getConfig<AppConfig>().THEME; const head = document.getElementsByTagName('head')[0];
const link = document.createElement('link');
if (cssFileName) { link.id = cssFileName;
const head = document.getElementsByTagName('head')[0]; link.rel = 'stylesheet';
const link = document.createElement('link'); link.type = 'text/css';
link.id = cssFileName; link.href = 'assets/styles/themes/' + cssFileName + '.css';
link.rel = 'stylesheet'; link.media = 'all';
link.type = 'text/css'; head.appendChild(link);
link.href = 'assets/styles/themes/' + cssFileName + '.css';
link.media = 'all';
head.appendChild(link);
}
} }
@Component({ @Component({
selector: 'redaction-root', selector: 'redaction-root',
templateUrl: './app.component.html', templateUrl: './app.component.html',
standalone: false,
}) })
export class AppComponent { export class AppComponent {
constructor( constructor(
@ -34,9 +35,12 @@ export class AppComponent {
userPreferenceService: UserPreferenceService, userPreferenceService: UserPreferenceService,
renderer: Renderer2, renderer: Renderer2,
private readonly _router: Router, 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()); renderer.addClass(document.body, userPreferenceService.getTheme());
loadCustomTheme();
const removeQueryParams = _router.events.pipe( const removeQueryParams = _router.events.pipe(
filter((event): event is NavigationEnd => event instanceof NavigationEnd), filter((event): event is NavigationEnd => event instanceof NavigationEnd),
@ -47,9 +51,25 @@ export class AppComponent {
); );
removeQueryParams.subscribe(); removeQueryParams.subscribe();
if (getConfig().IS_DOCUMINE) { this._tenantsService
document.getElementById('favicon').setAttribute('href', 'assets/icons/documine-logo.ico'); .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() { #removeKeycloakQueryParams() {

View File

@ -1,6 +1,6 @@
import { APP_BASE_HREF, DatePipe as BaseDatePipe } from '@angular/common'; import { APP_BASE_HREF, DatePipe as BaseDatePipe } from '@angular/common';
import { HTTP_INTERCEPTORS } from '@angular/common/http'; 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 { MatDividerModule } from '@angular/material/divider';
import { MatIcon } from '@angular/material/icon'; import { MatIcon } from '@angular/material/icon';
import { MatMenu, MatMenuContent, MatMenuItem, MatMenuTrigger } from '@angular/material/menu'; import { MatMenu, MatMenuContent, MatMenuItem, MatMenuTrigger } from '@angular/material/menu';
@ -117,7 +117,7 @@ export const appModuleFactory = (config: AppConfig) => {
resetTimeoutOnDuplicate: true, resetTimeoutOnDuplicate: true,
}), }),
TenantsModule.forRoot(), TenantsModule.forRoot(),
IqserTranslateModule.forRoot({ pathPrefix: config.BASE_TRANSLATIONS_DIRECTORY || '/assets/i18n/redact/' }), IqserTranslateModule.forRoot({ pathPrefix: config.BASE_TRANSLATIONS_DIRECTORY }),
IqserLoadingModule.forRoot(), IqserLoadingModule.forRoot(),
ServiceWorkerModule.register('ngsw-worker.js', { enabled: environment.production }), ServiceWorkerModule.register('ngsw-worker.js', { enabled: environment.production }),
LoggerModule.forRoot(undefined, { LoggerModule.forRoot(undefined, {
@ -135,20 +135,20 @@ export const appModuleFactory = (config: AppConfig) => {
features: { features: {
ANNOTATIONS: { ANNOTATIONS: {
color: 'aqua', color: 'aqua',
enabled: true, enabled: false,
level: NgxLoggerLevel.DEBUG, level: NgxLoggerLevel.DEBUG,
}, },
FILTERS: { FILTERS: {
enabled: false, enabled: false,
}, },
TENANTS: { TENANTS: {
enabled: true, enabled: false,
}, },
ROUTES: { ROUTES: {
enabled: true, enabled: false,
}, },
PDF: { PDF: {
enabled: true, enabled: false,
}, },
FILE: { FILE: {
enabled: false, enabled: false,
@ -171,6 +171,9 @@ export const appModuleFactory = (config: AppConfig) => {
DOSSIERS_CHANGES: { DOSSIERS_CHANGES: {
enabled: false, enabled: false,
}, },
GUARDS: {
enabled: false,
},
}, },
} as ILoggerConfig, } as ILoggerConfig,
}, },
@ -230,14 +233,10 @@ export const appModuleFactory = (config: AppConfig) => {
provide: ErrorHandler, provide: ErrorHandler,
useClass: GlobalErrorHandler, useClass: GlobalErrorHandler,
}, },
{ provideEnvironmentInitializer(async () => {
provide: ENVIRONMENT_INITIALIZER, const languageService = inject(LanguageService);
multi: true, return languageService.setInitialLanguage();
useValue: async () => { }),
const languageService = inject(LanguageService);
return languageService.setInitialLanguage();
},
},
{ {
provide: MAX_RETRIES_ON_SERVER_ERROR, provide: MAX_RETRIES_ON_SERVER_ERROR,
useFactory: () => config.MAX_RETRIES_ON_SERVER_ERROR, useFactory: () => config.MAX_RETRIES_ON_SERVER_ERROR,
@ -258,6 +257,7 @@ export const appModuleFactory = (config: AppConfig) => {
provide: MAT_TOOLTIP_DEFAULT_OPTIONS, provide: MAT_TOOLTIP_DEFAULT_OPTIONS,
useValue: { useValue: {
disableTooltipInteractivity: true, disableTooltipInteractivity: true,
showDelay: 1,
}, },
}, },
BaseDatePipe, BaseDatePipe,

View File

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

View File

@ -20,6 +20,7 @@ const isSearchScreen: (url: string) => boolean = url => url.includes('/search');
@Component({ @Component({
templateUrl: './base-screen.component.html', templateUrl: './base-screen.component.html',
styleUrls: ['./base-screen.component.scss'], styleUrls: ['./base-screen.component.scss'],
standalone: false,
}) })
export class BaseScreenComponent { export class BaseScreenComponent {
readonly roles = Roles; readonly roles = Roles;

View File

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

View File

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

View File

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

View File

@ -25,6 +25,7 @@ function chronologically(first: string, second: string) {
selector: 'redaction-notifications', selector: 'redaction-notifications',
templateUrl: './notifications.component.html', templateUrl: './notifications.component.html',
styleUrls: ['./notifications.component.scss'], styleUrls: ['./notifications.component.scss'],
standalone: false,
}) })
export class NotificationsComponent { export class NotificationsComponent {
readonly hasUnreadNotifications$: Observable<boolean>; readonly hasUnreadNotifications$: Observable<boolean>;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -20,6 +20,7 @@ interface MenuItem {
selector: 'app-user-menu', selector: 'app-user-menu',
templateUrl: './user-menu.component.html', templateUrl: './user-menu.component.html',
styleUrls: ['./user-menu.component.scss'], styleUrls: ['./user-menu.component.scss'],
standalone: false,
}) })
export class UserMenuComponent { export class UserMenuComponent {
readonly currentUser = getCurrentUser<User>(); 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 { DefaultColorsService } from '@services/entity-services/default-colors.service';
import { WatermarkService } from '@services/entity-services/watermark.service'; import { WatermarkService } from '@services/entity-services/watermark.service';
import { FileAttributesService } from '@services/entity-services/file-attributes.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 { export function templateExistsWhenEnteringAdmin(): CanActivateFn {
return async function (route: ActivatedRouteSnapshot): Promise<boolean> { return async function (route: ActivatedRouteSnapshot): Promise<boolean> {
@ -21,12 +23,14 @@ export function templateExistsWhenEnteringAdmin(): CanActivateFn {
const defaultColorsService = inject(DefaultColorsService); const defaultColorsService = inject(DefaultColorsService);
const watermarksService = inject(WatermarkService); const watermarksService = inject(WatermarkService);
const router = inject(Router); const router = inject(Router);
const rulesService = inject(RulesService);
const isDocumine = getConfig().IS_DOCUMINE; const isDocumine = getConfig().IS_DOCUMINE;
const dossierTemplate = inject(DossierTemplateStatsService).get(dossierTemplateId); const dossierTemplate = inject(DossierTemplateStatsService).get(dossierTemplateId);
await firstValueFrom(fileAttributesService.loadFileAttributesConfig(dossierTemplateId)); await firstValueFrom(fileAttributesService.loadFileAttributesConfig(dossierTemplateId));
await firstValueFrom(dictionaryService.loadDictionaryDataForDossierTemplate(dossierTemplateId)); await firstValueFrom(dictionaryService.loadDictionaryDataForDossierTemplate(dossierTemplateId));
await firstValueFrom(defaultColorsService.loadForDossierTemplate(dossierTemplateId)); await firstValueFrom(defaultColorsService.loadForDossierTemplate(dossierTemplateId));
await firstValueFrom(rulesService.getFor(dossierTemplateId));
if (!isDocumine) { if (!isDocumine) {
await firstValueFrom(watermarksService.loadForDossierTemplate(dossierTemplateId)); await firstValueFrom(watermarksService.loadForDossierTemplate(dossierTemplateId));
} }
@ -50,6 +54,8 @@ export function templateExistsWhenEnteringDossierList(): CanActivateFn {
const dictionaryService = inject(DictionaryService); const dictionaryService = inject(DictionaryService);
const defaultColorsService = inject(DefaultColorsService); const defaultColorsService = inject(DefaultColorsService);
const watermarksService = inject(WatermarkService); const watermarksService = inject(WatermarkService);
const rulesService = inject(RulesService);
const toaster = inject(Toaster);
const isDocumine = getConfig().IS_DOCUMINE; const isDocumine = getConfig().IS_DOCUMINE;
await firstValueFrom(dashboardStatsService.loadForTemplate(dossierTemplateId)); await firstValueFrom(dashboardStatsService.loadForTemplate(dossierTemplateId));
@ -64,6 +70,10 @@ export function templateExistsWhenEnteringDossierList(): CanActivateFn {
await firstValueFrom(fileAttributesService.loadFileAttributesConfig(dossierTemplateId)); await firstValueFrom(fileAttributesService.loadFileAttributesConfig(dossierTemplateId));
await firstValueFrom(dictionaryService.loadDictionaryDataForDossierTemplate(dossierTemplateId)); await firstValueFrom(dictionaryService.loadDictionaryDataForDossierTemplate(dossierTemplateId));
await firstValueFrom(defaultColorsService.loadForDossierTemplate(dossierTemplateId)); await firstValueFrom(defaultColorsService.loadForDossierTemplate(dossierTemplateId));
const rules = await firstValueFrom(rulesService.getFor(dossierTemplateId));
if (rules.timeoutDetected) {
toaster.error(_('dossier-listing.rules.timeoutError'));
}
if (!isDocumine) { if (!isDocumine) {
await firstValueFrom(watermarksService.loadForDossierTemplate(dossierTemplateId)); await firstValueFrom(watermarksService.loadForDossierTemplate(dossierTemplateId));
} }

View File

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

View File

@ -1,6 +1,6 @@
import { AnnotationPermissions } from '@models/file/annotation.permissions'; import { AnnotationPermissions } from '@models/file/annotation.permissions';
import { AnnotationWrapper } from '@models/file/annotation.wrapper'; import { AnnotationWrapper } from '@models/file/annotation.wrapper';
import { Dictionary, LogEntryEngines, SuperTypes } from '@red/domain'; import { Dictionary, SuperTypes } from '@red/domain';
export const canUndo = (annotation: AnnotationWrapper, isApprover: boolean) => !isApprover && annotation.pending; export const canUndo = (annotation: AnnotationWrapper, isApprover: boolean) => !isApprover && annotation.pending;
@ -24,7 +24,7 @@ export const canRemoveOnlyHere = (annotation: AnnotationWrapper, canAddRedaction
(annotation.isRedacted || (annotation.isHint && !annotation.isImage)); (annotation.isRedacted || (annotation.isHint && !annotation.isImage));
export const canRemoveFromDictionary = (annotation: AnnotationWrapper, autoAnalysisDisabled: boolean) => 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)) && (annotation.isRedacted || annotation.isSkipped || annotation.isHint || (annotation.isIgnoredHint && !annotation.isRuleBased)) &&
(autoAnalysisDisabled || !annotation.pending) && (autoAnalysisDisabled || !annotation.pending) &&
annotation.isDictBased; annotation.isDictBased;
@ -69,3 +69,5 @@ export const canEditHint = (annotation: AnnotationWrapper) =>
((annotation.isHint && !annotation.isRuleBased) || annotation.isIgnoredHint) && !annotation.isImage; ((annotation.isHint && !annotation.isRuleBased) || annotation.isIgnoredHint) && !annotation.isImage;
export const canEditImage = (annotation: AnnotationWrapper) => annotation.isImage; export const canEditImage = (annotation: AnnotationWrapper) => annotation.isImage;
export const canRevertChanges = (annotation: AnnotationWrapper) => annotation.hasRedactionChanges;

View File

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

View File

@ -26,6 +26,12 @@ import {
} from '@red/domain'; } from '@red/domain';
import { annotationTypesTranslations } from '@translations/annotation-types-translations'; import { annotationTypesTranslations } from '@translations/annotation-types-translations';
interface AnnotationContent {
translation: string;
params: { [key: string]: string };
untranslatedContent: string;
}
export class AnnotationWrapper implements IListable { export class AnnotationWrapper implements IListable {
id: string; id: string;
superType: SuperType; superType: SuperType;
@ -34,9 +40,9 @@ export class AnnotationWrapper implements IListable {
typeLabel?: string; typeLabel?: string;
color: string; color: string;
numberOfComments = 0; numberOfComments = 0;
firstTopLeftPoint: IPoint; firstBottomLeftPoint: IPoint;
shortContent: string; shortContent: string;
content: string; content: AnnotationContent;
value: string; value: string;
pageNumber: number; pageNumber: number;
dictionaryOperation = false; dictionaryOperation = false;
@ -78,7 +84,10 @@ export class AnnotationWrapper implements IListable {
} }
get isRedactedImageHint() { get isRedactedImageHint() {
return this.IMAGE_HINT && this.superType === SuperTypes.Redaction; return (
(this.IMAGE_HINT && this.superType === SuperTypes.Redaction) ||
(this.IMAGE_HINT && this.superType === SuperTypes.ManualRedaction)
);
} }
get isSkippedImageHint() { get isSkippedImageHint() {
@ -103,7 +112,10 @@ export class AnnotationWrapper implements IListable {
get canBeMarkedAsFalsePositive() { get canBeMarkedAsFalsePositive() {
return ( 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.isImage &&
!this.imported && !this.imported &&
!this.pending && !this.pending &&
@ -187,11 +199,11 @@ export class AnnotationWrapper implements IListable {
} }
get x() { get x() {
return this.firstTopLeftPoint.x; return this.firstBottomLeftPoint.x;
} }
get y() { get y() {
return this.firstTopLeftPoint.y; return this.firstBottomLeftPoint.y;
} }
get legalBasis() { get legalBasis() {
@ -216,7 +228,7 @@ export class AnnotationWrapper implements IListable {
annotationWrapper.value = 'Imported'; annotationWrapper.value = 'Imported';
annotationWrapper.color = earmark.hexColor; annotationWrapper.color = earmark.hexColor;
annotationWrapper.positions = earmark.positions; annotationWrapper.positions = earmark.positions;
annotationWrapper.firstTopLeftPoint = earmark.positions[0]?.topLeft; annotationWrapper.firstBottomLeftPoint = earmark.positions[0]?.topLeft;
annotationWrapper.superTypeLabel = annotationTypesTranslations[annotationWrapper.superType]; annotationWrapper.superTypeLabel = annotationTypesTranslations[annotationWrapper.superType];
return annotationWrapper; return annotationWrapper;
@ -237,7 +249,7 @@ export class AnnotationWrapper implements IListable {
annotationWrapper.isChangeLogEntry = logEntry.state === EntryStates.REMOVED || !!changeLogType; annotationWrapper.isChangeLogEntry = logEntry.state === EntryStates.REMOVED || !!changeLogType;
annotationWrapper.type = logEntry.type; annotationWrapper.type = logEntry.type;
annotationWrapper.value = logEntry.value; 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.pageNumber = logEntry.positions[0].pageNumber;
annotationWrapper.positions = logEntry.positions.map(p => ({ annotationWrapper.positions = logEntry.positions.map(p => ({
page: p.pageNumber, page: p.pageNumber,
@ -279,7 +291,7 @@ export class AnnotationWrapper implements IListable {
); );
const content = this.#createContent(annotationWrapper, logEntry, isDocumine); 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; annotationWrapper.content = content;
const lastRelevantManualChange = logEntry.manualChanges?.at(-1); const lastRelevantManualChange = logEntry.manualChanges?.at(-1);
@ -311,44 +323,62 @@ export class AnnotationWrapper implements IListable {
} }
static #createContent(annotationWrapper: AnnotationWrapper, logEntry: IEntityLogEntry, isDocumine: boolean) { static #createContent(annotationWrapper: AnnotationWrapper, logEntry: IEntityLogEntry, isDocumine: boolean) {
let content = ''; let untranslatedContent = '';
const params: { [key: string]: string } = {};
if (logEntry.matchedRule) { 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) { if (logEntry.reason) {
params['hasReason'] = 'true';
if (isDocumine && logEntry.reason.slice(-1) === '.') { if (isDocumine && logEntry.reason.slice(-1) === '.') {
logEntry.reason = logEntry.reason.slice(0, -1); logEntry.reason = logEntry.reason.slice(0, -1);
} }
if (!params['hasRule']) {
content += logEntry.reason + '\n\n'; 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 //remove leading and trailing commas and whitespaces
content = content.replace(/(^[, ]*)|([, ]*$)/g, ''); untranslatedContent = untranslatedContent.replace(/(^[, ]*)|([, ]*$)/g, '');
content = content.substring(0, 1).toUpperCase() + content.substring(1); untranslatedContent = untranslatedContent.substring(0, 1).toUpperCase() + untranslatedContent.substring(1);
} }
if (annotationWrapper.legalBasis && !isDocumine) { 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) { if (annotationWrapper.hasBeenRemovedByManualOverride) {
content += 'Removed by manual override'; params['hasOverride'] = 'true';
untranslatedContent += 'Removed by manual override';
} }
if (logEntry.section) { if (logEntry.section) {
params['hasSection'] = 'true';
params['sectionSymbol'] = isDocumine ? '' : ':';
params['shouldLower'] = untranslatedContent.length.toString();
params['section'] = logEntry.section;
let prefix = `In section${isDocumine ? '' : ':'} `; let prefix = `In section${isDocumine ? '' : ':'} `;
if (content.length) { if (untranslatedContent.length) {
prefix = ` ${prefix.toLowerCase()}`; 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[]) { static #getShortContent(annotationWrapper: AnnotationWrapper, legalBasisList: ILegalBasis[]) {
if (annotationWrapper.legalBasis) { 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) { if (lb) {
return lb.name; return lb.name;
} }

View File

@ -21,7 +21,6 @@ interface NavItem {
templateUrl: './account-side-nav.component.html', templateUrl: './account-side-nav.component.html',
styleUrls: ['./account-side-nav.component.scss'], styleUrls: ['./account-side-nav.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [SideNavComponent, TranslateModule, NgForOf, NgIf, RouterLinkActive, RouterLink], imports: [SideNavComponent, TranslateModule, NgForOf, NgIf, RouterLinkActive, RouterLink],
}) })
export class AccountSideNavComponent { export class AccountSideNavComponent {

View File

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

View File

@ -1,7 +1,7 @@
import { ChangeDetectionStrategy, Component, OnInit, ViewContainerRef } from '@angular/core'; import { ChangeDetectionStrategy, Component, OnInit, ViewContainerRef } from '@angular/core';
import { Router, RouterOutlet } from '@angular/router'; import { Router, RouterOutlet } from '@angular/router';
import { accountTranslations } from '@translations/account-translations'; import { accountTranslations } from '@translations/account-translations';
import { NgClass, NgIf } from '@angular/common'; import { NgClass } from '@angular/common';
import { AccountSideNavComponent } from '../account-side-nav/account-side-nav.component'; import { AccountSideNavComponent } from '../account-side-nav/account-side-nav.component';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
@ -10,8 +10,7 @@ import { TranslateModule } from '@ngx-translate/core';
templateUrl: './base-account-screen-component.html', templateUrl: './base-account-screen-component.html',
styleUrls: ['./base-account-screen-component.scss'], styleUrls: ['./base-account-screen-component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true, imports: [NgClass, RouterOutlet, AccountSideNavComponent, TranslateModule],
imports: [NgClass, NgIf, RouterOutlet, AccountSideNavComponent, TranslateModule],
}) })
export class BaseAccountScreenComponent implements OnInit { export class BaseAccountScreenComponent implements OnInit {
readonly translations = accountTranslations; readonly translations = accountTranslations;

View File

@ -25,7 +25,6 @@ const RSS_EXCLUDED_SETTINGS = ['USER_PROMOTED_TO_APPROVER', 'USER_DEGRADED_TO_RE
templateUrl: './notifications-screen.component.html', templateUrl: './notifications-screen.component.html',
styleUrls: ['./notifications-screen.component.scss'], styleUrls: ['./notifications-screen.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [ReactiveFormsModule, NgForOf, MatSlideToggle, TranslateModule, NgIf, MatCheckbox, IconButtonComponent], imports: [ReactiveFormsModule, NgForOf, MatSlideToggle, TranslateModule, NgIf, MatCheckbox, IconButtonComponent],
}) })
export class NotificationsScreenComponent extends BaseFormComponent implements OnInit { export class NotificationsScreenComponent extends BaseFormComponent implements OnInit {

View File

@ -41,7 +41,6 @@ interface DefaultOptionsForm {
selector: 'redaction-dialog-defaults', selector: 'redaction-dialog-defaults',
templateUrl: './dialog-defaults.component.html', templateUrl: './dialog-defaults.component.html',
styleUrl: './dialog-defaults.component.scss', styleUrl: './dialog-defaults.component.scss',
standalone: true,
imports: [ReactiveFormsModule, TranslateModule, MatFormField, MatSelect, MatOption, NgForOf, MatCheckbox, NgIf, IconButtonComponent], imports: [ReactiveFormsModule, TranslateModule, MatFormField, MatSelect, MatOption, NgForOf, MatCheckbox, NgIf, IconButtonComponent],
}) })
export class DialogDefaultsComponent extends BaseFormComponent { export class DialogDefaultsComponent extends BaseFormComponent {

View File

@ -31,6 +31,11 @@
{{ 'preferences-screen.form.help-mode-dialog' | translate }} {{ 'preferences-screen.form.help-mode-dialog' | translate }}
</mat-checkbox> </mat-checkbox>
</div> </div>
<div class="iqser-input-group">
<mat-checkbox color="primary" formControlName="overwriteFileOption">
{{ 'preferences-screen.form.overwrite-file-option' | translate }}
</mat-checkbox>
</div>
</ng-container> </ng-container>
</div> </div>
</div> </div>

View File

@ -1,4 +1,4 @@
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, inject, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, ReactiveFormsModule } from '@angular/forms'; import { FormBuilder, FormGroup, ReactiveFormsModule } from '@angular/forms';
import { ActivatedRoute } from '@angular/router'; import { ActivatedRoute } from '@angular/router';
import { import {
@ -27,6 +27,7 @@ interface PreferencesForm {
// warnings preferences // warnings preferences
loadAllAnnotationsWarning: boolean; loadAllAnnotationsWarning: boolean;
helpModeDialog: boolean; helpModeDialog: boolean;
overwriteFileOption: boolean;
[k: string]: any; [k: string]: any;
} }
@ -43,7 +44,6 @@ const Screens = {
templateUrl: './preferences.component.html', templateUrl: './preferences.component.html',
styleUrls: ['./preferences.component.scss'], styleUrls: ['./preferences.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [ imports: [
DialogDefaultsComponent, DialogDefaultsComponent,
NgClass, NgClass,
@ -57,6 +57,12 @@ const Screens = {
], ],
}) })
export class PreferencesComponent extends BaseFormComponent implements OnInit { 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 form: FormGroup<AsControl<PreferencesForm>>;
readonly currentScreen: Screen; readonly currentScreen: Screen;
readonly screens = Screens; readonly screens = Screens;
@ -65,76 +71,87 @@ export class PreferencesComponent extends BaseFormComponent implements OnInit {
readonly config = getConfig(); readonly config = getConfig();
readonly isIqserDevMode = isIqserDevMode(); readonly isIqserDevMode = isIqserDevMode();
constructor( get #isOverwriteFileOptionActive() {
route: ActivatedRoute, return !(this.#userPreferenceService.getOverwriteFileOption() === 'undefined');
readonly userPreferenceService: UserPreferenceService, }
private readonly _formBuilder: FormBuilder,
private readonly _permissionsService: IqserPermissionsService, constructor(route: ActivatedRoute) {
private readonly _changeRef: ChangeDetectorRef,
private readonly _loadingService: LoadingService,
) {
super(); super();
this.form = this._formBuilder.group({ this.form = this.#formBuilder.group({
// preferences // preferences
autoExpandFiltersOnActions: [this.userPreferenceService.getAutoExpandFiltersOnActions()], autoExpandFiltersOnActions: [this.#userPreferenceService.getAutoExpandFiltersOnActions()],
tableExtractionType: [this.userPreferenceService.getTableExtractionType()], tableExtractionType: [this.#userPreferenceService.getTableExtractionType()],
// warnings preferences // warnings preferences
loadAllAnnotationsWarning: [this.userPreferenceService.getBool(PreferencesKeys.loadAllAnnotationsWarning)], loadAllAnnotationsWarning: [this.#userPreferenceService.getBool(PreferencesKeys.loadAllAnnotationsWarning)],
helpModeDialog: [this.userPreferenceService.getBool(KEYS.helpModeDialog)], helpModeDialog: [this.#userPreferenceService.getBool(KEYS.helpModeDialog)],
overwriteFileOption: [this.#isOverwriteFileOptionActive],
}); });
if (!this._permissionsService.has(Roles.managePreferences)) { if (!this.#permissionsService.has(Roles.managePreferences)) {
this.form.disable(); this.form.disable();
} }
if (!this._permissionsService.has(Roles.getTables)) { if (!this.#permissionsService.has(Roles.getTables)) {
this.form.controls.tableExtractionType.disable(); this.form.controls.tableExtractionType.disable();
} }
if (!this.#isOverwriteFileOptionActive) {
this.form.controls.overwriteFileOption.disable();
}
this.initialFormValue = this.form.getRawValue(); this.initialFormValue = this.form.getRawValue();
this.currentScreen = route.snapshot.data.screen; this.currentScreen = route.snapshot.data.screen;
} }
ngOnInit() { ngOnInit() {
this._loadingService.stop(); this.#loadingService.stop();
} }
async save(): Promise<any> { async save(): Promise<any> {
if (this.form.controls.autoExpandFiltersOnActions.value !== this.userPreferenceService.getAutoExpandFiltersOnActions()) { if (this.form.controls.autoExpandFiltersOnActions.value !== this.#userPreferenceService.getAutoExpandFiltersOnActions()) {
await this.userPreferenceService.toggleAutoExpandFiltersOnActions(); await this.#userPreferenceService.toggleAutoExpandFiltersOnActions();
} }
if (this.form.controls.tableExtractionType.value !== this.userPreferenceService.getTableExtractionType()) { if (this.form.controls.tableExtractionType.value !== this.#userPreferenceService.getTableExtractionType()) {
await this.userPreferenceService.save(PreferencesKeys.tableExtractionType, this.form.controls.tableExtractionType.value); await this.#userPreferenceService.save(PreferencesKeys.tableExtractionType, this.form.controls.tableExtractionType.value);
} }
if ( if (
this.form.controls.loadAllAnnotationsWarning.value !== 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, PreferencesKeys.loadAllAnnotationsWarning,
String(this.form.controls.loadAllAnnotationsWarning.value), String(this.form.controls.loadAllAnnotationsWarning.value),
); );
} }
if (this.form.controls.helpModeDialog.value !== this.userPreferenceService.getBool(KEYS.helpModeDialog)) { if (this.form.controls.helpModeDialog.value !== this.#userPreferenceService.getBool(KEYS.helpModeDialog)) {
await this.userPreferenceService.save(KEYS.helpModeDialog, String(this.form.controls.helpModeDialog.value)); await this.#userPreferenceService.save(KEYS.helpModeDialog, String(this.form.controls.helpModeDialog.value));
} }
await this.userPreferenceService.reload(); if (this.form.controls.overwriteFileOption.enabled && !this.form.controls.overwriteFileOption.value) {
await this.#userPreferenceService.saveOverwriteFileOption('undefined');
}
await this.#userPreferenceService.reload();
this.#patchValues(); this.#patchValues();
this.initialFormValue = this.form.getRawValue(); this.initialFormValue = this.form.getRawValue();
this._changeRef.markForCheck(); this.#changeRef.markForCheck();
} }
#patchValues() { #patchValues() {
this.form.patchValue({ this.form.patchValue({
autoExpandFiltersOnActions: this.userPreferenceService.getAutoExpandFiltersOnActions(), autoExpandFiltersOnActions: this.#userPreferenceService.getAutoExpandFiltersOnActions(),
tableExtractionType: this.userPreferenceService.getTableExtractionType(), tableExtractionType: this.#userPreferenceService.getTableExtractionType(),
loadAllAnnotationsWarning: this.userPreferenceService.getBool(PreferencesKeys.loadAllAnnotationsWarning), loadAllAnnotationsWarning: this.#userPreferenceService.getBool(PreferencesKeys.loadAllAnnotationsWarning),
helpModeDialog: this.userPreferenceService.getBool(KEYS.helpModeDialog), helpModeDialog: this.#userPreferenceService.getBool(KEYS.helpModeDialog),
overwriteFileOption: this.#isOverwriteFileOptionActive,
}); });
if (!this.#isOverwriteFileOptionActive) {
this.form.controls.overwriteFileOption.disable();
}
} }
} }

View File

@ -10,7 +10,6 @@ interface FormType {
@Component({ @Component({
templateUrl: './confirm-password-dialog.component.html', templateUrl: './confirm-password-dialog.component.html',
standalone: true,
imports: [ReactiveFormsModule, IconButtonComponent, TranslateModule, CircleButtonComponent], imports: [ReactiveFormsModule, IconButtonComponent, TranslateModule, CircleButtonComponent],
}) })
export class ConfirmPasswordDialogComponent extends BaseDialogComponent { export class ConfirmPasswordDialogComponent extends BaseDialogComponent {

View File

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

View File

@ -1,5 +1,5 @@
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, computed } from '@angular/core';
import { ReactiveFormsModule, UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms'; import { FormGroup, ReactiveFormsModule, UntypedFormBuilder, Validators } from '@angular/forms';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { import {
BaseFormComponent, BaseFormComponent,
@ -17,23 +17,47 @@ import { UserPreferenceService } from '@users/user-preference.service';
import { UserService } from '@users/user.service'; import { UserService } from '@users/user.service';
import { firstValueFrom } from 'rxjs'; import { firstValueFrom } from 'rxjs';
import { UserProfileDialogService } from '../services/user-profile-dialog.service'; import { UserProfileDialogService } from '../services/user-profile-dialog.service';
import { NgForOf, NgIf } from '@angular/common';
import { MatFormField } from '@angular/material/form-field'; import { MatFormField } from '@angular/material/form-field';
import { MatOption, MatSelect } from '@angular/material/select'; import { MatOption, MatSelect, MatSelectTrigger } from '@angular/material/select';
import { MatSlideToggle } from '@angular/material/slide-toggle'; 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({ @Component({
templateUrl: './user-profile-screen.component.html', templateUrl: './user-profile-screen.component.html',
styleUrls: ['./user-profile-screen.component.scss'], styleUrls: ['./user-profile-screen.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true, imports: [
imports: [ReactiveFormsModule, NgIf, MatFormField, MatSelect, MatOption, NgForOf, TranslateModule, MatSlideToggle, IconButtonComponent], ReactiveFormsModule,
MatFormField,
MatSelect,
MatOption,
TranslateModule,
MatSlideToggle,
IconButtonComponent,
MatSelectTrigger,
],
}) })
export class UserProfileScreenComponent extends BaseFormComponent implements OnInit { export class UserProfileScreenComponent extends BaseFormComponent {
#profileModel: IProfile; readonly form: FormGroup<AsControl<UserProfileForm>> = this.#getForm();
initialFormValue = this.form.getRawValue();
readonly translations = languagesTranslations; readonly translations = languagesTranslations;
readonly devMode = this._userPreferenceService.isIqserDevMode; 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( constructor(
private readonly _userService: UserService, private readonly _userService: UserService,
private readonly _loadingService: LoadingService, private readonly _loadingService: LoadingService,
@ -45,43 +69,29 @@ export class UserProfileScreenComponent extends BaseFormComponent implements OnI
protected readonly _userPreferenceService: UserPreferenceService, protected readonly _userPreferenceService: UserPreferenceService,
private readonly _changeRef: ChangeDetectorRef, private readonly _changeRef: ChangeDetectorRef,
private readonly _toaster: Toaster, private readonly _toaster: Toaster,
private readonly _pdfViewer: PdfViewer,
) { ) {
super(); super();
this._loadingService.start(); if (!this._permissionsService.has(Roles.updateMyProfile)) {
this.form.disable();
}
this._loadingService.stop();
} }
get languageChanged(): boolean { get languageChanged(): boolean {
return this.#profileModel['language'] !== this.form.get('language').value; return this.initialFormValue['language'] !== this.form.controls.language.value;
} }
get themeChanged(): boolean { get themeChanged(): boolean {
return this.#profileModel['darkTheme'] !== this.form.get('darkTheme').value; return this.initialFormValue['darkTheme'] !== this.form.controls.darkTheme.value;
} }
get emailChanged(): boolean { get emailChanged(): boolean {
return this.#profileModel['email'] !== this.form.get('email').value; return this.initialFormValue['email'] !== this.form.controls.email.value;
} }
get profileChanged(): boolean { get profileChanged(): boolean {
const keys = Object.keys(this.form.getRawValue()); return this.profileKeys.some(key => this.initialFormValue[key] !== this.form.get(key).value);
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();
} }
async save(): Promise<void> { async save(): Promise<void> {
@ -106,15 +116,17 @@ export class UserProfileScreenComponent extends BaseFormComponent implements OnI
} }
if (this.languageChanged) { 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) { 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')); this._toaster.success(_('user-profile-screen.update.success'));
} catch (e) { } catch (e) {
this._loadingService.stop(); this._loadingService.stop();
@ -125,35 +137,13 @@ export class UserProfileScreenComponent extends BaseFormComponent implements OnI
await this._userService.createResetPasswordAction(); await this._userService.createResetPasswordAction();
} }
private _getForm(): UntypedFormGroup { #getForm() {
return this._formBuilder.group({ return this._formBuilder.group({
email: ['', [Validators.required, Validators.email]], email: [this._userService.currentUser.email ?? '', [Validators.required, Validators.email]],
firstName: [''], firstName: [this._userService.currentUser.firstName ?? ''],
lastName: [''], lastName: [this._userService.currentUser.lastName ?? ''],
language: [''], language: [this._userPreferenceService.getLanguage()],
darkTheme: [false], 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

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

View File

@ -1,22 +1,24 @@
import { CompositeRouteGuard, IqserPermissionsGuard, IqserRoutes } from '@iqser/common-ui'; import { inject, provideEnvironmentInitializer } from '@angular/core';
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 { PendingChangesGuard } from '@guards/can-deactivate.guard';
import { DefaultColorsScreenComponent } from './screens/default-colors/default-colors-screen.component'; import { templateExistsWhenEnteringAdmin } from '@guards/dossier-template-exists.guard';
import { UserListingScreenComponent } from './screens/user-listing/user-listing-screen.component'; import { DossierTemplatesGuard } from '@guards/dossier-templates.guard';
import { DigitalSignatureScreenComponent } from './screens/digital-signature/digital-signature-screen.component'; import { entityExistsGuard } from '@guards/entity-exists-guard.service';
import { AuditScreenComponent } from './screens/audit/audit-screen.component'; import { PermissionsGuard } from '@guards/permissions-guard';
import { GeneralConfigScreenComponent } from './screens/general-config/general-config-screen.component'; 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 { BaseAdminScreenComponent } from './base-admin-screen/base-admin-screen.component';
import { BaseDossierTemplateScreenComponent } from './base-dossier-templates-screen/base-dossier-template-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 { BaseEntityScreenComponent } from './base-entity-screen/base-entity-screen.component';
import { PermissionsGuard } from '@guards/permissions-guard'; import { AuditScreenComponent } from './screens/audit/audit-screen.component';
import { Roles } from '@users/roles'; import { DefaultColorsScreenComponent } from './screens/default-colors/default-colors-screen.component';
import { IqserAuthGuard } from '@iqser/common-ui/lib/users'; 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 { AdminDialogService } from './services/admin-dialog.service';
import { AuditService } from './services/audit.service'; import { AuditService } from './services/audit.service';
import { DigitalSignatureService } from './services/digital-signature.service'; import { DigitalSignatureService } from './services/digital-signature.service';
@ -78,7 +80,12 @@ const dossierTemplateIdRoutes: IqserRoutes = [
}, },
type: 'ENTITY', type: 'ENTITY',
}, },
providers: [RulesService], providers: [
RulesService,
provideEnvironmentInitializer(() => {
return inject(CopilotService).connectAsync('/api/llm/llm-websocket');
}),
],
}, },
{ {
path: 'component-rules', path: 'component-rules',

View File

@ -5,7 +5,6 @@ import { RouterOutlet } from '@angular/router';
@Component({ @Component({
templateUrl: './base-admin-screen.component.html', templateUrl: './base-admin-screen.component.html',
styleUrls: ['./base-admin-screen.component.scss'], styleUrls: ['./base-admin-screen.component.scss'],
standalone: true,
imports: [AdminSideNavComponent, RouterOutlet], imports: [AdminSideNavComponent, RouterOutlet],
}) })
export class BaseAdminScreenComponent {} export class BaseAdminScreenComponent {}

View File

@ -9,7 +9,6 @@ import { AdminSideNavComponent } from '../shared/components/admin-side-nav/admin
@Component({ @Component({
templateUrl: './base-dossier-template-screen.component.html', templateUrl: './base-dossier-template-screen.component.html',
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [ imports: [
DossierTemplateBreadcrumbsComponent, DossierTemplateBreadcrumbsComponent,
DossierTemplateActionsComponent, DossierTemplateActionsComponent,

View File

@ -18,7 +18,6 @@ import { AdminSideNavComponent } from '../shared/components/admin-side-nav/admin
@Component({ @Component({
templateUrl: './base-entity-screen.component.html', templateUrl: './base-entity-screen.component.html',
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [ imports: [
DossierTemplateBreadcrumbsComponent, DossierTemplateBreadcrumbsComponent,
CircleButtonComponent, CircleButtonComponent,

View File

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

View File

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

View File

@ -16,7 +16,6 @@ export interface CloneTemplateData {
@Component({ @Component({
templateUrl: './add-clone-dossier-template-dialog.component.html', templateUrl: './add-clone-dossier-template-dialog.component.html',
styleUrls: ['./add-clone-dossier-template-dialog.component.scss'], styleUrls: ['./add-clone-dossier-template-dialog.component.scss'],
standalone: true,
imports: [TranslateModule, ReactiveFormsModule, IconButtonComponent, CircleButtonComponent], imports: [TranslateModule, ReactiveFormsModule, IconButtonComponent, CircleButtonComponent],
}) })
export class AddCloneDossierTemplateDialogComponent extends BaseDialogComponent { export class AddCloneDossierTemplateDialogComponent extends BaseDialogComponent {

View File

@ -8,7 +8,6 @@ import { UserDetailsComponent } from './user-details/user-details.component';
@Component({ @Component({
selector: 'redaction-add-edit-user-dialog', selector: 'redaction-add-edit-user-dialog',
templateUrl: './add-edit-user-dialog.component.html', templateUrl: './add-edit-user-dialog.component.html',
standalone: true,
imports: [UserDetailsComponent, ResetPasswordComponent, CircleButtonComponent], imports: [UserDetailsComponent, ResetPasswordComponent, CircleButtonComponent],
}) })
export class AddEditUserDialogComponent extends BaseDialogComponent { export class AddEditUserDialogComponent extends BaseDialogComponent {

View File

@ -10,7 +10,6 @@ import { NamePipe } from '@common-ui/users/name.pipe';
@Component({ @Component({
selector: 'redaction-reset-password', selector: 'redaction-reset-password',
templateUrl: './reset-password.component.html', templateUrl: './reset-password.component.html',
standalone: true,
imports: [TranslateModule, NamePipe, ReactiveFormsModule, IconButtonComponent], imports: [TranslateModule, NamePipe, ReactiveFormsModule, IconButtonComponent],
}) })
export class ResetPasswordComponent { export class ResetPasswordComponent {

View File

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

View File

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

View File

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

View File

@ -19,7 +19,6 @@ interface DialogData {
@Component({ @Component({
templateUrl: './add-entity-dialog.component.html', templateUrl: './add-entity-dialog.component.html',
styleUrls: ['./add-entity-dialog.component.scss'], styleUrls: ['./add-entity-dialog.component.scss'],
standalone: true,
imports: [AddEditEntityComponent, TranslateModule, IconButtonComponent, NgIf, CircleButtonComponent, HelpButtonComponent], imports: [AddEditEntityComponent, TranslateModule, IconButtonComponent, NgIf, CircleButtonComponent, HelpButtonComponent],
}) })
export class AddEntityDialogComponent extends BaseDialogComponent { export class AddEntityDialogComponent extends BaseDialogComponent {

View File

@ -6,9 +6,11 @@
<div class="table-header">Key</div> <div class="table-header">Key</div>
<div class="table-header">Value</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 class="bold">{{ entry.key | humanize }}</div>
<div>{{ entry.value }}</div> <div>
<pre>{{ entry.value | json }}</pre>
</div>
</ng-container> </ng-container>
</div> </div>
</div> </div>

View File

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

View File

@ -20,7 +20,6 @@ const KMS_SIGNATURE_DIALOG_WIDTH = '810px';
@Component({ @Component({
templateUrl: './configure-certificate-dialog.component.html', templateUrl: './configure-certificate-dialog.component.html',
styleUrls: ['./configure-certificate-dialog.component.scss'], styleUrls: ['./configure-certificate-dialog.component.scss'],
standalone: true,
imports: [ imports: [
DetailsRadioComponent, DetailsRadioComponent,
NgIf, NgIf,

View File

@ -13,7 +13,6 @@ import { TranslateModule } from '@ngx-translate/core';
templateUrl: './kms-signature-configuration.component.html', templateUrl: './kms-signature-configuration.component.html',
styleUrls: ['./kms-signature-configuration.component.scss'], styleUrls: ['./kms-signature-configuration.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [UploadFileComponent, ReactiveFormsModule, NgIf, TranslateModule], imports: [UploadFileComponent, ReactiveFormsModule, NgIf, TranslateModule],
}) })
export class KmsSignatureConfigurationComponent extends BaseSignatureConfigurationComponent implements OnInit { export class KmsSignatureConfigurationComponent extends BaseSignatureConfigurationComponent implements OnInit {

View File

@ -14,7 +14,6 @@ import { TranslateModule } from '@ngx-translate/core';
templateUrl: './pkcs-signature-configuration.component.html', templateUrl: './pkcs-signature-configuration.component.html',
styleUrls: ['./pkcs-signature-configuration.component.scss'], styleUrls: ['./pkcs-signature-configuration.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [UploadFileComponent, ReactiveFormsModule, NgIf, TranslateModule], imports: [UploadFileComponent, ReactiveFormsModule, NgIf, TranslateModule],
}) })
export class PkcsSignatureConfigurationComponent extends BaseSignatureConfigurationComponent implements OnInit { export class PkcsSignatureConfigurationComponent extends BaseSignatureConfigurationComponent implements OnInit {

View File

@ -20,7 +20,6 @@ interface IEditColorData {
@Component({ @Component({
templateUrl: './edit-color-dialog.component.html', templateUrl: './edit-color-dialog.component.html',
styleUrls: ['./edit-color-dialog.component.scss'], styleUrls: ['./edit-color-dialog.component.scss'],
standalone: true,
imports: [ReactiveFormsModule, TranslateModule, ColorPickerModule, MatIcon, NgIf, IconButtonComponent, CircleButtonComponent], imports: [ReactiveFormsModule, TranslateModule, ColorPickerModule, MatIcon, NgIf, IconButtonComponent, CircleButtonComponent],
}) })
export class EditColorDialogComponent extends BaseDialogComponent { export class EditColorDialogComponent extends BaseDialogComponent {

View File

@ -9,7 +9,6 @@ import { TranslateModule } from '@ngx-translate/core';
@Component({ @Component({
selector: 'redaction-smtp-auth-dialog', selector: 'redaction-smtp-auth-dialog',
templateUrl: './smtp-auth-dialog.component.html', templateUrl: './smtp-auth-dialog.component.html',
standalone: true,
imports: [ReactiveFormsModule, TranslateModule, IconButtonComponent, CircleButtonComponent, MatDialogClose], imports: [ReactiveFormsModule, TranslateModule, IconButtonComponent, CircleButtonComponent, MatDialogClose],
}) })
export class SmtpAuthDialogComponent extends BaseDialogComponent { export class SmtpAuthDialogComponent extends BaseDialogComponent {

View File

@ -7,7 +7,6 @@ import { TranslateModule } from '@ngx-translate/core';
templateUrl: './upload-dictionary-dialog.component.html', templateUrl: './upload-dictionary-dialog.component.html',
styleUrls: ['./upload-dictionary-dialog.component.scss'], styleUrls: ['./upload-dictionary-dialog.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [IconButtonComponent, TranslateModule], imports: [IconButtonComponent, TranslateModule],
}) })
export class UploadDictionaryDialogComponent { export class UploadDictionaryDialogComponent {

View File

@ -17,7 +17,7 @@ import { RouterHistoryService } from '@services/router-history.service';
import { auditCategoriesTranslations } from '@translations/audit-categories-translations'; import { auditCategoriesTranslations } from '@translations/audit-categories-translations';
import { Roles } from '@users/roles'; import { Roles } from '@users/roles';
import { applyIntervalConstraints } from '@utils/date-inputs-utils'; import { applyIntervalConstraints } from '@utils/date-inputs-utils';
import { Dayjs } from 'dayjs'; import dayjs, { Dayjs } from 'dayjs';
import { firstValueFrom } from 'rxjs'; import { firstValueFrom } from 'rxjs';
import { AdminDialogService } from '../../services/admin-dialog.service'; import { AdminDialogService } from '../../services/admin-dialog.service';
import { AuditService } from '../../services/audit.service'; import { AuditService } from '../../services/audit.service';
@ -36,7 +36,6 @@ const PAGE_SIZE = 50;
templateUrl: './audit-screen.component.html', templateUrl: './audit-screen.component.html',
styleUrls: ['./audit-screen.component.scss'], styleUrls: ['./audit-screen.component.scss'],
providers: listingProvidersFactory(AuditScreenComponent), providers: listingProvidersFactory(AuditScreenComponent),
standalone: true,
imports: [ imports: [
IqserListingModule, IqserListingModule,
TranslateModule, TranslateModule,
@ -139,16 +138,9 @@ export class AuditScreenComponent extends ListingComponent<Audit> implements OnI
const promises = []; const promises = [];
const category = this.form.get('category').value; const category = this.form.get('category').value;
const userId = this.form.get('userId').value; const userId = this.form.get('userId').value;
const from = this.form.get('from').value; const from = this.form.get('from').value ? dayjs(this.form.get('from').value).startOf('day').toISOString() : null;
let to = this.form.get('to').value; const to = this.form.get('to').value ? dayjs(this.form.get('to').value).endOf('day').toISOString() : null;
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 logsRequestBody: IAuditSearchRequest = { const logsRequestBody: IAuditSearchRequest = {
pageSize: PAGE_SIZE, pageSize: PAGE_SIZE,
page: page, page: page,

View File

@ -50,9 +50,11 @@
icon="iqser:trash" icon="iqser:trash"
></iqser-circle-button> ></iqser-circle-button>
} }
@if (selectedComponent?.id === component.id) { <mat-icon
<mat-icon class="arrow-right" svgIcon="red:arrow-right"></mat-icon> [class.not-visible]="selectedComponent?.id !== component.id"
} class="arrow-right"
svgIcon="red:arrow-right"
></mat-icon>
</div> </div>
</div> </div>
</div> </div>

View File

@ -38,6 +38,10 @@
.arrow-right { .arrow-right {
transform: scale(0.7); transform: scale(0.7);
&.not-visible {
visibility: hidden;
}
} }
} }
} }
@ -45,6 +49,8 @@
.content-container { .content-container {
background-color: var(--iqser-grey-6); background-color: var(--iqser-grey-6);
height: 100vh; height: 100vh;
display: flex;
flex-direction: column;
.content-header { .content-header {
display: flex; display: flex;
@ -61,6 +67,7 @@
} }
.content { .content {
flex: 1;
display: flex; display: flex;
gap: 20px; gap: 20px;
overflow: hidden; overflow: hidden;
@ -68,7 +75,8 @@
.components-list { .components-list {
flex: 1; flex: 1;
background-color: var(--iqser-white); background-color: var(--iqser-white);
width: 100%; display: flex;
flex-direction: column;
.header { .header {
height: 30px; height: 30px;

View File

@ -1,12 +1,18 @@
import { Component, OnInit, signal } from '@angular/core'; import { Component, OnInit, signal } from '@angular/core';
import { BaseFormComponent, CircleButtonComponent, IconButtonComponent, listingProvidersFactory, LoadingService } from '@iqser/common-ui'; import {
BaseFormComponent,
CircleButtonComponent,
HasScrollbarDirective,
IconButtonComponent,
listingProvidersFactory,
LoadingService,
} from '@iqser/common-ui';
import { ComponentDefinitionsService } from '@services/entity-services/component-definitions.service'; import { ComponentDefinitionsService } from '@services/entity-services/component-definitions.service';
import { firstValueFrom } from 'rxjs'; import { firstValueFrom } from 'rxjs';
import { getParam } from '@common-ui/utils'; import { getParam } from '@common-ui/utils';
import { DOSSIER_TEMPLATE_ID, IComponentDefinition } from '@red/domain'; import { DOSSIER_TEMPLATE_ID, IComponentDefinition } from '@red/domain';
import { toObservable } from '@angular/core/rxjs-interop'; import { toObservable } from '@angular/core/rxjs-interop';
import { InputWithActionComponent } from '@common-ui/inputs/input-with-action/input-with-action.component'; import { CommonModule } from '@angular/common';
import { CommonModule, NgIf } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { PermissionsService } from '@services/permissions.service'; import { PermissionsService } from '@services/permissions.service';
import { MatIcon } from '@angular/material/icon'; import { MatIcon } from '@angular/material/icon';
@ -18,11 +24,8 @@ import { AdminDialogService } from '../../services/admin-dialog.service';
templateUrl: './component-definitions.component.html', templateUrl: './component-definitions.component.html',
styleUrls: ['./component-definitions.component.scss'], styleUrls: ['./component-definitions.component.scss'],
providers: listingProvidersFactory(ComponentDefinitionsComponent), providers: listingProvidersFactory(ComponentDefinitionsComponent),
standalone: true,
imports: [ imports: [
IconButtonComponent, IconButtonComponent,
InputWithActionComponent,
NgIf,
TranslateModule, TranslateModule,
CommonModule, CommonModule,
MatIcon, MatIcon,
@ -32,6 +35,7 @@ import { AdminDialogService } from '../../services/admin-dialog.service';
FormsModule, FormsModule,
ReactiveFormsModule, ReactiveFormsModule,
CircleButtonComponent, CircleButtonComponent,
HasScrollbarDirective,
], ],
}) })
export default class ComponentDefinitionsComponent extends BaseFormComponent implements OnInit { export default class ComponentDefinitionsComponent extends BaseFormComponent implements OnInit {
@ -103,6 +107,7 @@ export default class ComponentDefinitionsComponent extends BaseFormComponent imp
this._dialogService.openDialog('confirm', null, async () => { this._dialogService.openDialog('confirm', null, async () => {
await firstValueFrom(this._componentDefinitionsService.deleteComponentDefinitions(this.#dossierTemplateId, [componentId])); await firstValueFrom(this._componentDefinitionsService.deleteComponentDefinitions(this.#dossierTemplateId, [componentId]));
await this.#loadData(); await this.#loadData();
this.selectedComponent = null;
}); });
} }

View File

@ -30,7 +30,7 @@
<div <div
class="row" class="row"
[matTooltip]="'add-edit-component-mapping.disabled-file-options' | translate" [matTooltip]="'add-edit-component-mapping.disabled-file-options' | translate"
[matTooltipDisabled]="!disabledFileOptions" [matTooltipDisabled]="!form.get('encoding')?.disabled"
[matTooltipPosition]="'above'" [matTooltipPosition]="'above'"
> >
<div class="iqser-input-group required w-150"> <div class="iqser-input-group required w-150">
@ -40,13 +40,21 @@
formControlName="delimiter" formControlName="delimiter"
name="delimiter" name="delimiter"
type="text" type="text"
[class.disabled-file-options]="disabledFileOptions" />
</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>
<div class="iqser-input-group required w-150"> <div class="iqser-input-group required w-150">
<label translate="add-edit-component-mapping.form.encoding-type"></label> <label translate="add-edit-component-mapping.form.encoding-type"></label>
<mat-form-field [class.disabled-file-options]="disabledFileOptions"> <mat-form-field>
<mat-select formControlName="encoding"> <mat-select formControlName="encoding">
<mat-option *ngFor="let type of encodingTypeOptions" [value]="type"> <mat-option *ngFor="let type of encodingTypeOptions" [value]="type">
{{ translations[type] | translate }} {{ translations[type] | translate }}

View File

@ -18,11 +18,6 @@
font-size: 15px; font-size: 15px;
} }
} }
.disabled-file-options {
opacity: 0.5;
pointer-events: none;
}
} }
.row:last-child { .row:last-child {

View File

@ -7,7 +7,7 @@ import { NgForOf, NgIf } from '@angular/common';
import { MatFormFieldModule } from '@angular/material/form-field'; import { MatFormFieldModule } from '@angular/material/form-field';
import { MatDialogModule } from '@angular/material/dialog'; import { MatDialogModule } from '@angular/material/dialog';
import { MatOption } from '@angular/material/autocomplete'; import { MatOption } from '@angular/material/autocomplete';
import { MatSelect, MatSelectTrigger } from '@angular/material/select'; import { MatSelect } from '@angular/material/select';
import { fileAttributeEncodingTypesTranslations } from '@translations/file-attribute-encoding-types-translations'; import { fileAttributeEncodingTypesTranslations } from '@translations/file-attribute-encoding-types-translations';
import { firstValueFrom } from 'rxjs'; import { firstValueFrom } from 'rxjs';
import { ComponentMappingsService } from '@services/entity-services/component-mappings.service'; import { ComponentMappingsService } from '@services/entity-services/component-mappings.service';
@ -17,19 +17,20 @@ interface DialogData {
dossierTemplateId: string; dossierTemplateId: string;
mapping: IComponentMapping; mapping: IComponentMapping;
} }
interface DialogResult { interface DialogResult {
id: string; id: string;
name: string; name: string;
file: Blob; file: Blob;
encoding: string; encoding: string;
delimiter: string; delimiter: string;
quoteChar: string;
fileName?: string; fileName?: string;
} }
@Component({ @Component({
templateUrl: './add-edit-component-mapping-dialog.component.html', templateUrl: './add-edit-component-mapping-dialog.component.html',
styleUrls: ['./add-edit-component-mapping-dialog.component.scss'], styleUrls: ['./add-edit-component-mapping-dialog.component.scss'],
standalone: true,
imports: [ imports: [
TranslateModule, TranslateModule,
ReactiveFormsModule, ReactiveFormsModule,
@ -39,7 +40,6 @@ interface DialogResult {
CircleButtonComponent, CircleButtonComponent,
MatDialogModule, MatDialogModule,
MatOption, MatOption,
MatSelectTrigger,
MatSelect, MatSelect,
IconButtonComponent, IconButtonComponent,
UploadFileComponent, UploadFileComponent,
@ -52,7 +52,6 @@ export class AddEditComponentMappingDialogComponent
{ {
protected readonly encodingTypeOptions = Object.keys(FileAttributeEncodingTypes); protected readonly encodingTypeOptions = Object.keys(FileAttributeEncodingTypes);
protected readonly translations = fileAttributeEncodingTypesTranslations; protected readonly translations = fileAttributeEncodingTypesTranslations;
#fileChanged = false;
activeFile: File; activeFile: File;
form!: UntypedFormGroup; form!: UntypedFormGroup;
@ -73,13 +72,14 @@ export class AddEditComponentMappingDialogComponent
const file = new Blob([fileContent.body as Blob], { type: 'text/csv' }); const file = new Blob([fileContent.body as Blob], { type: 'text/csv' });
this.form.get('file').setValue(file); this.form.get('file').setValue(file);
this.initialFormValue = this.form.getRawValue(); this.initialFormValue = this.form.getRawValue();
this.#disableEncodingAndQuoteCharAndDelimiter();
} }
} }
changeFile(file: File) { changeFile(file: File) {
this.#fileChanged = true;
this.form.get('file').setValue(file); this.form.get('file').setValue(file);
this.form.get('fileName').setValue(file?.name); this.form.get('fileName').setValue(file?.name);
this.#enableEncodingAndQuoteCharAndDelimiter();
} }
save() { save() {
@ -93,10 +93,19 @@ export class AddEditComponentMappingDialogComponent
fileName: [this.data?.mapping?.fileName, Validators.required], fileName: [this.data?.mapping?.fileName, Validators.required],
encoding: this.encodingTypeOptions.find(e => e === this.data?.mapping?.encoding) ?? this.encodingTypeOptions[0], encoding: this.encodingTypeOptions.find(e => e === this.data?.mapping?.encoding) ?? this.encodingTypeOptions[0],
delimiter: [this.data?.mapping?.delimiter ?? ',', Validators.required], delimiter: [this.data?.mapping?.delimiter ?? ',', Validators.required],
quoteChar: [this.data?.mapping?.quoteChar ?? '"', Validators.required],
}); });
} }
get disabledFileOptions() { #disableEncodingAndQuoteCharAndDelimiter() {
return this.initialFormValue?.file && !this.#fileChanged; 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

@ -1,6 +1,5 @@
import { AsyncPipe, NgIf } from '@angular/common'; import { AsyncPipe, NgIf } from '@angular/common';
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { RouterLink } from '@angular/router';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { InputWithActionComponent } from '@common-ui/inputs/input-with-action/input-with-action.component'; import { InputWithActionComponent } from '@common-ui/inputs/input-with-action/input-with-action.component';
import { getCurrentUser } from '@common-ui/users'; import { getCurrentUser } from '@common-ui/users';
@ -25,9 +24,6 @@ import { Roles } from '@users/roles';
import { combineLatest, firstValueFrom } from 'rxjs'; import { combineLatest, firstValueFrom } from 'rxjs';
import { map, tap } from 'rxjs/operators'; import { map, tap } from 'rxjs/operators';
import { AdminDialogService } from '../../services/admin-dialog.service'; import { AdminDialogService } from '../../services/admin-dialog.service';
import { AdminSideNavComponent } from '../../shared/components/admin-side-nav/admin-side-nav.component';
import { DossierTemplateActionsComponent } from '../../shared/components/dossier-template-actions/dossier-template-actions.component';
import { DossierTemplateBreadcrumbsComponent } from '../../shared/components/dossier-template-breadcrumbs/dossier-template-breadcrumbs.component';
import { AddEditComponentMappingDialogComponent } from './add-edit-component-mapping-dialog/add-edit-component-mapping-dialog.component'; import { AddEditComponentMappingDialogComponent } from './add-edit-component-mapping-dialog/add-edit-component-mapping-dialog.component';
import { download } from '@utils/file-download-utils'; import { download } from '@utils/file-download-utils';
import { MatTooltip } from '@angular/material/tooltip'; import { MatTooltip } from '@angular/material/tooltip';
@ -36,16 +32,11 @@ import { MatTooltip } from '@angular/material/tooltip';
templateUrl: './component-mappings-screen.component.html', templateUrl: './component-mappings-screen.component.html',
styleUrls: ['./component-mappings-screen.component.scss'], styleUrls: ['./component-mappings-screen.component.scss'],
providers: listingProvidersFactory(ComponentMappingsScreenComponent), providers: listingProvidersFactory(ComponentMappingsScreenComponent),
standalone: true,
imports: [ imports: [
DossierTemplateBreadcrumbsComponent,
AsyncPipe, AsyncPipe,
NgIf, NgIf,
DossierTemplateActionsComponent,
CircleButtonComponent, CircleButtonComponent,
TranslateModule, TranslateModule,
RouterLink,
AdminSideNavComponent,
IqserListingModule, IqserListingModule,
InputWithActionComponent, InputWithActionComponent,
IconButtonComponent, IconButtonComponent,
@ -99,8 +90,8 @@ export default class ComponentMappingsScreenComponent extends ListingComponent<C
const result = await dialog.result(); const result = await dialog.result();
if (result) { if (result) {
this._loadingService.start(); this._loadingService.start();
const { id, name, encoding, delimiter, fileName } = result; const { id, name, encoding, delimiter, fileName, quoteChar } = result;
const newMapping = { id, name, encoding, delimiter, fileName }; const newMapping = { id, name, encoding, delimiter, fileName, quoteChar };
await firstValueFrom( await firstValueFrom(
this._componentMappingService.createUpdateComponentMapping(this.#dossierTemplateId, newMapping, result.file), this._componentMappingService.createUpdateComponentMapping(this.#dossierTemplateId, newMapping, result.file),
); );

View File

@ -33,7 +33,6 @@ interface ListItem extends IListable {
styleUrls: ['./default-colors-screen.component.scss'], styleUrls: ['./default-colors-screen.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
providers: listingProvidersFactory(DefaultColorsScreenComponent), providers: listingProvidersFactory(DefaultColorsScreenComponent),
standalone: true,
imports: [IqserListingModule, NgStyle, CircleButtonComponent, IqserAllowDirective, TranslateModule, AsyncPipe, NgIf], imports: [IqserListingModule, NgStyle, CircleButtonComponent, IqserAllowDirective, TranslateModule, AsyncPipe, NgIf],
}) })
export class DefaultColorsScreenComponent extends ListingComponent<ListItem> implements OnInit { export class DefaultColorsScreenComponent extends ListingComponent<ListItem> implements OnInit {

View File

@ -25,7 +25,6 @@ import { DigitalSignatureService } from '../../services/digital-signature.servic
selector: 'redaction-digital-signature-screen', selector: 'redaction-digital-signature-screen',
templateUrl: './digital-signature-screen.component.html', templateUrl: './digital-signature-screen.component.html',
styleUrls: ['./digital-signature-screen.component.scss'], styleUrls: ['./digital-signature-screen.component.scss'],
standalone: true,
imports: [ imports: [
IqserListingModule, IqserListingModule,
EmptyStateComponent, EmptyStateComponent,

View File

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

View File

@ -35,7 +35,6 @@ import { TableItemComponent } from './table-item/table-item.component';
entitiesService: DossierAttributesService, entitiesService: DossierAttributesService,
component: DossierAttributesListingScreenComponent, component: DossierAttributesListingScreenComponent,
}), }),
standalone: true,
imports: [ imports: [
IqserListingModule, IqserListingModule,
TranslateModule, TranslateModule,

View File

@ -10,7 +10,6 @@ import { NgIf } from '@angular/common';
selector: 'redaction-table-item [attribute] [canEditDossierAttributes]', selector: 'redaction-table-item [attribute] [canEditDossierAttributes]',
templateUrl: './table-item.component.html', templateUrl: './table-item.component.html',
styleUrls: ['./table-item.component.scss'], styleUrls: ['./table-item.component.scss'],
standalone: true,
imports: [MatTooltip, TranslateModule, CircleButtonComponent, NgIf], imports: [MatTooltip, TranslateModule, CircleButtonComponent, NgIf],
}) })
export class TableItemComponent { export class TableItemComponent {

View File

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

View File

@ -18,7 +18,6 @@ export interface AddEditDossierStateDialogData {
@Component({ @Component({
templateUrl: './add-edit-dossier-state-dialog.component.html', templateUrl: './add-edit-dossier-state-dialog.component.html',
styleUrls: ['./add-edit-dossier-state-dialog.component.scss'], styleUrls: ['./add-edit-dossier-state-dialog.component.scss'],
standalone: true,
imports: [TranslateModule, ReactiveFormsModule, ColorPickerModule, MatIcon, NgIf, IconButtonComponent, CircleButtonComponent], imports: [TranslateModule, ReactiveFormsModule, ColorPickerModule, MatIcon, NgIf, IconButtonComponent, CircleButtonComponent],
}) })
export class AddEditDossierStateDialogComponent extends BaseDialogComponent { export class AddEditDossierStateDialogComponent extends BaseDialogComponent {

View File

@ -4,12 +4,12 @@
</div> </div>
<div class="dialog-content"> <div class="dialog-content">
<div [innerHTML]="'confirm-delete-dossier-state.warning' | translate : translateArgs" class="heading"></div> <div [innerHTML]="'confirm-delete-dossier-state.warning' | translate: translateArgs" class="heading"></div>
<form *ngIf="data.dossierCount !== 0 && data.otherStates.length > 0" [formGroup]="form" class="mt-16"> <form *ngIf="data.dossierCount !== 0 && data.otherStates.length > 0" [formGroup]="form" class="mt-16">
<div class="iqser-input-group"> <div class="iqser-input-group">
<mat-checkbox color="primary" formControlName="replace"> <mat-checkbox color="primary" formControlName="replace">
{{ 'confirm-delete-dossier-state.question' | translate : { count: data.dossierCount } }} {{ 'confirm-delete-dossier-state.question' | translate: { count: data.dossierCount } }}
</mat-checkbox> </mat-checkbox>
</div> </div>
@ -30,7 +30,12 @@
</div> </div>
<div class="dialog-actions"> <div class="dialog-actions">
<iqser-icon-button (action)="save()" [label]="label | translate" [type]="iconButtonTypes.primary"></iqser-icon-button> <iqser-icon-button
(action)="save()"
[buttonId]="'confirm-delete-dossier-state'"
[label]="label | translate"
[type]="iconButtonTypes.primary"
></iqser-icon-button>
<div [translate]="'confirm-delete-dossier-state.cancel'" class="all-caps-label cancel" mat-dialog-close></div> <div [translate]="'confirm-delete-dossier-state.cancel'" class="all-caps-label cancel" mat-dialog-close></div>
</div> </div>

View File

@ -11,7 +11,7 @@ import { ArchivedDossiersService } from '@services/dossiers/archived-dossiers.se
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { MatCheckbox } from '@angular/material/checkbox'; import { MatCheckbox } from '@angular/material/checkbox';
import { MatFormField } from '@angular/material/form-field'; import { MatFormField } from '@angular/material/form-field';
import { MatOption, MatSelect, MatSelectTrigger } from '@angular/material/select'; import { MatOption, MatSelect } from '@angular/material/select';
import { NgForOf, NgIf } from '@angular/common'; import { NgForOf, NgIf } from '@angular/common';
export interface ConfirmDeleteDossierStateDialogData { export interface ConfirmDeleteDossierStateDialogData {
@ -23,13 +23,11 @@ export interface ConfirmDeleteDossierStateDialogData {
@Component({ @Component({
templateUrl: './confirm-delete-dossier-state-dialog.component.html', templateUrl: './confirm-delete-dossier-state-dialog.component.html',
styleUrls: ['./confirm-delete-dossier-state-dialog.component.scss'], styleUrls: ['./confirm-delete-dossier-state-dialog.component.scss'],
standalone: true,
imports: [ imports: [
TranslateModule, TranslateModule,
ReactiveFormsModule, ReactiveFormsModule,
MatCheckbox, MatCheckbox,
MatFormField, MatFormField,
MatSelectTrigger,
MatSelect, MatSelect,
MatOption, MatOption,
NgForOf, NgForOf,

View File

@ -33,7 +33,6 @@ import { DossierStatesTableItemComponent } from '../dossier-states-table-item/do
templateUrl: './dossier-states-listing-screen.component.html', templateUrl: './dossier-states-listing-screen.component.html',
styleUrls: ['./dossier-states-listing-screen.component.scss'], styleUrls: ['./dossier-states-listing-screen.component.scss'],
providers: listingProvidersFactory(DossierStatesListingScreenComponent), providers: listingProvidersFactory(DossierStatesListingScreenComponent),
standalone: true,
imports: [ imports: [
IqserListingModule, IqserListingModule,
DonutChartComponent, DonutChartComponent,

View File

@ -13,18 +13,20 @@
<span class="small-label">{{ state.dossierCount }}</span> <span class="small-label">{{ state.dossierCount }}</span>
</div> </div>
<div class="cell"> <div [id]="'dossier_' + (state.name | snakeCase)" class="cell">
<div *ngIf="permissionsService.canPerformDossierStatesActions()" class="action-buttons"> <div *ngIf="permissionsService.canPerformDossierStatesActions()" class="action-buttons">
<div [attr.help-mode-key]="'edit_delete_dossier_state'"> <div [attr.help-mode-key]="'edit_delete_dossier_state'">
<iqser-circle-button <iqser-circle-button
(action)="openEditStateDialog(state)" (action)="openEditStateDialog(state)"
[tooltip]="'dossier-states-listing.action.edit' | translate" [tooltip]="'dossier-states-listing.action.edit' | translate"
[buttonId]="'dossier-state-edit-button'"
icon="iqser:edit" icon="iqser:edit"
></iqser-circle-button> ></iqser-circle-button>
<iqser-circle-button <iqser-circle-button
(action)="openConfirmDeleteStateDialog(state)" (action)="openConfirmDeleteStateDialog(state)"
[tooltip]="'dossier-states-listing.action.delete' | translate" [tooltip]="'dossier-states-listing.action.delete' | translate"
[buttonId]="'dossier-state-delete-button'"
icon="iqser:trash" icon="iqser:trash"
></iqser-circle-button> ></iqser-circle-button>
</div> </div>

View File

@ -14,13 +14,13 @@ import {
import { MatTooltip } from '@angular/material/tooltip'; import { MatTooltip } from '@angular/material/tooltip';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { NgIf } from '@angular/common'; import { NgIf } from '@angular/common';
import { SnakeCasePipe } from '@common-ui/pipes/snake-case.pipe';
@Component({ @Component({
selector: 'redaction-dossier-states-table-item', selector: 'redaction-dossier-states-table-item',
templateUrl: './dossier-states-table-item.component.html', templateUrl: './dossier-states-table-item.component.html',
styleUrls: ['./dossier-states-table-item.component.scss'], styleUrls: ['./dossier-states-table-item.component.scss'],
standalone: true, imports: [MatTooltip, CircleButtonComponent, TranslateModule, NgIf, SnakeCasePipe],
imports: [MatTooltip, CircleButtonComponent, TranslateModule, NgIf],
}) })
export class DossierStatesTableItemComponent { export class DossierStatesTableItemComponent {
readonly #dialog = inject(MatDialog); readonly #dialog = inject(MatDialog);

View File

@ -33,7 +33,6 @@ import { TableItemComponent } from '../table-item/table-item.component';
entitiesService: DossierTemplatesService, entitiesService: DossierTemplatesService,
component: DossierTemplatesListingScreenComponent, component: DossierTemplatesListingScreenComponent,
}), }),
standalone: true,
imports: [ imports: [
IqserListingModule, IqserListingModule,
TranslateModule, TranslateModule,

View File

@ -17,7 +17,6 @@ import { DatePipe } from '@shared/pipes/date.pipe';
templateUrl: './table-item.component.html', templateUrl: './table-item.component.html',
styleUrls: ['./table-item.component.scss'], styleUrls: ['./table-item.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [MatTooltip, NgIf, AsyncPipe, MatIcon, TranslateModule, DatePipe, DossierTemplateActionsComponent, InitialsAvatarComponent], imports: [MatTooltip, NgIf, AsyncPipe, MatIcon, TranslateModule, DatePipe, DossierTemplateActionsComponent, InitialsAvatarComponent],
}) })
export class TableItemComponent implements OnChanges { export class TableItemComponent implements OnChanges {

View File

@ -87,6 +87,7 @@
[routerLink]="dict.routerLink" [routerLink]="dict.routerLink"
[tooltip]="'entities-listing.action.edit' | translate" [tooltip]="'entities-listing.action.edit' | translate"
icon="iqser:edit" icon="iqser:edit"
iqserStopPropagation
></iqser-circle-button> ></iqser-circle-button>
</div> </div>
</div> </div>

View File

@ -11,6 +11,7 @@ import {
ListingComponent, ListingComponent,
listingProvidersFactory, listingProvidersFactory,
LoadingService, LoadingService,
StopPropagationDirective,
TableColumnConfig, TableColumnConfig,
} from '@iqser/common-ui'; } from '@iqser/common-ui';
import { getParam } from '@iqser/common-ui/lib/utils'; import { getParam } from '@iqser/common-ui/lib/utils';
@ -29,7 +30,6 @@ import { AdminDialogService } from '../../services/admin-dialog.service';
templateUrl: './entities-listing-screen.component.html', templateUrl: './entities-listing-screen.component.html',
styleUrls: ['./entities-listing-screen.component.scss'], styleUrls: ['./entities-listing-screen.component.scss'],
providers: listingProvidersFactory(EntitiesListingScreenComponent), providers: listingProvidersFactory(EntitiesListingScreenComponent),
standalone: true,
imports: [ imports: [
IqserListingModule, IqserListingModule,
TranslateModule, TranslateModule,
@ -41,6 +41,7 @@ import { AdminDialogService } from '../../services/admin-dialog.service';
AnnotationIconComponent, AnnotationIconComponent,
AsyncPipe, AsyncPipe,
RouterLink, RouterLink,
StopPropagationDirective,
], ],
}) })
export class EntitiesListingScreenComponent extends ListingComponent<Dictionary> implements OnInit { export class EntitiesListingScreenComponent extends ListingComponent<Dictionary> implements OnInit {

View File

@ -16,7 +16,6 @@ import { AsyncPipe } from '@angular/common';
templateUrl: './dictionary-screen.component.html', templateUrl: './dictionary-screen.component.html',
styleUrls: ['./dictionary-screen.component.scss'], styleUrls: ['./dictionary-screen.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [AsyncPipe, DictionaryManagerComponent], imports: [AsyncPipe, DictionaryManagerComponent],
}) })
export class DictionaryScreenComponent implements OnInit { export class DictionaryScreenComponent implements OnInit {

View File

@ -1,6 +1,6 @@
import { ChangeDetectionStrategy, Component, HostListener, ViewChild } from '@angular/core'; import { ChangeDetectionStrategy, Component, HostListener, ViewChild } from '@angular/core';
import { ActivatedRoute } from '@angular/router'; import { ActivatedRoute } from '@angular/router';
import { getConfig, HasScrollbarDirective, HelpButtonComponent, IconButtonComponent, IconButtonTypes } from '@iqser/common-ui'; import { getConfig, HasScrollbarDirective, IconButtonComponent, IconButtonTypes } from '@iqser/common-ui';
import { IqserEventTarget } from '@iqser/common-ui/lib/utils'; import { IqserEventTarget } from '@iqser/common-ui/lib/utils';
import { Dictionary, DOSSIER_TEMPLATE_ID, ENTITY_TYPE } from '@red/domain'; import { Dictionary, DOSSIER_TEMPLATE_ID, ENTITY_TYPE } from '@red/domain';
import { DictionariesMapService } from '@services/entity-services/dictionaries-map.service'; import { DictionariesMapService } from '@services/entity-services/dictionaries-map.service';
@ -17,17 +17,7 @@ import { TranslateModule } from '@ngx-translate/core';
templateUrl: './entity-info.component.html', templateUrl: './entity-info.component.html',
styleUrls: ['./entity-info.component.scss'], styleUrls: ['./entity-info.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true, imports: [HasScrollbarDirective, MatIcon, NgIf, TranslateModule, AsyncPipe, IconButtonComponent, AddEditEntityComponent],
imports: [
HasScrollbarDirective,
MatIcon,
NgIf,
TranslateModule,
AsyncPipe,
IconButtonComponent,
AddEditEntityComponent,
HelpButtonComponent,
],
}) })
export class EntityInfoComponent { export class EntityInfoComponent {
@ViewChild(AddEditEntityComponent) private readonly _addEditEntityComponent: AddEditEntityComponent; @ViewChild(AddEditEntityComponent) private readonly _addEditEntityComponent: AddEditEntityComponent;

View File

@ -22,7 +22,6 @@ export interface AddEditFileAttributeDialogData {
@Component({ @Component({
templateUrl: './add-edit-file-attribute-dialog.component.html', templateUrl: './add-edit-file-attribute-dialog.component.html',
styleUrls: ['./add-edit-file-attribute-dialog.component.scss'], styleUrls: ['./add-edit-file-attribute-dialog.component.scss'],
standalone: true,
imports: [ imports: [
ReactiveFormsModule, ReactiveFormsModule,
TranslateModule, TranslateModule,

View File

@ -13,7 +13,6 @@ import { MatSlideToggleModule } from '@angular/material/slide-toggle';
@Component({ @Component({
templateUrl: './file-attributes-configurations-dialog.component.html', templateUrl: './file-attributes-configurations-dialog.component.html',
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [ imports: [
ReactiveFormsModule, ReactiveFormsModule,
MatSlideToggleModule, MatSlideToggleModule,
@ -58,6 +57,7 @@ export class FileAttributesConfigurationsDialogComponent extends BaseDialogCompo
if (supportCsvMapping) { if (supportCsvMapping) {
return { return {
...this.#configuration, ...this.#configuration,
keyColumn: this.form.get('keyColumn').value,
filenameMappingColumnHeaderName: this.form.get('keyColumn').value, filenameMappingColumnHeaderName: this.form.get('keyColumn').value,
delimiter: this.form.get('delimiter').value, delimiter: this.form.get('delimiter').value,
encoding: this.form.get('encodingType').value, encoding: this.form.get('encodingType').value,
@ -67,13 +67,14 @@ export class FileAttributesConfigurationsDialogComponent extends BaseDialogCompo
return { return {
...this.#configuration, ...this.#configuration,
filenameMappingColumnHeaderName: '', filenameMappingColumnHeaderName: '',
keyColumn: this.form.get('keyColumn').value,
}; };
} }
#getForm() { #getForm() {
return this._formBuilder.group({ return this._formBuilder.group({
supportCsvMapping: [!!this.#configuration.filenameMappingColumnHeaderName], supportCsvMapping: [!!this.#configuration.filenameMappingColumnHeaderName],
keyColumn: [this.#configuration.filenameMappingColumnHeaderName || '', [Validators.required]], keyColumn: [this.#configuration.filenameMappingColumnHeaderName || this.#configuration.keyColumn || '', [Validators.required]],
delimiter: [this.#configuration.delimiter || '', [Validators.required]], delimiter: [this.#configuration.delimiter || '', [Validators.required]],
encodingType: [this.#configuration.encoding || FileAttributeEncodingTypes['UTF-8'], [Validators.required]], encodingType: [this.#configuration.encoding || FileAttributeEncodingTypes['UTF-8'], [Validators.required]],
}); });

View File

@ -2,8 +2,8 @@ import { AsyncPipe, NgForOf, NgIf } from '@angular/common';
import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from '@angular/core'; import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from '@angular/core';
import { FormsModule } from '@angular/forms'; import { FormsModule } from '@angular/forms';
import { MatFormField } from '@angular/material/form-field'; import { MatFormField } from '@angular/material/form-field';
import { MatMenu, MatMenuTrigger } from '@angular/material/menu'; import { MatMenu, MatMenuItem, MatMenuTrigger } from '@angular/material/menu';
import { MatOption, MatSelect, MatSelectTrigger } from '@angular/material/select'; import { MatOption, MatSelect } from '@angular/material/select';
import { MatSlideToggle } from '@angular/material/slide-toggle'; import { MatSlideToggle } from '@angular/material/slide-toggle';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { ChevronButtonComponent } from '@common-ui/buttons/chevron-button'; import { ChevronButtonComponent } from '@common-ui/buttons/chevron-button';
@ -19,7 +19,6 @@ import { fileAttributeTypesTranslations } from '@translations/file-attribute-typ
templateUrl: './active-fields-listing.component.html', templateUrl: './active-fields-listing.component.html',
styleUrls: ['./active-fields-listing.component.scss'], styleUrls: ['./active-fields-listing.component.scss'],
providers: listingProvidersFactory(ActiveFieldsListingComponent), providers: listingProvidersFactory(ActiveFieldsListingComponent),
standalone: true,
imports: [ imports: [
IqserListingModule, IqserListingModule,
CircleButtonComponent, CircleButtonComponent,
@ -30,7 +29,6 @@ import { fileAttributeTypesTranslations } from '@translations/file-attribute-typ
MatMenu, MatMenu,
EditableInputComponent, EditableInputComponent,
MatFormField, MatFormField,
MatSelectTrigger,
MatSelect, MatSelect,
MatOption, MatOption,
FormsModule, FormsModule,
@ -38,6 +36,7 @@ import { fileAttributeTypesTranslations } from '@translations/file-attribute-typ
RoundCheckboxComponent, RoundCheckboxComponent,
NgForOf, NgForOf,
NgIf, NgIf,
MatMenuItem,
], ],
}) })
export class ActiveFieldsListingComponent extends ListingComponent<IField> implements OnChanges { export class ActiveFieldsListingComponent extends ListingComponent<IField> implements OnChanges {

View File

@ -4,7 +4,7 @@ import { AbstractControl, ReactiveFormsModule, UntypedFormBuilder, UntypedFormGr
import { MatAutocomplete, MatAutocompleteTrigger, MatOption } from '@angular/material/autocomplete'; import { MatAutocomplete, MatAutocompleteTrigger, MatOption } from '@angular/material/autocomplete';
import { MAT_DIALOG_DATA, MatDialogClose, MatDialogRef } from '@angular/material/dialog'; import { MAT_DIALOG_DATA, MatDialogClose, MatDialogRef } from '@angular/material/dialog';
import { MatFormField } from '@angular/material/form-field'; import { MatFormField } from '@angular/material/form-field';
import { MatSelect, MatSelectTrigger } from '@angular/material/select'; import { MatSelect } from '@angular/material/select';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { InputWithActionComponent } from '@common-ui/inputs/input-with-action/input-with-action.component'; import { InputWithActionComponent } from '@common-ui/inputs/input-with-action/input-with-action.component';
import { import {
@ -38,7 +38,6 @@ export interface IFileAttributesCSVImportData {
styleUrls: ['./file-attributes-csv-import-dialog.component.scss'], styleUrls: ['./file-attributes-csv-import-dialog.component.scss'],
providers: listingProvidersFactory(), providers: listingProvidersFactory(),
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [ imports: [
ReactiveFormsModule, ReactiveFormsModule,
MatFormField, MatFormField,
@ -46,7 +45,6 @@ export interface IFileAttributesCSVImportData {
MatAutocomplete, MatAutocomplete,
AsyncPipe, AsyncPipe,
MatOption, MatOption,
MatSelectTrigger,
MatSelect, MatSelect,
CircleButtonComponent, CircleButtonComponent,
NgIf, NgIf,

View File

@ -46,7 +46,6 @@ import {
templateUrl: './file-attributes-listing-screen.component.html', templateUrl: './file-attributes-listing-screen.component.html',
styleUrls: ['./file-attributes-listing-screen.component.scss'], styleUrls: ['./file-attributes-listing-screen.component.scss'],
providers: listingProvidersFactory(FileAttributesListingScreenComponent), providers: listingProvidersFactory(FileAttributesListingScreenComponent),
standalone: true,
imports: [ imports: [
IqserListingModule, IqserListingModule,
NgForOf, NgForOf,
@ -86,6 +85,7 @@ export default class FileAttributesListingScreenComponent extends ListingCompone
}, },
]; ];
readonly roles = Roles; readonly roles = Roles;
keyColumnValue: string = '';
constructor( constructor(
readonly permissionsService: PermissionsService, readonly permissionsService: PermissionsService,
@ -172,13 +172,13 @@ export default class FileAttributesListingScreenComponent extends ListingCompone
FileAttributesConfigurationsDialogComponent, FileAttributesConfigurationsDialogComponent,
{ {
...defaultDialogConfig, ...defaultDialogConfig,
data: this.#existingConfiguration, data: { ...this.#existingConfiguration, keyColumn: this.keyColumnValue },
}, },
); );
const configuration = await firstValueFrom(ref.afterClosed()); const configuration = await firstValueFrom(ref.afterClosed());
if (configuration) { if (configuration) {
this.keyColumnValue = configuration.keyColumn;
await this.#setConfigAndLoadData(configuration); await this.#setConfigAndLoadData(configuration);
} }
} }

View File

@ -1,6 +1,5 @@
<div class="dialog-header"> <div class="dialog-header">
<div class="heading-l" translate="general-config-screen.general.title"></div> <div class="heading-l" translate="general-config-screen.general.title"></div>
<div translate="general-config-screen.general.subtitle"></div>
</div> </div>
<form (submit)="save()" *ngIf="form" [formGroup]="form"> <form (submit)="save()" *ngIf="form" [formGroup]="form">
<div class="dialog-content"> <div class="dialog-content">

View File

@ -13,7 +13,6 @@ import { MatSlideToggle } from '@angular/material/slide-toggle';
@Component({ @Component({
selector: 'redaction-general-config-form', selector: 'redaction-general-config-form',
templateUrl: './general-config-form.component.html', templateUrl: './general-config-form.component.html',
standalone: true,
imports: [ReactiveFormsModule, TranslateModule, NgIf, MatSlideToggle, IconButtonComponent], imports: [ReactiveFormsModule, TranslateModule, NgIf, MatSlideToggle, IconButtonComponent],
}) })
export class GeneralConfigFormComponent extends BaseFormComponent implements OnInit { export class GeneralConfigFormComponent extends BaseFormComponent implements OnInit {

View File

@ -11,7 +11,12 @@
<div class="dialog mt-24 mb-0"> <div class="dialog mt-24 mb-0">
<redaction-system-preferences-form></redaction-system-preferences-form> <redaction-system-preferences-form></redaction-system-preferences-form>
</div> </div>
<div class="dialog mt-24">
<redaction-smtp-form></redaction-smtp-form> @if (smtpLicenseFeatureEnabled) {
</div> <div class="dialog mt-24">
<redaction-smtp-form></redaction-smtp-form>
</div>
} @else {
<div style="visibility: hidden" class="dialog mt-24"></div>
}
</div> </div>

View File

@ -6,26 +6,29 @@ import { BaseFormComponent, IqserListingModule } from '@iqser/common-ui';
import { SystemPreferencesFormComponent } from './system-preferences-form/system-preferences-form.component'; import { SystemPreferencesFormComponent } from './system-preferences-form/system-preferences-form.component';
import { RouterHistoryService } from '@services/router-history.service'; import { RouterHistoryService } from '@services/router-history.service';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { LicenseService } from '@services/license.service';
import { ILicenseFeature } from '@red/domain';
@Component({ @Component({
selector: 'redaction-general-config-screen', selector: 'redaction-general-config-screen',
templateUrl: './general-config-screen.component.html', templateUrl: './general-config-screen.component.html',
styleUrls: ['./general-config-screen.component.scss'], styleUrls: ['./general-config-screen.component.scss'],
standalone: true,
imports: [IqserListingModule, GeneralConfigFormComponent, SystemPreferencesFormComponent, SmtpFormComponent, TranslateModule], imports: [IqserListingModule, GeneralConfigFormComponent, SystemPreferencesFormComponent, SmtpFormComponent, TranslateModule],
}) })
export class GeneralConfigScreenComponent extends BaseFormComponent implements AfterViewInit { export class GeneralConfigScreenComponent extends BaseFormComponent implements AfterViewInit {
readonly currentUser = inject(UserService).currentUser; readonly currentUser = inject(UserService).currentUser;
readonly routerHistoryService = inject(RouterHistoryService); readonly routerHistoryService = inject(RouterHistoryService);
readonly licenseService = inject(LicenseService);
@ViewChild(GeneralConfigFormComponent) generalConfigFormComponent: GeneralConfigFormComponent; @ViewChild(GeneralConfigFormComponent) generalConfigFormComponent: GeneralConfigFormComponent;
@ViewChild(SystemPreferencesFormComponent) systemPreferencesFormComponent: SystemPreferencesFormComponent; @ViewChild(SystemPreferencesFormComponent) systemPreferencesFormComponent: SystemPreferencesFormComponent;
@ViewChild(SmtpFormComponent) smtpFormComponent: SmtpFormComponent; @ViewChild(SmtpFormComponent) smtpFormComponent: SmtpFormComponent;
children: BaseFormComponent[]; children: BaseFormComponent[];
smtpLicenseFeatureEnabled: boolean;
get changed(): boolean { get changed(): boolean {
for (const child of this.children) { for (const child of this.children) {
if (child.changed) { if (child?.changed) {
return true; return true;
} }
} }
@ -43,6 +46,8 @@ export class GeneralConfigScreenComponent extends BaseFormComponent implements A
ngAfterViewInit() { ngAfterViewInit() {
this.children = [this.generalConfigFormComponent, this.systemPreferencesFormComponent, this.smtpFormComponent]; this.children = [this.generalConfigFormComponent, this.systemPreferencesFormComponent, this.smtpFormComponent];
let licenseFeature: ILicenseFeature = this.licenseService.getFeature('configurableSMTPServer');
this.smtpLicenseFeatureEnabled = licenseFeature != null && licenseFeature.value === true;
} }
async save(): Promise<void> { async save(): Promise<void> {

View File

@ -21,7 +21,6 @@ import { NgIf } from '@angular/common';
@Component({ @Component({
selector: 'redaction-smtp-form', selector: 'redaction-smtp-form',
templateUrl: './smtp-form.component.html', templateUrl: './smtp-form.component.html',
standalone: true,
imports: [ReactiveFormsModule, TranslateModule, MatSlideToggle, IconButtonComponent, NgIf], imports: [ReactiveFormsModule, TranslateModule, MatSlideToggle, IconButtonComponent, NgIf],
}) })
export class SmtpFormComponent extends BaseFormComponent implements OnInit { export class SmtpFormComponent extends BaseFormComponent implements OnInit {

View File

@ -15,7 +15,6 @@ export type ValueType = 'number' | 'string' | 'boolean';
@Component({ @Component({
selector: 'redaction-system-preferences-form', selector: 'redaction-system-preferences-form',
templateUrl: './system-preferences-form.component.html', templateUrl: './system-preferences-form.component.html',
standalone: true,
imports: [NgIf, ReactiveFormsModule, NgForOf, TranslateModule, MatSlideToggle, IconButtonComponent], imports: [NgIf, ReactiveFormsModule, NgForOf, TranslateModule, MatSlideToggle, IconButtonComponent],
}) })
export class SystemPreferencesFormComponent extends BaseFormComponent { export class SystemPreferencesFormComponent extends BaseFormComponent {

View File

@ -34,6 +34,20 @@
<span [innerHTML]="'dossier-template-info-screen.created-on' | translate: { date: createdOn }"></span> <span [innerHTML]="'dossier-template-info-screen.created-on' | translate: { date: createdOn }"></span>
</div> </div>
<div *ngIf="areRulesLocked()">
<mat-icon
(click)="resetRules()"
[matTooltip]="
currentUser.isAdmin
? ('dossier-template-info-screen.rules-reset.tooltip' | translate)
: ('dossier-template-info-screen.rules-reset.disabled-action' | translate)
"
[class.action-icon]="currentUser.isAdmin"
svgIcon="iqser:alert-circle"
></mat-icon>
<span class="error">{{ 'dossier-template-info-screen.rules-reset.label' | translate }}</span>
</div>
<div> <div>
<mat-icon svgIcon="red:entries"></mat-icon> <mat-icon svgIcon="red:entries"></mat-icon>
{{ 'dossier-template-info-screen.entries' | translate: { count: ctx.stats.numberOfEntries } }} {{ 'dossier-template-info-screen.entries' | translate: { count: ctx.stats.numberOfEntries } }}

View File

@ -18,3 +18,11 @@
padding-right: 24px; padding-right: 24px;
margin-right: 24px; margin-right: 24px;
} }
.error {
color: var(--iqser-primary);
}
.action-icon {
cursor: pointer;
}

View File

@ -1,4 +1,4 @@
import { Component, Input, OnInit } from '@angular/core'; import { Component, computed, Input, OnInit } from '@angular/core';
import { ContextComponent } from '@iqser/common-ui/lib/utils'; import { ContextComponent } from '@iqser/common-ui/lib/utils';
import { type DossierTemplate, type DossierTemplateStats } from '@red/domain'; import { type DossierTemplate, type DossierTemplateStats } from '@red/domain';
import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service';
@ -9,6 +9,12 @@ import { MatIcon } from '@angular/material/icon';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { InitialsAvatarComponent } from '@common-ui/users'; import { InitialsAvatarComponent } from '@common-ui/users';
import { DatePipe } from '@shared/pipes/date.pipe'; import { DatePipe } from '@shared/pipes/date.pipe';
import { RulesService } from '../../../services/rules.service';
import { Toaster } from '@iqser/common-ui';
import { MatTooltip } from '@angular/material/tooltip';
import { firstValueFrom } from 'rxjs';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { getCurrentUser } from '@users/user.service';
interface Context { interface Context {
readonly dossierTemplate: DossierTemplate; readonly dossierTemplate: DossierTemplate;
@ -19,17 +25,21 @@ interface Context {
selector: 'redaction-dossier-template-details', selector: 'redaction-dossier-template-details',
templateUrl: './dossier-template-details.component.html', templateUrl: './dossier-template-details.component.html',
styleUrls: ['./dossier-template-details.component.scss'], styleUrls: ['./dossier-template-details.component.scss'],
standalone: true, imports: [NgIf, AsyncPipe, MatIcon, TranslateModule, DatePipe, InitialsAvatarComponent, MatTooltip],
imports: [NgIf, AsyncPipe, MatIcon, TranslateModule, DatePipe, InitialsAvatarComponent],
}) })
export class DossierTemplateDetailsComponent extends ContextComponent<Context> implements OnInit { export class DossierTemplateDetailsComponent extends ContextComponent<Context> implements OnInit {
readonly translations = dossierTemplateStatusTranslations; readonly translations = dossierTemplateStatusTranslations;
@Input({ required: true }) dossierTemplateId: string; @Input({ required: true }) dossierTemplateId: string;
readonly areRulesLocked = computed(() => {
return this._rulesService.currentTemplateRules().timeoutDetected;
});
readonly currentUser = getCurrentUser();
constructor( constructor(
private readonly _dossierTemplatesService: DossierTemplatesService, private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _dossierTemplateStatsService: DossierTemplateStatsService, private readonly _dossierTemplateStatsService: DossierTemplateStatsService,
private readonly _rulesService: RulesService,
private readonly _toaster: Toaster,
) { ) {
super(); super();
} }
@ -40,4 +50,15 @@ export class DossierTemplateDetailsComponent extends ContextComponent<Context> i
stats: this._dossierTemplateStatsService.watch$(this.dossierTemplateId), stats: this._dossierTemplateStatsService.watch$(this.dossierTemplateId),
}); });
} }
async resetRules() {
if (!this.currentUser.isAdmin) return;
try {
await firstValueFrom(this._rulesService.reset(this.dossierTemplateId));
this._toaster.success(_('dossier-template-info-screen.rules-reset.success'));
await firstValueFrom(this._rulesService.getFor(this.dossierTemplateId));
} catch (error) {
this._toaster.rawError(error.error.message);
}
}
} }

View File

@ -22,13 +22,12 @@ import { Observable } from 'rxjs';
import { DossierTemplateDetailsComponent } from '../dossier-template-details/dossier-template-details.component'; import { DossierTemplateDetailsComponent } from '../dossier-template-details/dossier-template-details.component';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { MatCheckbox } from '@angular/material/checkbox'; import { MatCheckbox } from '@angular/material/checkbox';
import { NgIf } from '@angular/common';
import { MatDatepickerModule } from '@angular/material/datepicker'; import { MatDatepickerModule } from '@angular/material/datepicker';
import { MatIcon } from '@angular/material/icon'; import { MatIcon } from '@angular/material/icon';
import { SelectComponent } from '@shared/components/select/select.component'; import { SelectComponent } from '@shared/components/select/select.component';
import { MatSuffix } from '@angular/material/form-field'; import { MatSuffix } from '@angular/material/form-field';
const downloadTypes = ['ORIGINAL', 'PREVIEW', 'DELTA_PREVIEW', 'REDACTED'].map(type => ({ const downloadTypes = ['ORIGINAL', 'PREVIEW', 'OPTIMIZED_PREVIEW', 'DELTA_PREVIEW', 'REDACTED'].map(type => ({
key: type, key: type,
label: downloadTypesTranslations[type], label: downloadTypesTranslations[type],
})); }));
@ -36,14 +35,12 @@ const downloadTypes = ['ORIGINAL', 'PREVIEW', 'DELTA_PREVIEW', 'REDACTED'].map(t
@Component({ @Component({
templateUrl: './dossier-template-info-screen.component.html', templateUrl: './dossier-template-info-screen.component.html',
styleUrls: ['./dossier-template-info-screen.component.scss'], styleUrls: ['./dossier-template-info-screen.component.scss'],
standalone: true,
imports: [ imports: [
HasScrollbarDirective, HasScrollbarDirective,
ReactiveFormsModule, ReactiveFormsModule,
DossierTemplateDetailsComponent, DossierTemplateDetailsComponent,
TranslateModule, TranslateModule,
MatCheckbox, MatCheckbox,
NgIf,
MatDatepickerModule, MatDatepickerModule,
SelectComponent, SelectComponent,
IconButtonComponent, IconButtonComponent,

View File

@ -17,8 +17,17 @@
type="text" type="text"
/> />
</div> </div>
<div class="iqser-input-group">
<label translate="add-edit-entity.form.technical-name"></label>
<div class="technical-name">{{ this.technicalName() || '-' }}</div>
<span
[translateParams]="{ type: data.justification ? 'edit' : 'create' }"
[translate]="'add-edit-entity.form.technical-name-hint'"
class="hint"
></span>
</div>
<div class="iqser-input-group required w-400"> <div class="iqser-input-group w-400">
<label translate="add-edit-justification.form.reason"></label> <label translate="add-edit-justification.form.reason"></label>
<input <input
[placeholder]="'add-edit-justification.form.reason-placeholder' | translate" [placeholder]="'add-edit-justification.form.reason-placeholder' | translate"
@ -28,7 +37,7 @@
/> />
</div> </div>
<div class="iqser-input-group required w-400"> <div class="iqser-input-group w-400">
<label translate="add-edit-justification.form.description"></label> <label translate="add-edit-justification.form.description"></label>
<textarea <textarea
[placeholder]="'add-edit-justification.form.description-placeholder' | translate" [placeholder]="'add-edit-justification.form.description-placeholder' | translate"

View File

@ -1,11 +1,13 @@
import { ChangeDetectionStrategy, Component, Inject } from '@angular/core'; import { ChangeDetectionStrategy, Component, computed, Inject, untracked } from '@angular/core';
import { ReactiveFormsModule, UntypedFormGroup, Validators } from '@angular/forms'; import { ReactiveFormsModule, UntypedFormGroup, Validators } from '@angular/forms';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { Justification } from '@red/domain'; import { Justification } from '@red/domain';
import { JustificationsService } from '@services/entity-services/justifications.service'; import { JustificationsService } from '@services/entity-services/justifications.service';
import { BaseDialogComponent, CircleButtonComponent, IconButtonComponent } from '@iqser/common-ui'; import { BaseDialogComponent, CircleButtonComponent, HasScrollbarDirective, IconButtonComponent } from '@iqser/common-ui';
import { firstValueFrom } from 'rxjs'; import { firstValueFrom } from 'rxjs';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { formControlToSignal } from '@utils/functions';
import { toSignal } from '@angular/core/rxjs-interop';
interface DialogData { interface DialogData {
justification?: Justification; justification?: Justification;
@ -15,10 +17,29 @@ interface DialogData {
@Component({ @Component({
templateUrl: './add-edit-justification-dialog.component.html', templateUrl: './add-edit-justification-dialog.component.html',
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true, imports: [TranslateModule, ReactiveFormsModule, IconButtonComponent, CircleButtonComponent, HasScrollbarDirective],
imports: [TranslateModule, ReactiveFormsModule, IconButtonComponent, CircleButtonComponent],
}) })
export class AddEditJustificationDialogComponent extends BaseDialogComponent { export class AddEditJustificationDialogComponent extends BaseDialogComponent {
readonly form = this.#getForm();
readonly name = formControlToSignal(this.form.controls['name']);
readonly allJustifications = toSignal(this._justificationService.all$);
readonly technicalName = computed(() => {
if (this.data.justification) {
return this.data.justification.technicalName;
}
if (!this.name()) {
return null;
}
let currentTechnicalName = Justification.toTechnicalName(this.name());
const existingTechnicalNames = untracked(this.allJustifications).map(justification => justification.technicalName);
let suffix = 1;
while (existingTechnicalNames.includes(currentTechnicalName)) {
currentTechnicalName =
currentTechnicalName === '_' ? `${currentTechnicalName}${suffix++}` : [currentTechnicalName, suffix++].join('_');
}
return currentTechnicalName;
});
constructor( constructor(
private readonly _justificationService: JustificationsService, private readonly _justificationService: JustificationsService,
protected readonly _dialogRef: MatDialogRef<AddEditJustificationDialogComponent>, protected readonly _dialogRef: MatDialogRef<AddEditJustificationDialogComponent>,
@ -26,7 +47,6 @@ export class AddEditJustificationDialogComponent extends BaseDialogComponent {
) { ) {
super(_dialogRef, !!data.justification); super(_dialogRef, !!data.justification);
this.form = this._getForm();
this.initialFormValue = this.form.getRawValue(); this.initialFormValue = this.form.getRawValue();
} }
@ -34,7 +54,8 @@ export class AddEditJustificationDialogComponent extends BaseDialogComponent {
const dossierTemplateId = this.data.dossierTemplateId; const dossierTemplateId = this.data.dossierTemplateId;
this._loadingService.start(); this._loadingService.start();
try { try {
await firstValueFrom(this._justificationService.createOrUpdate(this.form.getRawValue() as Justification, dossierTemplateId)); const formValue = { ...this.form.getRawValue(), technicalName: this.technicalName() };
await firstValueFrom(this._justificationService.createOrUpdate(formValue as Justification, dossierTemplateId));
await firstValueFrom(this._justificationService.loadAll(dossierTemplateId)); await firstValueFrom(this._justificationService.loadAll(dossierTemplateId));
this._dialogRef.close(true); this._dialogRef.close(true);
} catch (error) { } catch (error) {
@ -43,11 +64,12 @@ export class AddEditJustificationDialogComponent extends BaseDialogComponent {
this._loadingService.stop(); this._loadingService.stop();
} }
private _getForm(): UntypedFormGroup { #getForm(): UntypedFormGroup {
return this._formBuilder.group({ return this._formBuilder.group({
name: [{ value: this.data.justification?.name, disabled: !!this.data.justification }, Validators.required], name: [{ value: this.data.justification?.name, disabled: !!this.data.justification }, Validators.required],
reason: [this.data.justification?.reason, Validators.required], reason: [this.data.justification?.reason],
description: [this.data.justification?.description, Validators.required], description: [this.data.justification?.description],
technicalName: [this.data.justification?.technicalName ?? null],
}); });
} }
} }

View File

@ -33,7 +33,6 @@ import { TranslateModule } from '@ngx-translate/core';
}), }),
JustificationsDialogService, JustificationsDialogService,
], ],
standalone: true,
imports: [IqserListingModule, CircleButtonComponent, NgIf, TableItemComponent, TranslateModule, AsyncPipe, IconButtonComponent], imports: [IqserListingModule, CircleButtonComponent, NgIf, TableItemComponent, TranslateModule, AsyncPipe, IconButtonComponent],
}) })
export default class JustificationsScreenComponent extends ListingComponent<Justification> implements OnInit { export default class JustificationsScreenComponent extends ListingComponent<Justification> implements OnInit {

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