@uxland/primary-shell 5.4.7 → 5.6.0

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 (85) hide show
  1. package/dist/index.js +11766 -11398
  2. package/dist/index.js.map +1 -1
  3. package/dist/index.umd.cjs +833 -750
  4. package/dist/index.umd.cjs.map +1 -1
  5. package/dist/primary/shell/src/UI/components/primaria-shell/shell-header/header-divider/header-divider.d.ts +6 -0
  6. package/dist/primary/shell/src/UI/components/primaria-shell/shell-header/header-divider/template.d.ts +3 -0
  7. package/dist/primary/shell/src/UI/components/primaria-shell/shell-header/shell-header.d.ts +1 -0
  8. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/add/handle-busy/busy-component/component.d.ts +2 -1
  9. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/add/handle-busy/selectors.d.ts +1 -1
  10. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/domain/specs/up-filter-spec.d.ts +8 -0
  11. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/domain/specs/up-filter-spec.test.d.ts +1 -0
  12. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/UI/active-filters-badges/active-filters-badges.d.ts +3 -1
  13. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/UI/active-filters-header/active-filters-header.d.ts +1 -0
  14. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/UI/activity-history-filters/activity-history-filters.d.ts +4 -1
  15. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/model.d.ts +13 -1
  16. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/slice.d.ts +4 -0
  17. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/add/actions.d.ts +1 -0
  18. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/add/bootstrapper.d.ts +4 -0
  19. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/add/handler.d.ts +6 -0
  20. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/add/reducer.d.ts +4 -0
  21. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/add/reducer.test.d.ts +1 -0
  22. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/add/request.d.ts +6 -0
  23. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/handle-add-up-options-from-item.d.ts +4 -0
  24. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/selectors.d.ts +185 -0
  25. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/set/actions.d.ts +1 -0
  26. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/set/bootstrapper.d.ts +4 -0
  27. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/set/handler.d.ts +6 -0
  28. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/set/reducer.d.ts +3 -0
  29. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/set/request.d.ts +4 -0
  30. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/list/UI/main-view/activity-history-main.d.ts +2 -0
  31. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/selectors.d.ts +60 -0
  32. package/package.json +2 -2
  33. package/src/UI/components/bootstrapper.ts +2 -0
  34. package/src/UI/components/communication-action-menu/template.ts +3 -2
  35. package/src/UI/components/primaria-shell/shell-header/header-divider/header-divider.ts +13 -0
  36. package/src/UI/components/primaria-shell/shell-header/header-divider/styles.css +5 -0
  37. package/src/UI/components/primaria-shell/shell-header/header-divider/template.ts +8 -0
  38. package/src/UI/components/primaria-shell/shell-header/shell-header.ts +27 -0
  39. package/src/UI/components/primaria-shell/shell-header/styles.css +4 -4
  40. package/src/UI/components/primaria-shell/shell-header/template.ts +2 -0
  41. package/src/UI/components/primaria-shell/styles.css +6 -1
  42. package/src/UI/internal-views/handle-views.ts +1 -1
  43. package/src/UI/internal-views/lower-nav-menu-views.ts +0 -17
  44. package/src/UI/internal-views/upper-nav-views.ts +32 -6
  45. package/src/internal-plugins/activity-history/activity-history-item/add/add-history-item/handler.ts +2 -0
  46. package/src/internal-plugins/activity-history/activity-history-item/add/add-history-items/handler.ts +2 -0
  47. package/src/internal-plugins/activity-history/activity-history-item/add/handle-busy/busy-component/component.ts +7 -6
  48. package/src/internal-plugins/activity-history/activity-history-item/add/handle-busy/busy-component/styles.css +11 -14
  49. package/src/internal-plugins/activity-history/activity-history-item/add/handle-busy/busy-component/template.ts +2 -2
  50. package/src/internal-plugins/activity-history/activity-history-item/add/handle-busy/selectors.ts +6 -6
  51. package/src/internal-plugins/activity-history/activity-history-item/add/handle-error/selectors.ts +4 -6
  52. package/src/internal-plugins/activity-history/activity-history-item/domain/specs/search-string-spec.ts +1 -1
  53. package/src/internal-plugins/activity-history/activity-history-item/domain/specs/up-filter-spec.test.ts +38 -0
  54. package/src/internal-plugins/activity-history/activity-history-item/domain/specs/up-filter-spec.ts +18 -0
  55. package/src/internal-plugins/activity-history/activity-history-item/filter/UI/active-filters-badges/active-filters-badges.ts +21 -6
  56. package/src/internal-plugins/activity-history/activity-history-item/filter/UI/active-filters-badges/template.ts +65 -6
  57. package/src/internal-plugins/activity-history/activity-history-item/filter/UI/active-filters-header/active-filters-header.ts +4 -0
  58. package/src/internal-plugins/activity-history/activity-history-item/filter/UI/active-filters-header/template.ts +1 -0
  59. package/src/internal-plugins/activity-history/activity-history-item/filter/UI/activity-history-filters/activity-history-filters.ts +16 -10
  60. package/src/internal-plugins/activity-history/activity-history-item/filter/UI/activity-history-filters/styles.css +1 -0
  61. package/src/internal-plugins/activity-history/activity-history-item/filter/UI/activity-history-filters/template.ts +53 -16
  62. package/src/internal-plugins/activity-history/activity-history-item/filter/bootstrapper.ts +6 -0
  63. package/src/internal-plugins/activity-history/activity-history-item/filter/custom-filters/reset-custom-filter/reducer.ts +1 -2
  64. package/src/internal-plugins/activity-history/activity-history-item/filter/model.ts +14 -8
  65. package/src/internal-plugins/activity-history/activity-history-item/filter/slice.ts +4 -0
  66. package/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/add/actions.ts +3 -0
  67. package/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/add/bootstrapper.ts +14 -0
  68. package/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/add/handler.ts +14 -0
  69. package/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/add/reducer.test.ts +93 -0
  70. package/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/add/reducer.ts +22 -0
  71. package/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/add/request.ts +5 -0
  72. package/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/handle-add-up-options-from-item.ts +20 -0
  73. package/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/selectors.ts +14 -0
  74. package/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/set/actions.ts +3 -0
  75. package/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/set/bootstrapper.ts +14 -0
  76. package/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/set/handler.ts +13 -0
  77. package/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/set/reducer.ts +11 -0
  78. package/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/set/request.ts +3 -0
  79. package/src/internal-plugins/activity-history/activity-history-item/list/UI/main-view/activity-history-main.ts +11 -9
  80. package/src/internal-plugins/activity-history/activity-history-item/list/UI/main-view/template.ts +2 -2
  81. package/src/internal-plugins/activity-history/activity-history-item/list/UI/timeline/activity-history-timeline.ts +3 -6
  82. package/src/internal-plugins/activity-history/activity-history-item/list/UI/timeline/template.ts +1 -1
  83. package/src/internal-plugins/activity-history/activity-history-item/selectors.ts +10 -23
  84. package/src/internal-plugins/activity-history/utils/get-unique-values-by-prop-path.ts +3 -1
  85. package/src/locales.ts +3 -6
@@ -15,11 +15,13 @@ export const template = (props: PrimariaShellHeader) => {
15
15
  <div class="header-logo">
16
16
  <img src=${salutLogo} alt="logo" />
17
17
  </div>
18
+ <header-divider></header-divider>
18
19
  <div id="header-region-container"></div>
19
20
  </div>
20
21
  <div class="header__right">
21
22
  <finalize-visit-button></finalize-visit-button>
22
23
  <div id="header-actions-region-container"></div>
24
+ <header-divider></header-divider>
23
25
  ${when(
24
26
  props.professional,
25
27
  () => html`<dss-header-menu-professional @onExit=${props.logout} slot="professional-menu" name="${props.professional.firstName} ${props.professional?.familyName} ${props.professional?.lastName}" center="${props.professional.workCenter}" collegiate="${props.professional.registrationNumber}">
@@ -64,7 +64,7 @@
64
64
  overflow-y: auto;
65
65
  margin-right: -14px;
66
66
  padding-right: 14px;
67
- scrollbar-color: var(--color-primary-800) var(--color-primary-700);
67
+ scrollbar-color: var(--color-primary-200) var(--color-primary-700);
68
68
  scrollbar-width: thin;
69
69
  }
70
70
  #menu-region-container::-webkit-scrollbar {
@@ -140,6 +140,11 @@
140
140
  height: 100%;
141
141
  flex: 1;
142
142
  }
143
+ #navigation-menu-lower-region-container{
144
+ display: flex;
145
+ flex-direction: column;
146
+ gap: 4px;
147
+ }
143
148
  #floating-region-container {
144
149
  position: fixed;
145
150
  z-index: 300;
@@ -10,7 +10,7 @@ export const useInternalViews = () => {
10
10
  registerMainViews();
11
11
  registerCommunicationNavMenuItem();
12
12
  registerUpperNavMenuViews();
13
- registerLowerNavMenuViews();
13
+ // registerLowerNavMenuViews();
14
14
 
15
15
  registerCommunicationMenuActions();
16
16
  };
@@ -1,19 +1,2 @@
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
1
  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
2
  };
@@ -7,6 +7,7 @@ import { CommunicationActionMenu } from "../components/communication-action-menu
7
7
  import { QuickActionItem } from "../shared-components/quick-action-item/quick-action-item";
8
8
  import { PrimariaNavItem } from "../shared-components/primaria-nav-item/primaria-nav-item";
9
9
  import { PrimariaNavTreeMenu } from "../shared-components/primaria-nav-tree-menu/primaria-nav-tree-menu";
10
+ import { GetVisitId } from "../../features/visit/get-visit-id/request";
10
11
 
11
12
  type MenuItemConfig =
12
13
  | {
@@ -56,7 +57,7 @@ const upperNavMenuItems: MenuItemConfig[] = [
56
57
  actionMenuItems: [
57
58
  {
58
59
  icon: "open_in_new",
59
- label: "ARES",
60
+ label: "Proces d'atenció - ARES",
60
61
  callbackFn: () => navigateToEcapWithoutClosingWithCip("PROCES_ATENCIO"),
61
62
  },
62
63
  {
@@ -89,7 +90,7 @@ const upperNavMenuItems: MenuItemConfig[] = [
89
90
  {
90
91
  id: "unique-petition",
91
92
  icon: "playlist_add",
92
- label: "Petitori",
93
+ label: "Peticionari",
93
94
  type: "tree",
94
95
  sortHint: "0050",
95
96
  actionMenuItems: [
@@ -183,7 +184,7 @@ const upperNavMenuItems: MenuItemConfig[] = [
183
184
  {
184
185
  icon: "open_in_new",
185
186
  label: "Prescripció social",
186
- callbackFn: () => navigateToEcapWithoutClosingWithCip("PRESCIPCIO_SOCIAL"),
187
+ callbackFn: () => navigateToEcapWithoutClosingWithCip("PRESCRIPCIO_SOCIAL"),
187
188
  },
188
189
  ],
189
190
  },
@@ -273,8 +274,33 @@ export const registerCommunicationMenuActions = () => {
273
274
  });
274
275
  },
275
276
  },
276
- { id: "2", sortHint: "0020", icon: "open_in_new", label: "eConsulta", callbackFn: () => {} },
277
- { id: "3", icon: "open_in_new", label: "Mail", callbackFn: () => {} },
277
+ {
278
+ id: "2",
279
+ sortHint: "0020",
280
+ icon: "open_in_new",
281
+ label: "eConsulta",
282
+ callbackFn: async () => {
283
+ const CIP = await getPatientCip(shellApi);
284
+ const visiId = (await shellApi.broker.send(new GetVisitId())) as string;
285
+
286
+ shellApi.ecapEventManager.publish("NAVEGACIO_ECAP_ECONSULTA", "NO_TANCAR", {
287
+ CIP: CIP || "",
288
+ VisiID: visiId || "",
289
+ });
290
+ },
291
+ },
292
+ {
293
+ id: "3",
294
+ icon: "open_in_new",
295
+ label: "Mail",
296
+ callbackFn: async () => {
297
+ const CIP = await getPatientCip(shellApi);
298
+ shellApi.ecapEventManager.publish("COMUNICACIO_MISSATGES_CREAR", "NO_TANCAR", {
299
+ CIP: CIP || "",
300
+ TipusMissatge: "SMS",
301
+ });
302
+ },
303
+ },
278
304
  {
279
305
  id: "4",
280
306
  sortHint: "0030",
@@ -282,7 +308,7 @@ export const registerCommunicationMenuActions = () => {
282
308
  label: "Veu IP",
283
309
  callbackFn: () => navigateToEcapWithoutClosingWithCip("VOIP"),
284
310
  },
285
- { id: "5", sortHint: "0040", icon: "open_in_new", label: "Videoconsulta", callbackFn: () => {} },
311
+ // { id: "5", sortHint: "0040", icon: "open_in_new", label: "Videoconsulta", callbackFn: () => {} },
286
312
  ];
287
313
  for (const item of communicationItems) {
288
314
  shellApi.regionManager.registerView(shellRegions.communicationSidenav, {
@@ -1,6 +1,7 @@
1
1
  import { StoreBaseHandler } from "../../../infrastructure/base-handlers";
2
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
+ import { handleAddUpFilter } from "../../filter/up-filters/handle-add-up-options-from-item";
4
5
  import { addActivityHistoryItem } from "./action";
5
6
  import { AddHistoryItemPayload } from "./request";
6
7
 
@@ -15,6 +16,7 @@ export class AddHistoryItemHandler extends StoreBaseHandler {
15
16
  }),
16
17
  );
17
18
  handleAddDiagnosticsFilter([payload.item], this.store);
19
+ handleAddUpFilter([payload.item], this.store);
18
20
  } catch (e) {
19
21
  console.log(e.message);
20
22
  }
@@ -1,6 +1,7 @@
1
1
  import { StoreBaseHandler } from "../../../infrastructure/base-handlers";
2
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
+ import { handleAddUpFilter } from "../../filter/up-filters/handle-add-up-options-from-item";
4
5
  import { addActivityHistoryItems } from "./action";
5
6
  import { AddHistoryItemsPayload } from "./request";
6
7
 
@@ -17,6 +18,7 @@ export class AddHistoryItemsHandler extends StoreBaseHandler {
17
18
  }),
18
19
  );
19
20
  handleAddDiagnosticsFilter(validItems, this.store);
21
+ handleAddUpFilter(validItems, this.store);
20
22
  } catch (e) {
21
23
  console.log(e.message);
22
24
  }
@@ -3,10 +3,7 @@ import { customElement } from "lit/decorators.js";
3
3
  import styles from "./styles.css?inline";
4
4
  import { template } from "./template";
5
5
  import { connectedProperty } from "../../../../infrastructure/state/connected-property";
6
- import {
7
- isAnyCollectionLoadingWithoutAnyLoaded,
8
- isSomeCollectionLoadedAndOtherLoading,
9
- } from "../selectors";
6
+ import { isSomeCollectionLoadedAndOtherLoading, isCollectionInitialState } from "../selectors";
10
7
 
11
8
  //@ts-ignore
12
9
  @customElement("activity-history-busy")
@@ -19,9 +16,13 @@ export class ActivityHistoryBusy extends LitElement {
19
16
  ${unsafeCSS(styles)}
20
17
  `;
21
18
 
22
- @connectedProperty(isAnyCollectionLoadingWithoutAnyLoaded)
23
- isAnyCollectionLoadingWithoutAnyLoaded: boolean;
19
+ @connectedProperty(isCollectionInitialState)
20
+ isCollectionInitialState: boolean;
24
21
 
25
22
  @connectedProperty(isSomeCollectionLoadedAndOtherLoading)
26
23
  isSomeCollectionLoadedAndOtherLoading: boolean;
24
+
25
+ get skeletons() {
26
+ return Array.from({ length: 12 }, () => html`<dss-skeleton width="100" height="10"></dss-skeleton>`);
27
+ }
27
28
  }
@@ -1,15 +1,12 @@
1
1
  .spinner-container {
2
- display: flex;
3
- flex-direction: row;
4
- align-items: center;
5
- gap: 24px;
6
- justify-content: center;
7
- padding-top:16px
8
- }
9
- .spinner-full-container {
10
- width: 100%;
11
- height: 100%;
12
- display: flex;
13
- align-items: center;
14
- justify-content: center;
15
- }
2
+ display: flex;
3
+ flex-direction: row;
4
+ align-items: center;
5
+ gap: 24px;
6
+ justify-content: center;
7
+ padding-top:16px
8
+ }
9
+ .skeleton-container {
10
+ padding: 20px;
11
+ height: 100%;
12
+ }
@@ -3,8 +3,8 @@ import { ActivityHistoryBusy } from "./component";
3
3
  import { translate } from "../../../../localization";
4
4
 
5
5
  export const template = (props: ActivityHistoryBusy) =>
6
- props.isAnyCollectionLoadingWithoutAnyLoaded
7
- ? html`<div class="spinner-full-container"><dss-spinner></dss-spinner></div>`
6
+ props.isCollectionInitialState
7
+ ? html`<div class="skeleton-container">${props.skeletons}</div>`
8
8
  : props.isSomeCollectionLoadedAndOtherLoading
9
9
  ? html`<div class="spinner-container"><dss-spinner size="sm"></dss-spinner><div class="busy-description">${translate("busyEntriesLoading")}</div></div>`
10
10
  : nothing;
@@ -1,13 +1,13 @@
1
1
  import { RootState } from "../../../infrastructure/state/store";
2
2
 
3
- const isAnyCollectionBusySelector = (state: RootState) =>
4
- state.activityHistoryCollections.busy.length > 0;
5
- export const isAnyCollectionLoadingWithoutAnyLoaded = (state: RootState) => {
6
- const collections = Object.values(state.activityHistoryCollections.collections);
7
- return !collections?.length && isAnyCollectionBusySelector(state);
8
- };
3
+ const isAnyCollectionBusySelector = (state: RootState) => state.activityHistoryCollections.busy.length > 0;
9
4
 
10
5
  export const isSomeCollectionLoadedAndOtherLoading = (state: RootState) => {
11
6
  const collections = Object.values(state.activityHistoryCollections.collections);
12
7
  return collections && isAnyCollectionBusySelector(state);
13
8
  };
9
+
10
+ export const isCollectionInitialState = (state: RootState) => {
11
+ const collections = Object.values(state.activityHistoryCollections.collections);
12
+ return !collections?.length && !isAnyCollectionBusySelector(state);
13
+ };
@@ -1,19 +1,17 @@
1
1
  import { RootState } from "../../../infrastructure/state/store";
2
- import { isAnyCollectionLoadingWithoutAnyLoaded, isSomeCollectionLoadedAndOtherLoading } from "../handle-busy/selectors";
2
+ import { isSomeCollectionLoadedAndOtherLoading } from "../handle-busy/selectors";
3
3
 
4
4
  export const isErrorOccurred = (state: RootState) => state.activityHistoryCollections.error.length > 0;
5
5
 
6
6
  const areCollectionsEmpty = (state: RootState) => {
7
7
  const collections = state.activityHistoryCollections.collections;
8
8
 
9
- return Object.values(collections).every(collection => {
9
+ return Object.values(collections).every((collection) => {
10
10
  return !collection.items || collection.items.length === 0;
11
11
  });
12
12
  };
13
13
  export const isAllDataFailedToLoad = (state: RootState) => {
14
- return !isAnyCollectionLoadingWithoutAnyLoaded(state) &&
15
- !isSomeCollectionLoadedAndOtherLoading(state) &&
16
- isErrorOccurred(state) && areCollectionsEmpty(state);
14
+ return !isSomeCollectionLoadedAndOtherLoading(state) && isErrorOccurred(state) && areCollectionsEmpty(state);
17
15
  };
18
16
 
19
- export const selectErrorMessages = (state: RootState) => state.activityHistoryCollections.error;
17
+ export const selectErrorMessages = (state: RootState) => state.activityHistoryCollections.error;
@@ -12,7 +12,7 @@ const commonFieldsSearchPredicate = (item: IActivityHistoryItem, searchString: s
12
12
  item.professional?.role?.description && propContainsString(item.professional?.role.description, searchString);
13
13
  const serviceNameContainsSearchString = item.service?.description && propContainsString(item.service.description, searchString);
14
14
  const diagnosticsMatch = item.diagnostics?.some(
15
- (diagnostic) => propContainsString(diagnostic.id, searchString) || propContainsString(diagnostic.description, searchString),
15
+ (diagnostic) => propContainsString(diagnostic.descripcio, searchString),
16
16
  );
17
17
  return (
18
18
  professionalNameContainsSearchString ||
@@ -0,0 +1,38 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { IActivityHistoryItem } from '../model';
3
+ import { UpFilterSpec } from './up-filter-spec';
4
+
5
+
6
+ describe('UpFilterSpec', () => {
7
+ const makeItem = (upId: string | undefined, description: string | undefined): IActivityHistoryItem => ({
8
+ up: { id: upId, description },
9
+ } as IActivityHistoryItem);
10
+
11
+ it('should return true if up filter is empty', () => {
12
+ const spec = new UpFilterSpec([]);
13
+ const item = makeItem('00461', 'EAP Barcelona 2D - Universitat');
14
+
15
+ expect(spec.isSatisfiedBy(item)).toBe(true);
16
+ });
17
+
18
+ it('should return true if item has at least one matching up', () => {
19
+ const spec = new UpFilterSpec(['00001', '00461', '99999']);
20
+ const item = makeItem('00461', 'EAP Barcelona 2D - Universitat');
21
+
22
+ expect(spec.isSatisfiedBy(item)).toBe(true);
23
+ });
24
+
25
+ it('should return false if item has up but none match', () => {
26
+ const spec = new UpFilterSpec(['00001', '00002', '00003']);
27
+ const item = makeItem('00461', 'EAP Barcelona 2D - Universitat');
28
+
29
+ expect(spec.isSatisfiedBy(item)).toBe(false);
30
+ });
31
+
32
+ it('should return false if item has no up', () => {
33
+ const spec = new UpFilterSpec(['a']);
34
+ const item = makeItem(undefined, undefined);
35
+
36
+ expect(spec.isSatisfiedBy(item)).toBe(false);
37
+ });
38
+ });
@@ -0,0 +1,18 @@
1
+ import { IActivityHistoryItem } from "../model";
2
+ import { Spec } from "./spec";
3
+
4
+ export class UpFilterSpec extends Spec<IActivityHistoryItem> {
5
+ constructor(private upIds: string[]) {
6
+ super();
7
+ }
8
+
9
+ isSatisfiedBy(item: IActivityHistoryItem): boolean {
10
+ if (!this.upIds?.length) {
11
+ return true; // No se filtra si no se proporcionan códigos
12
+ }
13
+
14
+ const itemUp = item.up ?? null;
15
+
16
+ return this.upIds.some((upId) => itemUp.id === upId);
17
+ }
18
+ }
@@ -6,15 +6,24 @@ import { PrimariaApi } from "../../../../../../api/api";
6
6
  import { TYPES } from "../../../../infrastructure/ioc/types";
7
7
  import { template } from "./template";
8
8
  import styles from "./styles.css?inline";
9
- import { activeGroupsWithEnabledFilters } from "../../custom-filters/selectors";
9
+
10
10
  import { SetCustomFilterValue } from "../../custom-filters/set-custom-filter-value/request";
11
- import { IActivityHistoryCustomFilterGroup, IActivityHistoryDiagnosticsFilter, IActivityHistoryFilter } from "../../model";
11
+ import {
12
+ IActivityHistoryCustomFilter,
13
+ IActivityHistoryCustomFilterGroup,
14
+ IActivityHistoryDiagnosticsFilter,
15
+ IActivityHistoryFilter,
16
+ IActivityHistoryUpFilter,
17
+ } from "../../model";
12
18
  import { activityHistoryEnabledCommonFiltersSelector } from "../../common-filters/selectors";
13
19
  import { SetCommonFilter } from "../../common-filters/set-common-filter/request";
14
20
  import { diagnosticFilterSelector } from "../../diagnostic-filters/selectors";
15
21
  import { SetDiagnosticFiltersCommand } from "../../diagnostic-filters/set/request";
16
22
  import { ResetCommonFilter } from "../../common-filters/reset-common-filter/request";
17
23
  import { ResetCustomFilter } from "../../custom-filters/reset-custom-filter/request";
24
+ import { upFilterSelector } from "../../up-filters/selectors";
25
+ import { SetUpFiltersCommand } from "../../up-filters/set/request";
26
+ import { customFilterGroupsWithOptionsSelector } from "../../../selectors";
18
27
 
19
28
  //@ts-ignore
20
29
  @customElement("active-filters-badges")
@@ -35,12 +44,15 @@ export class ActiveFiltersBadges extends LitElement {
35
44
  @connectedProperty(activityHistoryEnabledCommonFiltersSelector)
36
45
  enabledCommonFilters: IActivityHistoryFilter[];
37
46
 
38
- @connectedProperty(activeGroupsWithEnabledFilters)
47
+ @connectedProperty(customFilterGroupsWithOptionsSelector)
39
48
  enabledFilters: IActivityHistoryCustomFilterGroup[];
40
49
 
41
50
  @connectedProperty(diagnosticFilterSelector)
42
51
  diagnosticFilterEnabled: IActivityHistoryDiagnosticsFilter;
43
52
 
53
+ @connectedProperty(upFilterSelector)
54
+ upFilterEnabled: IActivityHistoryUpFilter;
55
+
44
56
  _onDeleteFilterValue(filterGroupId: string, filterId: string, optionId: string, value: boolean) {
45
57
  this.api.broker.send(
46
58
  new SetCustomFilterValue({
@@ -58,14 +70,17 @@ export class ActiveFiltersBadges extends LitElement {
58
70
 
59
71
  _onDeleteDiagnosticFilterValue(diagnosticValue: string) {
60
72
  this.api.broker.send(
61
- new SetDiagnosticFiltersCommand([
62
- ...this.diagnosticFilterEnabled.enabledValues.filter((v) => v !== diagnosticValue),
63
- ]),
73
+ new SetDiagnosticFiltersCommand([...this.diagnosticFilterEnabled.enabledValues.filter((v) => v !== diagnosticValue)]),
64
74
  );
65
75
  }
66
76
 
77
+ _onDeleteUpFilterValue(upValue: string) {
78
+ this.api.broker.send(new SetUpFiltersCommand([...this.upFilterEnabled.enabledValues.filter((v) => v !== upValue)]));
79
+ }
80
+
67
81
  resetFilters() {
68
82
  this.api.broker.send(new SetDiagnosticFiltersCommand([]));
83
+ this.api.broker.send(new SetUpFiltersCommand([]));
69
84
  this.api.broker.send(new ResetCommonFilter());
70
85
  this.api.broker.send(new ResetCustomFilter());
71
86
  }
@@ -5,14 +5,14 @@ import { formatShowFilterTitle, normalizeDeletedFilterBooleanValue, normalizeEmp
5
5
 
6
6
  const MAX_VISIBLE_CHIPS = 5;
7
7
 
8
- const renderChip = (id, filter, value, props) => html`
8
+ const renderChip = (id, filter, option, props) => html`
9
9
  <dss-chip
10
- label=${normalizeEmptyFilterValue(value, filter.title)}
10
+ label=${normalizeEmptyFilterValue(option.title, filter.title)}
11
11
  size="sm"
12
12
  hasdelete
13
13
  selected
14
- @click=${() => props._onDeleteFilterValue(id, filter.id, value, false)}
15
- @onDelete=${() => props._onDeleteFilterValue(id, filter.id, value, false)}
14
+ @click=${() => props._onDeleteFilterValue(id, filter.id, option.id, false)}
15
+ @onDelete=${() => props._onDeleteFilterValue(id, filter.id, option.id, false)}
16
16
  ></dss-chip>
17
17
  `;
18
18
 
@@ -38,13 +38,26 @@ const renderDiagnosticChip = (id, value, props) => html`
38
38
  ></dss-chip>
39
39
  `;
40
40
 
41
+ const renderUpChip = (id, value, props) => html`
42
+ <dss-chip
43
+ label=${value}
44
+ size="sm"
45
+ hasdelete
46
+ selected
47
+ @click=${() => props._onDeleteUpFilterValue(id)}
48
+ @onDelete=${() => props._onDeleteUpFilterValue(id)}
49
+ ></dss-chip>
50
+ `;
51
+
41
52
  const renderFilterTitle = (title) => html`<div class="filter-title">${`${title}:`}</div>`;
42
53
 
43
54
  export const template = (props: ActiveFiltersBadges) => {
55
+ //TODO: refactor chips render
44
56
  if (
45
57
  props.enabledFilters.length === 0 &&
46
58
  props.enabledCommonFilters.length === 0 &&
47
- props.diagnosticFilterEnabled.enabledValues.length === 0
59
+ props.diagnosticFilterEnabled.enabledValues.length === 0 &&
60
+ props.upFilterEnabled.enabledValues.length === 0
48
61
  )
49
62
  return nothing;
50
63
 
@@ -85,6 +98,38 @@ export const template = (props: ActiveFiltersBadges) => {
85
98
  }
86
99
  }
87
100
 
101
+ const up = props.upFilterEnabled;
102
+
103
+ if (up) {
104
+ const { title, values, enabledValues } = up;
105
+ const selectedOptions = values.filter((opt) => enabledValues.includes(opt.value));
106
+
107
+ if (selectedOptions.length > 0) {
108
+ let titleAddedToVisible = false;
109
+ let titleAddedToHidden = false;
110
+
111
+ for (const option of selectedOptions) {
112
+ const chip = renderUpChip(option.value, option.label, props);
113
+
114
+ if (visibleCount < MAX_VISIBLE_CHIPS) {
115
+ if (!titleAddedToVisible) {
116
+ visibleChips.push(renderFilterTitle(title));
117
+ titleAddedToVisible = true;
118
+ }
119
+ visibleChips.push(chip);
120
+ visibleCount++;
121
+ } else {
122
+ if (!titleAddedToHidden) {
123
+ hiddenElements.push(renderFilterTitle(title));
124
+ titleAddedToHidden = true;
125
+ }
126
+ hiddenElements.push(chip);
127
+ hiddenChips.push(chip);
128
+ }
129
+ }
130
+ }
131
+ }
132
+
88
133
  for (const filter of props.enabledCommonFilters) {
89
134
  const chip = renderCommonChip(filter, props);
90
135
 
@@ -103,7 +148,21 @@ export const template = (props: ActiveFiltersBadges) => {
103
148
 
104
149
  for (const filter of filters) {
105
150
  for (const value of [...new Set(filter.enabledValues)]) {
106
- const chip = renderChip(id, filter, normalizeDeletedFilterBooleanValue(value), props);
151
+ let filterOption = filter?.options?.find((o) => o.id === value);
152
+
153
+ if (filterOption) {
154
+ //Fill when filter option doesnt have title (description)
155
+ filterOption.title = filterOption.title !== "" ? filterOption.title : value;
156
+ } else {
157
+ //Hi ha un filtre de curs clinic "veure eliminats" booleà que no serà un filterOption, per tant entra aquí
158
+ //Aqui es crea el objecte que es passa al chip
159
+ const deletedFiltersOption = normalizeDeletedFilterBooleanValue(value);
160
+ filterOption = { title: deletedFiltersOption, id: deletedFiltersOption };
161
+ }
162
+
163
+ const chip2 = renderChip(id, filter, normalizeDeletedFilterBooleanValue(value), props);
164
+
165
+ const chip = renderChip(id, filter, filterOption, props);
107
166
 
108
167
  if (visibleCount < MAX_VISIBLE_CHIPS) {
109
168
  if (!titleAddedToVisible) {
@@ -7,6 +7,7 @@ import { activityHistorySearchStringSelector } from "../../../search/selectors";
7
7
  import { areCustomFiltersActive } from "../../custom-filters/selectors";
8
8
  import { areCommonFiltersActive } from "../../common-filters/selectors";
9
9
  import { areDiagnosticFiltersActive } from "../../diagnostic-filters/selectors";
10
+ import { areUpFiltersActive } from "../../up-filters/selectors";
10
11
 
11
12
  //@ts-ignore
12
13
  @customElement("active-filters-header")
@@ -30,4 +31,7 @@ export class ActiveFiltersHeader extends LitElement {
30
31
 
31
32
  @connectedProperty(areDiagnosticFiltersActive)
32
33
  areDiagnosticFiltersActive: boolean;
34
+
35
+ @connectedProperty(areUpFiltersActive)
36
+ areUpFiltersActive: boolean;
33
37
  }
@@ -7,6 +7,7 @@ export const template = (props: ActiveFiltersHeader) => {
7
7
  !props.areCustomFiltersActive &&
8
8
  !props.areCommonFiltersActive &&
9
9
  !props.areDiagnosticFiltersActive &&
10
+ !props.areUpFiltersActive &&
10
11
  props.searchString.length < 1
11
12
  )
12
13
  return nothing;
@@ -8,6 +8,7 @@ import {
8
8
  IActivityHistoryCommonFilter,
9
9
  IActivityHistoryCustomFilterGroup,
10
10
  IActivityHistoryDiagnosticsFilter,
11
+ IActivityHistoryUpFilter,
11
12
  } from "../../model";
12
13
  import styles from "./styles.css?inline";
13
14
  import { template } from "./template";
@@ -16,11 +17,10 @@ import { SetCommonFilter } from "../../common-filters/set-common-filter/request"
16
17
  import { activityHistoryCommonFiltersSelector } from "../../common-filters/selectors";
17
18
  import { SetCustomFilterValue } from "../../custom-filters/set-custom-filter-value/request";
18
19
  import { customFilterGroupsWithOptionsSelector } from "../../../selectors";
19
- import {
20
- diagnosticFilterEnabledValuesSelector,
21
- diagnosticFilterSelector,
22
- } from "../../diagnostic-filters/selectors";
20
+ import { diagnosticFilterEnabledValuesSelector, diagnosticFilterSelector } from "../../diagnostic-filters/selectors";
23
21
  import { SetDiagnosticFiltersCommand } from "../../diagnostic-filters/set/request";
22
+ import { upFilterEnabledValuesSelector, upFilterSelector } from "../../up-filters/selectors";
23
+ import { SetUpFiltersCommand } from "../../up-filters/set/request";
24
24
 
25
25
  //@ts-ignore
26
26
  @customElement("activity-history-filters")
@@ -45,6 +45,12 @@ export class ActivityHistoryFilters extends LitElement {
45
45
  @connectedProperty(diagnosticFilterEnabledValuesSelector)
46
46
  diagnosticFilterEnabledValues: string[];
47
47
 
48
+ @connectedProperty(upFilterSelector)
49
+ upFilter: IActivityHistoryUpFilter;
50
+
51
+ @connectedProperty(upFilterEnabledValuesSelector)
52
+ upFilterEnabledValues: string[];
53
+
48
54
  @lazyInject(TYPES.primaryApi)
49
55
  api: PrimariaApi;
50
56
 
@@ -72,12 +78,7 @@ export class ActivityHistoryFilters extends LitElement {
72
78
  this.api.broker.send(new SetCustomFilterGroup({ id: filterGroupId, enabled: value }));
73
79
  }
74
80
 
75
- _onChangeCustomFilterValue(
76
- filterGroupId: string,
77
- filterId: string,
78
- optionId: string,
79
- value: boolean,
80
- ) {
81
+ _onChangeCustomFilterValue(filterGroupId: string, filterId: string, optionId: string, value: boolean) {
81
82
  this.api.broker.send(
82
83
  new SetCustomFilterValue({
83
84
  filterGroupId,
@@ -92,4 +93,9 @@ export class ActivityHistoryFilters extends LitElement {
92
93
  const selectedValues = e.detail.selectedValue;
93
94
  this.api.broker.send(new SetDiagnosticFiltersCommand(selectedValues));
94
95
  }
96
+
97
+ _handleUpFilterChange(e: CustomEvent) {
98
+ const selectedValues = e.detail.selectedValue;
99
+ this.api.broker.send(new SetUpFiltersCommand(selectedValues));
100
+ }
95
101
  }
@@ -41,6 +41,7 @@
41
41
  display: flex;
42
42
  flex-direction: column;
43
43
  padding-top: 12px;
44
+ gap: var(--dss-spacing-xs);
44
45
 
45
46
  .custom-filter{
46
47
  display: flex;