@uxland/primary-shell 5.3.7 → 5.3.8

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 (123) hide show
  1. package/dist/index.js +3260 -3463
  2. package/dist/index.js.map +1 -1
  3. package/dist/index.umd.cjs +121 -85
  4. package/dist/index.umd.cjs.map +1 -1
  5. package/dist/primary/shell/src/events.d.ts +1 -0
  6. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/add/add-async-history-items/request.d.ts +3 -2
  7. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/add/handle-error/actions.d.ts +1 -0
  8. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/add/handle-error/handle-history-items-add-error/bootstrapper.d.ts +4 -0
  9. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/add/handle-error/handle-history-items-add-error/handler.d.ts +7 -0
  10. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/add/handle-error/handle-history-items-add-error/request.d.ts +6 -0
  11. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/add/handle-error/history-full-data-error/component.d.ts +10 -0
  12. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/add/handle-error/history-full-data-error/template.d.ts +3 -0
  13. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/add/handle-error/history-partial-data-error/component.d.ts +11 -0
  14. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/add/handle-error/history-partial-data-error/template.d.ts +3 -0
  15. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/{list → add}/handle-error/reducers.d.ts +2 -4
  16. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/add/handle-error/selectors.d.ts +5 -0
  17. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/domain/model.d.ts +2 -1
  18. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/domain/specs/diagnostics-filter-spec.d.ts +8 -0
  19. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/domain/specs/diagnostics-filter-spec.test.d.ts +1 -0
  20. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/UI/active-filters-badges/active-filters-badges.d.ts +4 -2
  21. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/UI/active-filters-header/active-filters-header.d.ts +1 -0
  22. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/UI/activity-history-filters/activity-history-filters.d.ts +4 -1
  23. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/common-filters/selectors.d.ts +42 -42
  24. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/custom-filters/add-custom-filters/actions.d.ts +1 -1
  25. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/custom-filters/add-custom-filters/reducer.d.ts +2 -2
  26. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/custom-filters/add-custom-filters/request.d.ts +3 -3
  27. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/custom-filters/selectors.d.ts +29 -29
  28. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/add/actions.d.ts +1 -0
  29. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/add/bootstrapper.d.ts +4 -0
  30. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/add/handler.d.ts +6 -0
  31. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/add/reducer.d.ts +4 -0
  32. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/add/reducer.test.d.ts +1 -0
  33. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/add/request.d.ts +6 -0
  34. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/handle-add-diagnostics-options-from-item.d.ts +5 -0
  35. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/handle-add-diagnostics-options-from-item.test.d.ts +1 -0
  36. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/selectors.d.ts +185 -0
  37. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/set/actions.d.ts +1 -0
  38. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/set/bootstrapper.d.ts +4 -0
  39. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/set/handler.d.ts +6 -0
  40. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/set/reducer.d.ts +3 -0
  41. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/set/request.d.ts +4 -0
  42. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/model.d.ts +18 -3
  43. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/selectors.d.ts +1 -1
  44. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/slice.d.ts +7 -3
  45. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/selectors.d.ts +86 -27
  46. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/slice.d.ts +2 -2
  47. package/dist/primary/shell/src/internal-plugins/activity-history/infrastructure/state/store.d.ts +4 -4
  48. package/dist/primary/shell/src/internal-plugins/activity-history/localization.d.ts +16 -0
  49. package/package.json +1 -2
  50. package/src/UI/images/feedback-error.svg +9 -0
  51. package/src/UI/internal-views/upper-nav-views.ts +90 -17
  52. package/src/UI/shared-components/primaria-character-limit-badge/primaria-character-limit-badge.ts +5 -7
  53. package/src/UI/shared-components/primaria-character-limit-badge/styles.css +1 -1
  54. package/src/api/interaction-service/modal-styles.css +1 -1
  55. package/src/events.ts +1 -0
  56. package/src/features/clinical-monitoring/component/template.ts +5 -5
  57. package/src/internal-plugins/activity-history/activity-history-item/add/add-async-history-items/handler.ts +4 -3
  58. package/src/internal-plugins/activity-history/activity-history-item/add/add-async-history-items/request.ts +3 -2
  59. package/src/internal-plugins/activity-history/activity-history-item/add/add-history-item/handler.ts +2 -0
  60. package/src/internal-plugins/activity-history/activity-history-item/add/add-history-items/handler.ts +2 -0
  61. package/src/internal-plugins/activity-history/activity-history-item/add/handle-error/handle-history-items-add-error/bootstrapper.ts +18 -0
  62. package/src/internal-plugins/activity-history/activity-history-item/add/handle-error/handle-history-items-add-error/handler.ts +26 -0
  63. package/src/internal-plugins/activity-history/activity-history-item/add/handle-error/handle-history-items-add-error/request.ts +5 -0
  64. package/src/internal-plugins/activity-history/activity-history-item/add/handle-error/history-full-data-error/component.ts +32 -0
  65. package/src/internal-plugins/activity-history/activity-history-item/add/handle-error/history-full-data-error/styles.css +11 -0
  66. package/src/internal-plugins/activity-history/activity-history-item/add/handle-error/history-full-data-error/template.ts +23 -0
  67. package/src/internal-plugins/activity-history/activity-history-item/add/handle-error/history-partial-data-error/component.ts +42 -0
  68. package/src/internal-plugins/activity-history/activity-history-item/add/handle-error/history-partial-data-error/styles.css +11 -0
  69. package/src/internal-plugins/activity-history/activity-history-item/add/handle-error/history-partial-data-error/template.ts +19 -0
  70. package/src/internal-plugins/activity-history/activity-history-item/{list → add}/handle-error/reducers.ts +3 -2
  71. package/src/internal-plugins/activity-history/activity-history-item/add/handle-error/selectors.ts +19 -0
  72. package/src/internal-plugins/activity-history/activity-history-item/bootstrapper.ts +4 -1
  73. package/src/internal-plugins/activity-history/activity-history-item/domain/model.ts +2 -1
  74. package/src/internal-plugins/activity-history/activity-history-item/domain/specs/diagnostics-filter-spec.test.ts +59 -0
  75. package/src/internal-plugins/activity-history/activity-history-item/domain/specs/diagnostics-filter-spec.ts +18 -0
  76. package/src/internal-plugins/activity-history/activity-history-item/filter/UI/active-filters-badges/active-filters-badges.ts +19 -2
  77. package/src/internal-plugins/activity-history/activity-history-item/filter/UI/active-filters-badges/template.ts +49 -1
  78. package/src/internal-plugins/activity-history/activity-history-item/filter/UI/active-filters-header/active-filters-header.ts +4 -0
  79. package/src/internal-plugins/activity-history/activity-history-item/filter/UI/active-filters-header/template.ts +1 -0
  80. package/src/internal-plugins/activity-history/activity-history-item/filter/UI/activity-history-filters/activity-history-filters.ts +21 -1
  81. package/src/internal-plugins/activity-history/activity-history-item/filter/UI/activity-history-filters/template.ts +11 -2
  82. package/src/internal-plugins/activity-history/activity-history-item/filter/bootstrapper.ts +12 -0
  83. package/src/internal-plugins/activity-history/activity-history-item/filter/common-filters/common-filters.ts +8 -3
  84. package/src/internal-plugins/activity-history/activity-history-item/filter/custom-filters/add-custom-filters/reducer.ts +2 -2
  85. package/src/internal-plugins/activity-history/activity-history-item/filter/custom-filters/add-custom-filters/request.ts +2 -2
  86. package/src/internal-plugins/activity-history/activity-history-item/filter/custom-filters/selectors.ts +4 -5
  87. package/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/add/actions.ts +3 -0
  88. package/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/add/bootstrapper.ts +14 -0
  89. package/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/add/handler.ts +14 -0
  90. package/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/add/reducer.test.ts +93 -0
  91. package/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/add/reducer.ts +25 -0
  92. package/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/add/request.ts +5 -0
  93. package/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/handle-add-diagnostics-options-from-item.test.ts +80 -0
  94. package/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/handle-add-diagnostics-options-from-item.ts +30 -0
  95. package/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/selectors.ts +22 -0
  96. package/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/set/actions.ts +3 -0
  97. package/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/set/bootstrapper.ts +14 -0
  98. package/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/set/handler.ts +13 -0
  99. package/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/set/reducer.ts +11 -0
  100. package/src/internal-plugins/activity-history/activity-history-item/filter/diagnostic-filters/set/request.ts +3 -0
  101. package/src/internal-plugins/activity-history/activity-history-item/filter/model.ts +21 -4
  102. package/src/internal-plugins/activity-history/activity-history-item/filter/slice.ts +6 -2
  103. package/src/internal-plugins/activity-history/activity-history-item/list/UI/timeline/activity-history-timeline.ts +1 -4
  104. package/src/internal-plugins/activity-history/activity-history-item/list/UI/timeline/template.ts +3 -1
  105. package/src/internal-plugins/activity-history/activity-history-item/list/bootstrapper.ts +4 -1
  106. package/src/internal-plugins/activity-history/activity-history-item/selectors.ts +5 -0
  107. package/src/internal-plugins/activity-history/activity-history-item/slice.ts +2 -8
  108. package/src/internal-plugins/activity-history/localization.ts +16 -0
  109. package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/list/handle-error/actions.d.ts +0 -4
  110. /package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/{list → add}/handle-busy/actions.d.ts +0 -0
  111. /package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/{list → add}/handle-busy/bootstrapper.d.ts +0 -0
  112. /package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/{list → add}/handle-busy/busy-component/component.d.ts +0 -0
  113. /package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/{list → add}/handle-busy/busy-component/template.d.ts +0 -0
  114. /package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/{list → add}/handle-busy/reducers.d.ts +0 -0
  115. /package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/{list → add}/handle-busy/selectors.d.ts +0 -0
  116. /package/src/internal-plugins/activity-history/activity-history-item/{list → add}/handle-busy/actions.ts +0 -0
  117. /package/src/internal-plugins/activity-history/activity-history-item/{list → add}/handle-busy/bootstrapper.ts +0 -0
  118. /package/src/internal-plugins/activity-history/activity-history-item/{list → add}/handle-busy/busy-component/component.ts +0 -0
  119. /package/src/internal-plugins/activity-history/activity-history-item/{list → add}/handle-busy/busy-component/styles.css +0 -0
  120. /package/src/internal-plugins/activity-history/activity-history-item/{list → add}/handle-busy/busy-component/template.ts +0 -0
  121. /package/src/internal-plugins/activity-history/activity-history-item/{list → add}/handle-busy/reducers.ts +0 -0
  122. /package/src/internal-plugins/activity-history/activity-history-item/{list → add}/handle-busy/selectors.ts +0 -0
  123. /package/src/internal-plugins/activity-history/activity-history-item/{list → add}/handle-error/actions.ts +0 -0
@@ -8,9 +8,15 @@ import { template } from "./template";
8
8
  import styles from "./styles.css?inline";
9
9
  import { activeGroupsWithEnabledFilters } from "../../custom-filters/selectors";
10
10
  import { SetCustomFilterValue } from "../../custom-filters/set-custom-filter-value/request";
11
- import { IActivityHistoryCustomFilterGroup, IActivityHistoryFilterGroup } from "../../model";
11
+ import {
12
+ IActivityHistoryCustomFilterGroup,
13
+ IActivityHistoryDiagnosticsFilter,
14
+ IActivityHistoryFilter,
15
+ } from "../../model";
12
16
  import { activityHistoryEnabledCommonFiltersSelector } from "../../common-filters/selectors";
13
17
  import { SetCommonFilter } from "../../common-filters/set-common-filter/request";
18
+ import { diagnosticFilterSelector } from "../../diagnostic-filters/selectors";
19
+ import { SetDiagnosticFiltersCommand } from "../../diagnostic-filters/set/request";
14
20
 
15
21
  //@ts-ignore
16
22
  @customElement("active-filters-badges")
@@ -29,11 +35,14 @@ export class ActiveFiltersBadges extends LitElement {
29
35
  activityHistoryCommonFiltersSelector;
30
36
 
31
37
  @connectedProperty(activityHistoryEnabledCommonFiltersSelector)
32
- enabledCommonFilters: IActivityHistoryFilterGroup[];
38
+ enabledCommonFilters: IActivityHistoryFilter[];
33
39
 
34
40
  @connectedProperty(activeGroupsWithEnabledFilters)
35
41
  enabledFilters: IActivityHistoryCustomFilterGroup[];
36
42
 
43
+ @connectedProperty(diagnosticFilterSelector)
44
+ diagnosticFilterEnabled: IActivityHistoryDiagnosticsFilter;
45
+
37
46
  _onDeleteFilterValue(filterGroupId: string, filterId: string, optionId: string, value: boolean) {
38
47
  this.api.broker.send(
39
48
  new SetCustomFilterValue({
@@ -48,4 +57,12 @@ export class ActiveFiltersBadges extends LitElement {
48
57
  _onDeleteCommonFilterValue(filterId: string) {
49
58
  this.api.broker.send(new SetCommonFilter({ id: filterId, enabled: false }));
50
59
  }
60
+
61
+ _onDeleteDiagnosticFilterValue(diagnosticValue: string) {
62
+ this.api.broker.send(
63
+ new SetDiagnosticFiltersCommand([
64
+ ...this.diagnosticFilterEnabled.enabledValues.filter((v) => v !== diagnosticValue),
65
+ ]),
66
+ );
67
+ }
51
68
  }
@@ -27,16 +27,64 @@ const renderCommonChip = (filter, props) => html`
27
27
  ></dss-chip>
28
28
  `;
29
29
 
30
+ const renderDiagnosticChip = (id, value, props) => html`
31
+ <dss-chip
32
+ label=${value}
33
+ size="sm"
34
+ hasdelete
35
+ selected
36
+ @click=${() => props._onDeleteDiagnosticFilterValue(id)}
37
+ @onDelete=${() => props._onDeleteDiagnosticFilterValue(id)}
38
+ ></dss-chip>
39
+ `;
40
+
30
41
  const renderFilterTitle = (title) => html`<div class="filter-title">${`${title}:`}</div>`;
31
42
 
32
43
  export const template = (props: ActiveFiltersBadges) => {
33
- if (props.enabledFilters.length === 0 && props.enabledCommonFilters.length === 0) return nothing;
44
+ if (
45
+ props.enabledFilters.length === 0 &&
46
+ props.enabledCommonFilters.length === 0 &&
47
+ props.diagnosticFilterEnabled.enabledValues.length === 0
48
+ )
49
+ return nothing;
34
50
 
35
51
  let visibleCount = 0;
36
52
  const visibleChips: any[] = [];
37
53
  const hiddenElements: any[] = [];
38
54
  const hiddenChips: any[] = [];
39
55
 
56
+ const diagnostic = props.diagnosticFilterEnabled;
57
+
58
+ if (diagnostic) {
59
+ const { title, values, enabledValues } = diagnostic;
60
+ const selectedOptions = values.filter((opt) => enabledValues.includes(opt.value));
61
+
62
+ if (selectedOptions.length > 0) {
63
+ let titleAddedToVisible = false;
64
+ let titleAddedToHidden = false;
65
+
66
+ for (const option of selectedOptions) {
67
+ const chip = renderDiagnosticChip(option.value, option.label, props);
68
+
69
+ if (visibleCount < MAX_VISIBLE_CHIPS) {
70
+ if (!titleAddedToVisible) {
71
+ visibleChips.push(renderFilterTitle(title));
72
+ titleAddedToVisible = true;
73
+ }
74
+ visibleChips.push(chip);
75
+ visibleCount++;
76
+ } else {
77
+ if (!titleAddedToHidden) {
78
+ hiddenElements.push(renderFilterTitle(title));
79
+ titleAddedToHidden = true;
80
+ }
81
+ hiddenElements.push(chip);
82
+ hiddenChips.push(chip);
83
+ }
84
+ }
85
+ }
86
+ }
87
+
40
88
  for (const filter of props.enabledCommonFilters) {
41
89
  const chip = renderCommonChip(filter, props);
42
90
 
@@ -6,6 +6,7 @@ import { connectedProperty } from "../../../../infrastructure/state/connected-pr
6
6
  import { activityHistorySearchStringSelector } from "../../../search/selectors";
7
7
  import { areCustomFiltersActive } from "../../custom-filters/selectors";
8
8
  import { areCommonFiltersActive } from "../../common-filters/selectors";
9
+ import { areDiagnosticFiltersActive } from "../../diagnostic-filters/selectors";
9
10
 
10
11
  //@ts-ignore
11
12
  @customElement("active-filters-header")
@@ -26,4 +27,7 @@ export class ActiveFiltersHeader extends LitElement {
26
27
 
27
28
  @connectedProperty(areCommonFiltersActive)
28
29
  areCommonFiltersActive: boolean;
30
+
31
+ @connectedProperty(areDiagnosticFiltersActive)
32
+ areDiagnosticFiltersActive: boolean;
29
33
  }
@@ -6,6 +6,7 @@ export const template = (props: ActiveFiltersHeader) => {
6
6
  if (
7
7
  !props.areCustomFiltersActive &&
8
8
  !props.areCommonFiltersActive &&
9
+ !props.areDiagnosticFiltersActive &&
9
10
  props.searchString.length < 1
10
11
  )
11
12
  return nothing;
@@ -4,7 +4,11 @@ import { PrimariaApi } from "../../../../../../api/api";
4
4
  import { lazyInject } from "../../../../infrastructure/ioc/container";
5
5
  import { TYPES } from "../../../../infrastructure/ioc/types";
6
6
  import { connectedProperty } from "../../../../infrastructure/state/connected-property";
7
- import { IActivityHistoryCommonFilter, IActivityHistoryCustomFilterGroup } from "../../model";
7
+ import {
8
+ IActivityHistoryCommonFilter,
9
+ IActivityHistoryCustomFilterGroup,
10
+ IActivityHistoryDiagnosticsFilter,
11
+ } from "../../model";
8
12
  import styles from "./styles.css?inline";
9
13
  import { template } from "./template";
10
14
  import { SetCustomFilterGroup } from "../../custom-filters/set-custom-filter-group/request";
@@ -12,6 +16,11 @@ import { SetCommonFilter } from "../../common-filters/set-common-filter/request"
12
16
  import { activityHistoryCommonFiltersSelector } from "../../common-filters/selectors";
13
17
  import { SetCustomFilterValue } from "../../custom-filters/set-custom-filter-value/request";
14
18
  import { customFilterGroupsWithOptionsSelector } from "../../../selectors";
19
+ import {
20
+ diagnosticFilterEnabledValuesSelector,
21
+ diagnosticFilterSelector,
22
+ } from "../../diagnostic-filters/selectors";
23
+ import { SetDiagnosticFiltersCommand } from "../../diagnostic-filters/set/request";
15
24
 
16
25
  //@ts-ignore
17
26
  @customElement("activity-history-filters")
@@ -30,6 +39,12 @@ export class ActivityHistoryFilters extends LitElement {
30
39
  @connectedProperty(customFilterGroupsWithOptionsSelector)
31
40
  customFilterGroups: IActivityHistoryCustomFilterGroup[];
32
41
 
42
+ @connectedProperty(diagnosticFilterSelector)
43
+ diagnosticFilter: IActivityHistoryDiagnosticsFilter;
44
+
45
+ @connectedProperty(diagnosticFilterEnabledValuesSelector)
46
+ diagnosticFilterEnabledValues: string[];
47
+
33
48
  @lazyInject(TYPES.primaryApi)
34
49
  api: PrimariaApi;
35
50
 
@@ -72,4 +87,9 @@ export class ActivityHistoryFilters extends LitElement {
72
87
  }),
73
88
  );
74
89
  }
90
+
91
+ _handleDiagnosticFilterChange(e: CustomEvent) {
92
+ const selectedValues = e.detail.selectedValue;
93
+ this.api.broker.send(new SetDiagnosticFiltersCommand(selectedValues));
94
+ }
75
95
  }
@@ -6,7 +6,7 @@ import {
6
6
  IActivityHistoryCommonFilter,
7
7
  IActivityHistoryCustomFilter,
8
8
  IActivityHistoryCustomFilterGroup,
9
- IActivityHistoryFilterGroup,
9
+ IActivityHistoryFilter,
10
10
  } from "../../model";
11
11
  import { translate } from "../../../../localization";
12
12
 
@@ -27,7 +27,7 @@ const filterTemplates = {
27
27
  const getFilterTemplate = (
28
28
  filter: IActivityHistoryCommonFilter | IActivityHistoryCustomFilter,
29
29
  onChangeValue: (...args: any[]) => void,
30
- filterGroup?: IActivityHistoryFilterGroup,
30
+ filterGroup?: IActivityHistoryFilter,
31
31
  option?: { id: string; title: string },
32
32
  ) => {
33
33
  const isCustom = !!filterGroup?.id && !!option;
@@ -62,6 +62,15 @@ export const template = (props: ActivityHistoryFilters) =>
62
62
  ? html`<div class="filters-sidebar-opened">${translate("filters.filters")}<dss-icon-button ?hidden=${props.wrapperMaximized} @click=${() => props._toggleFilters()} size="md" variant="primary" icon="keyboard_double_arrow_left"></dss-icon-button></div>
63
63
  <div class="filter-container">
64
64
  ${repeat(props.commonFilters, (filter: IActivityHistoryCommonFilter) => html`<div class="filter">${getFilterTemplate(filter, props._onChangeCommonFilterValue.bind(props))}</div> `)}
65
+ ${
66
+ props.diagnosticFilter &&
67
+ html`<div class="filter">
68
+ <dss-input-dropdown icon="" multiple dropdownFixed type="default" .elements=${props.diagnosticFilter?.values} @onInputDropdownChange=${props._handleDiagnosticFilterChange} .selectedValue=${props.diagnosticFilterEnabledValues}>
69
+ <label slot="label" for="diagnostic-filter">${props.diagnosticFilter.title}</label>
70
+ <input id="diagnostic-filter" slot="input" type="text" class="dss-input" autocomplete="off"/>
71
+ </dss-input-dropdown>
72
+ </div>`
73
+ }
65
74
  ${repeat(
66
75
  props.customFilterGroups,
67
76
  (group: IActivityHistoryCustomFilterGroup) => html`
@@ -16,12 +16,22 @@ import {
16
16
  bootstrapSetCustomFilterValue,
17
17
  teardownSetCustomFilterValue,
18
18
  } from "./custom-filters/set-custom-filter-value/bootstrapper";
19
+ import {
20
+ bootstrapAddDiagnosticFilter,
21
+ teardownAddDiagnosticFilter,
22
+ } from "./diagnostic-filters/add/bootstrapper";
23
+ import {
24
+ bootstrapSetDiagnosticFilter,
25
+ teardownSetDiagnosticFilter,
26
+ } from "./diagnostic-filters/set/bootstrapper";
19
27
 
20
28
  export const bootstrapFilters = (broker: BrokerExtensions) => {
21
29
  bootstrapSetCommonFilter(broker);
22
30
  bootstrapAddCustomFilter(broker);
23
31
  bootstrapSetCustomFilterGroup(broker);
24
32
  bootstrapSetCustomFilterValue(broker);
33
+ bootstrapAddDiagnosticFilter(broker);
34
+ bootstrapSetDiagnosticFilter(broker);
25
35
  };
26
36
 
27
37
  export const teardownFilters = () => {
@@ -29,4 +39,6 @@ export const teardownFilters = () => {
29
39
  teardownAddCustomFilter();
30
40
  teardownSetCustomFilterGroup();
31
41
  teardownSetCustomFilterValue();
42
+ teardownAddDiagnosticFilter();
43
+ teardownSetDiagnosticFilter();
32
44
  };
@@ -1,6 +1,11 @@
1
1
  import { OwnSpec } from "../../domain/specs/own-spec";
2
2
  import { RelevantSpec } from "../../domain/specs/relevant-spec";
3
- import { IActivityHistoryCommonFilterGroup, ActivityHistoryFilterType } from "../model";
3
+ import {
4
+ IActivityHistoryCommonFilterGroup,
5
+ ActivityHistoryFilterType,
6
+ relevantFilterId,
7
+ ownFilterId,
8
+ } from "../model";
4
9
 
5
10
  export const commonFilters: IActivityHistoryCommonFilterGroup[] = [
6
11
  {
@@ -8,14 +13,14 @@ export const commonFilters: IActivityHistoryCommonFilterGroup[] = [
8
13
  title: "Comuns",
9
14
  filters: [
10
15
  {
11
- id: "relevant",
16
+ id: relevantFilterId,
12
17
  title: "Veure rellevants",
13
18
  spec: RelevantSpec,
14
19
  enabled: false,
15
20
  type: ActivityHistoryFilterType.Switch,
16
21
  },
17
22
  {
18
- id: "own",
23
+ id: ownFilterId,
19
24
  title: "Veure meus",
20
25
  spec: OwnSpec,
21
26
  enabled: false,
@@ -1,9 +1,9 @@
1
1
  import { PayloadAction } from "@reduxjs/toolkit";
2
- import { IActivityHistoryCommonFilterGroup } from "../model";
2
+ import { IActivityHistoryCustomFilterGroup } from "../../model";
3
3
 
4
4
  export function addCustomFiltersReducer(
5
5
  state,
6
- action: PayloadAction<IActivityHistoryCommonFilterGroup>,
6
+ action: PayloadAction<IActivityHistoryCustomFilterGroup>,
7
7
  ) {
8
8
  state.filters = [...state.filters, action.payload];
9
9
  }
@@ -1,5 +1,5 @@
1
- import { IActivityHistoryCommonFilterGroup } from "../model";
1
+ import { IActivityHistoryCustomFilterGroup } from "../../model";
2
2
 
3
3
  export class AddCustomFiltersCommand {
4
- constructor(public payload: IActivityHistoryCommonFilterGroup) {}
4
+ constructor(public payload: IActivityHistoryCustomFilterGroup) {}
5
5
  }
@@ -1,16 +1,15 @@
1
1
  import { createSelector } from "@reduxjs/toolkit";
2
2
  import {
3
- IActivityHistoryCustomFilter,
4
3
  IActivityHistoryCustomFilterGroup,
5
- IActivityHistoryFilterGroup,
6
- isNotCommonFilterGroup,
4
+ IActivityHistoryFilter,
5
+ isCustomFilter,
7
6
  } from "../model";
8
7
  import { activityHistoryFiltersSelector } from "../selectors";
9
8
 
10
9
  export const activityHistoryCustomFilterGroupsSelector = createSelector(
11
10
  activityHistoryFiltersSelector,
12
- (filters: IActivityHistoryFilterGroup[]) => {
13
- const customFilters = filters.filter(isNotCommonFilterGroup);
11
+ (filters: IActivityHistoryFilter[]) => {
12
+ const customFilters = filters.filter(isCustomFilter);
14
13
  return customFilters.sort(sortBySortProperty);
15
14
  },
16
15
  );
@@ -0,0 +1,3 @@
1
+ import { activityHistoryFiltersSlice } from "../../slice";
2
+
3
+ export const { addDiagnosticFilters } = activityHistoryFiltersSlice.actions;
@@ -0,0 +1,14 @@
1
+ import { BrokerExtensions } from "@primaria/plugins-core";
2
+ import { BrokerDisposableHandler } from "../../../../../../api/broker/primaria-broker";
3
+ import { AddDiagnosticFiltersHandler } from "./handler";
4
+ import { AddDiagnosticFiltersCommand } from "./request";
5
+
6
+ let request: BrokerDisposableHandler;
7
+
8
+ export const bootstrapAddDiagnosticFilter = (broker: BrokerExtensions) => {
9
+ request = broker.registerRequest(AddDiagnosticFiltersCommand, AddDiagnosticFiltersHandler);
10
+ };
11
+
12
+ export const teardownAddDiagnosticFilter = () => {
13
+ request?.dispose();
14
+ };
@@ -0,0 +1,14 @@
1
+ import { StoreBaseHandler } from "../../../../infrastructure/base-handlers";
2
+ import { addDiagnosticFilters } from "./actions";
3
+ import { AddDiagnosticFiltersCommand } from "./request";
4
+
5
+ export class AddDiagnosticFiltersHandler extends StoreBaseHandler {
6
+ async handle(request: AddDiagnosticFiltersCommand) {
7
+ try {
8
+ //TODO ensure are valid filters
9
+ this.store.dispatch(addDiagnosticFilters(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 { IActivityHistoryDiagnosticsFilter, isDiagnosticFilter } from "../../model";
4
+ import { addDiagnosticFiltersReducer } from "./reducer";
5
+
6
+ vi.mock("../../model", () => ({
7
+ isDiagnosticFilter: vi.fn(),
8
+ }));
9
+
10
+ describe("addDiagnosticFiltersReducer", () => {
11
+ let initialState: { filters: IActivityHistoryDiagnosticsFilter[] };
12
+
13
+ const baseFilter = (values: any[]): IActivityHistoryDiagnosticsFilter => ({
14
+ id: "diagnostics",
15
+ title: "Diagnòstics",
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
+ addDiagnosticFilters: addDiagnosticFiltersReducer,
32
+ },
33
+ });
34
+
35
+ const { addDiagnosticFilters } = slice.actions;
36
+ const reducer = slice.reducer;
37
+
38
+ it("should add a new diagnostic filter if none exists", () => {
39
+ (isDiagnosticFilter as any).mockReturnValue(false);
40
+
41
+ const newFilter = baseFilter([{ label: "Hipertensió", value: "I10" }]);
42
+
43
+ const nextState = reducer(initialState, addDiagnosticFilters(newFilter));
44
+
45
+ expect(nextState.filters).toHaveLength(1);
46
+ expect(nextState.filters[0]).toEqual(newFilter);
47
+ });
48
+
49
+ it("should merge values if a diagnostic filter already exists", () => {
50
+ const existingFilter = baseFilter([{ label: "Diabetes", value: "E11" }]);
51
+ initialState.filters = [existingFilter];
52
+
53
+ (isDiagnosticFilter as any).mockImplementation((f) => f.id === "diagnostics");
54
+
55
+ const incomingFilter = baseFilter([{ label: "Hipertensió", value: "I10" }]);
56
+
57
+ const nextState = reducer(initialState, addDiagnosticFilters(incomingFilter));
58
+
59
+ expect(nextState.filters).toHaveLength(1);
60
+ expect(nextState.filters[0].values).toContainEqual({ label: "Diabetes", value: "E11" });
61
+ expect(nextState.filters[0].values).toContainEqual({ label: "Hipertensió", value: "I10" });
62
+ });
63
+
64
+ it("should avoid duplicate values when merging", () => {
65
+ const existingFilter = baseFilter([{ label: "Diabetes", value: "E11" }]);
66
+ initialState.filters = [existingFilter];
67
+
68
+ (isDiagnosticFilter as any).mockImplementation((f) => f.id === "diagnostics");
69
+
70
+ const incomingFilter = baseFilter([{ label: "Diabetes", value: "E11" }]);
71
+
72
+ const nextState = reducer(initialState, addDiagnosticFilters(incomingFilter));
73
+
74
+ expect(nextState.filters).toHaveLength(1);
75
+ expect(nextState.filters[0].values).toEqual([{ label: "Diabetes", value: "E11" }]);
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
+ (isDiagnosticFilter as any).mockReturnValue(true);
86
+
87
+ const incomingFilter = baseFilter([{ label: "B", value: "2" }]);
88
+
89
+ const nextState = reducer(initialState, addDiagnosticFilters(incomingFilter));
90
+
91
+ expect(nextState.filters[0].enabledValues).toEqual(["1"]); // no se sobreescribe
92
+ });
93
+ });
@@ -0,0 +1,25 @@
1
+ import { PayloadAction } from "@reduxjs/toolkit";
2
+ import { IActivityHistoryDiagnosticsFilter, isDiagnosticFilter } from "../../model";
3
+
4
+ export function addDiagnosticFiltersReducer(
5
+ state,
6
+ action: PayloadAction<IActivityHistoryDiagnosticsFilter>,
7
+ ) {
8
+ const index = state.filters.findIndex(isDiagnosticFilter);
9
+
10
+ if (index === -1) {
11
+ state.filters.push(action.payload);
12
+ } else {
13
+ const existing = state.filters[index];
14
+
15
+ const mergedValues = [
16
+ ...existing.values,
17
+ ...action.payload.values.filter((v) => !existing.values.some((ev) => ev.value === v.value)),
18
+ ];
19
+
20
+ state.filters[index] = {
21
+ ...existing,
22
+ values: mergedValues,
23
+ };
24
+ }
25
+ }
@@ -0,0 +1,5 @@
1
+ import { IActivityHistoryDiagnosticsFilter } from "../../model";
2
+
3
+ export class AddDiagnosticFiltersCommand {
4
+ constructor(public payload: IActivityHistoryDiagnosticsFilter) {}
5
+ }
@@ -0,0 +1,80 @@
1
+ import { mapArrayToLabelValue } from "@primaria/plugins-core";
2
+ import { describe, it, expect, vi, beforeEach } from "vitest";
3
+ import { handleAddDiagnosticsFilter } from "./handle-add-diagnostics-options-from-item";
4
+ import { diagnosticsfilterId } from "../model";
5
+
6
+ vi.mock("@primaria/plugins-core", () => ({
7
+ mapArrayToLabelValue: vi.fn(),
8
+ }));
9
+
10
+ describe("handleAddDiagnosticsFilter", () => {
11
+ const mockDispatch = vi.fn();
12
+ const mockStore = { dispatch: mockDispatch };
13
+
14
+ const diagnosticsSample = [
15
+ { descripcio: "Diabetes", codi: "E11" },
16
+ { descripcio: "Hipertensió", codi: "I10" },
17
+ ];
18
+
19
+ beforeEach(() => {
20
+ vi.clearAllMocks();
21
+ });
22
+
23
+ it("should dispatch a filter when items have diagnostics", () => {
24
+ (mapArrayToLabelValue as any).mockReturnValue([
25
+ { label: "Diabetes", value: "E11" },
26
+ { label: "Hipertensió", value: "I10" },
27
+ ]);
28
+
29
+ const items = [{ diagnostics: diagnosticsSample }];
30
+
31
+ handleAddDiagnosticsFilter(items, mockStore as any);
32
+
33
+ expect(mapArrayToLabelValue).toHaveBeenCalledWith(diagnosticsSample, "descripcio", "codi");
34
+ expect(mockDispatch).toHaveBeenCalledWith({
35
+ type: expect.any(String), // puedes ajustar esto si usas createAction
36
+ payload: {
37
+ id: diagnosticsfilterId,
38
+ title: "Diagnòstics",
39
+ values: [
40
+ { label: "Diabetes", value: "E11" },
41
+ { label: "Hipertensió", value: "I10" },
42
+ ],
43
+ enabledValues: [],
44
+ },
45
+ });
46
+ });
47
+
48
+ it("should not dispatch if no diagnostics are present", () => {
49
+ const items = [{ diagnostics: [] }, { diagnostics: undefined }];
50
+ handleAddDiagnosticsFilter(items, mockStore as any);
51
+ expect(mockDispatch).not.toHaveBeenCalled();
52
+ });
53
+
54
+ it("should deduplicate diagnostics by codi", () => {
55
+ const duplicatedDiagnostics = [
56
+ { descripcio: "Diabetes", codi: "E11" },
57
+ { descripcio: "Diabetis", codi: "E11" }, // mismo código
58
+ { descripcio: "Hipertensió", codi: "I10" },
59
+ ];
60
+
61
+ (mapArrayToLabelValue as any).mockReturnValue([
62
+ { label: "Diabetes", value: "E11" },
63
+ { label: "Hipertensió", value: "I10" },
64
+ ]);
65
+
66
+ const items = [{ diagnostics: duplicatedDiagnostics }];
67
+
68
+ handleAddDiagnosticsFilter(items, mockStore as any);
69
+
70
+ expect(mapArrayToLabelValue).toHaveBeenCalledWith(
71
+ [
72
+ { descripcio: "Diabetes", codi: "E11" },
73
+ { descripcio: "Hipertensió", codi: "I10" },
74
+ ],
75
+ "descripcio",
76
+ "codi",
77
+ );
78
+ expect(mockDispatch).toHaveBeenCalled();
79
+ });
80
+ });
@@ -0,0 +1,30 @@
1
+ import { mapArrayToLabelValue } from "@primaria/plugins-core";
2
+ import { Store } from "@reduxjs/toolkit";
3
+ import { IActivityHistoryItem } from "../../domain/model";
4
+ import { diagnosticsfilterId } from "../model";
5
+ import { addDiagnosticFilters } from "./add/actions";
6
+
7
+ export const handleAddDiagnosticsFilter = (items: IActivityHistoryItem[], store: Store) => {
8
+ const allDiagnostics = items
9
+ .flatMap((item) => item.diagnostics ?? [])
10
+ .filter((diag, index, self) => index === self.findIndex((d) => d.codi === diag.codi));
11
+
12
+ if (allDiagnostics.length > 0) {
13
+ const newDiagnosticFilter = {
14
+ id: diagnosticsfilterId,
15
+ title: "Diagnòstics",
16
+ values: mapArrayToLabelValue(allDiagnostics, "descripcio", "codi"),
17
+ enabledValues: [],
18
+ };
19
+
20
+ store.dispatch(addDiagnosticFilters(newDiagnosticFilter));
21
+ }
22
+ };
23
+
24
+ export function mergeDiagnosticOptionsByCodi(array1, array2) {
25
+ const existingCodis = new Set(array1.map((obj) => obj.codi));
26
+
27
+ const newObjects = array2.filter((obj) => !existingCodis.has(obj.codi));
28
+
29
+ return [...array1, ...newObjects];
30
+ }
@@ -0,0 +1,22 @@
1
+ import { createSelector } from "@reduxjs/toolkit";
2
+ import {
3
+ IActivityHistoryDiagnosticsFilter,
4
+ IActivityHistoryFilter,
5
+ isDiagnosticFilter,
6
+ } from "../model";
7
+ import { activityHistoryFiltersSelector } from "../selectors";
8
+
9
+ export const diagnosticFilterSelector = createSelector(
10
+ activityHistoryFiltersSelector,
11
+ (filters: IActivityHistoryFilter[]) => filters.find(isDiagnosticFilter),
12
+ );
13
+
14
+ export const diagnosticFilterEnabledValuesSelector = createSelector(
15
+ diagnosticFilterSelector,
16
+ (filter: IActivityHistoryDiagnosticsFilter) => filter?.enabledValues || [],
17
+ );
18
+
19
+ export const areDiagnosticFiltersActive = createSelector(
20
+ diagnosticFilterEnabledValuesSelector,
21
+ (filters) => !!filters.length,
22
+ );
@@ -0,0 +1,3 @@
1
+ import { activityHistoryFiltersSlice } from "../../slice";
2
+
3
+ export const { setDiagnosticFilterValues } = activityHistoryFiltersSlice.actions;
@@ -0,0 +1,14 @@
1
+ import { BrokerExtensions } from "@primaria/plugins-core";
2
+ import { BrokerDisposableHandler } from "../../../../../../api/broker/primaria-broker";
3
+ import { SetDiagnosticFiltersHandler } from "./handler";
4
+ import { SetDiagnosticFiltersCommand } from "./request";
5
+
6
+ let request: BrokerDisposableHandler;
7
+
8
+ export const bootstrapSetDiagnosticFilter = (broker: BrokerExtensions) => {
9
+ request = broker.registerRequest(SetDiagnosticFiltersCommand, SetDiagnosticFiltersHandler);
10
+ };
11
+
12
+ export const teardownSetDiagnosticFilter = () => {
13
+ request?.dispose();
14
+ };
@@ -0,0 +1,13 @@
1
+ import { StoreBaseHandler } from "../../../../infrastructure/base-handlers";
2
+ import { setDiagnosticFilterValues } from "./actions";
3
+ import { SetDiagnosticFiltersCommand } from "./request";
4
+
5
+ export class SetDiagnosticFiltersHandler extends StoreBaseHandler {
6
+ async handle(request: SetDiagnosticFiltersCommand) {
7
+ try {
8
+ this.store.dispatch(setDiagnosticFilterValues(request.payload));
9
+ } catch (e) {
10
+ console.log(e.message);
11
+ }
12
+ }
13
+ }