@uxland/primary-shell 5.3.7 → 5.3.9

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 (140) hide show
  1. package/dist/index.js +1951 -2144
  2. package/dist/index.js.map +1 -1
  3. package/dist/index.umd.cjs +123 -87
  4. package/dist/index.umd.cjs.map +1 -1
  5. package/dist/primary/shell/src/events.d.ts +1 -0
  6. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/add/add-async-history-items/request.d.ts +3 -2
  7. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/add/handle-error/actions.d.ts +1 -0
  8. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/add/handle-error/handle-history-items-add-error/bootstrapper.d.ts +4 -0
  9. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/add/handle-error/handle-history-items-add-error/handler.d.ts +7 -0
  10. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/add/handle-error/handle-history-items-add-error/request.d.ts +6 -0
  11. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/add/handle-error/history-full-data-error/component.d.ts +10 -0
  12. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/add/handle-error/history-full-data-error/template.d.ts +3 -0
  13. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/add/handle-error/history-partial-data-error/component.d.ts +11 -0
  14. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/add/handle-error/history-partial-data-error/template.d.ts +3 -0
  15. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/{list → add}/handle-error/reducers.d.ts +2 -4
  16. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/add/handle-error/selectors.d.ts +5 -0
  17. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/domain/model.d.ts +2 -1
  18. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/domain/specs/diagnostics-filter-spec.d.ts +8 -0
  19. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/domain/validation/is-valid-basic-history-item.d.ts +5 -0
  20. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/domain/validation/is-valid-basic-history-item.test.d.ts +1 -0
  21. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/domain/validation/is-valid-full-history-item.d.ts +5 -0
  22. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/domain/validation/is-valid-full-history-item.test.d.ts +1 -0
  23. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/UI/active-filters-badges/active-filters-badges.d.ts +4 -2
  24. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/UI/active-filters-header/active-filters-header.d.ts +1 -0
  25. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/UI/activity-history-filters/activity-history-filters.d.ts +4 -1
  26. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/common-filters/selectors.d.ts +42 -42
  27. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/custom-filters/add-custom-filters/actions.d.ts +1 -1
  28. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/custom-filters/add-custom-filters/reducer.d.ts +2 -2
  29. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/custom-filters/add-custom-filters/request.d.ts +3 -3
  30. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/custom-filters/selectors.d.ts +29 -29
  31. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/add/actions.d.ts +1 -0
  32. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/add/bootstrapper.d.ts +4 -0
  33. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/add/handler.d.ts +6 -0
  34. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/add/reducer.d.ts +4 -0
  35. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/add/reducer.test.d.ts +1 -0
  36. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/add/request.d.ts +6 -0
  37. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/handle-add-diagnostics-options-from-item.d.ts +5 -0
  38. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/handle-add-diagnostics-options-from-item.test.d.ts +1 -0
  39. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/selectors.d.ts +185 -0
  40. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/set/actions.d.ts +1 -0
  41. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/set/bootstrapper.d.ts +4 -0
  42. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/set/handler.d.ts +6 -0
  43. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/set/reducer.d.ts +3 -0
  44. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/set/request.d.ts +4 -0
  45. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/model.d.ts +18 -3
  46. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/selectors.d.ts +1 -1
  47. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/slice.d.ts +7 -3
  48. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/selectors.d.ts +86 -27
  49. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/slice.d.ts +2 -2
  50. package/dist/primary/shell/src/internal-plugins/activity-history/infrastructure/state/store.d.ts +4 -4
  51. package/dist/primary/shell/src/internal-plugins/activity-history/localization.d.ts +16 -0
  52. package/dist/primary/shell/src/internal-plugins/activity-history/utils/get-unique-values-by-prop-path.d.ts +1 -1
  53. package/package.json +1 -2
  54. package/src/UI/components/primaria-shell/shell-header/styles.css +1 -0
  55. package/src/UI/images/feedback-error.svg +9 -0
  56. package/src/UI/internal-views/upper-nav-views.ts +82 -17
  57. package/src/UI/shared-components/primaria-character-limit-badge/primaria-character-limit-badge.ts +5 -7
  58. package/src/UI/shared-components/primaria-character-limit-badge/styles.css +1 -1
  59. package/src/api/interaction-service/modal-styles.css +1 -1
  60. package/src/events.ts +1 -0
  61. package/src/features/clinical-monitoring/component/template.ts +5 -5
  62. package/src/internal-plugins/activity-history/activity-history-item/add/add-async-history-items/handler.ts +4 -3
  63. package/src/internal-plugins/activity-history/activity-history-item/add/add-async-history-items/request.ts +3 -2
  64. package/src/internal-plugins/activity-history/activity-history-item/add/add-history-item/handler.ts +4 -2
  65. package/src/internal-plugins/activity-history/activity-history-item/add/add-history-items/handler.ts +4 -2
  66. package/src/internal-plugins/activity-history/activity-history-item/add/handle-error/handle-history-items-add-error/bootstrapper.ts +18 -0
  67. package/src/internal-plugins/activity-history/activity-history-item/add/handle-error/handle-history-items-add-error/handler.ts +26 -0
  68. package/src/internal-plugins/activity-history/activity-history-item/add/handle-error/handle-history-items-add-error/request.ts +5 -0
  69. package/src/internal-plugins/activity-history/activity-history-item/add/handle-error/history-full-data-error/component.ts +32 -0
  70. package/src/internal-plugins/activity-history/activity-history-item/add/handle-error/history-full-data-error/styles.css +11 -0
  71. package/src/internal-plugins/activity-history/activity-history-item/add/handle-error/history-full-data-error/template.ts +23 -0
  72. package/src/internal-plugins/activity-history/activity-history-item/add/handle-error/history-partial-data-error/component.ts +42 -0
  73. package/src/internal-plugins/activity-history/activity-history-item/add/handle-error/history-partial-data-error/styles.css +11 -0
  74. package/src/internal-plugins/activity-history/activity-history-item/add/handle-error/history-partial-data-error/template.ts +19 -0
  75. package/src/internal-plugins/activity-history/activity-history-item/{list → add}/handle-error/reducers.ts +3 -2
  76. package/src/internal-plugins/activity-history/activity-history-item/add/handle-error/selectors.ts +19 -0
  77. package/src/internal-plugins/activity-history/activity-history-item/bootstrapper.ts +4 -1
  78. package/src/internal-plugins/activity-history/activity-history-item/domain/business-rules.ts +1 -1
  79. package/src/internal-plugins/activity-history/activity-history-item/domain/model.ts +2 -1
  80. package/src/internal-plugins/activity-history/activity-history-item/domain/specs/diagnostics-filter-spec.test.ts +59 -0
  81. package/src/internal-plugins/activity-history/activity-history-item/domain/specs/diagnostics-filter-spec.ts +18 -0
  82. package/src/internal-plugins/activity-history/activity-history-item/domain/validation/is-valid-basic-history-item.test.ts +63 -0
  83. package/src/internal-plugins/activity-history/activity-history-item/domain/validation/is-valid-basic-history-item.ts +43 -0
  84. package/src/internal-plugins/activity-history/activity-history-item/domain/{is-valid-history-item/is-valid-history-item.test.ts → validation/is-valid-full-history-item.test.ts} +11 -11
  85. package/src/internal-plugins/activity-history/activity-history-item/domain/{is-valid-history-item/is-valid-history-item.ts → validation/is-valid-full-history-item.ts} +7 -8
  86. package/src/internal-plugins/activity-history/activity-history-item/filter/UI/active-filters-badges/active-filters-badges.ts +19 -2
  87. package/src/internal-plugins/activity-history/activity-history-item/filter/UI/active-filters-badges/template.ts +49 -1
  88. package/src/internal-plugins/activity-history/activity-history-item/filter/UI/active-filters-header/active-filters-header.ts +4 -0
  89. package/src/internal-plugins/activity-history/activity-history-item/filter/UI/active-filters-header/template.ts +1 -0
  90. package/src/internal-plugins/activity-history/activity-history-item/filter/UI/activity-history-filters/activity-history-filters.ts +21 -1
  91. package/src/internal-plugins/activity-history/activity-history-item/filter/UI/activity-history-filters/template.ts +11 -2
  92. package/src/internal-plugins/activity-history/activity-history-item/filter/bootstrapper.ts +12 -0
  93. package/src/internal-plugins/activity-history/activity-history-item/filter/common-filters/common-filters.ts +8 -3
  94. package/src/internal-plugins/activity-history/activity-history-item/filter/custom-filters/add-custom-filters/reducer.ts +2 -2
  95. package/src/internal-plugins/activity-history/activity-history-item/filter/custom-filters/add-custom-filters/request.ts +2 -2
  96. package/src/internal-plugins/activity-history/activity-history-item/filter/custom-filters/selectors.ts +4 -5
  97. package/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/add/actions.ts +3 -0
  98. package/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/add/bootstrapper.ts +14 -0
  99. package/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/add/handler.ts +14 -0
  100. package/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/add/reducer.test.ts +93 -0
  101. package/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/add/reducer.ts +25 -0
  102. package/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/add/request.ts +5 -0
  103. package/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/handle-add-diagnostics-options-from-item.test.ts +80 -0
  104. package/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/handle-add-diagnostics-options-from-item.ts +31 -0
  105. package/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/selectors.ts +22 -0
  106. package/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/set/actions.ts +3 -0
  107. package/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/set/bootstrapper.ts +14 -0
  108. package/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/set/handler.ts +13 -0
  109. package/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/set/reducer.ts +11 -0
  110. package/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/set/request.ts +3 -0
  111. package/src/internal-plugins/activity-history/activity-history-item/filter/model.ts +21 -4
  112. package/src/internal-plugins/activity-history/activity-history-item/filter/slice.ts +6 -2
  113. package/src/internal-plugins/activity-history/activity-history-item/list/UI/timeline/activity-history-timeline.ts +1 -4
  114. package/src/internal-plugins/activity-history/activity-history-item/list/UI/timeline/template.ts +5 -2
  115. package/src/internal-plugins/activity-history/activity-history-item/list/bootstrapper.ts +4 -1
  116. package/src/internal-plugins/activity-history/activity-history-item/list/group-history-items/group-history-items.test.ts +71 -215
  117. package/src/internal-plugins/activity-history/activity-history-item/list/group-history-items/group-history-items.ts +24 -1
  118. package/src/internal-plugins/activity-history/activity-history-item/selectors.ts +6 -0
  119. package/src/internal-plugins/activity-history/activity-history-item/slice.ts +2 -8
  120. package/src/internal-plugins/activity-history/activity-history-item/update/handler.ts +2 -2
  121. package/src/internal-plugins/activity-history/localization.ts +16 -0
  122. package/src/internal-plugins/activity-history/utils/get-unique-values-by-prop-path.test.ts +55 -30
  123. package/src/internal-plugins/activity-history/utils/get-unique-values-by-prop-path.ts +30 -10
  124. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/domain/is-valid-history-item/is-valid-history-item.d.ts +0 -5
  125. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/list/handle-error/actions.d.ts +0 -4
  126. /package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/{list → add}/handle-busy/actions.d.ts +0 -0
  127. /package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/{list → add}/handle-busy/bootstrapper.d.ts +0 -0
  128. /package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/{list → add}/handle-busy/busy-component/component.d.ts +0 -0
  129. /package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/{list → add}/handle-busy/busy-component/template.d.ts +0 -0
  130. /package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/{list → add}/handle-busy/reducers.d.ts +0 -0
  131. /package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/{list → add}/handle-busy/selectors.d.ts +0 -0
  132. /package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/domain/{is-valid-history-item/is-valid-history-item.test.d.ts → specs/diagnostics-filter-spec.test.d.ts} +0 -0
  133. /package/src/internal-plugins/activity-history/activity-history-item/{list → add}/handle-busy/actions.ts +0 -0
  134. /package/src/internal-plugins/activity-history/activity-history-item/{list → add}/handle-busy/bootstrapper.ts +0 -0
  135. /package/src/internal-plugins/activity-history/activity-history-item/{list → add}/handle-busy/busy-component/component.ts +0 -0
  136. /package/src/internal-plugins/activity-history/activity-history-item/{list → add}/handle-busy/busy-component/styles.css +0 -0
  137. /package/src/internal-plugins/activity-history/activity-history-item/{list → add}/handle-busy/busy-component/template.ts +0 -0
  138. /package/src/internal-plugins/activity-history/activity-history-item/{list → add}/handle-busy/reducers.ts +0 -0
  139. /package/src/internal-plugins/activity-history/activity-history-item/{list → add}/handle-busy/selectors.ts +0 -0
  140. /package/src/internal-plugins/activity-history/activity-history-item/{list → add}/handle-error/actions.ts +0 -0
@@ -0,0 +1,18 @@
1
+ import { IActivityHistoryItem } from "../model";
2
+ import { Spec } from "./spec";
3
+
4
+ export class DiagnosticCodeSpec extends Spec<IActivityHistoryItem> {
5
+ constructor(private diagnosticCodes: string[]) {
6
+ super();
7
+ }
8
+
9
+ isSatisfiedBy(item: IActivityHistoryItem): boolean {
10
+ if (!this.diagnosticCodes?.length) {
11
+ return true; // No se filtra si no se proporcionan códigos
12
+ }
13
+
14
+ const itemDiagnostics = item.diagnostics ?? [];
15
+
16
+ return itemDiagnostics.some((d) => this.diagnosticCodes.includes(d.codi));
17
+ }
18
+ }
@@ -0,0 +1,63 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { isValidBasicActivityHistoryItem } from "./is-valid-basic-history-item";
3
+
4
+ describe("isValidBasicActivityHistoryItem", () => {
5
+ it("should return true for a valid ActivityHistoryItem object", () => {
6
+ const validItem = {
7
+ id: "123",
8
+ date: "2023-10-07T10:32:00.000Z", // formato válido ISO
9
+ professional: {
10
+ id: "prof-1",
11
+ name: "Dr. John Doe",
12
+ speciality: { id: "spec-1", description: "Cardiology" },
13
+ role: { id: "role-1", description: "Lead Doctor" },
14
+ },
15
+ relevant: true,
16
+ diagnostics: [{ codi: "diag-1", cataleg: "001", descripcio: "High Blood Pressure" }],
17
+ center: { id: "center-1", description: "Main Hospital" },
18
+ up: { id: "up-1", description: "Unit A" },
19
+ ep: { id: "ep-1", description: "Emergency Room" },
20
+ service: { id: "service-1", description: "Cardiac Service" },
21
+ };
22
+
23
+ expect(isValidBasicActivityHistoryItem(validItem)).toBe(true);
24
+ });
25
+
26
+ it('should return false if "id" is missing', () => {
27
+ const invalidItem = {
28
+ date: "2023-10-07T10:32:00.000Z",
29
+ // same as above
30
+ };
31
+
32
+ expect(isValidBasicActivityHistoryItem(invalidItem as any)).toBe(false);
33
+ });
34
+
35
+ it('should return false if "date" is missing', () => {
36
+ const invalidItem = {
37
+ id: "123",
38
+ // same as above
39
+ };
40
+
41
+ expect(isValidBasicActivityHistoryItem(invalidItem as any)).toBe(false);
42
+ });
43
+
44
+ it('should return false if "date" is an invalid string', () => {
45
+ const invalidItem = {
46
+ id: "123",
47
+ date: "not-a-date",
48
+ };
49
+
50
+ expect(isValidBasicActivityHistoryItem(invalidItem as any)).toBe(false);
51
+ });
52
+
53
+ it('should return false if "date" is an empty string', () => {
54
+ const invalidItem = {
55
+ id: "123",
56
+ date: "",
57
+ };
58
+
59
+ expect(isValidBasicActivityHistoryItem(invalidItem as any)).toBe(false);
60
+ });
61
+
62
+
63
+ });
@@ -0,0 +1,43 @@
1
+ import { IActivityHistoryItem } from "../model";
2
+
3
+ export const isValidBasicActivityHistoryItem = (obj: IActivityHistoryItem) => {
4
+ // Función auxiliar para comprobar si una propiedad existe y es del tipo string válido
5
+ const isString = (value: any) => typeof value === "string" && value.trim() !== "";
6
+
7
+ // Función para comprobar si un string representa una fecha válida
8
+ const isValidDateString = (value: any) => {
9
+ if (typeof value !== "string" || value.trim() === "") return false;
10
+
11
+ const date = new Date(value);
12
+ return date instanceof Date && !Number.isNaN(date.getTime());
13
+ };
14
+
15
+ // Comprobación del objeto principal
16
+ return (
17
+ obj &&
18
+ isString(obj.id) && // Verifica que "id" esté informado
19
+ isValidDateString(obj.date) // Verifica que "date" sea un string de fecha válido
20
+ );
21
+ };
22
+
23
+ export const ensureAreValidBasicActivityHistoryItems = (items: IActivityHistoryItem[]) => {
24
+ const areValid = items.every(isValidBasicActivityHistoryItem);
25
+ if (!areValid) {
26
+ console.error("Invalid activity history items", items);
27
+ throw new Error("Invalid activity history items");
28
+ }
29
+ return items;
30
+ };
31
+
32
+ const notifyInvalidItem = (item: IActivityHistoryItem) => {
33
+ console.error("Invalid history item", item);
34
+ };
35
+
36
+ export const validateAndFilterBasicItems = (items: IActivityHistoryItem[]) => {
37
+ const validItems = [] as IActivityHistoryItem[];
38
+ for (const item of items) {
39
+ if (isValidBasicActivityHistoryItem(item)) validItems.push(item);
40
+ else notifyInvalidItem(item);
41
+ }
42
+ return validItems;
43
+ };
@@ -1,7 +1,7 @@
1
1
  import { describe, it, expect } from "vitest";
2
- import { isValidActivityHistoryItem } from "./is-valid-history-item";
2
+ import { isValidFullActivityHistoryItem } from "./is-valid-full-history-item";
3
3
 
4
- describe("isValidActivityHistoryItem", () => {
4
+ describe("isValidFullActivityHistoryItem", () => {
5
5
  it("should return true for a valid ActivityHistoryItem object", () => {
6
6
  const validItem = {
7
7
  id: "123",
@@ -20,7 +20,7 @@ describe("isValidActivityHistoryItem", () => {
20
20
  service: { id: "service-1", description: "Cardiac Service" },
21
21
  };
22
22
 
23
- expect(isValidActivityHistoryItem(validItem)).toBe(true);
23
+ expect(isValidFullActivityHistoryItem(validItem)).toBe(true);
24
24
  });
25
25
 
26
26
  it('should return false if "id" is missing', () => {
@@ -40,7 +40,7 @@ describe("isValidActivityHistoryItem", () => {
40
40
  service: { id: "service-1", description: "Cardiac Service" },
41
41
  };
42
42
 
43
- expect(isValidActivityHistoryItem(invalidItem)).toBe(false);
43
+ expect(isValidFullActivityHistoryItem(invalidItem)).toBe(false);
44
44
  });
45
45
 
46
46
  it('should return false if "date" is missing', () => {
@@ -60,7 +60,7 @@ describe("isValidActivityHistoryItem", () => {
60
60
  service: { id: "service-1", description: "Cardiac Service" },
61
61
  };
62
62
 
63
- expect(isValidActivityHistoryItem(invalidItem)).toBe(false);
63
+ expect(isValidFullActivityHistoryItem(invalidItem)).toBe(false);
64
64
  });
65
65
 
66
66
  it('should return false if "professional" is invalid', () => {
@@ -81,7 +81,7 @@ describe("isValidActivityHistoryItem", () => {
81
81
  service: { id: "service-1", description: "Cardiac Service" },
82
82
  };
83
83
 
84
- expect(isValidActivityHistoryItem(invalidItem)).toBe(false);
84
+ expect(isValidFullActivityHistoryItem(invalidItem)).toBe(false);
85
85
  });
86
86
 
87
87
  it('should return false if "diagnostics" is not an array', () => {
@@ -102,7 +102,7 @@ describe("isValidActivityHistoryItem", () => {
102
102
  service: { id: "service-1", description: "Cardiac Service" },
103
103
  };
104
104
 
105
- expect(isValidActivityHistoryItem(invalidItem)).toBe(false);
105
+ expect(isValidFullActivityHistoryItem(invalidItem)).toBe(false);
106
106
  });
107
107
 
108
108
  it('should return true if "diagnostics" is null', () => {
@@ -123,7 +123,7 @@ describe("isValidActivityHistoryItem", () => {
123
123
  service: { id: "service-1", description: "Cardiac Service" },
124
124
  };
125
125
 
126
- expect(isValidActivityHistoryItem(validItem)).toBe(true);
126
+ expect(isValidFullActivityHistoryItem(validItem)).toBe(true);
127
127
  });
128
128
 
129
129
  it('should return false if "diagnostics" are invalid', () => {
@@ -144,7 +144,7 @@ describe("isValidActivityHistoryItem", () => {
144
144
  service: { id: "service-1", description: "Cardiac Service" },
145
145
  };
146
146
 
147
- expect(isValidActivityHistoryItem(invalidItem)).toBe(false);
147
+ expect(isValidFullActivityHistoryItem(invalidItem)).toBe(false);
148
148
  });
149
149
 
150
150
  it('should return false if "relevant" is not a boolean', () => {
@@ -165,7 +165,7 @@ describe("isValidActivityHistoryItem", () => {
165
165
  service: { id: "service-1", description: "Cardiac Service" },
166
166
  };
167
167
 
168
- expect(isValidActivityHistoryItem(invalidItem)).toBe(false);
168
+ expect(isValidFullActivityHistoryItem(invalidItem)).toBe(false);
169
169
  });
170
170
  it("should return true if all base props are correct, but object contain more extra fields", () => {
171
171
  const validItem = {
@@ -187,6 +187,6 @@ describe("isValidActivityHistoryItem", () => {
187
187
  prop2: "value2",
188
188
  };
189
189
 
190
- expect(isValidActivityHistoryItem(validItem)).toBe(true);
190
+ expect(isValidFullActivityHistoryItem(validItem)).toBe(true);
191
191
  });
192
192
  });
@@ -1,6 +1,7 @@
1
1
  import { IActivityHistoryItem } from "../model";
2
+ import { isValidBasicActivityHistoryItem } from "./is-valid-basic-history-item";
2
3
 
3
- export const isValidActivityHistoryItem = (obj: IActivityHistoryItem) => {
4
+ export const isValidFullActivityHistoryItem = (obj: IActivityHistoryItem) => {
4
5
  // Función auxiliar para comprobar si una propiedad existe y es del tipo esperado
5
6
  const isString = (value) => typeof value === "string" && value.trim() !== "";
6
7
  const isBoolean = (value) => typeof value === "boolean";
@@ -49,9 +50,7 @@ export const isValidActivityHistoryItem = (obj: IActivityHistoryItem) => {
49
50
 
50
51
  // Comprobación del objeto principal
51
52
  return (
52
- obj &&
53
- isString(obj.id) && // Verifica que "id" esté informado
54
- isString(obj.date) && // Verifica que "date" esté informado
53
+ isValidBasicActivityHistoryItem(obj) &&
55
54
  hasValidProfessional(obj.professional) &&
56
55
  isBoolean(obj.relevant) &&
57
56
  hasValidDiagnostics(obj.diagnostics) &&
@@ -62,8 +61,8 @@ export const isValidActivityHistoryItem = (obj: IActivityHistoryItem) => {
62
61
  );
63
62
  };
64
63
 
65
- export const ensureAreValidActivityHistoryItems = (items: IActivityHistoryItem[]) => {
66
- const areValid = items.every(isValidActivityHistoryItem);
64
+ export const ensureAreValidFullActivityHistoryItems = (items: IActivityHistoryItem[]) => {
65
+ const areValid = items.every(isValidFullActivityHistoryItem);
67
66
  if (!areValid) {
68
67
  console.error("Invalid activity history items", items);
69
68
  throw new Error("Invalid activity history items");
@@ -75,10 +74,10 @@ const notifyInvalidItem = (item: IActivityHistoryItem) => {
75
74
  console.error("Invalid history item", item);
76
75
  };
77
76
 
78
- export const validateAndFilterItems = (items: IActivityHistoryItem[]) => {
77
+ export const validateAndFilterFullItems = (items: IActivityHistoryItem[]) => {
79
78
  const validItems = [] as IActivityHistoryItem[];
80
79
  for (const item of items) {
81
- if (isValidActivityHistoryItem(item)) validItems.push(item);
80
+ if (isValidFullActivityHistoryItem(item)) validItems.push(item);
82
81
  else notifyInvalidItem(item);
83
82
  }
84
83
  return validItems;
@@ -8,9 +8,15 @@ import { template } from "./template";
8
8
  import styles from "./styles.css?inline";
9
9
  import { activeGroupsWithEnabledFilters } from "../../custom-filters/selectors";
10
10
  import { SetCustomFilterValue } from "../../custom-filters/set-custom-filter-value/request";
11
- import { IActivityHistoryCustomFilterGroup, IActivityHistoryFilterGroup } from "../../model";
11
+ import {
12
+ IActivityHistoryCustomFilterGroup,
13
+ IActivityHistoryDiagnosticsFilter,
14
+ IActivityHistoryFilter,
15
+ } from "../../model";
12
16
  import { activityHistoryEnabledCommonFiltersSelector } from "../../common-filters/selectors";
13
17
  import { SetCommonFilter } from "../../common-filters/set-common-filter/request";
18
+ import { diagnosticFilterSelector } from "../../diagnostic-filters/selectors";
19
+ import { SetDiagnosticFiltersCommand } from "../../diagnostic-filters/set/request";
14
20
 
15
21
  //@ts-ignore
16
22
  @customElement("active-filters-badges")
@@ -29,11 +35,14 @@ export class ActiveFiltersBadges extends LitElement {
29
35
  activityHistoryCommonFiltersSelector;
30
36
 
31
37
  @connectedProperty(activityHistoryEnabledCommonFiltersSelector)
32
- enabledCommonFilters: IActivityHistoryFilterGroup[];
38
+ enabledCommonFilters: IActivityHistoryFilter[];
33
39
 
34
40
  @connectedProperty(activeGroupsWithEnabledFilters)
35
41
  enabledFilters: IActivityHistoryCustomFilterGroup[];
36
42
 
43
+ @connectedProperty(diagnosticFilterSelector)
44
+ diagnosticFilterEnabled: IActivityHistoryDiagnosticsFilter;
45
+
37
46
  _onDeleteFilterValue(filterGroupId: string, filterId: string, optionId: string, value: boolean) {
38
47
  this.api.broker.send(
39
48
  new SetCustomFilterValue({
@@ -48,4 +57,12 @@ export class ActiveFiltersBadges extends LitElement {
48
57
  _onDeleteCommonFilterValue(filterId: string) {
49
58
  this.api.broker.send(new SetCommonFilter({ id: filterId, enabled: false }));
50
59
  }
60
+
61
+ _onDeleteDiagnosticFilterValue(diagnosticValue: string) {
62
+ this.api.broker.send(
63
+ new SetDiagnosticFiltersCommand([
64
+ ...this.diagnosticFilterEnabled.enabledValues.filter((v) => v !== diagnosticValue),
65
+ ]),
66
+ );
67
+ }
51
68
  }
@@ -27,16 +27,64 @@ const renderCommonChip = (filter, props) => html`
27
27
  ></dss-chip>
28
28
  `;
29
29
 
30
+ const renderDiagnosticChip = (id, value, props) => html`
31
+ <dss-chip
32
+ label=${value}
33
+ size="sm"
34
+ hasdelete
35
+ selected
36
+ @click=${() => props._onDeleteDiagnosticFilterValue(id)}
37
+ @onDelete=${() => props._onDeleteDiagnosticFilterValue(id)}
38
+ ></dss-chip>
39
+ `;
40
+
30
41
  const renderFilterTitle = (title) => html`<div class="filter-title">${`${title}:`}</div>`;
31
42
 
32
43
  export const template = (props: ActiveFiltersBadges) => {
33
- if (props.enabledFilters.length === 0 && props.enabledCommonFilters.length === 0) return nothing;
44
+ if (
45
+ props.enabledFilters.length === 0 &&
46
+ props.enabledCommonFilters.length === 0 &&
47
+ props.diagnosticFilterEnabled.enabledValues.length === 0
48
+ )
49
+ return nothing;
34
50
 
35
51
  let visibleCount = 0;
36
52
  const visibleChips: any[] = [];
37
53
  const hiddenElements: any[] = [];
38
54
  const hiddenChips: any[] = [];
39
55
 
56
+ const diagnostic = props.diagnosticFilterEnabled;
57
+
58
+ if (diagnostic) {
59
+ const { title, values, enabledValues } = diagnostic;
60
+ const selectedOptions = values.filter((opt) => enabledValues.includes(opt.value));
61
+
62
+ if (selectedOptions.length > 0) {
63
+ let titleAddedToVisible = false;
64
+ let titleAddedToHidden = false;
65
+
66
+ for (const option of selectedOptions) {
67
+ const chip = renderDiagnosticChip(option.value, option.label, props);
68
+
69
+ if (visibleCount < MAX_VISIBLE_CHIPS) {
70
+ if (!titleAddedToVisible) {
71
+ visibleChips.push(renderFilterTitle(title));
72
+ titleAddedToVisible = true;
73
+ }
74
+ visibleChips.push(chip);
75
+ visibleCount++;
76
+ } else {
77
+ if (!titleAddedToHidden) {
78
+ hiddenElements.push(renderFilterTitle(title));
79
+ titleAddedToHidden = true;
80
+ }
81
+ hiddenElements.push(chip);
82
+ hiddenChips.push(chip);
83
+ }
84
+ }
85
+ }
86
+ }
87
+
40
88
  for (const filter of props.enabledCommonFilters) {
41
89
  const chip = renderCommonChip(filter, props);
42
90
 
@@ -6,6 +6,7 @@ import { connectedProperty } from "../../../../infrastructure/state/connected-pr
6
6
  import { activityHistorySearchStringSelector } from "../../../search/selectors";
7
7
  import { areCustomFiltersActive } from "../../custom-filters/selectors";
8
8
  import { areCommonFiltersActive } from "../../common-filters/selectors";
9
+ import { areDiagnosticFiltersActive } from "../../diagnostic-filters/selectors";
9
10
 
10
11
  //@ts-ignore
11
12
  @customElement("active-filters-header")
@@ -26,4 +27,7 @@ export class ActiveFiltersHeader extends LitElement {
26
27
 
27
28
  @connectedProperty(areCommonFiltersActive)
28
29
  areCommonFiltersActive: boolean;
30
+
31
+ @connectedProperty(areDiagnosticFiltersActive)
32
+ areDiagnosticFiltersActive: boolean;
29
33
  }
@@ -6,6 +6,7 @@ export const template = (props: ActiveFiltersHeader) => {
6
6
  if (
7
7
  !props.areCustomFiltersActive &&
8
8
  !props.areCommonFiltersActive &&
9
+ !props.areDiagnosticFiltersActive &&
9
10
  props.searchString.length < 1
10
11
  )
11
12
  return nothing;
@@ -4,7 +4,11 @@ import { PrimariaApi } from "../../../../../../api/api";
4
4
  import { lazyInject } from "../../../../infrastructure/ioc/container";
5
5
  import { TYPES } from "../../../../infrastructure/ioc/types";
6
6
  import { connectedProperty } from "../../../../infrastructure/state/connected-property";
7
- import { IActivityHistoryCommonFilter, IActivityHistoryCustomFilterGroup } from "../../model";
7
+ import {
8
+ IActivityHistoryCommonFilter,
9
+ IActivityHistoryCustomFilterGroup,
10
+ IActivityHistoryDiagnosticsFilter,
11
+ } from "../../model";
8
12
  import styles from "./styles.css?inline";
9
13
  import { template } from "./template";
10
14
  import { SetCustomFilterGroup } from "../../custom-filters/set-custom-filter-group/request";
@@ -12,6 +16,11 @@ import { SetCommonFilter } from "../../common-filters/set-common-filter/request"
12
16
  import { activityHistoryCommonFiltersSelector } from "../../common-filters/selectors";
13
17
  import { SetCustomFilterValue } from "../../custom-filters/set-custom-filter-value/request";
14
18
  import { customFilterGroupsWithOptionsSelector } from "../../../selectors";
19
+ import {
20
+ diagnosticFilterEnabledValuesSelector,
21
+ diagnosticFilterSelector,
22
+ } from "../../diagnostic-filters/selectors";
23
+ import { SetDiagnosticFiltersCommand } from "../../diagnostic-filters/set/request";
15
24
 
16
25
  //@ts-ignore
17
26
  @customElement("activity-history-filters")
@@ -30,6 +39,12 @@ export class ActivityHistoryFilters extends LitElement {
30
39
  @connectedProperty(customFilterGroupsWithOptionsSelector)
31
40
  customFilterGroups: IActivityHistoryCustomFilterGroup[];
32
41
 
42
+ @connectedProperty(diagnosticFilterSelector)
43
+ diagnosticFilter: IActivityHistoryDiagnosticsFilter;
44
+
45
+ @connectedProperty(diagnosticFilterEnabledValuesSelector)
46
+ diagnosticFilterEnabledValues: string[];
47
+
33
48
  @lazyInject(TYPES.primaryApi)
34
49
  api: PrimariaApi;
35
50
 
@@ -72,4 +87,9 @@ export class ActivityHistoryFilters extends LitElement {
72
87
  }),
73
88
  );
74
89
  }
90
+
91
+ _handleDiagnosticFilterChange(e: CustomEvent) {
92
+ const selectedValues = e.detail.selectedValue;
93
+ this.api.broker.send(new SetDiagnosticFiltersCommand(selectedValues));
94
+ }
75
95
  }
@@ -6,7 +6,7 @@ import {
6
6
  IActivityHistoryCommonFilter,
7
7
  IActivityHistoryCustomFilter,
8
8
  IActivityHistoryCustomFilterGroup,
9
- IActivityHistoryFilterGroup,
9
+ IActivityHistoryFilter,
10
10
  } from "../../model";
11
11
  import { translate } from "../../../../localization";
12
12
 
@@ -27,7 +27,7 @@ const filterTemplates = {
27
27
  const getFilterTemplate = (
28
28
  filter: IActivityHistoryCommonFilter | IActivityHistoryCustomFilter,
29
29
  onChangeValue: (...args: any[]) => void,
30
- filterGroup?: IActivityHistoryFilterGroup,
30
+ filterGroup?: IActivityHistoryFilter,
31
31
  option?: { id: string; title: string },
32
32
  ) => {
33
33
  const isCustom = !!filterGroup?.id && !!option;
@@ -62,6 +62,15 @@ export const template = (props: ActivityHistoryFilters) =>
62
62
  ? html`<div class="filters-sidebar-opened">${translate("filters.filters")}<dss-icon-button ?hidden=${props.wrapperMaximized} @click=${() => props._toggleFilters()} size="md" variant="primary" icon="keyboard_double_arrow_left"></dss-icon-button></div>
63
63
  <div class="filter-container">
64
64
  ${repeat(props.commonFilters, (filter: IActivityHistoryCommonFilter) => html`<div class="filter">${getFilterTemplate(filter, props._onChangeCommonFilterValue.bind(props))}</div> `)}
65
+ ${
66
+ props.diagnosticFilter &&
67
+ html`<div class="filter">
68
+ <dss-input-dropdown icon="" multiple dropdownFixed type="default" .elements=${props.diagnosticFilter?.values} @onInputDropdownChange=${props._handleDiagnosticFilterChange} .selectedValue=${props.diagnosticFilterEnabledValues}>
69
+ <label slot="label" for="diagnostic-filter">${props.diagnosticFilter.title}</label>
70
+ <input id="diagnostic-filter" slot="input" type="text" class="dss-input" autocomplete="off"/>
71
+ </dss-input-dropdown>
72
+ </div>`
73
+ }
65
74
  ${repeat(
66
75
  props.customFilterGroups,
67
76
  (group: IActivityHistoryCustomFilterGroup) => html`
@@ -16,12 +16,22 @@ import {
16
16
  bootstrapSetCustomFilterValue,
17
17
  teardownSetCustomFilterValue,
18
18
  } from "./custom-filters/set-custom-filter-value/bootstrapper";
19
+ import {
20
+ bootstrapAddDiagnosticFilter,
21
+ teardownAddDiagnosticFilter,
22
+ } from "./diagnostic-filters/add/bootstrapper";
23
+ import {
24
+ bootstrapSetDiagnosticFilter,
25
+ teardownSetDiagnosticFilter,
26
+ } from "./diagnostic-filters/set/bootstrapper";
19
27
 
20
28
  export const bootstrapFilters = (broker: BrokerExtensions) => {
21
29
  bootstrapSetCommonFilter(broker);
22
30
  bootstrapAddCustomFilter(broker);
23
31
  bootstrapSetCustomFilterGroup(broker);
24
32
  bootstrapSetCustomFilterValue(broker);
33
+ bootstrapAddDiagnosticFilter(broker);
34
+ bootstrapSetDiagnosticFilter(broker);
25
35
  };
26
36
 
27
37
  export const teardownFilters = () => {
@@ -29,4 +39,6 @@ export const teardownFilters = () => {
29
39
  teardownAddCustomFilter();
30
40
  teardownSetCustomFilterGroup();
31
41
  teardownSetCustomFilterValue();
42
+ teardownAddDiagnosticFilter();
43
+ teardownSetDiagnosticFilter();
32
44
  };
@@ -1,6 +1,11 @@
1
1
  import { OwnSpec } from "../../domain/specs/own-spec";
2
2
  import { RelevantSpec } from "../../domain/specs/relevant-spec";
3
- import { IActivityHistoryCommonFilterGroup, ActivityHistoryFilterType } from "../model";
3
+ import {
4
+ IActivityHistoryCommonFilterGroup,
5
+ ActivityHistoryFilterType,
6
+ relevantFilterId,
7
+ ownFilterId,
8
+ } from "../model";
4
9
 
5
10
  export const commonFilters: IActivityHistoryCommonFilterGroup[] = [
6
11
  {
@@ -8,14 +13,14 @@ export const commonFilters: IActivityHistoryCommonFilterGroup[] = [
8
13
  title: "Comuns",
9
14
  filters: [
10
15
  {
11
- id: "relevant",
16
+ id: relevantFilterId,
12
17
  title: "Veure rellevants",
13
18
  spec: RelevantSpec,
14
19
  enabled: false,
15
20
  type: ActivityHistoryFilterType.Switch,
16
21
  },
17
22
  {
18
- id: "own",
23
+ id: ownFilterId,
19
24
  title: "Veure meus",
20
25
  spec: OwnSpec,
21
26
  enabled: false,
@@ -1,9 +1,9 @@
1
1
  import { PayloadAction } from "@reduxjs/toolkit";
2
- import { IActivityHistoryCommonFilterGroup } from "../model";
2
+ import { IActivityHistoryCustomFilterGroup } from "../../model";
3
3
 
4
4
  export function addCustomFiltersReducer(
5
5
  state,
6
- action: PayloadAction<IActivityHistoryCommonFilterGroup>,
6
+ action: PayloadAction<IActivityHistoryCustomFilterGroup>,
7
7
  ) {
8
8
  state.filters = [...state.filters, action.payload];
9
9
  }
@@ -1,5 +1,5 @@
1
- import { IActivityHistoryCommonFilterGroup } from "../model";
1
+ import { IActivityHistoryCustomFilterGroup } from "../../model";
2
2
 
3
3
  export class AddCustomFiltersCommand {
4
- constructor(public payload: IActivityHistoryCommonFilterGroup) {}
4
+ constructor(public payload: IActivityHistoryCustomFilterGroup) {}
5
5
  }
@@ -1,16 +1,15 @@
1
1
  import { createSelector } from "@reduxjs/toolkit";
2
2
  import {
3
- IActivityHistoryCustomFilter,
4
3
  IActivityHistoryCustomFilterGroup,
5
- IActivityHistoryFilterGroup,
6
- isNotCommonFilterGroup,
4
+ IActivityHistoryFilter,
5
+ isCustomFilter,
7
6
  } from "../model";
8
7
  import { activityHistoryFiltersSelector } from "../selectors";
9
8
 
10
9
  export const activityHistoryCustomFilterGroupsSelector = createSelector(
11
10
  activityHistoryFiltersSelector,
12
- (filters: IActivityHistoryFilterGroup[]) => {
13
- const customFilters = filters.filter(isNotCommonFilterGroup);
11
+ (filters: IActivityHistoryFilter[]) => {
12
+ const customFilters = filters.filter(isCustomFilter);
14
13
  return customFilters.sort(sortBySortProperty);
15
14
  },
16
15
  );
@@ -0,0 +1,3 @@
1
+ import { activityHistoryFiltersSlice } from "../../slice";
2
+
3
+ export const { addDiagnosticFilters } = activityHistoryFiltersSlice.actions;
@@ -0,0 +1,14 @@
1
+ import { BrokerExtensions } from "@primaria/plugins-core";
2
+ import { BrokerDisposableHandler } from "../../../../../../api/broker/primaria-broker";
3
+ import { AddDiagnosticFiltersHandler } from "./handler";
4
+ import { AddDiagnosticFiltersCommand } from "./request";
5
+
6
+ let request: BrokerDisposableHandler;
7
+
8
+ export const bootstrapAddDiagnosticFilter = (broker: BrokerExtensions) => {
9
+ request = broker.registerRequest(AddDiagnosticFiltersCommand, AddDiagnosticFiltersHandler);
10
+ };
11
+
12
+ export const teardownAddDiagnosticFilter = () => {
13
+ request?.dispose();
14
+ };
@@ -0,0 +1,14 @@
1
+ import { StoreBaseHandler } from "../../../../infrastructure/base-handlers";
2
+ import { addDiagnosticFilters } from "./actions";
3
+ import { AddDiagnosticFiltersCommand } from "./request";
4
+
5
+ export class AddDiagnosticFiltersHandler extends StoreBaseHandler {
6
+ async handle(request: AddDiagnosticFiltersCommand) {
7
+ try {
8
+ //TODO ensure are valid filters
9
+ this.store.dispatch(addDiagnosticFilters(request.payload));
10
+ } catch (e) {
11
+ console.log(e.message);
12
+ }
13
+ }
14
+ }