@uxland/primary-shell 5.3.3 → 5.3.4

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 (47) hide show
  1. package/dist/index.js +6321 -6227
  2. package/dist/index.js.map +1 -1
  3. package/dist/index.umd.cjs +444 -435
  4. package/dist/index.umd.cjs.map +1 -1
  5. package/dist/primary/shell/src/UI/internal-views/lower-nav-menu-views.d.ts +1 -0
  6. package/dist/primary/shell/src/UI/internal-views/upper-nav-views.d.ts +1 -0
  7. package/dist/primary/shell/src/features/get-user-info/backend-adapter.d.ts +1 -0
  8. package/dist/primary/shell/src/features/visit/finalize-visit/bootstrapper.d.ts +4 -0
  9. package/dist/primary/shell/src/features/visit/finalize-visit/component/finalize-visit-button.d.ts +9 -0
  10. package/dist/primary/shell/src/features/visit/finalize-visit/component/template.d.ts +3 -0
  11. package/dist/primary/shell/src/features/visit/finalize-visit/handler.d.ts +8 -0
  12. package/dist/primary/shell/src/features/visit/finalize-visit/request.d.ts +4 -0
  13. package/dist/primary/shell/src/features/visit/get-visit-id/bootstrapper.d.ts +4 -0
  14. package/dist/primary/shell/src/features/visit/get-visit-id/handler.d.ts +9 -0
  15. package/dist/primary/shell/src/features/visit/get-visit-id/request.d.ts +2 -0
  16. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/domain/business-rules.d.ts +2 -1
  17. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/domain/model.d.ts +9 -1
  18. package/dist/primary/shell/src/locales.d.ts +1 -0
  19. package/package.json +4 -4
  20. package/src/UI/bootstrapper.ts +2 -0
  21. package/src/UI/components/bootstrapper.ts +2 -0
  22. package/src/UI/components/primaria-shell/shell-header/template.ts +2 -1
  23. package/src/UI/internal-views/handle-views.ts +13 -0
  24. package/src/UI/internal-views/lower-nav-menu-views.ts +19 -0
  25. package/src/UI/internal-views/upper-nav-views.ts +200 -0
  26. package/src/bootstrapper.ts +0 -2
  27. package/src/features/bootstrapper.ts +6 -0
  28. package/src/features/get-user-info/backend-adapter.ts +14 -3
  29. package/src/features/visit/finalize-visit/bootstrapper.ts +17 -0
  30. package/src/features/visit/finalize-visit/component/finalize-visit-button.ts +36 -0
  31. package/src/features/visit/finalize-visit/component/template.ts +9 -0
  32. package/src/features/visit/finalize-visit/handler.ts +18 -0
  33. package/src/features/visit/finalize-visit/request.ts +3 -0
  34. package/src/features/visit/get-visit-id/bootstrapper.ts +17 -0
  35. package/src/features/visit/get-visit-id/handler.ts +27 -0
  36. package/src/features/visit/get-visit-id/request.ts +1 -0
  37. package/src/internal-plugins/activity-history/activity-history-item/domain/business-rules.ts +25 -1
  38. package/src/internal-plugins/activity-history/activity-history-item/domain/is-valid-history-item/is-valid-history-item.test.ts +48 -6
  39. package/src/internal-plugins/activity-history/activity-history-item/domain/is-valid-history-item/is-valid-history-item.ts +13 -7
  40. package/src/internal-plugins/activity-history/activity-history-item/domain/model.ts +10 -1
  41. package/src/internal-plugins/activity-history/activity-history-item/list/UI/timeline/activity-history-timeline.ts +20 -3
  42. package/src/internal-plugins/activity-history/activity-history-item/list/UI/timeline/styles.css +8 -4
  43. package/src/internal-plugins/activity-history/activity-history-item/list/UI/timeline/template.ts +10 -10
  44. package/src/internal-plugins/activity-history/activity-history-item/list/group-history-items/group-history-items.ts +7 -4
  45. package/src/locales.ts +1 -0
  46. package/src/handle-views.ts +0 -255
  47. /package/dist/primary/shell/src/{handle-views.d.ts → UI/internal-views/handle-views.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ export declare const registerLowerNavMenuViews: () => void;
@@ -0,0 +1 @@
1
+ export declare const registerUpperNavMenuViews: () => void;
@@ -8,4 +8,5 @@ export declare class GetUserInfoBackendAdapter implements UserInfoBackendAdapter
8
8
  private api;
9
9
  constructor(api: typeof shellApi);
10
10
  getUserInfo(): Promise<IUserInfo>;
11
+ getUserId(access_info: any): any;
11
12
  }
@@ -0,0 +1,4 @@
1
+ import { PrimariaApi } from '../../../api/api';
2
+
3
+ export declare const useFinalizeVisit: (api: PrimariaApi) => void;
4
+ export declare const disposeFinalizeVisit: () => void;
@@ -0,0 +1,9 @@
1
+ import { LitElement } from 'lit';
2
+
3
+ export declare class FinalizeVisitButton extends LitElement {
4
+ render(): import('lit').TemplateResult<1>;
5
+ connectedCallback(): void;
6
+ visitId: string | undefined;
7
+ getVisitId(): Promise<void>;
8
+ finalizeVisitHandler(): void;
9
+ }
@@ -0,0 +1,3 @@
1
+ import { FinalizeVisitButton } from './finalize-visit-button';
2
+
3
+ export declare const template: (props: FinalizeVisitButton) => import('lit').TemplateResult<1>;
@@ -0,0 +1,8 @@
1
+ import { PrimariaApi } from '../../../api/api';
2
+ import { FinalizeVisit } from './request';
3
+
4
+ export declare class FinalizeVisitHandler {
5
+ private api;
6
+ constructor(api: PrimariaApi);
7
+ handle(data: FinalizeVisit): Promise<void>;
8
+ }
@@ -0,0 +1,4 @@
1
+ export declare class FinalizeVisit {
2
+ visitId: string;
3
+ constructor(visitId: string);
4
+ }
@@ -0,0 +1,4 @@
1
+ import { PrimariaApi } from '../../../api/api';
2
+
3
+ export declare const useGetVisitId: (api: PrimariaApi) => void;
4
+ export declare const disposeGetVisitId: () => void;
@@ -0,0 +1,9 @@
1
+ import { PrimariaApi } from '../../../api/api';
2
+ import { GetVisitId } from './request';
3
+
4
+ export declare class GetVisitIdHandler {
5
+ private api;
6
+ constructor(api: PrimariaApi);
7
+ handle(message: GetVisitId): Promise<string | undefined>;
8
+ private getVisitId;
9
+ }
@@ -0,0 +1,2 @@
1
+ export declare class GetVisitId {
2
+ }
@@ -1,3 +1,4 @@
1
- import { IActivityHistoryItem } from './model';
1
+ import { IActivityHistoryItem, IActivityHistoryItemWithComponent } from './model';
2
2
 
3
3
  export declare function shouldShowRole(item: IActivityHistoryItem): boolean;
4
+ export declare const hasItemDivider: (item: IActivityHistoryItemWithComponent, items: IActivityHistoryItemWithComponent[]) => boolean;
@@ -8,12 +8,20 @@ export interface IErrorHistoryItem {
8
8
  message: string;
9
9
  }
10
10
  export type TSearchActivityHistoryItemPredicate = (searchString: string, item: IActivityHistoryItem) => boolean;
11
+ export interface IActivityHistoryDiagnostic {
12
+ codi: string;
13
+ cataleg: string;
14
+ descripcio: string;
15
+ idEcap: string;
16
+ idCipds: string;
17
+ idCdr: string;
18
+ }
11
19
  export interface IActivityHistoryItem {
12
20
  id: string;
13
21
  date: string;
14
22
  professional: IOwner;
15
23
  relevant: boolean;
16
- diagnostics: IEntityDescription[];
24
+ diagnostics: IActivityHistoryDiagnostic[];
17
25
  center: IEntityDescription;
18
26
  up: IEntityDescription;
19
27
  ep: IEntityDescription;
@@ -18,6 +18,7 @@ export declare const locales: {
18
18
  toggleMenuClose: string;
19
19
  toggleMenuOpen: string;
20
20
  askExit: string;
21
+ finalizeVisit: string;
21
22
  };
22
23
  clinicalMonitoring: {
23
24
  title: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uxland/primary-shell",
3
- "version": "5.3.3",
3
+ "version": "5.3.4",
4
4
  "description": "Primaria Shell",
5
5
  "author": "UXLand <dev@uxland.es>",
6
6
  "homepage": "https://github.com/uxland/harmonix/tree/app#readme",
@@ -25,14 +25,13 @@
25
25
  "url": "https://github.com/uxland/harmonix/issues"
26
26
  },
27
27
  "dependencies": {
28
- "@lit-labs/virtualizer": "^2.1.0",
29
28
  "@uxland/harmonix": "^1.0.5",
30
29
  "@uxland/harmonix-adapters": "^1.0.1"
31
30
  },
32
31
  "devDependencies": {
33
32
  "@primaria/plugins-core": "^1.0.14",
34
33
  "@reduxjs/toolkit": "^2.6.1",
35
- "@salut/design-system-salut": "../../design-system-salut-2.4.0.tgz",
34
+ "@salut/design-system-salut": "../../design-system-salut-2.4.1.tgz",
36
35
  "@types/react": "^19.0.12",
37
36
  "@uxland/lit-utilities": "^1.0.0",
38
37
  "@uxland/localization": "^1.0.3",
@@ -52,7 +51,8 @@
52
51
  "reflect-metadata": "^0.2.2",
53
52
  "tslib": "^2.3.0",
54
53
  "uxl-quill": "^1.0.1",
55
- "vite": "^5.2.8"
54
+ "vite": "^5.2.8",
55
+ "@lit-labs/virtualizer": "^2.1.0"
56
56
  },
57
57
  "scripts": {
58
58
  "serve": "vite",
@@ -1,6 +1,7 @@
1
1
  import { regionAdapterRegistry, selectableAdapterFactory } from "@uxland/regions";
2
2
  import { useComponents } from "./components/bootstrapper";
3
3
  import { useSharedUI } from "./shared-components/bootstrapper";
4
+ import { useInternalViews } from "./internal-views/handle-views";
4
5
 
5
6
  export const useUI = () => {
6
7
  regionAdapterRegistry.registerAdapterFactory(
@@ -9,4 +10,5 @@ export const useUI = () => {
9
10
  );
10
11
  useSharedUI();
11
12
  useComponents();
13
+ useInternalViews();
12
14
  };
@@ -4,6 +4,7 @@ import { PrimariaErrorView } from "./error-view/component";
4
4
  import { QuickActionsMenu } from "./quick-actions-menu/quick-actions-menu";
5
5
  import { PrimariaShellHeader } from "./primaria-shell/shell-header/shell-header";
6
6
  import { PocEventsEcap } from "./poc-events-ecap/poc-events-ecap";
7
+ import { FinalizeVisitButton } from "../../features/visit/finalize-visit/component/finalize-visit-button";
7
8
 
8
9
  export const useComponents = () => {
9
10
  //@ts-ignore
@@ -12,6 +13,7 @@ export const useComponents = () => {
12
13
  customElement("primaria-shell-header")(PrimariaShellHeader);
13
14
  customElement("primaria-error-view")(PrimariaErrorView);
14
15
  customElement("quick-actions-menu")(QuickActionsMenu);
16
+ customElement("finalize-visit-button")(FinalizeVisitButton);
15
17
  //@ts-ignore
16
18
  customElement("poc-events-ecap")(PocEventsEcap);
17
19
  };
@@ -1,4 +1,4 @@
1
- import { html } from "lit";
1
+ import { html, nothing } from "lit";
2
2
  import salutLogo from "../../../../UI/images/Salut_Logotip.svg";
3
3
  import { PrimariaShellHeader } from "./shell-header";
4
4
  import { when } from "lit/directives/when.js";
@@ -18,6 +18,7 @@ export const template = (props: PrimariaShellHeader) => {
18
18
  <div id="header-region-container"></div>
19
19
  </div>
20
20
  <div class="header__right">
21
+ <finalize-visit-button></finalize-visit-button>
21
22
  <div id="header-actions-region-container"></div>
22
23
  ${when(
23
24
  props.professional,
@@ -0,0 +1,13 @@
1
+ import { registerPDFVisorMainView } from "../../api/pdf-viewer-manager/handle-views";
2
+ import { registerLowerNavMenuViews } from "./lower-nav-menu-views";
3
+ import { registerUpperNavMenuViews } from "./upper-nav-views";
4
+
5
+ const registerMainViews = () => {
6
+ registerPDFVisorMainView();
7
+ };
8
+
9
+ export const useInternalViews = () => {
10
+ registerMainViews();
11
+ registerUpperNavMenuViews();
12
+ registerLowerNavMenuViews();
13
+ };
@@ -0,0 +1,19 @@
1
+ import { shellApi } from "../../api/api";
2
+ import { shellRegions } from "../../api/region-manager/regions";
3
+ import { PrimariaNavItem } from "../shared-components/primaria-nav-item/primaria-nav-item";
4
+
5
+ export const registerLowerNavMenuViews = () => {
6
+ shellApi.regionManager.registerView(shellRegions.navigationLowerLeftMenu, {
7
+ id: "configuration-center",
8
+ factory: () => {
9
+ const menuItem = new PrimariaNavItem({
10
+ icon: "settings",
11
+ label: "Centre de configuració",
12
+ callbackFn: () => {
13
+ // shellApi.regionManager.activateView(shellRegions.main, "");
14
+ },
15
+ });
16
+ return Promise.resolve(menuItem);
17
+ },
18
+ });
19
+ };
@@ -0,0 +1,200 @@
1
+ import { shellApi } from "../../api/api";
2
+ import { shellRegions } from "../../api/region-manager/regions";
3
+ import { ExitShell } from "../../features/exit/request";
4
+ import { getPatientCip } from "../../features/get-patient-cip/action";
5
+ import { navigateToEcapWithoutClosingWithCip } from "../../features/navigate-to-ecap/navigate-without-closing-and-with-cip";
6
+ import { PrimariaNavItem } from "../shared-components/primaria-nav-item/primaria-nav-item";
7
+ import { PrimariaNavTreeMenu } from "../shared-components/primaria-nav-tree-menu/primaria-nav-tree-menu";
8
+
9
+ type MenuItemConfig =
10
+ | {
11
+ id: string;
12
+ sortHint?: string;
13
+ icon: string;
14
+ label: string;
15
+ type: "item";
16
+ callbackFn: () => void | Promise<void>;
17
+ }
18
+ | {
19
+ id: string;
20
+ sortHint?: string;
21
+ icon: string;
22
+ label: string;
23
+ type: "tree";
24
+ actionMenuItems: {
25
+ icon: string;
26
+ label: string;
27
+ callbackFn: () => void | Promise<void>;
28
+ }[];
29
+ };
30
+
31
+ const upperNavMenuItems: MenuItemConfig[] = [
32
+ {
33
+ id: "landing",
34
+ icon: "home",
35
+ label: "Pàgina inici",
36
+ type: "item",
37
+ sortHint: "0010",
38
+ callbackFn: () => shellApi.broker.send(new ExitShell()),
39
+ },
40
+ {
41
+ id: "processes",
42
+ icon: "account_tree",
43
+ label: "Vies clíniques",
44
+ type: "tree",
45
+ sortHint: "0040",
46
+ actionMenuItems: [
47
+ {
48
+ icon: "open_in_new",
49
+ label: "ARES",
50
+ callbackFn: () => navigateToEcapWithoutClosingWithCip("PROCES_ATENCIO"),
51
+ },
52
+ {
53
+ icon: "open_in_new",
54
+ label: "Procés Obstètric",
55
+ callbackFn: () => {},
56
+ },
57
+ {
58
+ icon: "open_in_new",
59
+ label: "Nen sa",
60
+ callbackFn: () => navigateToEcapWithoutClosingWithCip("NEN_SA"),
61
+ },
62
+ {
63
+ icon: "open_in_new",
64
+ label: "Odontologia",
65
+ callbackFn: () => navigateToEcapWithoutClosingWithCip("ODONTOLOGO"),
66
+ },
67
+ {
68
+ icon: "open_in_new",
69
+ label: "Situació d'especial cura",
70
+ callbackFn: () => navigateToEcapWithoutClosingWithCip("SIT_ESPEC_CURA_DEV"),
71
+ },
72
+ ],
73
+ },
74
+ {
75
+ id: "unique-petition",
76
+ icon: "playlist_add",
77
+ label: "Petitori",
78
+ type: "tree",
79
+ sortHint: "0050",
80
+ actionMenuItems: [
81
+ {
82
+ icon: "open_in_new",
83
+ label: "Analítiques",
84
+ callbackFn: () => navigateToEcapWithoutClosingWithCip("LABORATORI"),
85
+ },
86
+ {
87
+ icon: "open_in_new",
88
+ label: "Ordres Clíniques",
89
+ callbackFn: () => navigateToEcapWithoutClosingWithCip("RESULT_OC"),
90
+ },
91
+ {
92
+ icon: "open_in_new",
93
+ label: "OC Exprés",
94
+ callbackFn: () => navigateToEcapWithoutClosingWithCip("OC_EXPRES"),
95
+ },
96
+ {
97
+ icon: "open_in_new",
98
+ label: "Sol·licitud de trasllat",
99
+ callbackFn: () => navigateToEcapWithoutClosingWithCip("TRANSPORT"),
100
+ },
101
+ ],
102
+ },
103
+ {
104
+ id: "results-reports",
105
+ icon: "folder_shared",
106
+ label: "Documents",
107
+ type: "tree",
108
+ sortHint: "0070",
109
+ actionMenuItems: [
110
+ {
111
+ icon: "open_in_new",
112
+ label: "Resultats i informes ECAP",
113
+ callbackFn: () => {},
114
+ },
115
+ {
116
+ icon: "open_in_new",
117
+ label: "Documents usuari",
118
+ callbackFn: () =>
119
+ setTimeout(() => {
120
+ navigateToEcapWithoutClosingWithCip("CRIDA_DOCS_USU");
121
+ }, 0),
122
+ },
123
+ ],
124
+ },
125
+ {
126
+ id: "communication",
127
+ icon: "3p",
128
+ label: "Comunicació",
129
+ type: "tree",
130
+ sortHint: "0120",
131
+ actionMenuItems: [
132
+ {
133
+ icon: "open_in_new",
134
+ label: "SMS",
135
+ callbackFn: async () => {
136
+ const CIP = await getPatientCip(shellApi);
137
+ shellApi.ecapEventManager.publish("MISSATGES_DEV", "NO_TANCAR", {
138
+ CIP: CIP || "",
139
+ TipusMissatge: "SMS",
140
+ });
141
+ },
142
+ },
143
+ { icon: "open_in_new", label: "Econsulta", callbackFn: () => {} },
144
+ { icon: "open_in_new", label: "Mail", callbackFn: () => {} },
145
+ {
146
+ icon: "open_in_new",
147
+ label: "Veu IP",
148
+ callbackFn: () => navigateToEcapWithoutClosingWithCip("VOIP"),
149
+ },
150
+ { icon: "open_in_new", label: "Videoconsulta", callbackFn: () => {} },
151
+ ],
152
+ },
153
+ {
154
+ id: "visits",
155
+ icon: "event",
156
+ label: "Visites",
157
+ type: "item",
158
+ sortHint: "0130",
159
+ callbackFn: () => navigateToEcapWithoutClosingWithCip("CONSULTA_VISITES"),
160
+ },
161
+ {
162
+ id: "it",
163
+ icon: "add_box",
164
+ label: "IT",
165
+ type: "item",
166
+ callbackFn: () => navigateToEcapWithoutClosingWithCip("REV_IT"),
167
+ },
168
+ {
169
+ id: "variable activities",
170
+ icon: "add_box",
171
+ label: "Activitats variables",
172
+ type: "item",
173
+ callbackFn: () => navigateToEcapWithoutClosingWithCip("SIA_DEV"),
174
+ },
175
+ ];
176
+
177
+ export const registerUpperNavMenuViews = () => {
178
+ for (const item of upperNavMenuItems) {
179
+ shellApi.regionManager.registerView(shellRegions.navigationMenu, {
180
+ id: item.id,
181
+ sortHint: item.sortHint,
182
+ factory: () => {
183
+ const menuItem =
184
+ item.type === "item"
185
+ ? new PrimariaNavItem({
186
+ icon: item.icon,
187
+ label: item.label,
188
+ callbackFn: item.callbackFn,
189
+ })
190
+ : new PrimariaNavTreeMenu({
191
+ icon: item.icon,
192
+ label: item.label,
193
+ actionMenuItems: item.actionMenuItems,
194
+ });
195
+
196
+ return Promise.resolve(menuItem);
197
+ },
198
+ });
199
+ }
200
+ };
@@ -1,14 +1,12 @@
1
1
  import { PrimariaShell } from "./UI/components/primaria-shell/primaria-shell";
2
2
  import { shellApi } from "./api/api";
3
3
  import { useFeatures } from "./features/bootstrapper";
4
- import { useInternalViews } from "./handle-views";
5
4
  import { useLocalization } from "./locales";
6
5
  import { useUI } from "./UI/bootstrapper";
7
6
 
8
7
  export const initializeShell = (hostAppElement: HTMLElement) => {
9
8
  useLocalization(shellApi);
10
9
  useUI();
11
- useInternalViews();
12
10
  useFeatures(shellApi);
13
11
  const shell = new PrimariaShell();
14
12
  hostAppElement.appendChild(shell as any);
@@ -9,11 +9,15 @@ import {
9
9
  disposeClinicalMonitoring,
10
10
  useClinicalMonitoring,
11
11
  } from "./clinical-monitoring/bootstrapper";
12
+ import { disposeGetVisitId, useGetVisitId } from "./visit/get-visit-id/bootstrapper";
13
+ import { disposeFinalizeVisit, useFinalizeVisit } from "./visit/finalize-visit/bootstrapper";
12
14
 
13
15
  export const useFeatures = (api: PrimariaApi) => {
14
16
  container.bind(TYPES.primaryApi).toConstantValue(api);
15
17
  useGetUserInfo(api);
16
18
  useExitShell(api);
19
+ useGetVisitId(api);
20
+ useFinalizeVisit(api);
17
21
  useClinicalMonitoring(api);
18
22
  api.broker.send(new GetUserInfo());
19
23
  };
@@ -21,6 +25,8 @@ export const useFeatures = (api: PrimariaApi) => {
21
25
  export const disposeFeatures = (api: PrimariaApi) => {
22
26
  disposeGetUserInfo();
23
27
  disposeExitShell();
28
+ disposeGetVisitId();
29
+ disposeFinalizeVisit();
24
30
  disposeClinicalMonitoring(api);
25
31
  container.unbindAll();
26
32
  api.regionManager._destroy();
@@ -11,14 +11,14 @@ export abstract class UserInfoBackendAdapter {
11
11
  export class GetUserInfoBackendAdapter implements UserInfoBackendAdapter {
12
12
  constructor(@inject(TYPES.primaryApi) private api: typeof shellApi) {}
13
13
  getUserInfo(): Promise<IUserInfo> {
14
- const decodedToken = jwtDecode(this.api.tokenManager.getToken())
14
+ const decodedToken = jwtDecode(this.api.tokenManager.getToken());
15
15
  const userInfo: IUserInfo = {
16
- userId: decodedToken.access_info.trace_user_id,
16
+ userId: this.getUserId(decodedToken.access_info),
17
17
  firstName: decodedToken.access_info.trace_user_given_name,
18
18
  familyName: decodedToken.access_info.trace_user_family_name,
19
19
  lastName: decodedToken.access_info.trace_user_last_name,
20
20
  registrationNumber: decodedToken.access_info.identifier.find(
21
- (id: { type: string; value: string }) => id.type === "NUMCOL"
21
+ (id: { type: string; value: string }) => id.type === "NUMCOL",
22
22
  )?.value,
23
23
  workCenter: decodedToken.access_info.center_code,
24
24
  role: decodedToken.access_info.role_type,
@@ -26,4 +26,15 @@ export class GetUserInfoBackendAdapter implements UserInfoBackendAdapter {
26
26
  };
27
27
  return Promise.resolve(userInfo);
28
28
  }
29
+
30
+ getUserId(access_info) {
31
+ return (
32
+ access_info.identifier?.find(
33
+ (identifierItem: { type: string; value: string }) => identifierItem.type === "DNI",
34
+ )?.value ||
35
+ access_info.identifier?.find(
36
+ (identifierItem: { type: string; value: string }) => identifierItem.type === "NIE",
37
+ )?.value
38
+ );
39
+ }
29
40
  }
@@ -0,0 +1,17 @@
1
+ import { PrimariaApi } from "../../../api/api";
2
+ import { BrokerDisposableHandler } from "../../../api/broker/primaria-broker";
3
+ import { container } from "../../../infrastructure/ioc/container";
4
+ import { registerRequest } from "../../utils";
5
+ import { FinalizeVisitHandler } from "./handler";
6
+ import { FinalizeVisit } from "./request";
7
+
8
+ let request: BrokerDisposableHandler;
9
+
10
+ export const useFinalizeVisit = (api: PrimariaApi) => {
11
+ disposeFinalizeVisit();
12
+ request = registerRequest(api, container)(FinalizeVisit, FinalizeVisitHandler);
13
+ };
14
+
15
+ export const disposeFinalizeVisit = () => {
16
+ request?.dispose();
17
+ };
@@ -0,0 +1,36 @@
1
+ import { LitElement, html } from "lit";
2
+ import { template } from "./template";
3
+ import { property } from "lit/decorators.js";
4
+ import { GetVisitId } from "../../get-visit-id/request";
5
+ import { shellApi } from "../../../../api/api";
6
+ import { FinalizeVisit } from "../request";
7
+
8
+ export class FinalizeVisitButton extends LitElement {
9
+ render() {
10
+ return html`${template(this)}`;
11
+ }
12
+
13
+ connectedCallback() {
14
+ super.connectedCallback();
15
+ this.getVisitId();
16
+ }
17
+
18
+ @property({ type: String })
19
+ visitId: string | undefined;
20
+
21
+ async getVisitId() {
22
+ try {
23
+ await shellApi.broker.send(new GetVisitId()).then((visitIdResponse: string | undefined) => {
24
+ this.visitId = visitIdResponse;
25
+ });
26
+ } catch (error) {
27
+ console.error(error.message);
28
+ }
29
+ }
30
+
31
+ finalizeVisitHandler() {
32
+ if (this.visitId) {
33
+ shellApi.broker.send(new FinalizeVisit(this.visitId));
34
+ }
35
+ }
36
+ }
@@ -0,0 +1,9 @@
1
+ import { html, nothing } from "lit";
2
+ import { FinalizeVisitButton } from "./finalize-visit-button";
3
+ import { translate } from "../../../../locales";
4
+
5
+ export const template = (props: FinalizeVisitButton) => {
6
+ return html`
7
+ ${props.visitId ? html`<dss-button @click=${props.finalizeVisitHandler} variant="subtle" size="md" icon="door_front" label=${translate("actions.finalizeVisit")}></dss-button>` : nothing}
8
+ `;
9
+ };
@@ -0,0 +1,18 @@
1
+ import { TYPES } from "../../../infrastructure/ioc/types";
2
+ import { inject } from "inversify";
3
+ import { PrimariaApi } from "../../../api/api";
4
+ import { FinalizeVisit } from "./request";
5
+
6
+ export class FinalizeVisitHandler {
7
+ constructor(
8
+ @inject(TYPES.primaryApi) private api: PrimariaApi,
9
+ ) {}
10
+ async handle(data: FinalizeVisit) {
11
+ try {
12
+ const visitIdData = data.visitId;
13
+ this.api.ecapEventManager.publish("RESOL_VISITA", "", { visitId: visitIdData });
14
+ } catch (error) {
15
+ this.api.notificationService.error(error.message);
16
+ }
17
+ }
18
+ }
@@ -0,0 +1,3 @@
1
+ export class FinalizeVisit {
2
+ constructor(public visitId: string) {}
3
+ }
@@ -0,0 +1,17 @@
1
+ import { PrimariaApi } from "../../../api/api";
2
+ import { BrokerDisposableHandler } from "../../../api/broker/primaria-broker";
3
+ import { container } from "../../../infrastructure/ioc/container";
4
+ import { registerRequest } from "../../utils";
5
+ import { GetVisitIdHandler } from "./handler";
6
+ import { GetVisitId } from "./request";
7
+
8
+ let request: BrokerDisposableHandler;
9
+
10
+ export const useGetVisitId = (api: PrimariaApi) => {
11
+ disposeGetVisitId();
12
+ request = registerRequest(api, container)(GetVisitId, GetVisitIdHandler);
13
+ };
14
+
15
+ export const disposeGetVisitId = () => {
16
+ request?.dispose();
17
+ };
@@ -0,0 +1,27 @@
1
+ import { TYPES } from "../../../infrastructure/ioc/types";
2
+ import { inject } from "inversify";
3
+ import { PrimariaApi } from "../../../api/api";
4
+ import { GetVisitId } from "./request";
5
+
6
+ export class GetVisitIdHandler {
7
+ constructor(
8
+ @inject(TYPES.primaryApi) private api: PrimariaApi,
9
+ ) {}
10
+ async handle(message: GetVisitId): Promise<string | undefined> {
11
+ try {
12
+ const visitIdData = await this.getVisitId();
13
+ console.log("Visit ID obtenido: ", visitIdData);
14
+ return visitIdData;
15
+ } catch (error) {
16
+ this.api.notificationService.error(error.message);
17
+ return undefined;
18
+ }
19
+ }
20
+
21
+ private getVisitId(): Promise<string | undefined> {
22
+ const urlParams = new URLSearchParams(window.location.search);
23
+ console.log("Paràmetres de la URL: ", window.location.search);
24
+ const visitId = urlParams.get("visit_id");
25
+ return Promise.resolve(visitId || undefined);
26
+ }
27
+ }
@@ -0,0 +1 @@
1
+ export class GetVisitId {}