@uxland/primary-shell 5.4.6 → 5.5.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 (73) hide show
  1. package/dist/index.js +1314 -1050
  2. package/dist/index.js.map +1 -1
  3. package/dist/index.umd.cjs +171 -121
  4. package/dist/index.umd.cjs.map +1 -1
  5. package/dist/primary/shell/src/UI/components/communication-action-menu/communication-action-menu.d.ts +16 -0
  6. package/dist/primary/shell/src/UI/components/communication-action-menu/template.d.ts +3 -0
  7. package/dist/primary/shell/src/UI/internal-views/upper-nav-views.d.ts +2 -0
  8. package/dist/primary/shell/src/UI/shared-components/quick-action-item/quick-action-item.d.ts +9 -0
  9. package/dist/primary/shell/src/UI/shared-components/quick-action-item/template.d.ts +3 -0
  10. package/dist/primary/shell/src/api/region-manager/regions.d.ts +1 -0
  11. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/domain/specs/up-filter-spec.d.ts +8 -0
  12. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/domain/specs/up-filter-spec.test.d.ts +1 -0
  13. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/UI/active-filters-badges/active-filters-badges.d.ts +3 -1
  14. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/UI/active-filters-header/active-filters-header.d.ts +1 -0
  15. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/UI/activity-history-filters/activity-history-filters.d.ts +4 -1
  16. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/model.d.ts +13 -1
  17. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/slice.d.ts +4 -0
  18. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/add/actions.d.ts +1 -0
  19. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/add/bootstrapper.d.ts +4 -0
  20. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/add/handler.d.ts +6 -0
  21. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/add/reducer.d.ts +4 -0
  22. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/add/reducer.test.d.ts +1 -0
  23. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/add/request.d.ts +6 -0
  24. 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
  25. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/selectors.d.ts +185 -0
  26. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/set/actions.d.ts +1 -0
  27. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/set/bootstrapper.d.ts +4 -0
  28. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/set/handler.d.ts +6 -0
  29. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/set/reducer.d.ts +3 -0
  30. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/set/request.d.ts +4 -0
  31. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/selectors.d.ts +60 -0
  32. package/package.json +1 -1
  33. package/src/UI/components/bootstrapper.ts +2 -0
  34. package/src/UI/components/communication-action-menu/communication-action-menu.ts +48 -0
  35. package/src/UI/components/communication-action-menu/styles.css +25 -0
  36. package/src/UI/components/communication-action-menu/template.ts +24 -0
  37. package/src/UI/components/primaria-shell/styles.css +0 -3
  38. package/src/UI/internal-views/handle-views.ts +4 -1
  39. package/src/UI/internal-views/upper-nav-views.ts +59 -29
  40. package/src/UI/shared-components/quick-action-item/quick-action-item.ts +21 -0
  41. package/src/UI/shared-components/quick-action-item/template.ts +8 -0
  42. package/src/api/region-manager/regions.ts +1 -0
  43. package/src/internal-plugins/activity-history/activity-history-item/add/add-history-item/handler.ts +2 -0
  44. package/src/internal-plugins/activity-history/activity-history-item/add/add-history-items/handler.ts +2 -0
  45. package/src/internal-plugins/activity-history/activity-history-item/domain/specs/up-filter-spec.test.ts +38 -0
  46. package/src/internal-plugins/activity-history/activity-history-item/domain/specs/up-filter-spec.ts +18 -0
  47. package/src/internal-plugins/activity-history/activity-history-item/filter/UI/active-filters-badges/active-filters-badges.ts +15 -1
  48. package/src/internal-plugins/activity-history/activity-history-item/filter/UI/active-filters-badges/template.ts +45 -1
  49. package/src/internal-plugins/activity-history/activity-history-item/filter/UI/active-filters-header/active-filters-header.ts +4 -0
  50. package/src/internal-plugins/activity-history/activity-history-item/filter/UI/active-filters-header/template.ts +1 -0
  51. package/src/internal-plugins/activity-history/activity-history-item/filter/UI/activity-history-filters/activity-history-filters.ts +16 -10
  52. package/src/internal-plugins/activity-history/activity-history-item/filter/UI/activity-history-filters/styles.css +1 -0
  53. package/src/internal-plugins/activity-history/activity-history-item/filter/UI/activity-history-filters/template.ts +51 -15
  54. package/src/internal-plugins/activity-history/activity-history-item/filter/bootstrapper.ts +6 -0
  55. package/src/internal-plugins/activity-history/activity-history-item/filter/custom-filters/reset-custom-filter/reducer.ts +1 -2
  56. package/src/internal-plugins/activity-history/activity-history-item/filter/model.ts +14 -8
  57. package/src/internal-plugins/activity-history/activity-history-item/filter/slice.ts +4 -0
  58. package/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/add/actions.ts +3 -0
  59. package/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/add/bootstrapper.ts +14 -0
  60. package/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/add/handler.ts +14 -0
  61. package/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/add/reducer.test.ts +93 -0
  62. package/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/add/reducer.ts +22 -0
  63. package/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/add/request.ts +5 -0
  64. package/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/handle-add-up-options-from-item.ts +20 -0
  65. package/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/selectors.ts +14 -0
  66. package/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/set/actions.ts +3 -0
  67. package/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/set/bootstrapper.ts +14 -0
  68. package/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/set/handler.ts +13 -0
  69. package/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/set/reducer.ts +11 -0
  70. package/src/internal-plugins/activity-history/activity-history-item/filter/up-filters/set/request.ts +3 -0
  71. package/src/internal-plugins/activity-history/activity-history-item/selectors.ts +10 -23
  72. package/src/internal-plugins/activity-history/utils/get-unique-values-by-prop-path.ts +3 -1
  73. package/src/locales.ts +3 -6
@@ -0,0 +1,14 @@
1
+ import { StoreBaseHandler } from "../../../../infrastructure/base-handlers";
2
+ import { addUpFilters } from "./actions";
3
+ import { AddUpFiltersCommand } from "./request";
4
+
5
+ export class AddUpFiltersHandler extends StoreBaseHandler {
6
+ async handle(request: AddUpFiltersCommand) {
7
+ try {
8
+ //TODO ensure are valid filters
9
+ this.store.dispatch(addUpFilters(request.payload));
10
+ } catch (e) {
11
+ console.log(e.message);
12
+ }
13
+ }
14
+ }
@@ -0,0 +1,93 @@
1
+ import { describe, it, expect, beforeEach, vi } from "vitest";
2
+ import { createSlice, PayloadAction } from "@reduxjs/toolkit";
3
+ import { IActivityHistoryUpFilter, isUpFilter } from "../../model";
4
+ import { addUpFiltersReducer } from "./reducer";
5
+
6
+ vi.mock("../../model", () => ({
7
+ isUpFilter: vi.fn(),
8
+ }));
9
+
10
+ describe("addUpFiltersReducer", () => {
11
+ let initialState: { filters: IActivityHistoryUpFilter[] };
12
+
13
+ const baseFilter = (values: any[]): IActivityHistoryUpFilter => ({
14
+ id: "up",
15
+ title: "UP",
16
+ values,
17
+ enabledValues: [],
18
+ });
19
+
20
+ beforeEach(() => {
21
+ initialState = {
22
+ filters: [],
23
+ };
24
+ vi.clearAllMocks();
25
+ });
26
+
27
+ const slice = createSlice({
28
+ name: "activity",
29
+ initialState,
30
+ reducers: {
31
+ addUpFilters: addUpFiltersReducer,
32
+ },
33
+ });
34
+
35
+ const { addUpFilters } = slice.actions;
36
+ const reducer = slice.reducer;
37
+
38
+ it("should add a new up filter if none exists", () => {
39
+ (isUpFilter as any).mockReturnValue(false);
40
+
41
+ const newUp = baseFilter([{ label: "0773", value: "0773" }]);
42
+
43
+ const nextState = reducer(initialState, addUpFilters(newUp));
44
+
45
+ expect(nextState.filters).toHaveLength(1);
46
+ expect(nextState.filters[0]).toEqual(newUp);
47
+ });
48
+
49
+ it("should merge values if a up filter already exists", () => {
50
+ const existingFilter = baseFilter([{ label: "0773", value: "0773" }]);
51
+ initialState.filters = [existingFilter];
52
+
53
+ (isUpFilter as any).mockImplementation((f) => f.id === "up");
54
+
55
+ const incomingFilter = baseFilter([{ label: "0444", value: "0444" }]);
56
+
57
+ const nextState = reducer(initialState, addUpFilters(incomingFilter));
58
+
59
+ expect(nextState.filters).toHaveLength(1);
60
+ expect(nextState.filters[0].values).toContainEqual({ label: "0773", value: "0773" });
61
+ expect(nextState.filters[0].values).toContainEqual({ label: "0444", value: "0444" });
62
+ });
63
+
64
+ it("should avoid duplicate values when merging", () => {
65
+ const existingFilter = baseFilter([{ label: "0444", value: "0444" }]);
66
+ initialState.filters = [existingFilter];
67
+
68
+ (isUpFilter as any).mockImplementation((f) => f.id === "up");
69
+
70
+ const incomingFilter = baseFilter([{ label: "0444", value: "0444" }]);
71
+
72
+ const nextState = reducer(initialState, addUpFilters(incomingFilter));
73
+
74
+ expect(nextState.filters).toHaveLength(1);
75
+ expect(nextState.filters[0].values).toEqual([{ label: "0444", value: "0444" }]);
76
+ });
77
+
78
+ it("should preserve other properties of the existing filter", () => {
79
+ const existingFilter = {
80
+ ...baseFilter([{ label: "A", value: "1" }]),
81
+ enabledValues: ["1"],
82
+ };
83
+ initialState.filters = [existingFilter];
84
+
85
+ (isUpFilter as any).mockReturnValue(true);
86
+
87
+ const incomingFilter = baseFilter([{ label: "B", value: "2" }]);
88
+
89
+ const nextState = reducer(initialState, addUpFilters(incomingFilter));
90
+
91
+ expect(nextState.filters[0].enabledValues).toEqual(["1"]); // no se sobreescribe
92
+ });
93
+ });
@@ -0,0 +1,22 @@
1
+ import { PayloadAction } from "@reduxjs/toolkit";
2
+ import { IActivityHistoryUpFilter, isUpFilter } from "../../model";
3
+
4
+ export function addUpFiltersReducer(state, action: PayloadAction<IActivityHistoryUpFilter>) {
5
+ const index = state.filters.findIndex(isUpFilter);
6
+
7
+ if (index === -1) {
8
+ state.filters.push(action.payload);
9
+ } else {
10
+ const existing = state.filters[index];
11
+
12
+ const mergedValues = [
13
+ ...existing.values,
14
+ ...action.payload.values.filter((v) => !existing.values.some((ev) => ev.value === v.value)),
15
+ ];
16
+
17
+ state.filters[index] = {
18
+ ...existing,
19
+ values: mergedValues,
20
+ };
21
+ }
22
+ }
@@ -0,0 +1,5 @@
1
+ import { IActivityHistoryUpFilter } from "../../model";
2
+
3
+ export class AddUpFiltersCommand {
4
+ constructor(public payload: IActivityHistoryUpFilter) {}
5
+ }
@@ -0,0 +1,20 @@
1
+ import { mapArrayToLabelValue } from "@primaria/plugins-core";
2
+ import { Store } from "@reduxjs/toolkit";
3
+ import { IActivityHistoryItem } from "../../domain/model";
4
+ import { upFilterId } from "../model";
5
+ import { addUpFilters } from "./add/actions";
6
+
7
+ export const handleAddUpFilter = (items: IActivityHistoryItem[], store: Store) => {
8
+ const allUps = items.flatMap((item) => item.up ?? []).filter((up, index, self) => index === self.findIndex((u) => u.id === up.id));
9
+
10
+ if (allUps.length > 0) {
11
+ const newUpFilter = {
12
+ id: upFilterId,
13
+ title: "UP",
14
+ values: mapArrayToLabelValue(allUps, "description", "id"),
15
+ enabledValues: [],
16
+ };
17
+
18
+ store.dispatch(addUpFilters(newUpFilter));
19
+ }
20
+ };
@@ -0,0 +1,14 @@
1
+ import { createSelector } from "@reduxjs/toolkit";
2
+ import { IActivityHistoryFilter, IActivityHistoryUpFilter, isUpFilter } from "../model";
3
+ import { activityHistoryFiltersSelector } from "../selectors";
4
+
5
+ export const upFilterSelector = createSelector(activityHistoryFiltersSelector, (filters: IActivityHistoryFilter[]) =>
6
+ filters.find(isUpFilter),
7
+ );
8
+
9
+ export const upFilterEnabledValuesSelector = createSelector(
10
+ upFilterSelector,
11
+ (filter: IActivityHistoryUpFilter) => filter?.enabledValues || [],
12
+ );
13
+
14
+ export const areUpFiltersActive = createSelector(upFilterEnabledValuesSelector, (filters) => !!filters.length);
@@ -0,0 +1,3 @@
1
+ import { activityHistoryFiltersSlice } from "../../slice";
2
+
3
+ export const { setUpFilterValues } = activityHistoryFiltersSlice.actions;
@@ -0,0 +1,14 @@
1
+ import { BrokerExtensions } from "@primaria/plugins-core";
2
+ import { BrokerDisposableHandler } from "../../../../../../api/broker/primaria-broker";
3
+ import { SetUpFiltersHandler } from "./handler";
4
+ import { SetUpFiltersCommand } from "./request";
5
+
6
+ let request: BrokerDisposableHandler;
7
+
8
+ export const bootstrapSetUpFilter = (broker: BrokerExtensions) => {
9
+ request = broker.registerRequest(SetUpFiltersCommand, SetUpFiltersHandler);
10
+ };
11
+
12
+ export const teardownSetUpFilter = () => {
13
+ request?.dispose();
14
+ };
@@ -0,0 +1,13 @@
1
+ import { StoreBaseHandler } from "../../../../infrastructure/base-handlers";
2
+ import { setUpFilterValues } from "./actions";
3
+ import { SetUpFiltersCommand } from "./request";
4
+
5
+ export class SetUpFiltersHandler extends StoreBaseHandler {
6
+ async handle(request: SetUpFiltersCommand) {
7
+ try {
8
+ this.store.dispatch(setUpFilterValues(request.payload));
9
+ } catch (e) {
10
+ console.log(e.message);
11
+ }
12
+ }
13
+ }
@@ -0,0 +1,11 @@
1
+ import { PayloadAction } from "@reduxjs/toolkit";
2
+ import { IActivityHistoryUpFilter, isUpFilter } from "../../model";
3
+
4
+ export function setUpFilterValuesReducer(state, action: PayloadAction<string[]>) {
5
+ state.filters = [...state.filters].map((f) => {
6
+ if (isUpFilter(f)) {
7
+ return { ...f, enabledValues: action.payload } as IActivityHistoryUpFilter;
8
+ }
9
+ return f;
10
+ });
11
+ }
@@ -0,0 +1,3 @@
1
+ export class SetUpFiltersCommand {
2
+ constructor(public payload: string[]) {}
3
+ }
@@ -1,11 +1,7 @@
1
1
  import { createSelector } from "@reduxjs/toolkit";
2
2
  import { RootState } from "../infrastructure/state/store";
3
3
  import { getUniqueObjects } from "../utils/get-unique-values-by-prop-path";
4
- import {
5
- IActivityHistoryItem,
6
- IActivityHistoryItemCollection,
7
- TSearchActivityHistoryItemPredicate,
8
- } from "./domain/model";
4
+ import { IActivityHistoryItem, IActivityHistoryItemCollection, TSearchActivityHistoryItemPredicate } from "./domain/model";
9
5
  import { CommonFilterSpec } from "./domain/specs/common-filter-spec";
10
6
  import { CustomFilterSpec } from "./domain/specs/custom-filter-spec";
11
7
  import { SearchStringSpec } from "./domain/specs/search-string-spec";
@@ -18,9 +14,10 @@ import { sortGroupsByMostRecentDate } from "./list/sort-history-items-by-date/so
18
14
  import { activityHistorySearchStringSelector } from "./search/selectors";
19
15
  import { diagnosticFilterEnabledValuesSelector } from "./filter/diagnostic-filters/selectors";
20
16
  import { DiagnosticCodeSpec } from "./domain/specs/diagnostics-filter-spec";
17
+ import { upFilterEnabledValuesSelector } from "./filter/up-filters/selectors";
18
+ import { UpFilterSpec } from "./domain/specs/up-filter-spec";
21
19
 
22
- export const activityHistoryCollectionsSelector = (state: RootState) =>
23
- state.activityHistoryCollections.collections;
20
+ export const activityHistoryCollectionsSelector = (state: RootState) => state.activityHistoryCollections.collections;
24
21
 
25
22
  const mapItemsWithMetadata = (
26
23
  items: IActivityHistoryItem[],
@@ -43,12 +40,7 @@ export const activityHistoryMappedItems = createSelector(
43
40
  activityHistoryCollectionsSelector,
44
41
  (collections: Record<string, IActivityHistoryItemCollection>) => {
45
42
  return Object.values(collections).flatMap((collection: IActivityHistoryItemCollection) => {
46
- return mapItemsWithMetadata(
47
- collection.items,
48
- collection.componentFactory,
49
- collection.id,
50
- collection.searchPredicate,
51
- );
43
+ return mapItemsWithMetadata(collection.items, collection.componentFactory, collection.id, collection.searchPredicate);
52
44
  });
53
45
  },
54
46
  );
@@ -56,10 +48,7 @@ export const activityHistoryMappedItems = createSelector(
56
48
  export const customFilterGroupsWithOptionsSelector = createSelector(
57
49
  activityHistoryCustomFilterGroupsSelector,
58
50
  activityHistoryCollectionsSelector,
59
- (
60
- filterGroups: IActivityHistoryCustomFilterGroup[],
61
- collections: Record<string, IActivityHistoryItemCollection>,
62
- ) => {
51
+ (filterGroups: IActivityHistoryCustomFilterGroup[], collections: Record<string, IActivityHistoryItemCollection>) => {
63
52
  const result = filterGroups.map((filterGroup: IActivityHistoryCustomFilterGroup) => {
64
53
  const collection = collections[filterGroup.id] as IActivityHistoryItemCollection;
65
54
  return {
@@ -69,12 +58,7 @@ export const customFilterGroupsWithOptionsSelector = createSelector(
69
58
  ...f,
70
59
  options:
71
60
  (!f.singleOption
72
- ? getUniqueObjects<IActivityHistoryItem>(
73
- collection.items,
74
- f.propPathValue,
75
- f.propsPathDescription,
76
- f.title
77
- )
61
+ ? getUniqueObjects<IActivityHistoryItem>(collection.items, f.propPathValue, f.propsPathDescription, f.title)
78
62
  : []) || [],
79
63
  };
80
64
  }),
@@ -90,12 +74,14 @@ export const activityHistoryGroupedItems = createSelector(
90
74
  activityHistoryCommonFiltersSelector,
91
75
  activityHistoryCustomFilterGroupsSelector,
92
76
  diagnosticFilterEnabledValuesSelector,
77
+ upFilterEnabledValuesSelector,
93
78
  (
94
79
  items: IActivityHistoryItem[],
95
80
  searchString: string,
96
81
  commonFilters: IActivityHistoryCommonFilter[],
97
82
  customFilters: IActivityHistoryCustomFilterGroup[],
98
83
  diagnosticFilterEnabledValues: string[],
84
+ upFilterEnabledValues: string[],
99
85
  ) => {
100
86
  const filteredItems = items.filter((item: IActivityHistoryItem) =>
101
87
  new SearchStringSpec(searchString, item.searchPredicate)
@@ -103,6 +89,7 @@ export const activityHistoryGroupedItems = createSelector(
103
89
  .and(new ComposedTypeSpec(customFilters))
104
90
  .and(new CustomFilterSpec(customFilters))
105
91
  .and(new DiagnosticCodeSpec(diagnosticFilterEnabledValues))
92
+ .and(new UpFilterSpec(upFilterEnabledValues))
106
93
  .isSatisfiedBy(item),
107
94
  );
108
95
 
@@ -13,7 +13,9 @@ export function getUniqueObjects<T>(
13
13
  const title = propPathDescription.reduce((acc, key) => acc?.[key], item);
14
14
 
15
15
  const isValidId = typeof id === "string" && id.trim() !== "";
16
- const isValidTitle = typeof title === "string" && title.trim() !== "";
16
+
17
+ //Tret el trim del title pels casos de migració on arriben camps buits
18
+ const isValidTitle = typeof title === "string";
17
19
 
18
20
  if (isValidId && isValidTitle) {
19
21
  if (!map.has(id)) {
package/src/locales.ts CHANGED
@@ -12,9 +12,7 @@ export const useLocalization = async (api: PrimariaApi) => {
12
12
 
13
13
  type LocaleKeys<T> = T extends object
14
14
  ? {
15
- [K in keyof T]:
16
- | `${K & string}`
17
- | (T[K] extends object ? `${K & string}.${LocaleKeys<T[K]>}` : never);
15
+ [K in keyof T]: `${K & string}` | (T[K] extends object ? `${K & string}.${LocaleKeys<T[K]>}` : never);
18
16
  }[keyof T]
19
17
  : never;
20
18
 
@@ -43,12 +41,11 @@ export const locales = {
43
41
  },
44
42
  errors: {
45
43
  session: "Hi ha hagut un error amb la sessió. Siusplau, tanca i torna a obrir l'aplicació.",
46
- invalidPatient:
47
- "El pacient actual no és vàlid. Siusplau, tanca i torna a obrir l'aplicació.",
44
+ invalidPatient: "El pacient actual no és vàlid. Siusplau, tanca i torna a obrir l'aplicació.",
48
45
  },
49
46
  header: {
50
47
  workCenter: "Centre treball",
51
- role: "Rol",
48
+ role: "Tipus de profesional",
52
49
  speciality: "Àmbit treball",
53
50
  },
54
51
  busyManager: {