@uxland/primary-shell 5.1.1 → 5.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/dist/index.js +27068 -26701
  2. package/dist/index.js.map +1 -1
  3. package/dist/index.umd.cjs +1637 -1519
  4. package/dist/index.umd.cjs.map +1 -1
  5. package/dist/primary/shell/src/UI/bootstrapper.d.ts +1 -0
  6. package/dist/primary/shell/src/UI/components/bootstrapper.d.ts +1 -0
  7. package/dist/primary/shell/src/UI/components/{shell-header → primaria-shell/shell-header}/shell-header.d.ts +3 -3
  8. package/dist/primary/shell/src/UI/components/primaria-shell/shell-header/template.d.ts +3 -0
  9. package/dist/primary/shell/src/UI/index.d.ts +0 -1
  10. package/dist/primary/shell/src/UI/shared-components/bootstrapper.d.ts +1 -0
  11. package/dist/primary/shell/src/UI/shared-components/index.d.ts +0 -1
  12. package/dist/primary/shell/src/api/api.d.ts +4 -4
  13. package/dist/primary/shell/src/api/ecap-event-manager/ecap-event-manager.test.d.ts +1 -0
  14. package/dist/primary/shell/src/api/notification-service/notification-service-impl.test.d.ts +1 -0
  15. package/dist/primary/shell/src/api/pdf-viewer-manager/constants.d.ts +1 -0
  16. package/dist/primary/shell/src/api/pdf-viewer-manager/handle-views.d.ts +2 -0
  17. package/dist/primary/shell/src/api/pdf-viewer-manager/pdf-viewer-manager.d.ts +2 -4
  18. package/dist/primary/shell/src/api/pdf-viewer-manager/pdf-viewer-manager.test.d.ts +1 -0
  19. package/dist/primary/shell/src/api/region-manager/region-manager.test.d.ts +1 -0
  20. package/dist/primary/shell/src/bootstrapper.d.ts +0 -1
  21. package/dist/primary/shell/src/constants.d.ts +0 -2
  22. package/dist/primary/shell/src/features/bootstrapper.d.ts +2 -2
  23. package/dist/primary/shell/src/features/clinical-monitoring/bootstrapper.d.ts +4 -0
  24. package/dist/primary/shell/src/{UI/components/clinical-monitoring → features/clinical-monitoring/component}/clinical-monitoring.d.ts +3 -0
  25. package/dist/primary/shell/src/features/clinical-monitoring/constants.d.ts +1 -0
  26. package/dist/primary/shell/src/features/clinical-monitoring/handle-views.d.ts +1 -0
  27. package/dist/primary/shell/src/features/exit/bootstrapper.d.ts +4 -2
  28. package/dist/primary/shell/src/features/exit/handler.test.d.ts +1 -0
  29. package/dist/primary/shell/src/features/get-patient-cip/action.d.ts +3 -0
  30. package/dist/primary/shell/src/features/get-user-info/bootstrapper.d.ts +4 -2
  31. package/dist/primary/shell/src/features/get-user-info/handler.d.ts +1 -1
  32. package/dist/primary/shell/src/features/get-user-info/handler.test.d.ts +1 -0
  33. package/dist/primary/shell/src/features/navigate-to-ecap/navigate-without-closing-and-with-cip.d.ts +1 -0
  34. package/dist/primary/shell/src/handle-views.d.ts +1 -2
  35. package/dist/primary/shell/src/internal-plugins/activity-history/utils/get-unique-values-by-prop-path.test.d.ts +1 -0
  36. package/dist/primary/shell/src/internal-plugins/activity-history/utils/normalize-string.d.ts +1 -1
  37. package/dist/primary/shell/src/internal-plugins/activity-history/utils/normalize-string.test.d.ts +1 -0
  38. package/dist/primary/shell/src/internal-plugins/activity-history/utils/prop-contains-string.test.d.ts +1 -0
  39. package/dist/primary/shell/src/locales.d.ts +1 -1
  40. package/package.json +2 -2
  41. package/src/UI/bootstrapper.ts +12 -0
  42. package/src/UI/components/bootstrapper.ts +17 -0
  43. package/src/UI/components/{primaria-error-view → error-view}/component.ts +2 -3
  44. package/src/UI/components/poc-events-ecap/poc-events-ecap.ts +3 -7
  45. package/src/UI/components/primaria-shell/primaria-shell.ts +8 -10
  46. package/src/UI/components/{shell-header → primaria-shell/shell-header}/shell-header.ts +8 -9
  47. package/src/UI/components/{shell-header → primaria-shell/shell-header}/template.ts +4 -4
  48. package/src/UI/components/primaria-shell/template.ts +14 -8
  49. package/src/UI/components/quick-actions-menu/quick-actions-menu.ts +0 -2
  50. package/src/UI/index.ts +0 -1
  51. package/src/UI/shared-components/bootstrapper.ts +12 -0
  52. package/src/UI/shared-components/index.ts +0 -3
  53. package/src/UI/shared-components/primaria-content-switcher/primaria-content-switcher.ts +1 -2
  54. package/src/UI/shared-components/primaria-nav-item/primaria-nav-item.ts +6 -7
  55. package/src/UI/shared-components/primaria-nav-tree-menu/primaria-nav-tree-menu.ts +3 -4
  56. package/src/UI/shared-components/primaria-text-editor/primaria-rich-text-editor.ts +1 -2
  57. package/src/api/api.ts +17 -14
  58. package/src/api/ecap-event-manager/ecap-event-manager.test.ts +48 -0
  59. package/src/api/notification-service/notification-service-impl.test.ts +56 -0
  60. package/src/api/pdf-viewer-manager/constants.ts +1 -0
  61. package/src/api/pdf-viewer-manager/handle-views.ts +32 -0
  62. package/src/api/pdf-viewer-manager/pdf-viewer-manager.test.ts +99 -0
  63. package/src/api/pdf-viewer-manager/pdf-viewer-manager.ts +15 -25
  64. package/src/{UI/components → api/pdf-viewer-manager}/pdf-visor/pdf-selector/pdf-selector.ts +3 -4
  65. package/src/{UI/components → api/pdf-viewer-manager}/pdf-visor/pdf-visor.ts +8 -9
  66. package/src/api/plugin-busy-manager/plugin-busy-list/component.ts +0 -2
  67. package/src/api/plugin-busy-manager/plugin-busy-manager.ts +7 -1
  68. package/src/api/region-manager/region-manager.test.ts +123 -0
  69. package/src/bootstrapper.ts +8 -9
  70. package/src/constants.ts +0 -2
  71. package/src/disposer.ts +2 -2
  72. package/src/features/bootstrapper.ts +14 -8
  73. package/src/features/clinical-monitoring/bootstrapper.ts +39 -0
  74. package/src/features/clinical-monitoring/component/clinical-monitoring.ts +57 -0
  75. package/src/{UI/components/clinical-monitoring → features/clinical-monitoring/component}/styles.css +0 -2
  76. package/src/features/clinical-monitoring/constants.ts +1 -0
  77. package/src/features/clinical-monitoring/handle-views.ts +6 -0
  78. package/src/features/exit/bootstrapper.ts +5 -5
  79. package/src/features/exit/handler.test.ts +103 -0
  80. package/src/features/exit/handler.ts +2 -2
  81. package/src/features/get-patient-cip/action.ts +5 -0
  82. package/src/features/get-user-info/bootstrapper.ts +5 -5
  83. package/src/features/get-user-info/handler.test.ts +60 -0
  84. package/src/features/get-user-info/handler.ts +2 -4
  85. package/src/features/navigate-to-ecap/navigate-without-closing-and-with-cip.ts +7 -0
  86. package/src/handle-plugins.ts +1 -1
  87. package/src/handle-views.ts +91 -133
  88. package/src/internal-plugins/activity-history/activity-history-item/list/UI/main-view/activity-history-main.ts +1 -1
  89. package/src/internal-plugins/activity-history/utils/get-unique-values-by-prop-path.test.ts +61 -0
  90. package/src/internal-plugins/activity-history/utils/get-unique-values-by-prop-path.ts +2 -2
  91. package/src/internal-plugins/activity-history/utils/normalize-string.test.ts +29 -0
  92. package/src/internal-plugins/activity-history/utils/normalize-string.ts +5 -3
  93. package/src/internal-plugins/activity-history/utils/prop-contains-string.test.ts +47 -0
  94. package/src/locales.ts +1 -1
  95. package/dist/primary/shell/src/UI/components/index.d.ts +0 -1
  96. package/dist/primary/shell/src/UI/components/shell-header/template.d.ts +0 -3
  97. package/src/UI/components/clinical-monitoring/clinical-monitoring.ts +0 -28
  98. package/src/UI/components/index.ts +0 -7
  99. /package/dist/primary/shell/src/UI/components/{primaria-error-view → error-view}/component.d.ts +0 -0
  100. /package/dist/primary/shell/src/UI/components/{primaria-error-view → error-view}/template.d.ts +0 -0
  101. /package/dist/primary/shell/src/{UI/components → api/pdf-viewer-manager}/pdf-visor/pdf-selector/pdf-selector.d.ts +0 -0
  102. /package/dist/primary/shell/src/{UI/components → api/pdf-viewer-manager}/pdf-visor/pdf-selector/template.d.ts +0 -0
  103. /package/dist/primary/shell/src/{UI/components → api/pdf-viewer-manager}/pdf-visor/pdf-visor.d.ts +0 -0
  104. /package/dist/primary/shell/src/{UI/components → api/pdf-viewer-manager}/pdf-visor/utils.d.ts +0 -0
  105. /package/dist/primary/shell/src/{UI/components/clinical-monitoring → features/clinical-monitoring/component}/template.d.ts +0 -0
  106. /package/src/UI/components/{primaria-error-view → error-view}/styles.css +0 -0
  107. /package/src/UI/components/{primaria-error-view → error-view}/template.ts +0 -0
  108. /package/src/UI/components/{shell-header → primaria-shell/shell-header}/styles.css +0 -0
  109. /package/src/{UI/components → api/pdf-viewer-manager}/pdf-visor/pdf-selector/styles.css +0 -0
  110. /package/src/{UI/components → api/pdf-viewer-manager}/pdf-visor/pdf-selector/template.ts +0 -0
  111. /package/src/{UI/components → api/pdf-viewer-manager}/pdf-visor/styles.css +0 -0
  112. /package/src/{UI/components → api/pdf-viewer-manager}/pdf-visor/utils.ts +0 -0
  113. /package/src/{UI/components/clinical-monitoring → features/clinical-monitoring/component}/template.ts +0 -0
@@ -1,158 +1,123 @@
1
1
  import { shellApi } from "./api/api";
2
+ import { registerPDFVisorMainView } from "./api/pdf-viewer-manager/handle-views";
2
3
  import { shellRegions } from "./api/region-manager/regions";
3
- import { clinicalMonitoringId, pdfViewerId, pocTestEventsId } from "./constants";
4
- import { shellEvents } from "./events";
4
+ import { pocTestEventsId } from "./constants";
5
5
  import { ExitShell } from "./features/exit/request";
6
- import { ClinicalMonitoring } from "./UI/components/clinical-monitoring/clinical-monitoring";
7
- import { PdfVisor } from "./UI/components/pdf-visor/pdf-visor";
6
+ import { getPatientCip } from "./features/get-patient-cip/action";
7
+ import { navigateToEcapWithoutClosingWithCip } from "./features/navigate-to-ecap/navigate-without-closing-and-with-cip";
8
8
  import { PocEventsEcap } from "./UI/components/poc-events-ecap/poc-events-ecap";
9
9
  import { PrimariaNavItem } from "./UI/shared-components/primaria-nav-item/primaria-nav-item";
10
10
  import { PrimariaNavTreeMenu } from "./UI/shared-components/primaria-nav-tree-menu/primaria-nav-tree-menu";
11
11
 
12
- const getPatientCip = async (): Promise<string> => {
13
- return (await shellApi.broker.send("get_patient_cip")) as string;
14
- };
15
-
16
- const publishEcapNoCloseWithCip = async (eventName: string) => {
17
- const CIP = await getPatientCip();
18
- shellApi.ecapEventManager.publish(eventName, "NO_TANCAR", { CIP });
19
- };
20
-
21
12
  const registerUpperNavMenuViews = () => {
22
13
  shellApi.regionManager.registerView(shellRegions.navigationMenu, {
23
- id: pocTestEventsId,
14
+ id: "landing",
24
15
  factory: () => {
25
16
  const menuItem = new PrimariaNavItem({
26
- icon: "bolt",
27
- label: "Prova Events ECAP",
17
+ icon: "home",
18
+ label: "Pàgina inici",
28
19
  callbackFn: () => {
29
- shellApi.regionManager.activateMainView(pocTestEventsId);
20
+ shellApi.broker.send(new ExitShell());
30
21
  },
31
22
  });
32
23
  return Promise.resolve(menuItem);
33
24
  },
34
25
  sortHint: "000100",
35
26
  });
27
+
36
28
  shellApi.regionManager.registerView(shellRegions.navigationMenu, {
37
- id: "communication",
29
+ id: "processes",
38
30
  factory: () => {
39
31
  const menuItem = new PrimariaNavTreeMenu({
40
- icon: "add_box",
41
- label: "Comunicació",
32
+ icon: "account_tree",
33
+ label: "Vies clíniques",
42
34
  actionMenuItems: [
43
35
  {
44
36
  icon: "open_in_new",
45
- label: "SMS",
46
- callbackFn: async (): Promise<void> => {
47
- const CIP = await getPatientCip();
48
- shellApi.ecapEventManager.publish("MISSATGES_DEV", "NO_TANCAR", {
49
- CIP: CIP || "",
50
- TipusMissatge: "SMS",
51
- });
37
+ label: "ARES",
38
+ callbackFn: async () => {
39
+ navigateToEcapWithoutClosingWithCip("PROCES_ATENCIO");
52
40
  },
53
41
  },
54
42
  {
55
43
  icon: "open_in_new",
56
- label: "Econsulta",
44
+ label: "Procés Obstètric",
57
45
  callbackFn: (): void => {},
58
46
  },
59
47
  {
60
48
  icon: "open_in_new",
61
- label: "Mail",
62
- callbackFn: (): void => {},
49
+ label: "Nen sa",
50
+ callbackFn: async () => {
51
+ navigateToEcapWithoutClosingWithCip("NEN_SA");
52
+ },
63
53
  },
64
54
  {
65
55
  icon: "open_in_new",
66
- label: "Veu IP",
67
- callbackFn: async (): Promise<void> => {
68
- publishEcapNoCloseWithCip("VOIP");
56
+ label: "Odontologia",
57
+ callbackFn: async () => {
58
+ navigateToEcapWithoutClosingWithCip("ODONTOLOGO");
69
59
  },
70
60
  },
71
61
  {
72
62
  icon: "open_in_new",
73
- label: "Videoconsulta",
74
- callbackFn: (): void => {},
63
+ label: "Situació d'especial cura",
64
+ callbackFn: async () => {
65
+ navigateToEcapWithoutClosingWithCip("SIT_ESPEC_CURA_DEV");
66
+ },
75
67
  },
76
68
  ],
77
69
  });
78
70
  return Promise.resolve(menuItem);
79
71
  },
80
- });
81
- shellApi.regionManager.registerView(shellRegions.navigationMenu, {
82
- id: "visits",
83
- factory: () => {
84
- const menuItem = new PrimariaNavItem({
85
- icon: "add_box",
86
- label: "Visites",
87
- callbackFn: async (): Promise<void> => {
88
- publishEcapNoCloseWithCip("CONSULTA_VISITES");
89
- },
90
- });
91
- return Promise.resolve(menuItem);
92
- },
93
- });
94
- shellApi.regionManager.registerView(shellRegions.navigationMenu, {
95
- id: "it",
96
- factory: () => {
97
- const menuItem = new PrimariaNavItem({
98
- icon: "add_box",
99
- label: "IT",
100
- callbackFn: async (): Promise<void> => {
101
- publishEcapNoCloseWithCip("REV_IT");
102
- },
103
- });
104
- return Promise.resolve(menuItem);
105
- },
72
+ sortHint: "000400",
106
73
  });
107
74
  shellApi.regionManager.registerView(shellRegions.navigationMenu, {
108
75
  id: "unique-petition",
109
76
  factory: () => {
110
77
  const menuItem = new PrimariaNavTreeMenu({
111
- icon: "add_box",
112
- label: "Petitori únic",
78
+ icon: "playlist_add",
79
+ label: "Petitori",
113
80
  actionMenuItems: [
114
81
  {
115
82
  icon: "open_in_new",
116
83
  label: "Analítiques",
117
84
  callbackFn: async (): Promise<void> => {
118
- publishEcapNoCloseWithCip("LABORATORI");
85
+ navigateToEcapWithoutClosingWithCip("LABORATORI");
119
86
  },
120
87
  },
121
88
  {
122
89
  icon: "open_in_new",
123
- label: "OC",
90
+ label: "Ordres Clíniques",
124
91
  callbackFn: async (): Promise<void> => {
125
- const CIP = await getPatientCip();
126
- publishEcapNoCloseWithCip("RESULT_OC");
92
+ navigateToEcapWithoutClosingWithCip("RESULT_OC");
127
93
  },
128
94
  },
129
95
  {
130
96
  icon: "open_in_new",
131
97
  label: "OC Exprés",
132
98
  callbackFn: async (): Promise<void> => {
133
- const CIP = await getPatientCip();
134
- publishEcapNoCloseWithCip("OC_EXPRES");
99
+ navigateToEcapWithoutClosingWithCip("OC_EXPRES");
135
100
  },
136
101
  },
137
102
  {
138
103
  icon: "open_in_new",
139
104
  label: "Sol·licitud de trasllat",
140
105
  callbackFn: async (): Promise<void> => {
141
- const CIP = await getPatientCip();
142
- publishEcapNoCloseWithCip("TRANSPORT");
106
+ navigateToEcapWithoutClosingWithCip("TRANSPORT");
143
107
  },
144
108
  },
145
109
  ],
146
110
  });
147
111
  return Promise.resolve(menuItem);
148
112
  },
113
+ sortHint: "000500",
149
114
  });
150
115
  shellApi.regionManager.registerView(shellRegions.navigationMenu, {
151
116
  id: "results-reports",
152
117
  factory: () => {
153
118
  const menuItem = new PrimariaNavTreeMenu({
154
- icon: "add_box",
155
- label: "Resultats i informes",
119
+ icon: "folder",
120
+ label: "Documents",
156
121
  actionMenuItems: [
157
122
  {
158
123
  icon: "open_in_new",
@@ -163,9 +128,8 @@ const registerUpperNavMenuViews = () => {
163
128
  icon: "open_in_new",
164
129
  label: "Documents usuari",
165
130
  callbackFn: async (): Promise<void> => {
166
- const CIP = await getPatientCip();
167
131
  setTimeout(() => {
168
- publishEcapNoCloseWithCip("CRIDA_DOCS_USU");
132
+ navigateToEcapWithoutClosingWithCip("CRIDA_DOCS_USU");
169
133
  }, 0);
170
134
  },
171
135
  },
@@ -173,92 +137,104 @@ const registerUpperNavMenuViews = () => {
173
137
  });
174
138
  return Promise.resolve(menuItem);
175
139
  },
140
+ sortHint: "000700",
176
141
  });
177
142
  shellApi.regionManager.registerView(shellRegions.navigationMenu, {
178
- id: "processes",
143
+ id: "communication",
179
144
  factory: () => {
180
145
  const menuItem = new PrimariaNavTreeMenu({
181
- icon: "add_box",
182
- label: "Processos",
146
+ icon: "3p",
147
+ label: "Comunicació",
183
148
  actionMenuItems: [
184
149
  {
185
150
  icon: "open_in_new",
186
- label: "ARES",
187
- callbackFn: async () => {
188
- const CIP = await getPatientCip();
189
- publishEcapNoCloseWithCip("PROCES_ATENCIO");
151
+ label: "SMS",
152
+ callbackFn: async (): Promise<void> => {
153
+ const CIP = await getPatientCip(shellApi);
154
+ shellApi.ecapEventManager.publish("MISSATGES_DEV", "NO_TANCAR", {
155
+ CIP: CIP || "",
156
+ TipusMissatge: "SMS",
157
+ });
190
158
  },
191
159
  },
192
160
  {
193
161
  icon: "open_in_new",
194
- label: "Nen sa",
195
- callbackFn: async () => {
196
- const CIP = await getPatientCip();
197
- publishEcapNoCloseWithCip("NEN_SA");
198
- },
162
+ label: "Econsulta",
163
+ callbackFn: (): void => {},
199
164
  },
200
165
  {
201
166
  icon: "open_in_new",
202
- label: "Procés Obstètric",
167
+ label: "Mail",
203
168
  callbackFn: (): void => {},
204
169
  },
205
170
  {
206
171
  icon: "open_in_new",
207
- label: "Odontologia",
208
- callbackFn: async () => {
209
- const CIP = await getPatientCip();
210
- publishEcapNoCloseWithCip("ODONTOLOGO");
172
+ label: "Veu IP",
173
+ callbackFn: async (): Promise<void> => {
174
+ navigateToEcapWithoutClosingWithCip("VOIP");
211
175
  },
212
176
  },
213
177
  {
214
178
  icon: "open_in_new",
215
- label: "Situació d'especial cura",
216
- callbackFn: async () => {
217
- const CIP = await getPatientCip();
218
- publishEcapNoCloseWithCip("SIT_ESPEC_CURA_DEV");
219
- },
179
+ label: "Videoconsulta",
180
+ callbackFn: (): void => {},
220
181
  },
221
182
  ],
222
183
  });
223
184
  return Promise.resolve(menuItem);
224
185
  },
186
+ sortHint: "001200",
225
187
  });
226
188
  shellApi.regionManager.registerView(shellRegions.navigationMenu, {
227
- id: "variable activities",
189
+ id: "visits",
228
190
  factory: () => {
229
191
  const menuItem = new PrimariaNavItem({
230
- icon: "add_box",
231
- label: "Activitats variables",
232
- callbackFn: async () => {
233
- const CIP = await getPatientCip();
234
- publishEcapNoCloseWithCip("SIA_DEV");
192
+ icon: "today",
193
+ label: "Visites",
194
+ callbackFn: async (): Promise<void> => {
195
+ navigateToEcapWithoutClosingWithCip("CONSULTA_VISITES");
235
196
  },
236
197
  });
237
198
  return Promise.resolve(menuItem);
238
199
  },
200
+ sortHint: "001300",
239
201
  });
240
202
  shellApi.regionManager.registerView(shellRegions.navigationMenu, {
241
- id: clinicalMonitoringId,
203
+ id: pocTestEventsId,
242
204
  factory: () => {
243
205
  const menuItem = new PrimariaNavItem({
244
- icon: "add_box",
245
- label: "Seguiment clínic",
206
+ icon: "bolt",
207
+ label: "Prova Events ECAP",
246
208
  callbackFn: () => {
247
- shellApi.regionManager.activateMainView(clinicalMonitoringId);
248
- shellApi.broker.publish(shellEvents.openClinicalMonitoringRequested);
209
+ shellApi.regionManager.activateMainView(pocTestEventsId);
249
210
  },
250
211
  });
251
212
  return Promise.resolve(menuItem);
252
213
  },
253
214
  });
215
+
254
216
  shellApi.regionManager.registerView(shellRegions.navigationMenu, {
255
- id: "landing",
217
+ id: "it",
256
218
  factory: () => {
257
219
  const menuItem = new PrimariaNavItem({
258
220
  icon: "add_box",
259
- label: "Pàgina inici",
260
- callbackFn: () => {
261
- shellApi.broker.send(new ExitShell());
221
+ label: "IT",
222
+ callbackFn: async (): Promise<void> => {
223
+ navigateToEcapWithoutClosingWithCip("REV_IT");
224
+ },
225
+ });
226
+ return Promise.resolve(menuItem);
227
+ },
228
+ });
229
+
230
+ shellApi.regionManager.registerView(shellRegions.navigationMenu, {
231
+ id: "variable activities",
232
+ factory: () => {
233
+ const menuItem = new PrimariaNavItem({
234
+ icon: "add_box",
235
+ label: "Activitats variables",
236
+ callbackFn: async () => {
237
+ navigateToEcapWithoutClosingWithCip("SIA_DEV");
262
238
  },
263
239
  });
264
240
  return Promise.resolve(menuItem);
@@ -271,7 +247,7 @@ const registerLowerNavMenuViews = () => {
271
247
  id: "configuration-center",
272
248
  factory: () => {
273
249
  const menuItem = new PrimariaNavItem({
274
- icon: "add_box",
250
+ icon: "settings",
275
251
  label: "Centre de configuració",
276
252
  callbackFn: () => {
277
253
  // shellApi.regionManager.activateView(shellRegions.main, "");
@@ -283,14 +259,6 @@ const registerLowerNavMenuViews = () => {
283
259
  };
284
260
 
285
261
  const registerMainViews = () => {
286
- shellApi.regionManager.registerMainView({
287
- id: clinicalMonitoringId,
288
- factory: () => {
289
- const mainItem = new ClinicalMonitoring();
290
- return Promise.resolve(mainItem as unknown as HTMLElement);
291
- },
292
- isDefault: true,
293
- });
294
262
  shellApi.regionManager.registerMainView({
295
263
  id: pocTestEventsId,
296
264
  factory: () => {
@@ -299,21 +267,11 @@ const registerMainViews = () => {
299
267
  },
300
268
  });
301
269
 
302
- shellApi.regionManager.registerMainView({
303
- id: pdfViewerId,
304
- factory: () => {
305
- const mainItem = new PdfVisor();
306
- return Promise.resolve(mainItem as unknown as HTMLElement);
307
- },
308
- });
270
+ registerPDFVisorMainView();
309
271
  };
310
272
 
311
- export const registerInternalViews = () => {
273
+ export const useInternalViews = () => {
312
274
  registerMainViews();
313
275
  registerUpperNavMenuViews();
314
276
  registerLowerNavMenuViews();
315
277
  };
316
-
317
- export const activateDefaultView = () => {
318
- shellApi.regionManager.activateMainView(clinicalMonitoringId);
319
- };
@@ -36,7 +36,7 @@ export class ActivityHistoryMain extends PrimariaRegionHost(LitElement) {
36
36
  this._unsubscribeEvents();
37
37
  }
38
38
 
39
- @property({ type: Boolean })
39
+ @property({ type: Boolean, reflect: true })
40
40
  maximized = false;
41
41
 
42
42
  @lazyInject(TYPES.primaryApi)
@@ -0,0 +1,61 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { getUniqueObjects } from "./get-unique-values-by-prop-path";
3
+
4
+ describe("getUniqueObjects", () => {
5
+ it("should return unique objects by id, keeping the last occurrence", () => {
6
+ const items = [
7
+ { data: { id: "1", label: "Item 1" } },
8
+ { data: { id: "2", label: "Item 2" } },
9
+ { data: { id: "1", label: "Item 1 (duplicate)" } }, // <- este debe sobrescribir
10
+ ];
11
+
12
+ const result = getUniqueObjects(items, ["data", "id"], ["data", "label"]);
13
+
14
+ expect(result).toEqual([
15
+ { id: "1", description: "Item 1 (duplicate)" }, // 👈 el último
16
+ { id: "2", description: "Item 2" },
17
+ ]);
18
+ });
19
+
20
+ it("should skip items with missing id or title", () => {
21
+ const items = [
22
+ { data: { id: "1", label: "Valid" } },
23
+ { data: { id: 2, label: "Invalid ID" } },
24
+ { data: { id: "3", label: null } },
25
+ ];
26
+
27
+ const result = getUniqueObjects(items, ["data", "id"], ["data", "label"]);
28
+
29
+ expect(result).toEqual([{ id: "1", description: "Valid" }]);
30
+ });
31
+
32
+ it("should return an empty array if input is empty", () => {
33
+ const result = getUniqueObjects([], ["a"], ["b"]);
34
+ expect(result).toEqual([]);
35
+ });
36
+
37
+ it("should handle deeply nested paths", () => {
38
+ const items = [
39
+ { a: { b: { c: { id: "x1", name: "Deep 1" } } } },
40
+ { a: { b: { c: { id: "x2", name: "Deep 2" } } } },
41
+ ];
42
+
43
+ const result = getUniqueObjects(items, ["a", "b", "c", "id"], ["a", "b", "c", "name"]);
44
+
45
+ expect(result).toEqual([
46
+ { id: "x1", description: "Deep 1" },
47
+ { id: "x2", description: "Deep 2" },
48
+ ]);
49
+ });
50
+
51
+ it("should handle invalid path safely", () => {
52
+ const items = [
53
+ { a: { b: { id: "1", name: "Good" } } },
54
+ { x: { y: { id: "2", name: "Missing Path" } } },
55
+ ];
56
+
57
+ const result = getUniqueObjects(items, ["a", "b", "id"], ["a", "b", "name"]);
58
+
59
+ expect(result).toEqual([{ id: "1", description: "Good" }]);
60
+ });
61
+ });
@@ -7,9 +7,9 @@ export function getUniqueObjects<T>(
7
7
  items
8
8
  .map((item) => ({
9
9
  id: propPathId.reduce((acc, key) => acc?.[key], item),
10
- title: propPathDescription.reduce((acc, key) => acc?.[key], item),
10
+ description: propPathDescription.reduce((acc, key) => acc?.[key], item),
11
11
  }))
12
- .filter((obj) => typeof obj.id === "string" && typeof obj.title === "string")
12
+ .filter((obj) => typeof obj.id === "string" && typeof obj.description === "string")
13
13
  .reduce(
14
14
  (map, obj) => map.set(obj.id, obj),
15
15
  new Map<string, { id: string; description: string }>(),
@@ -0,0 +1,29 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { normalizeStringToNFD } from "./normalize-string";
3
+
4
+ describe("normalizeStringToNFD", () => {
5
+ it("should remove accents and convert to lowercase", () => {
6
+ expect(normalizeStringToNFD("Árbol")).toBe("arbol");
7
+ expect(normalizeStringToNFD("ÉLÉPHANT")).toBe("elephant");
8
+ expect(normalizeStringToNFD("Niño")).toBe("nino");
9
+ expect(normalizeStringToNFD("Cañón")).toBe("canon");
10
+ });
11
+
12
+ it("should convert only to lowercase if no accents", () => {
13
+ expect(normalizeStringToNFD("HELLO")).toBe("hello");
14
+ expect(normalizeStringToNFD("WORLD")).toBe("world");
15
+ });
16
+
17
+ it("should handle empty string", () => {
18
+ expect(normalizeStringToNFD("")).toBe("");
19
+ });
20
+
21
+ it("should return lowercase even if no normalization is needed", () => {
22
+ expect(normalizeStringToNFD("AlreadyClean")).toBe("alreadyclean");
23
+ });
24
+
25
+ it("should remove accents from multicharacter words", () => {
26
+ expect(normalizeStringToNFD("José Álvarez")).toBe("jose alvarez");
27
+ expect(normalizeStringToNFD("mañana será otro día")).toBe("manana sera otro dia");
28
+ });
29
+ });
@@ -1,4 +1,6 @@
1
- export const normalizeStringToNFD = (text: string) => {
2
- const normalized = text.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
3
- return normalized ? normalized.toLocaleLowerCase() : text;
1
+ export const normalizeStringToNFD = (text: string | number | boolean | null | undefined) => {
2
+ if (text == null) return "";
3
+ const str = String(text);
4
+ const normalized = str.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
5
+ return normalized.toLocaleLowerCase();
4
6
  };
@@ -0,0 +1,47 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { propContainsString } from "./prop-contains-string";
3
+
4
+ describe("propContainsString", () => {
5
+ it("should return true if string contains search string (case-insensitive)", () => {
6
+ expect(propContainsString("Leo Messi", "messi")).toBe(true);
7
+ });
8
+
9
+ it("should return true if string contains search string with accents", () => {
10
+ expect(propContainsString("José Álvarez", "alvarez")).toBe(true);
11
+ expect(propContainsString("mañana", "manana")).toBe(true);
12
+ });
13
+
14
+ it("should return true for numeric values", () => {
15
+ expect(propContainsString(12345, "234")).toBe(true);
16
+ expect(propContainsString(2024, "202")).toBe(true);
17
+ });
18
+
19
+ it("should return false if no match", () => {
20
+ expect(propContainsString("Barcelona", "Madrid")).toBe(false);
21
+ });
22
+
23
+ it("should return true if match is exact", () => {
24
+ expect(propContainsString("Hola", "Hola")).toBe(true);
25
+ expect(propContainsString("hola", "HOLA")).toBe(true);
26
+ });
27
+
28
+ it("should handle boolean props", () => {
29
+ expect(propContainsString(true, "tru")).toBe(true);
30
+ expect(propContainsString(false, "false")).toBe(true);
31
+ expect(propContainsString(true, "nope")).toBe(false);
32
+ });
33
+
34
+ it("should return false if prop is null or undefined", () => {
35
+ expect(propContainsString(null, "a")).toBe(false);
36
+ expect(propContainsString(undefined, "a")).toBe(false);
37
+ });
38
+
39
+ it("should return false if search string is not in prop", () => {
40
+ expect(propContainsString("casa", "zzz")).toBe(false);
41
+ });
42
+
43
+ it("should be accent-insensitive and case-insensitive", () => {
44
+ expect(propContainsString("Éxito", "exito")).toBe(true);
45
+ expect(propContainsString("árbol", "ARBOL")).toBe(true);
46
+ });
47
+ });
package/src/locales.ts CHANGED
@@ -4,7 +4,7 @@ import { primariaShellId } from "./constants";
4
4
 
5
5
  let shellLocaleManager;
6
6
 
7
- export const initializeLocalization = async (api: PrimariaApi) => {
7
+ export const useLocalization = async (api: PrimariaApi) => {
8
8
  setLanguage("ca");
9
9
  const localeManager = await api.createLocaleManager(locales);
10
10
  shellLocaleManager = localeManager;
@@ -1,3 +0,0 @@
1
- import { ShellHeader } from './shell-header';
2
-
3
- export declare const template: (props: ShellHeader) => import('lit').TemplateResult<1>;
@@ -1,28 +0,0 @@
1
- import { LitElement, css, html, unsafeCSS } from "lit";
2
- import { customElement } from "lit/decorators.js";
3
- import styles from "./styles.css?inline";
4
- import { template } from "./template";
5
- import { PrimariaRegionHost } from "../../../api/api";
6
- import { IRegion, region } from "@uxland/regions";
7
- import { clinicalMonitoringRegions } from "../../../api/region-manager/regions";
8
-
9
- //@ts-ignore
10
- @customElement("clinical-monitoring")
11
- export class ClinicalMonitoring extends PrimariaRegionHost(LitElement) {
12
- render() {
13
- return html`${template(this)}`;
14
- }
15
-
16
- static styles = css`
17
- ${unsafeCSS(styles)}
18
- `;
19
-
20
- @region({ targetId: "widgets-sidebar-region", name: clinicalMonitoringRegions.sidebar })
21
- sidebarRegion: IRegion | undefined;
22
-
23
- @region({ targetId: "header-widgets-region", name: clinicalMonitoringRegions.header })
24
- headerRegion: IRegion | undefined;
25
-
26
- @region({ targetId: "content-widgets-region", name: clinicalMonitoringRegions.content })
27
- contentRegion: IRegion | undefined;
28
- }
@@ -1,7 +0,0 @@
1
- import "./primaria-shell/primaria-shell";
2
- import "./clinical-monitoring/clinical-monitoring";
3
- import "../shared-components";
4
- import "./shell-header/shell-header";
5
- import "./quick-actions-menu/quick-actions-menu";
6
- import "../../api/plugin-busy-manager/plugin-busy-list/component";
7
- import "./pdf-visor/pdf-selector/pdf-selector";