@uxland/primary-shell 5.3.8 → 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 (28) hide show
  1. package/dist/index.js +1432 -1422
  2. package/dist/index.js.map +1 -1
  3. package/dist/index.umd.cjs +7 -7
  4. package/dist/index.umd.cjs.map +1 -1
  5. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/domain/validation/is-valid-basic-history-item.d.ts +5 -0
  6. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/domain/validation/is-valid-full-history-item.d.ts +5 -0
  7. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/domain/validation/is-valid-full-history-item.test.d.ts +1 -0
  8. package/dist/primary/shell/src/internal-plugins/activity-history/utils/get-unique-values-by-prop-path.d.ts +1 -1
  9. package/package.json +1 -1
  10. package/src/UI/components/primaria-shell/shell-header/styles.css +1 -0
  11. package/src/UI/internal-views/upper-nav-views.ts +0 -8
  12. package/src/internal-plugins/activity-history/activity-history-item/add/add-history-item/handler.ts +2 -2
  13. package/src/internal-plugins/activity-history/activity-history-item/add/add-history-items/handler.ts +2 -2
  14. package/src/internal-plugins/activity-history/activity-history-item/domain/business-rules.ts +1 -1
  15. package/src/internal-plugins/activity-history/activity-history-item/domain/validation/is-valid-basic-history-item.test.ts +63 -0
  16. package/src/internal-plugins/activity-history/activity-history-item/domain/validation/is-valid-basic-history-item.ts +43 -0
  17. 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
  18. 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
  19. package/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/handle-add-diagnostics-options-from-item.ts +1 -0
  20. package/src/internal-plugins/activity-history/activity-history-item/list/UI/timeline/template.ts +2 -1
  21. package/src/internal-plugins/activity-history/activity-history-item/list/group-history-items/group-history-items.test.ts +71 -215
  22. package/src/internal-plugins/activity-history/activity-history-item/list/group-history-items/group-history-items.ts +24 -1
  23. package/src/internal-plugins/activity-history/activity-history-item/selectors.ts +1 -0
  24. package/src/internal-plugins/activity-history/activity-history-item/update/handler.ts +2 -2
  25. package/src/internal-plugins/activity-history/utils/get-unique-values-by-prop-path.test.ts +55 -30
  26. package/src/internal-plugins/activity-history/utils/get-unique-values-by-prop-path.ts +30 -10
  27. 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
  28. /package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/domain/{is-valid-history-item/is-valid-history-item.test.d.ts → validation/is-valid-basic-history-item.test.d.ts} +0 -0
@@ -0,0 +1,5 @@
1
+ import { IActivityHistoryItem } from '../model';
2
+
3
+ export declare const isValidBasicActivityHistoryItem: (obj: IActivityHistoryItem) => boolean;
4
+ export declare const ensureAreValidBasicActivityHistoryItems: (items: IActivityHistoryItem[]) => IActivityHistoryItem[];
5
+ export declare const validateAndFilterBasicItems: (items: IActivityHistoryItem[]) => IActivityHistoryItem[];
@@ -0,0 +1,5 @@
1
+ import { IActivityHistoryItem } from '../model';
2
+
3
+ export declare const isValidFullActivityHistoryItem: (obj: IActivityHistoryItem) => any;
4
+ export declare const ensureAreValidFullActivityHistoryItems: (items: IActivityHistoryItem[]) => IActivityHistoryItem[];
5
+ export declare const validateAndFilterFullItems: (items: IActivityHistoryItem[]) => IActivityHistoryItem[];
@@ -1,4 +1,4 @@
1
- export declare function getUniqueObjects<T>(items: T[], propPathId: string[], propPathDescription: string[]): {
1
+ export declare function getUniqueObjects<T>(items: T[], propPathId: string[], propPathDescription: string[], filterTitle: string): {
2
2
  id: string;
3
3
  title: string;
4
4
  }[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uxland/primary-shell",
3
- "version": "5.3.8",
3
+ "version": "5.3.9",
4
4
  "description": "Primaria Shell",
5
5
  "author": "UXLand <dev@uxland.es>",
6
6
  "homepage": "https://github.com/uxland/harmonix/tree/app#readme",
@@ -27,6 +27,7 @@
27
27
  display: flex;
28
28
  flex-direction: row;
29
29
  align-items: center;
30
+ gap: 24px;
30
31
  }
31
32
  }
32
33
 
@@ -37,14 +37,6 @@ const upperNavMenuItems: MenuItemConfig[] = [
37
37
  sortHint: "0010",
38
38
  callbackFn: () => shellApi.broker.send(new ExitShell("OBRIR_PI")),
39
39
  },
40
- {
41
- id: "dinamic-monitoring",
42
- icon: "poll",
43
- label: "Monitoratge dinàmic",
44
- type: "item",
45
- sortHint: "0030",
46
- callbackFn: () => navigateToEcapWithoutClosingWithCip("SIA_DEV"),
47
- },
48
40
  {
49
41
  id: "processes",
50
42
  icon: "account_tree",
@@ -1,5 +1,5 @@
1
1
  import { StoreBaseHandler } from "../../../infrastructure/base-handlers";
2
- import { ensureAreValidActivityHistoryItems } from "../../domain/is-valid-history-item/is-valid-history-item";
2
+ import { ensureAreValidBasicActivityHistoryItems } from "../../domain/validation/is-valid-basic-history-item";
3
3
  import { handleAddDiagnosticsFilter } from "../../filter/diagnostic-filters/handle-add-diagnostics-options-from-item";
4
4
  import { addActivityHistoryItem } from "./action";
5
5
  import { AddHistoryItemPayload } from "./request";
@@ -7,7 +7,7 @@ import { AddHistoryItemPayload } from "./request";
7
7
  export class AddHistoryItemHandler extends StoreBaseHandler {
8
8
  async handle(payload: AddHistoryItemPayload) {
9
9
  try {
10
- ensureAreValidActivityHistoryItems([payload.item]);
10
+ ensureAreValidBasicActivityHistoryItems([payload.item]);
11
11
  this.store.dispatch(
12
12
  addActivityHistoryItem({
13
13
  id: payload.entityId,
@@ -1,5 +1,5 @@
1
1
  import { StoreBaseHandler } from "../../../infrastructure/base-handlers";
2
- import { validateAndFilterItems } from "../../domain/is-valid-history-item/is-valid-history-item";
2
+ import { validateAndFilterBasicItems } from "../../domain/validation/is-valid-basic-history-item";
3
3
  import { handleAddDiagnosticsFilter } from "../../filter/diagnostic-filters/handle-add-diagnostics-options-from-item";
4
4
  import { addActivityHistoryItems } from "./action";
5
5
  import { AddHistoryItemsPayload } from "./request";
@@ -7,7 +7,7 @@ import { AddHistoryItemsPayload } from "./request";
7
7
  export class AddHistoryItemsHandler extends StoreBaseHandler {
8
8
  async handle(payload: AddHistoryItemsPayload) {
9
9
  try {
10
- const validItems = validateAndFilterItems(payload.items);
10
+ const validItems = validateAndFilterBasicItems(payload.items);
11
11
  this.store.dispatch(
12
12
  addActivityHistoryItems({
13
13
  id: payload.entityId,
@@ -20,5 +20,5 @@ export const hasItemDivider = (
20
20
  return true;
21
21
  }
22
22
 
23
- return !item.diagnostics.length;
23
+ return !item.diagnostics?.length;
24
24
  };
@@ -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;
@@ -7,6 +7,7 @@ import { addDiagnosticFilters } from "./add/actions";
7
7
  export const handleAddDiagnosticsFilter = (items: IActivityHistoryItem[], store: Store) => {
8
8
  const allDiagnostics = items
9
9
  .flatMap((item) => item.diagnostics ?? [])
10
+ .filter((diag) => typeof diag.codi === "string" && diag.codi.trim() !== "")
10
11
  .filter((diag, index, self) => index === self.findIndex((d) => d.codi === diag.codi));
11
12
 
12
13
  if (allDiagnostics.length > 0) {
@@ -34,7 +34,7 @@ export const template = (props: ActivityHistoryTimeline) => {
34
34
  ${virtualize({
35
35
  items: props.historyGroups,
36
36
  renderItem: (itemGroup: IActivityHistoryGroup, index: number) => html`
37
- <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)}>
38
38
  ${visitHeaderTemplate(props, itemGroup.items[0] || itemGroup.subGroups[0]?.items[0])}
39
39
  <div class="visit__items">
40
40
  ${repeat(
@@ -113,6 +113,7 @@ const visitHeaderTemplate = (
113
113
  };
114
114
 
115
115
  const renderProfessionalValues = (props: ActivityHistoryTimeline, item: IActivityHistoryItem) => {
116
+ if(!item.professional) return nothing;
116
117
  const showRole = shouldShowRole(item);
117
118
  const professionalItems = [
118
119
  props.highlighted(item.professional.name),