@uxland/primary-shell 5.1.2 → 5.2.1

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 (112) hide show
  1. package/dist/index.js +27064 -26699
  2. package/dist/index.js.map +1 -1
  3. package/dist/index.umd.cjs +1660 -1531
  4. package/dist/index.umd.cjs.map +1 -1
  5. package/dist/primary/shell/src/UI/bootstrapper.d.ts +1 -0
  6. package/dist/primary/shell/src/UI/components/bootstrapper.d.ts +1 -0
  7. package/dist/primary/shell/src/UI/components/{shell-header → primaria-shell/shell-header}/shell-header.d.ts +3 -3
  8. package/dist/primary/shell/src/UI/components/primaria-shell/shell-header/template.d.ts +3 -0
  9. package/dist/primary/shell/src/UI/index.d.ts +0 -1
  10. package/dist/primary/shell/src/UI/shared-components/bootstrapper.d.ts +1 -0
  11. package/dist/primary/shell/src/UI/shared-components/index.d.ts +0 -1
  12. package/dist/primary/shell/src/UI/shared-components/primaria-character-limit-badge/primaria-character-limit-badge.d.ts +9 -0
  13. package/dist/primary/shell/src/api/api.d.ts +4 -4
  14. package/dist/primary/shell/src/api/ecap-event-manager/ecap-event-manager.test.d.ts +1 -0
  15. package/dist/primary/shell/src/api/notification-service/notification-service-impl.test.d.ts +1 -0
  16. package/dist/primary/shell/src/api/pdf-viewer-manager/constants.d.ts +1 -0
  17. package/dist/primary/shell/src/api/pdf-viewer-manager/handle-views.d.ts +2 -0
  18. package/dist/primary/shell/src/api/pdf-viewer-manager/pdf-viewer-manager.d.ts +2 -4
  19. package/dist/primary/shell/src/api/pdf-viewer-manager/pdf-viewer-manager.test.d.ts +1 -0
  20. package/dist/primary/shell/src/api/region-manager/region-manager.test.d.ts +1 -0
  21. package/dist/primary/shell/src/bootstrapper.d.ts +0 -1
  22. package/dist/primary/shell/src/constants.d.ts +0 -2
  23. package/dist/primary/shell/src/features/bootstrapper.d.ts +2 -2
  24. package/dist/primary/shell/src/features/clinical-monitoring/bootstrapper.d.ts +4 -0
  25. package/dist/primary/shell/src/features/clinical-monitoring/constants.d.ts +1 -0
  26. package/dist/primary/shell/src/features/clinical-monitoring/handle-views.d.ts +1 -0
  27. package/dist/primary/shell/src/features/exit/bootstrapper.d.ts +4 -2
  28. package/dist/primary/shell/src/features/exit/handler.test.d.ts +1 -0
  29. package/dist/primary/shell/src/features/get-patient-cip/action.d.ts +3 -0
  30. package/dist/primary/shell/src/features/get-user-info/bootstrapper.d.ts +4 -2
  31. package/dist/primary/shell/src/features/get-user-info/handler.d.ts +1 -1
  32. package/dist/primary/shell/src/features/get-user-info/handler.test.d.ts +1 -0
  33. package/dist/primary/shell/src/features/navigate-to-ecap/navigate-without-closing-and-with-cip.d.ts +1 -0
  34. package/dist/primary/shell/src/handle-views.d.ts +1 -2
  35. package/dist/primary/shell/src/internal-plugins/activity-history/utils/get-unique-values-by-prop-path.test.d.ts +1 -0
  36. package/dist/primary/shell/src/internal-plugins/activity-history/utils/normalize-string.d.ts +1 -1
  37. package/dist/primary/shell/src/internal-plugins/activity-history/utils/normalize-string.test.d.ts +1 -0
  38. package/dist/primary/shell/src/internal-plugins/activity-history/utils/prop-contains-string.test.d.ts +1 -0
  39. package/dist/primary/shell/src/locales.d.ts +1 -1
  40. package/package.json +2 -2
  41. package/src/UI/bootstrapper.ts +12 -0
  42. package/src/UI/components/bootstrapper.ts +17 -0
  43. package/src/UI/components/{primaria-error-view → error-view}/component.ts +2 -3
  44. package/src/UI/components/poc-events-ecap/poc-events-ecap.ts +3 -7
  45. package/src/UI/components/primaria-shell/primaria-shell.ts +8 -10
  46. package/src/UI/components/{shell-header → primaria-shell/shell-header}/shell-header.ts +8 -9
  47. package/src/UI/components/{shell-header → primaria-shell/shell-header}/template.ts +4 -4
  48. package/src/UI/components/primaria-shell/template.ts +14 -8
  49. package/src/UI/components/quick-actions-menu/quick-actions-menu.ts +0 -2
  50. package/src/UI/index.ts +0 -1
  51. package/src/UI/shared-components/bootstrapper.ts +14 -0
  52. package/src/UI/shared-components/index.ts +0 -3
  53. package/src/UI/shared-components/primaria-character-limit-badge/primaria-character-limit-badge.ts +29 -0
  54. package/src/UI/shared-components/primaria-character-limit-badge/styles.css +8 -0
  55. package/src/UI/shared-components/primaria-content-switcher/primaria-content-switcher.ts +1 -2
  56. package/src/UI/shared-components/primaria-nav-item/primaria-nav-item.ts +6 -7
  57. package/src/UI/shared-components/primaria-nav-tree-menu/primaria-nav-tree-menu.ts +3 -4
  58. package/src/UI/shared-components/primaria-text-editor/primaria-rich-text-editor.ts +1 -2
  59. package/src/api/api.ts +17 -14
  60. package/src/api/ecap-event-manager/ecap-event-manager.test.ts +48 -0
  61. package/src/api/notification-service/notification-service-impl.test.ts +56 -0
  62. package/src/api/pdf-viewer-manager/constants.ts +1 -0
  63. package/src/api/pdf-viewer-manager/handle-views.ts +32 -0
  64. package/src/api/pdf-viewer-manager/pdf-viewer-manager.test.ts +99 -0
  65. package/src/api/pdf-viewer-manager/pdf-viewer-manager.ts +15 -25
  66. package/src/{UI/components → api/pdf-viewer-manager}/pdf-visor/pdf-selector/pdf-selector.ts +3 -4
  67. package/src/{UI/components → api/pdf-viewer-manager}/pdf-visor/pdf-visor.ts +8 -9
  68. package/src/api/plugin-busy-manager/plugin-busy-list/component.ts +0 -2
  69. package/src/api/plugin-busy-manager/plugin-busy-manager.ts +7 -1
  70. package/src/api/region-manager/region-manager.test.ts +123 -0
  71. package/src/bootstrapper.ts +8 -9
  72. package/src/constants.ts +0 -2
  73. package/src/disposer.ts +2 -2
  74. package/src/features/bootstrapper.ts +14 -8
  75. package/src/features/clinical-monitoring/bootstrapper.ts +39 -0
  76. package/src/{UI/components/clinical-monitoring → features/clinical-monitoring/component}/clinical-monitoring.ts +3 -6
  77. package/src/features/clinical-monitoring/constants.ts +1 -0
  78. package/src/features/clinical-monitoring/handle-views.ts +6 -0
  79. package/src/features/exit/bootstrapper.ts +5 -5
  80. package/src/features/exit/handler.test.ts +103 -0
  81. package/src/features/get-patient-cip/action.ts +5 -0
  82. package/src/features/get-user-info/bootstrapper.ts +5 -5
  83. package/src/features/get-user-info/handler.test.ts +60 -0
  84. package/src/features/get-user-info/handler.ts +2 -4
  85. package/src/features/navigate-to-ecap/navigate-without-closing-and-with-cip.ts +7 -0
  86. package/src/handle-views.ts +78 -142
  87. package/src/internal-plugins/activity-history/utils/get-unique-values-by-prop-path.test.ts +61 -0
  88. package/src/internal-plugins/activity-history/utils/get-unique-values-by-prop-path.ts +2 -2
  89. package/src/internal-plugins/activity-history/utils/normalize-string.test.ts +29 -0
  90. package/src/internal-plugins/activity-history/utils/normalize-string.ts +5 -3
  91. package/src/internal-plugins/activity-history/utils/prop-contains-string.test.ts +47 -0
  92. package/src/locales.ts +1 -1
  93. package/dist/primary/shell/src/UI/components/index.d.ts +0 -1
  94. package/dist/primary/shell/src/UI/components/shell-header/template.d.ts +0 -3
  95. package/src/UI/components/index.ts +0 -7
  96. /package/dist/primary/shell/src/UI/components/{primaria-error-view → error-view}/component.d.ts +0 -0
  97. /package/dist/primary/shell/src/UI/components/{primaria-error-view → error-view}/template.d.ts +0 -0
  98. /package/dist/primary/shell/src/{UI/components → api/pdf-viewer-manager}/pdf-visor/pdf-selector/pdf-selector.d.ts +0 -0
  99. /package/dist/primary/shell/src/{UI/components → api/pdf-viewer-manager}/pdf-visor/pdf-selector/template.d.ts +0 -0
  100. /package/dist/primary/shell/src/{UI/components → api/pdf-viewer-manager}/pdf-visor/pdf-visor.d.ts +0 -0
  101. /package/dist/primary/shell/src/{UI/components → api/pdf-viewer-manager}/pdf-visor/utils.d.ts +0 -0
  102. /package/dist/primary/shell/src/{UI/components/clinical-monitoring → features/clinical-monitoring/component}/clinical-monitoring.d.ts +0 -0
  103. /package/dist/primary/shell/src/{UI/components/clinical-monitoring → features/clinical-monitoring/component}/template.d.ts +0 -0
  104. /package/src/UI/components/{primaria-error-view → error-view}/styles.css +0 -0
  105. /package/src/UI/components/{primaria-error-view → error-view}/template.ts +0 -0
  106. /package/src/UI/components/{shell-header → primaria-shell/shell-header}/styles.css +0 -0
  107. /package/src/{UI/components → api/pdf-viewer-manager}/pdf-visor/pdf-selector/styles.css +0 -0
  108. /package/src/{UI/components → api/pdf-viewer-manager}/pdf-visor/pdf-selector/template.ts +0 -0
  109. /package/src/{UI/components → api/pdf-viewer-manager}/pdf-visor/styles.css +0 -0
  110. /package/src/{UI/components → api/pdf-viewer-manager}/pdf-visor/utils.ts +0 -0
  111. /package/src/{UI/components/clinical-monitoring → features/clinical-monitoring/component}/styles.css +0 -0
  112. /package/src/{UI/components/clinical-monitoring → features/clinical-monitoring/component}/template.ts +0 -0
@@ -0,0 +1,39 @@
1
+ import { customElement } from "lit/decorators.js";
2
+ import { PrimariaApi } from "../../api/api";
3
+ import { shellRegions } from "../../api/region-manager/regions";
4
+ import { clinicalMonitoringId } from "./constants";
5
+ import { ClinicalMonitoring } from "./component/clinical-monitoring";
6
+ import { shellEvents } from "../../events";
7
+ import { PrimariaNavItem } from "../../UI/shared-components/primaria-nav-item/primaria-nav-item";
8
+
9
+ export const useClinicalMonitoring = (api: PrimariaApi) => {
10
+ //@ts-ignore
11
+ customElement("clinical-monitoring")(ClinicalMonitoring);
12
+ api.regionManager.registerMainView({
13
+ id: clinicalMonitoringId,
14
+ factory: () => {
15
+ const mainItem = new ClinicalMonitoring();
16
+ return Promise.resolve(mainItem as unknown as HTMLElement);
17
+ },
18
+ isDefault: true,
19
+ });
20
+ api.regionManager.registerView(shellRegions.navigationMenu, {
21
+ id: clinicalMonitoringId,
22
+ factory: () => {
23
+ const menuItem = new PrimariaNavItem({
24
+ icon: "account_box",
25
+ label: "Seguiment clínic",
26
+ callbackFn: () => {
27
+ api.regionManager.activateMainView(clinicalMonitoringId);
28
+ api.broker.publish(shellEvents.openClinicalMonitoringRequested);
29
+ },
30
+ });
31
+ return Promise.resolve(menuItem);
32
+ },
33
+ sortHint: "000200",
34
+ });
35
+ };
36
+
37
+ export const disposeClinicalMonitoring = (api: PrimariaApi) => {
38
+ api.regionManager.removeView(shellRegions.main, clinicalMonitoringId);
39
+ };
@@ -1,13 +1,10 @@
1
+ import { IRegion, region } from "@uxland/regions";
1
2
  import { LitElement, css, html, unsafeCSS } from "lit";
2
- import { customElement } from "lit/decorators.js";
3
- import styles from "./styles.css?inline";
4
- import { template } from "./template";
5
3
  import { PrimariaRegionHost } from "../../../api/api";
6
- import { IRegion, region } from "@uxland/regions";
7
4
  import { clinicalMonitoringRegions } from "../../../api/region-manager/regions";
5
+ import styles from "./styles.css?inline";
6
+ import { template } from "./template";
8
7
 
9
- //@ts-ignore
10
- @customElement("clinical-monitoring")
11
8
  export class ClinicalMonitoring extends PrimariaRegionHost(LitElement) {
12
9
  render() {
13
10
  return html`${template(this)}`;
@@ -0,0 +1 @@
1
+ export const clinicalMonitoringId = "clinical-monitoring";
@@ -0,0 +1,6 @@
1
+ import { shellApi } from "../../api/api";
2
+ import { clinicalMonitoringId } from "./constants";
3
+
4
+ export const activateClinicalMonitoringView = () => {
5
+ shellApi.regionManager.activateMainView(clinicalMonitoringId);
6
+ };
@@ -1,4 +1,4 @@
1
- import { shellApi } from "../../api/api";
1
+ import { PrimariaApi } from "../../api/api";
2
2
  import { BrokerDisposableHandler } from "../../api/broker/primaria-broker";
3
3
  import { container } from "../../infrastructure/ioc/container";
4
4
  import { registerRequest } from "../utils";
@@ -7,11 +7,11 @@ import { ExitShell } from "./request";
7
7
 
8
8
  let request: BrokerDisposableHandler;
9
9
 
10
- export const bootstrapExitShell = () => {
11
- teardownExitShell();
12
- request = registerRequest(shellApi, container)(ExitShell, ExitShellHandler);
10
+ export const useExitShell = (api: PrimariaApi) => {
11
+ disposeExitShell();
12
+ request = registerRequest(api, container)(ExitShell, ExitShellHandler);
13
13
  };
14
14
 
15
- export const teardownExitShell = () => {
15
+ export const disposeExitShell = () => {
16
16
  request?.dispose();
17
17
  };
@@ -0,0 +1,103 @@
1
+ import { describe, it, expect, vi, beforeEach } from "vitest";
2
+ import { ExitShellHandler } from "./handler";
3
+ import { ExitShell } from "./request";
4
+ import { disposePlugins } from "../../handle-plugins";
5
+ import { disposeShell, raiseCloseEvent } from "../../disposer";
6
+ import { PluginBusyTask } from "../../api/plugin-busy-manager/plugin-busy-manager";
7
+ import { PrimariaApi } from "@uxland/primary-shell";
8
+
9
+ vi.mock("../../handle-plugins", () => ({
10
+ disposePlugins: vi.fn(),
11
+ }));
12
+
13
+ vi.mock("../../disposer", () => ({
14
+ disposeShell: vi.fn(),
15
+ raiseCloseEvent: vi.fn(),
16
+ }));
17
+
18
+ const createMockApi = (): PrimariaApi =>
19
+ ({
20
+ pluginBusyManager: {
21
+ getBusyPluginTasks: vi.fn(),
22
+ },
23
+ interactionService: {
24
+ confirm: vi.fn(),
25
+ },
26
+ notificationService: {
27
+ error: vi.fn(),
28
+ },
29
+ }) as any;
30
+
31
+ describe("ExitShellHandler", () => {
32
+ let handler: ExitShellHandler;
33
+ let mockApi: PrimariaApi;
34
+ const message = {} as ExitShell;
35
+
36
+ beforeEach(() => {
37
+ mockApi = createMockApi();
38
+ handler = new ExitShellHandler(mockApi);
39
+ vi.clearAllMocks();
40
+ });
41
+
42
+ it("should dispose and raise close event if no busy tasks", async () => {
43
+ mockApi.pluginBusyManager.getBusyPluginTasks = vi.fn().mockReturnValue([]);
44
+ (disposePlugins as any).mockResolvedValue(undefined);
45
+
46
+ await handler.handle(message);
47
+
48
+ expect(disposePlugins).toHaveBeenCalled();
49
+ expect(disposeShell).toHaveBeenCalled();
50
+ expect(raiseCloseEvent).toHaveBeenCalled();
51
+ });
52
+
53
+ it("should ask for confirmation if there are busy tasks", async () => {
54
+ const busyTasks: PluginBusyTask[] = [{ pluginId: "x" }] as any;
55
+ mockApi.pluginBusyManager.getBusyPluginTasks = vi.fn().mockReturnValue(busyTasks);
56
+ mockApi.interactionService.confirm = vi.fn().mockResolvedValue({ confirmed: true });
57
+ (disposePlugins as any).mockResolvedValue(undefined);
58
+
59
+ await handler.handle(message);
60
+
61
+ expect(mockApi.interactionService.confirm).toHaveBeenCalled();
62
+ expect(disposePlugins).toHaveBeenCalled();
63
+ expect(disposeShell).toHaveBeenCalled();
64
+ expect(raiseCloseEvent).toHaveBeenCalled();
65
+ });
66
+
67
+ it("should not continue if confirmation is declined", async () => {
68
+ const busyTasks: PluginBusyTask[] = [{ pluginId: "x" }] as any;
69
+ mockApi.pluginBusyManager.getBusyPluginTasks = vi.fn().mockReturnValue(busyTasks);
70
+ mockApi.interactionService.confirm = vi.fn().mockResolvedValue({ confirmed: false });
71
+
72
+ await handler.handle(message);
73
+
74
+ expect(mockApi.interactionService.confirm).toHaveBeenCalled();
75
+ expect(disposePlugins).not.toHaveBeenCalled();
76
+ expect(disposeShell).not.toHaveBeenCalled();
77
+ expect(raiseCloseEvent).not.toHaveBeenCalled();
78
+ });
79
+
80
+ it("should handle errors and raise close event", async () => {
81
+ const error = new Error("Something went wrong");
82
+ mockApi.pluginBusyManager.getBusyPluginTasks = vi.fn().mockReturnValue([]);
83
+ (disposePlugins as any).mockRejectedValue(error);
84
+
85
+ await handler.handle(message);
86
+
87
+ expect(mockApi.notificationService.error).toHaveBeenCalledWith("Something went wrong");
88
+ expect(raiseCloseEvent).toHaveBeenCalled();
89
+ });
90
+
91
+ it("should proceed if disposePlugins takes longer than 5 seconds", async () => {
92
+ mockApi.pluginBusyManager.getBusyPluginTasks = vi.fn().mockReturnValue([]);
93
+ (disposePlugins as any).mockImplementation(
94
+ () => new Promise((resolve) => setTimeout(resolve, 6000)),
95
+ );
96
+
97
+ await handler.handle(message);
98
+
99
+ expect(disposePlugins).toHaveBeenCalled();
100
+ expect(disposeShell).toHaveBeenCalled();
101
+ expect(raiseCloseEvent).toHaveBeenCalled();
102
+ });
103
+ });
@@ -0,0 +1,5 @@
1
+ import { PrimariaApi } from "@uxland/primary-shell";
2
+
3
+ export const getPatientCip = async (api: PrimariaApi): Promise<string> => {
4
+ return (await api.broker.send("get_patient_cip")) as string;
5
+ };
@@ -1,4 +1,4 @@
1
- import { shellApi } from "../../api/api";
1
+ import { PrimariaApi, shellApi } from "../../api/api";
2
2
  import { BrokerDisposableHandler } from "../../api/broker/primaria-broker";
3
3
  import { container, registerDep, unregisterDep } from "../../infrastructure/ioc/container";
4
4
  import { registerRequest } from "../utils";
@@ -8,13 +8,13 @@ import { GetUserInfo } from "./request";
8
8
 
9
9
  let request: BrokerDisposableHandler;
10
10
 
11
- export const bootstrapGetUserInfo = () => {
12
- teardownGetUserInfo();
13
- request = registerRequest(shellApi, container)(GetUserInfo, GetUserInfoHandler);
11
+ export const useGetUserInfo = (api: PrimariaApi) => {
12
+ disposeGetUserInfo();
13
+ request = registerRequest(api, container)(GetUserInfo, GetUserInfoHandler);
14
14
  registerDep(GetUserInfoBackendAdapter);
15
15
  };
16
16
 
17
- export const teardownGetUserInfo = () => {
17
+ export const disposeGetUserInfo = () => {
18
18
  request?.dispose();
19
19
  unregisterDep(GetUserInfoBackendAdapter);
20
20
  };
@@ -0,0 +1,60 @@
1
+ import { describe, it, expect, vi, beforeEach } from "vitest";
2
+ import { GetUserInfoHandler } from "./handler";
3
+ import { GetUserInfo } from "./request";
4
+ import { IUserInfo } from "./model";
5
+ import { UserInfoBackendAdapter } from "./backend-adapter";
6
+ import { PrimariaApi } from "../../api/api";
7
+
8
+ const createMockApi = (): PrimariaApi =>
9
+ ({
10
+ globalStateManager: {
11
+ setData: vi.fn(),
12
+ },
13
+ notificationService: {
14
+ error: vi.fn(),
15
+ },
16
+ }) as any;
17
+
18
+ const createMockBackendAdapter = (): UserInfoBackendAdapter =>
19
+ ({
20
+ getUserInfo: vi.fn(),
21
+ }) as any;
22
+
23
+ describe("GetUserInfoHandler", () => {
24
+ let handler: GetUserInfoHandler;
25
+ let api: PrimariaApi;
26
+ let backendAdapter: UserInfoBackendAdapter;
27
+
28
+ const message = {} as GetUserInfo;
29
+ const mockUserInfo: IUserInfo = {
30
+ name: "John Doe",
31
+ email: "john@example.com",
32
+ };
33
+
34
+ beforeEach(() => {
35
+ api = createMockApi();
36
+ backendAdapter = createMockBackendAdapter();
37
+ handler = new GetUserInfoHandler(api, backendAdapter);
38
+ vi.clearAllMocks();
39
+ });
40
+
41
+ it("should fetch user info and store it in global state", async () => {
42
+ (backendAdapter.getUserInfo as any).mockResolvedValue(mockUserInfo);
43
+
44
+ const result = await handler.handle(message);
45
+
46
+ expect(backendAdapter.getUserInfo).toHaveBeenCalled();
47
+ expect(api.globalStateManager.setData).toHaveBeenCalledWith("userInfo", mockUserInfo);
48
+ expect(result).toEqual(mockUserInfo);
49
+ });
50
+
51
+ it("should handle error and call notificationService", async () => {
52
+ const error = new Error("Failed to fetch user info");
53
+ (backendAdapter.getUserInfo as any).mockRejectedValue(error);
54
+
55
+ const result = await handler.handle(message);
56
+
57
+ expect(api.notificationService.error).toHaveBeenCalledWith("Failed to fetch user info");
58
+ expect(result).toBeUndefined();
59
+ });
60
+ });
@@ -1,10 +1,10 @@
1
- import { PrimariaApi } from "@uxland/primary-shell";
2
1
  import { TYPES } from "../../infrastructure/ioc/types";
3
2
  import { inject } from "inversify";
4
3
  import { GetUserInfo } from "./request";
5
4
  import { IUserInfo } from "./model";
6
5
  import { UserInfoBackendAdapter } from "./backend-adapter";
7
6
  import { GetUserInfoBackendAdapter } from "./backend-adapter";
7
+ import { PrimariaApi } from "../../api/api";
8
8
 
9
9
  export class GetUserInfoHandler {
10
10
  constructor(
@@ -17,9 +17,7 @@ export class GetUserInfoHandler {
17
17
  this.api.globalStateManager.setData("userInfo", userInfo);
18
18
  return userInfo;
19
19
  } catch (error) {
20
- this.api.notificationService.error(
21
- error.message,
22
- );
20
+ this.api.notificationService.error(error.message);
23
21
  }
24
22
  }
25
23
  }
@@ -0,0 +1,7 @@
1
+ import { shellApi } from "../../api/api";
2
+ import { getPatientCip } from "../get-patient-cip/action";
3
+
4
+ export const navigateToEcapWithoutClosingWithCip = async (eventName: string) => {
5
+ const CIP = await getPatientCip(shellApi);
6
+ shellApi.ecapEventManager.publish(eventName, "NO_TANCAR", { CIP });
7
+ };