@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,93 @@
1
+ import { describe, it, expect, beforeEach, vi } from "vitest";
2
+ import { createSlice, PayloadAction } from "@reduxjs/toolkit";
3
+ import { IActivityHistoryDiagnosticsFilter, isDiagnosticFilter } from "../../model";
4
+ import { addDiagnosticFiltersReducer } from "./reducer";
5
+
6
+ vi.mock("../../model", () => ({
7
+ isDiagnosticFilter: vi.fn(),
8
+ }));
9
+
10
+ describe("addDiagnosticFiltersReducer", () => {
11
+ let initialState: { filters: IActivityHistoryDiagnosticsFilter[] };
12
+
13
+ const baseFilter = (values: any[]): IActivityHistoryDiagnosticsFilter => ({
14
+ id: "diagnostics",
15
+ title: "Diagnòstics",
16
+ values,
17
+ enabledValues: [],
18
+ });
19
+
20
+ beforeEach(() => {
21
+ initialState = {
22
+ filters: [],
23
+ };
24
+ vi.clearAllMocks();
25
+ });
26
+
27
+ const slice = createSlice({
28
+ name: "activity",
29
+ initialState,
30
+ reducers: {
31
+ addDiagnosticFilters: addDiagnosticFiltersReducer,
32
+ },
33
+ });
34
+
35
+ const { addDiagnosticFilters } = slice.actions;
36
+ const reducer = slice.reducer;
37
+
38
+ it("should add a new diagnostic filter if none exists", () => {
39
+ (isDiagnosticFilter as any).mockReturnValue(false);
40
+
41
+ const newFilter = baseFilter([{ label: "Hipertensió", value: "I10" }]);
42
+
43
+ const nextState = reducer(initialState, addDiagnosticFilters(newFilter));
44
+
45
+ expect(nextState.filters).toHaveLength(1);
46
+ expect(nextState.filters[0]).toEqual(newFilter);
47
+ });
48
+
49
+ it("should merge values if a diagnostic filter already exists", () => {
50
+ const existingFilter = baseFilter([{ label: "Diabetes", value: "E11" }]);
51
+ initialState.filters = [existingFilter];
52
+
53
+ (isDiagnosticFilter as any).mockImplementation((f) => f.id === "diagnostics");
54
+
55
+ const incomingFilter = baseFilter([{ label: "Hipertensió", value: "I10" }]);
56
+
57
+ const nextState = reducer(initialState, addDiagnosticFilters(incomingFilter));
58
+
59
+ expect(nextState.filters).toHaveLength(1);
60
+ expect(nextState.filters[0].values).toContainEqual({ label: "Diabetes", value: "E11" });
61
+ expect(nextState.filters[0].values).toContainEqual({ label: "Hipertensió", value: "I10" });
62
+ });
63
+
64
+ it("should avoid duplicate values when merging", () => {
65
+ const existingFilter = baseFilter([{ label: "Diabetes", value: "E11" }]);
66
+ initialState.filters = [existingFilter];
67
+
68
+ (isDiagnosticFilter as any).mockImplementation((f) => f.id === "diagnostics");
69
+
70
+ const incomingFilter = baseFilter([{ label: "Diabetes", value: "E11" }]);
71
+
72
+ const nextState = reducer(initialState, addDiagnosticFilters(incomingFilter));
73
+
74
+ expect(nextState.filters).toHaveLength(1);
75
+ expect(nextState.filters[0].values).toEqual([{ label: "Diabetes", value: "E11" }]);
76
+ });
77
+
78
+ it("should preserve other properties of the existing filter", () => {
79
+ const existingFilter = {
80
+ ...baseFilter([{ label: "A", value: "1" }]),
81
+ enabledValues: ["1"],
82
+ };
83
+ initialState.filters = [existingFilter];
84
+
85
+ (isDiagnosticFilter as any).mockReturnValue(true);
86
+
87
+ const incomingFilter = baseFilter([{ label: "B", value: "2" }]);
88
+
89
+ const nextState = reducer(initialState, addDiagnosticFilters(incomingFilter));
90
+
91
+ expect(nextState.filters[0].enabledValues).toEqual(["1"]); // no se sobreescribe
92
+ });
93
+ });
@@ -0,0 +1,25 @@
1
+ import { PayloadAction } from "@reduxjs/toolkit";
2
+ import { IActivityHistoryDiagnosticsFilter, isDiagnosticFilter } from "../../model";
3
+
4
+ export function addDiagnosticFiltersReducer(
5
+ state,
6
+ action: PayloadAction<IActivityHistoryDiagnosticsFilter>,
7
+ ) {
8
+ const index = state.filters.findIndex(isDiagnosticFilter);
9
+
10
+ if (index === -1) {
11
+ state.filters.push(action.payload);
12
+ } else {
13
+ const existing = state.filters[index];
14
+
15
+ const mergedValues = [
16
+ ...existing.values,
17
+ ...action.payload.values.filter((v) => !existing.values.some((ev) => ev.value === v.value)),
18
+ ];
19
+
20
+ state.filters[index] = {
21
+ ...existing,
22
+ values: mergedValues,
23
+ };
24
+ }
25
+ }
@@ -0,0 +1,5 @@
1
+ import { IActivityHistoryDiagnosticsFilter } from "../../model";
2
+
3
+ export class AddDiagnosticFiltersCommand {
4
+ constructor(public payload: IActivityHistoryDiagnosticsFilter) {}
5
+ }
@@ -0,0 +1,80 @@
1
+ import { mapArrayToLabelValue } from "@primaria/plugins-core";
2
+ import { describe, it, expect, vi, beforeEach } from "vitest";
3
+ import { handleAddDiagnosticsFilter } from "./handle-add-diagnostics-options-from-item";
4
+ import { diagnosticsfilterId } from "../model";
5
+
6
+ vi.mock("@primaria/plugins-core", () => ({
7
+ mapArrayToLabelValue: vi.fn(),
8
+ }));
9
+
10
+ describe("handleAddDiagnosticsFilter", () => {
11
+ const mockDispatch = vi.fn();
12
+ const mockStore = { dispatch: mockDispatch };
13
+
14
+ const diagnosticsSample = [
15
+ { descripcio: "Diabetes", codi: "E11" },
16
+ { descripcio: "Hipertensió", codi: "I10" },
17
+ ];
18
+
19
+ beforeEach(() => {
20
+ vi.clearAllMocks();
21
+ });
22
+
23
+ it("should dispatch a filter when items have diagnostics", () => {
24
+ (mapArrayToLabelValue as any).mockReturnValue([
25
+ { label: "Diabetes", value: "E11" },
26
+ { label: "Hipertensió", value: "I10" },
27
+ ]);
28
+
29
+ const items = [{ diagnostics: diagnosticsSample }];
30
+
31
+ handleAddDiagnosticsFilter(items, mockStore as any);
32
+
33
+ expect(mapArrayToLabelValue).toHaveBeenCalledWith(diagnosticsSample, "descripcio", "codi");
34
+ expect(mockDispatch).toHaveBeenCalledWith({
35
+ type: expect.any(String), // puedes ajustar esto si usas createAction
36
+ payload: {
37
+ id: diagnosticsfilterId,
38
+ title: "Diagnòstics",
39
+ values: [
40
+ { label: "Diabetes", value: "E11" },
41
+ { label: "Hipertensió", value: "I10" },
42
+ ],
43
+ enabledValues: [],
44
+ },
45
+ });
46
+ });
47
+
48
+ it("should not dispatch if no diagnostics are present", () => {
49
+ const items = [{ diagnostics: [] }, { diagnostics: undefined }];
50
+ handleAddDiagnosticsFilter(items, mockStore as any);
51
+ expect(mockDispatch).not.toHaveBeenCalled();
52
+ });
53
+
54
+ it("should deduplicate diagnostics by codi", () => {
55
+ const duplicatedDiagnostics = [
56
+ { descripcio: "Diabetes", codi: "E11" },
57
+ { descripcio: "Diabetis", codi: "E11" }, // mismo código
58
+ { descripcio: "Hipertensió", codi: "I10" },
59
+ ];
60
+
61
+ (mapArrayToLabelValue as any).mockReturnValue([
62
+ { label: "Diabetes", value: "E11" },
63
+ { label: "Hipertensió", value: "I10" },
64
+ ]);
65
+
66
+ const items = [{ diagnostics: duplicatedDiagnostics }];
67
+
68
+ handleAddDiagnosticsFilter(items, mockStore as any);
69
+
70
+ expect(mapArrayToLabelValue).toHaveBeenCalledWith(
71
+ [
72
+ { descripcio: "Diabetes", codi: "E11" },
73
+ { descripcio: "Hipertensió", codi: "I10" },
74
+ ],
75
+ "descripcio",
76
+ "codi",
77
+ );
78
+ expect(mockDispatch).toHaveBeenCalled();
79
+ });
80
+ });
@@ -0,0 +1,31 @@
1
+ import { mapArrayToLabelValue } from "@primaria/plugins-core";
2
+ import { Store } from "@reduxjs/toolkit";
3
+ import { IActivityHistoryItem } from "../../domain/model";
4
+ import { diagnosticsfilterId } from "../model";
5
+ import { addDiagnosticFilters } from "./add/actions";
6
+
7
+ export const handleAddDiagnosticsFilter = (items: IActivityHistoryItem[], store: Store) => {
8
+ const allDiagnostics = items
9
+ .flatMap((item) => item.diagnostics ?? [])
10
+ .filter((diag) => typeof diag.codi === "string" && diag.codi.trim() !== "")
11
+ .filter((diag, index, self) => index === self.findIndex((d) => d.codi === diag.codi));
12
+
13
+ if (allDiagnostics.length > 0) {
14
+ const newDiagnosticFilter = {
15
+ id: diagnosticsfilterId,
16
+ title: "Diagnòstics",
17
+ values: mapArrayToLabelValue(allDiagnostics, "descripcio", "codi"),
18
+ enabledValues: [],
19
+ };
20
+
21
+ store.dispatch(addDiagnosticFilters(newDiagnosticFilter));
22
+ }
23
+ };
24
+
25
+ export function mergeDiagnosticOptionsByCodi(array1, array2) {
26
+ const existingCodis = new Set(array1.map((obj) => obj.codi));
27
+
28
+ const newObjects = array2.filter((obj) => !existingCodis.has(obj.codi));
29
+
30
+ return [...array1, ...newObjects];
31
+ }
@@ -0,0 +1,22 @@
1
+ import { createSelector } from "@reduxjs/toolkit";
2
+ import {
3
+ IActivityHistoryDiagnosticsFilter,
4
+ IActivityHistoryFilter,
5
+ isDiagnosticFilter,
6
+ } from "../model";
7
+ import { activityHistoryFiltersSelector } from "../selectors";
8
+
9
+ export const diagnosticFilterSelector = createSelector(
10
+ activityHistoryFiltersSelector,
11
+ (filters: IActivityHistoryFilter[]) => filters.find(isDiagnosticFilter),
12
+ );
13
+
14
+ export const diagnosticFilterEnabledValuesSelector = createSelector(
15
+ diagnosticFilterSelector,
16
+ (filter: IActivityHistoryDiagnosticsFilter) => filter?.enabledValues || [],
17
+ );
18
+
19
+ export const areDiagnosticFiltersActive = createSelector(
20
+ diagnosticFilterEnabledValuesSelector,
21
+ (filters) => !!filters.length,
22
+ );
@@ -0,0 +1,3 @@
1
+ import { activityHistoryFiltersSlice } from "../../slice";
2
+
3
+ export const { setDiagnosticFilterValues } = activityHistoryFiltersSlice.actions;
@@ -0,0 +1,14 @@
1
+ import { BrokerExtensions } from "@primaria/plugins-core";
2
+ import { BrokerDisposableHandler } from "../../../../../../api/broker/primaria-broker";
3
+ import { SetDiagnosticFiltersHandler } from "./handler";
4
+ import { SetDiagnosticFiltersCommand } from "./request";
5
+
6
+ let request: BrokerDisposableHandler;
7
+
8
+ export const bootstrapSetDiagnosticFilter = (broker: BrokerExtensions) => {
9
+ request = broker.registerRequest(SetDiagnosticFiltersCommand, SetDiagnosticFiltersHandler);
10
+ };
11
+
12
+ export const teardownSetDiagnosticFilter = () => {
13
+ request?.dispose();
14
+ };
@@ -0,0 +1,13 @@
1
+ import { StoreBaseHandler } from "../../../../infrastructure/base-handlers";
2
+ import { setDiagnosticFilterValues } from "./actions";
3
+ import { SetDiagnosticFiltersCommand } from "./request";
4
+
5
+ export class SetDiagnosticFiltersHandler extends StoreBaseHandler {
6
+ async handle(request: SetDiagnosticFiltersCommand) {
7
+ try {
8
+ this.store.dispatch(setDiagnosticFilterValues(request.payload));
9
+ } catch (e) {
10
+ console.log(e.message);
11
+ }
12
+ }
13
+ }
@@ -0,0 +1,11 @@
1
+ import { PayloadAction } from "@reduxjs/toolkit";
2
+ import { IActivityHistoryDiagnosticsFilter, isDiagnosticFilter } from "../../model";
3
+
4
+ export function setDiagnosticFilterValuesReducer(state, action: PayloadAction<string[]>) {
5
+ state.filters = [...state.filters].map((f) => {
6
+ if (isDiagnosticFilter(f)) {
7
+ return { ...f, enabledValues: action.payload } as IActivityHistoryDiagnosticsFilter;
8
+ }
9
+ return f;
10
+ });
11
+ }
@@ -0,0 +1,3 @@
1
+ export class SetDiagnosticFiltersCommand {
2
+ constructor(public payload: string[]) {}
3
+ }
@@ -35,9 +35,10 @@ export interface IActivityHistoryCustomFilterGroup {
35
35
  filters: IActivityHistoryCustomFilter[];
36
36
  }
37
37
 
38
- export type IActivityHistoryFilterGroup =
38
+ export type IActivityHistoryFilter =
39
39
  | IActivityHistoryCommonFilterGroup
40
- | IActivityHistoryCustomFilterGroup;
40
+ | IActivityHistoryCustomFilterGroup
41
+ | IActivityHistoryDiagnosticsFilter;
41
42
 
42
43
  export interface IActivityHistoryCustomFilter {
43
44
  id: string;
@@ -54,6 +55,22 @@ export interface IActivityHistoryCustomFilter {
54
55
  enabledValues?: string[];
55
56
  }
56
57
 
57
- export const isCommonFilterGroup = (group: IActivityHistoryFilterGroup) => group.id === "common";
58
- export const isNotCommonFilterGroup = (group: IActivityHistoryFilterGroup) =>
58
+ export const isCommonFilterGroup = (group: IActivityHistoryFilter) => group.id === "common";
59
+ export const isNotCommonFilterGroup = (group: IActivityHistoryFilter) =>
59
60
  !isCommonFilterGroup(group);
61
+ export const isDiagnosticFilter = (filter: IActivityHistoryFilter) =>
62
+ filter.id === diagnosticsfilterId;
63
+ export const isNotDiagnosticFilter = (filter: IActivityHistoryFilter) =>
64
+ !isDiagnosticFilter(filter);
65
+ export const isCustomFilter = (filter: IActivityHistoryFilter) =>
66
+ !isCommonFilterGroup(filter) && !isDiagnosticFilter(filter);
67
+ export interface IActivityHistoryDiagnosticsFilter {
68
+ id: string;
69
+ title: string;
70
+ values: { label: string; value: string }[];
71
+ enabledValues: string[];
72
+ }
73
+
74
+ export const diagnosticsfilterId = "history-diagnostics";
75
+ export const relevantFilterId = "history-relevant";
76
+ export const ownFilterId = "history-own";
@@ -5,13 +5,15 @@ import { setCommonFilterValueReducer } from "./common-filters/set-common-filter/
5
5
  import { addCustomFiltersReducer } from "./custom-filters/add-custom-filters/reducer";
6
6
  import { setCustomFilterGroupValueReducer } from "./custom-filters/set-custom-filter-group/reducer";
7
7
  import { setCustomFilterValueReducer } from "./custom-filters/set-custom-filter-value/reducer";
8
- import { IActivityHistoryFilterGroup } from "./model";
8
+ import { IActivityHistoryFilter } from "./model";
9
+ import { addDiagnosticFiltersReducer } from "./diagnostic-filters/add/reducer";
10
+ import { setDiagnosticFilterValuesReducer } from "./diagnostic-filters/set/reducer";
9
11
 
10
12
  export const activityHistoryFiltersSlice = createSlice({
11
13
  name: "activity-history-filters",
12
14
  initialState: {
13
15
  searchString: "",
14
- filters: [...commonFilters] as IActivityHistoryFilterGroup[],
16
+ filters: [...commonFilters] as IActivityHistoryFilter[],
15
17
  },
16
18
  reducers: {
17
19
  setSearchString: setSearchStringReducer,
@@ -19,5 +21,7 @@ export const activityHistoryFiltersSlice = createSlice({
19
21
  addCustomFilters: addCustomFiltersReducer,
20
22
  setCustomFilterGroupValue: setCustomFilterGroupValueReducer,
21
23
  setCustomFilterValue: setCustomFilterValueReducer,
24
+ addDiagnosticFilters: addDiagnosticFiltersReducer,
25
+ setDiagnosticFilterValues: setDiagnosticFilterValuesReducer,
22
26
  },
23
27
  });
@@ -3,14 +3,11 @@ import { customElement } from "lit/decorators.js";
3
3
  import { connectedProperty } from "../../../../infrastructure/state/connected-property";
4
4
  import { IActivityHistoryGroup } from "../../../domain/model";
5
5
  import { activityHistorySearchStringSelector } from "../../../search/selectors";
6
- import {
7
- isAnyCollectionLoadingWithoutAnyLoaded,
8
- isSomeCollectionLoadedAndOtherLoading,
9
- } from "../../handle-busy/selectors";
10
6
  import { activityHistoryGroupedItems } from "../../../selectors";
11
7
  import styles from "./styles.css?inline";
12
8
  import { template } from "./template";
13
9
  import { unsafeHTML } from "lit/directives/unsafe-html.js";
10
+ import { isAnyCollectionLoadingWithoutAnyLoaded, isSomeCollectionLoadedAndOtherLoading } from "../../../add/handle-busy/selectors";
14
11
 
15
12
  const createZIndexStyles = (max: number) => {
16
13
  let styles = "";
@@ -25,6 +25,8 @@ export const template = (props: ActivityHistoryTimeline) => {
25
25
  }
26
26
  return html`
27
27
  <div class="container">
28
+ <activity-history-full-data-error></activity-history-full-data-error>
29
+ <activity-history-partial-data-error></activity-history-partial-data-error>
28
30
  ${
29
31
  props.historyGroups?.length > 0
30
32
  ? html`
@@ -32,7 +34,7 @@ export const template = (props: ActivityHistoryTimeline) => {
32
34
  ${virtualize({
33
35
  items: props.historyGroups,
34
36
  renderItem: (itemGroup: IActivityHistoryGroup, index: number) => html`
35
- <div class="visit zIndex${props.historyGroups.length - index}" data-date=${ifDefined(itemGroup.items[0]?.date || itemGroup.subGroups[0]?.items[0]?.date)}>
37
+ <div class="visit zIndex${props.historyGroups.length - index}" data-date=${ifDefined(itemGroup?.items[0]?.date || itemGroup.subGroups[0]?.items[0]?.date)}>
36
38
  ${visitHeaderTemplate(props, itemGroup.items[0] || itemGroup.subGroups[0]?.items[0])}
37
39
  <div class="visit__items">
38
40
  ${repeat(
@@ -111,11 +113,12 @@ const visitHeaderTemplate = (
111
113
  };
112
114
 
113
115
  const renderProfessionalValues = (props: ActivityHistoryTimeline, item: IActivityHistoryItem) => {
116
+ if(!item.professional) return nothing;
114
117
  const showRole = shouldShowRole(item);
115
118
  const professionalItems = [
116
119
  props.highlighted(item.professional.name),
117
120
  showRole ? props.highlighted(item.professional.role.description) : null,
118
- props.highlighted(item.up.description) ?? props.highlighted(item.center.description),
121
+ props.highlighted(item.up.description),
119
122
  props.highlighted(item.professional.speciality.description),
120
123
  props.highlighted(item.service.description),
121
124
  ].filter(Boolean);
@@ -1,6 +1,9 @@
1
1
  import "./UI/timeline/activity-history-timeline";
2
2
  import "../filter/UI/active-filters-header/active-filters-header";
3
+ import "../add/handle-error/history-full-data-error/component";
4
+ import "../add/handle-error/history-partial-data-error/component";
5
+
3
6
 
4
7
  export const bootstrapListActivityHistoryItems = () => {
5
8
  () => null;
6
- };
9
+ }