@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.
- package/dist/index.js +1432 -1422
- package/dist/index.js.map +1 -1
- package/dist/index.umd.cjs +7 -7
- package/dist/index.umd.cjs.map +1 -1
- package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/domain/validation/is-valid-basic-history-item.d.ts +5 -0
- package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/domain/validation/is-valid-full-history-item.d.ts +5 -0
- package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/domain/validation/is-valid-full-history-item.test.d.ts +1 -0
- package/dist/primary/shell/src/internal-plugins/activity-history/utils/get-unique-values-by-prop-path.d.ts +1 -1
- package/package.json +1 -1
- package/src/UI/components/primaria-shell/shell-header/styles.css +1 -0
- package/src/UI/internal-views/upper-nav-views.ts +0 -8
- package/src/internal-plugins/activity-history/activity-history-item/add/add-history-item/handler.ts +2 -2
- package/src/internal-plugins/activity-history/activity-history-item/add/add-history-items/handler.ts +2 -2
- package/src/internal-plugins/activity-history/activity-history-item/domain/business-rules.ts +1 -1
- package/src/internal-plugins/activity-history/activity-history-item/domain/validation/is-valid-basic-history-item.test.ts +63 -0
- package/src/internal-plugins/activity-history/activity-history-item/domain/validation/is-valid-basic-history-item.ts +43 -0
- 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
- 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
- package/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/handle-add-diagnostics-options-from-item.ts +1 -0
- package/src/internal-plugins/activity-history/activity-history-item/list/UI/timeline/template.ts +2 -1
- package/src/internal-plugins/activity-history/activity-history-item/list/group-history-items/group-history-items.test.ts +71 -215
- package/src/internal-plugins/activity-history/activity-history-item/list/group-history-items/group-history-items.ts +24 -1
- package/src/internal-plugins/activity-history/activity-history-item/selectors.ts +1 -0
- package/src/internal-plugins/activity-history/activity-history-item/update/handler.ts +2 -2
- package/src/internal-plugins/activity-history/utils/get-unique-values-by-prop-path.test.ts +55 -30
- package/src/internal-plugins/activity-history/utils/get-unique-values-by-prop-path.ts +30 -10
- 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
- /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[];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -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
|
@@ -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",
|
package/src/internal-plugins/activity-history/activity-history-item/add/add-history-item/handler.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { StoreBaseHandler } from "../../../infrastructure/base-handlers";
|
|
2
|
-
import {
|
|
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
|
-
|
|
10
|
+
ensureAreValidBasicActivityHistoryItems([payload.item]);
|
|
11
11
|
this.store.dispatch(
|
|
12
12
|
addActivityHistoryItem({
|
|
13
13
|
id: payload.entityId,
|
package/src/internal-plugins/activity-history/activity-history-item/add/add-history-items/handler.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { StoreBaseHandler } from "../../../infrastructure/base-handlers";
|
|
2
|
-
import {
|
|
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 =
|
|
10
|
+
const validItems = validateAndFilterBasicItems(payload.items);
|
|
11
11
|
this.store.dispatch(
|
|
12
12
|
addActivityHistoryItems({
|
|
13
13
|
id: payload.entityId,
|
|
@@ -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 {
|
|
2
|
+
import { isValidFullActivityHistoryItem } from "./is-valid-full-history-item";
|
|
3
3
|
|
|
4
|
-
describe("
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
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
|
|
66
|
-
const areValid = items.every(
|
|
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
|
|
77
|
+
export const validateAndFilterFullItems = (items: IActivityHistoryItem[]) => {
|
|
79
78
|
const validItems = [] as IActivityHistoryItem[];
|
|
80
79
|
for (const item of items) {
|
|
81
|
-
if (
|
|
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) {
|
package/src/internal-plugins/activity-history/activity-history-item/list/UI/timeline/template.ts
CHANGED
|
@@ -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
|
|
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),
|