@uxland/primary-shell 3.4.1 → 3.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/dist/index.js +11640 -13451
  2. package/dist/index.js.map +1 -1
  3. package/dist/index.umd.cjs +795 -1064
  4. package/dist/index.umd.cjs.map +1 -1
  5. package/dist/primary/shell/src/UI/components/primaria-error-view/component.d.ts +9 -0
  6. package/dist/primary/shell/src/UI/components/primaria-error-view/template.d.ts +3 -0
  7. package/dist/primary/shell/src/UI/components/primaria-shell/constants.d.ts +4 -0
  8. package/dist/primary/shell/src/UI/components/primaria-shell/primaria-shell.d.ts +10 -0
  9. package/dist/primary/shell/src/UI/{shared-components/primaria-menu/primaria-menu.d.ts → components/quick-actions-menu/quick-actions-menu.d.ts} +1 -1
  10. package/dist/primary/shell/src/UI/components/quick-actions-menu/template.d.ts +3 -0
  11. package/dist/primary/shell/src/UI/shared-components/primaria-nav-item/template.d.ts +3 -0
  12. package/dist/primary/shell/src/UI/shared-components/primaria-nav-tree-menu/primaria-nav-tree-menu.d.ts +13 -0
  13. package/dist/primary/shell/src/UI/shared-components/primaria-nav-tree-menu/template.d.ts +3 -0
  14. package/dist/primary/shell/src/UI/shared-components/typings.d.ts +16 -0
  15. package/dist/primary/shell/src/api/broker/primaria-broker.d.ts +1 -0
  16. package/dist/primary/shell/src/api/region-manager/region-manager.d.ts +3 -2
  17. package/dist/primary/shell/src/bootstrapper.d.ts +2 -0
  18. package/dist/primary/shell/src/constants.d.ts +1 -0
  19. package/dist/primary/shell/src/disposer.d.ts +2 -0
  20. package/dist/primary/shell/src/events.d.ts +2 -0
  21. package/dist/primary/shell/src/features/bootstrapper.d.ts +1 -1
  22. package/dist/primary/shell/src/features/utils.d.ts +3 -2
  23. package/dist/primary/shell/src/{plugin.d.ts → handle-plugins.d.ts} +2 -1
  24. package/dist/primary/shell/src/handle-views.d.ts +2 -0
  25. package/dist/primary/shell/src/index.d.ts +5 -3
  26. package/dist/primary/shell/src/{UI/shared-components/dss-container/dss-container.d.ts → internal-plugins/activity-history/components/activity-history/activity-history-search-header/activity-history-search-header.d.ts} +2 -2
  27. package/dist/primary/shell/src/internal-plugins/activity-history/components/activity-history/activity-history-search-header/template.d.ts +3 -0
  28. package/dist/primary/shell/src/internal-plugins/activity-history/components/activity-history/activity-history-timeline/activity-history-timeline.d.ts +6 -0
  29. package/dist/primary/shell/src/internal-plugins/activity-history/components/activity-history/activity-history.d.ts +4 -3
  30. package/dist/primary/shell/src/internal-plugins/activity-history/constants.d.ts +3 -0
  31. package/dist/primary/shell/src/internal-plugins/activity-history/domain/is-valid-history-item/is-valid-history-item.d.ts +1 -0
  32. package/dist/primary/shell/src/internal-plugins/activity-history/features/search-items/handler.d.ts +3 -1
  33. package/dist/primary/shell/src/internal-plugins/activity-history/localization.d.ts +2 -0
  34. package/dist/primary/shell/src/locales.d.ts +14 -3
  35. package/dist/style.css +1 -1
  36. package/package.json +2 -3
  37. package/src/UI/components/index.ts +1 -0
  38. package/src/UI/components/primaria-error-view/component.ts +18 -0
  39. package/src/UI/components/primaria-error-view/styles.css +27 -0
  40. package/src/UI/components/primaria-error-view/template.ts +12 -0
  41. package/src/UI/components/primaria-shell/constants.ts +4 -0
  42. package/src/UI/components/primaria-shell/primaria-shell.ts +38 -1
  43. package/src/UI/components/primaria-shell/styles.css +24 -54
  44. package/src/UI/components/primaria-shell/template.ts +43 -50
  45. package/src/UI/{shared-components/primaria-menu/primaria-menu.ts → components/quick-actions-menu/quick-actions-menu.ts} +3 -3
  46. package/src/UI/components/quick-actions-menu/template.ts +10 -0
  47. package/src/UI/images/not-found.svg +9 -0
  48. package/src/UI/shared-components/index.ts +1 -3
  49. package/src/UI/shared-components/primaria-nav-item/primaria-nav-item.ts +54 -0
  50. package/src/UI/shared-components/{primaria-menu-item → primaria-nav-item}/styles.css +4 -0
  51. package/src/UI/shared-components/primaria-nav-item/template.ts +27 -0
  52. package/src/UI/shared-components/primaria-nav-tree-menu/primaria-nav-tree-menu.ts +41 -0
  53. package/src/UI/shared-components/primaria-nav-tree-menu/styles.css +11 -0
  54. package/src/UI/shared-components/primaria-nav-tree-menu/template.ts +30 -0
  55. package/src/UI/shared-components/typings.ts +17 -0
  56. package/src/api/api.ts +1 -1
  57. package/src/api/broker/factory.ts +29 -12
  58. package/src/api/broker/primaria-broker.ts +2 -0
  59. package/src/api/ecap-event-manager/ecap-event-manager.ts +1 -1
  60. package/src/api/region-manager/region-manager.ts +12 -2
  61. package/src/api/token-manager/token-manager.test.ts +1 -1
  62. package/src/bootstrapper.ts +16 -0
  63. package/src/constants.ts +1 -0
  64. package/src/disposer.ts +10 -0
  65. package/src/events.ts +2 -0
  66. package/src/features/bootstrapper.ts +4 -1
  67. package/src/features/get-user-info/bootstrapper.ts +6 -3
  68. package/src/features/utils.ts +7 -5
  69. package/src/{plugin.ts → handle-plugins.ts} +8 -3
  70. package/src/handle-views.ts +279 -0
  71. package/src/index.ts +5 -3
  72. package/src/internal-plugins/activity-history/components/activity-history/activity-history-search-header/activity-history-search-header.ts +20 -0
  73. package/src/internal-plugins/activity-history/components/activity-history/activity-history-search-header/styles.css +14 -0
  74. package/src/internal-plugins/activity-history/components/activity-history/activity-history-search-header/template.ts +8 -0
  75. package/src/internal-plugins/activity-history/components/activity-history/activity-history-timeline/activity-history-timeline.ts +27 -1
  76. package/src/internal-plugins/activity-history/components/activity-history/activity-history-timeline/styles.css +21 -2
  77. package/src/internal-plugins/activity-history/components/activity-history/activity-history-timeline/template.ts +38 -19
  78. package/src/internal-plugins/activity-history/components/activity-history/activity-history.ts +17 -26
  79. package/src/internal-plugins/activity-history/components/activity-history/styles.css +2 -24
  80. package/src/internal-plugins/activity-history/components/activity-history/template.ts +37 -69
  81. package/src/internal-plugins/activity-history/constants.ts +3 -0
  82. package/src/internal-plugins/activity-history/domain/filter-by-search-string/filter-by-search-string.ts +6 -1
  83. package/src/internal-plugins/activity-history/domain/is-valid-history-item/is-valid-history-item.ts +19 -5
  84. package/src/internal-plugins/activity-history/features/add-history-item/bootstrapper.ts +5 -2
  85. package/src/internal-plugins/activity-history/features/add-history-items/bootstrapper.ts +5 -2
  86. package/src/internal-plugins/activity-history/features/export-to-pdf/bootstrapper.ts +5 -2
  87. package/src/internal-plugins/activity-history/features/inject-async-history-items/bootstrapper.ts +5 -2
  88. package/src/internal-plugins/activity-history/features/inject-async-history-items/handler.ts +3 -3
  89. package/src/internal-plugins/activity-history/features/search-items/bootstrapper.ts +5 -2
  90. package/src/internal-plugins/activity-history/features/search-items/handler.ts +9 -1
  91. package/src/internal-plugins/activity-history/features/update-history-item/bootstrapper.ts +5 -2
  92. package/src/internal-plugins/activity-history/localization.ts +2 -0
  93. package/src/locales.ts +25 -5
  94. package/dist/primary/shell/src/UI/shared-components/primaria-menu/template.d.ts +0 -3
  95. package/dist/primary/shell/src/UI/shared-components/primaria-menu-item/primaria-menu-item.d.ts +0 -15
  96. package/dist/primary/shell/src/UI/shared-components/primaria-menu-item/template.d.ts +0 -3
  97. package/dist/primary/shell/src/UI/shared-components/primaria-nav-menu/primaria-nav-menu.d.ts +0 -26
  98. package/dist/primary/shell/src/UI/shared-components/primaria-nav-menu/template.d.ts +0 -3
  99. package/dist/primary/shell/src/UI/shared-components/primaria-wrapper-menu/primaria-wrapper-menu.d.ts +0 -19
  100. package/dist/primary/shell/src/UI/shared-components/primaria-wrapper-menu/template.d.ts +0 -3
  101. package/dist/primary/shell/src/initializer.d.ts +0 -1
  102. package/src/UI/shared-components/dss-container/dss-container.ts +0 -32
  103. package/src/UI/shared-components/dss-container/styles.css +0 -23
  104. package/src/UI/shared-components/primaria-menu/template.ts +0 -9
  105. package/src/UI/shared-components/primaria-menu-item/primaria-menu-item.ts +0 -51
  106. package/src/UI/shared-components/primaria-menu-item/template.ts +0 -11
  107. package/src/UI/shared-components/primaria-nav-menu/primaria-nav-menu.ts +0 -66
  108. package/src/UI/shared-components/primaria-nav-menu/styles.css +0 -26
  109. package/src/UI/shared-components/primaria-nav-menu/template.ts +0 -30
  110. package/src/UI/shared-components/primaria-wrapper-menu/primaria-wrapper-menu.ts +0 -41
  111. package/src/UI/shared-components/primaria-wrapper-menu/styles.css +0 -5
  112. package/src/UI/shared-components/primaria-wrapper-menu/template.ts +0 -28
  113. package/src/initializer.ts +0 -327
@@ -7,10 +7,12 @@
7
7
  display: flex;
8
8
  flex-direction: column;
9
9
  gap: 16px;
10
- padding-right: 16px;
10
+ padding-inline: 16px;
11
+ padding-top: 17px;
11
12
  min-height: 1px;
12
13
  height: 100%;
13
14
  overflow-y: auto;
15
+ position: relative;
14
16
 
15
17
  .visit {
16
18
  display: flex;
@@ -43,11 +45,21 @@
43
45
  flex-direction: row;
44
46
  gap: 4px;
45
47
  }
48
+ .highlight {
49
+ background-color: yellow;
50
+ font-weight: bold;
51
+ }
46
52
  }
47
53
  .visit__items {
48
54
  display: flex;
49
55
  flex-direction: column;
50
56
  gap: 16px;
57
+ .item {
58
+ border-bottom: var(--dss-border-width-sm) solid var(--color-neutral-200);
59
+ &:last-of-type {
60
+ border: none;
61
+ }
62
+ }
51
63
  }
52
64
  .diagnostics {
53
65
  display: flex;
@@ -64,7 +76,7 @@
64
76
  flex-direction: column;
65
77
 
66
78
  .item {
67
- border-bottom: 1px solid #bbbbbb;
79
+ border-bottom: var(--dss-border-width-sm) solid var(--color-neutral-200);
68
80
  &:last-of-type {
69
81
  border: none;
70
82
  }
@@ -72,4 +84,11 @@
72
84
  }
73
85
  }
74
86
  }
87
+ .feedback {
88
+ width: 100%;
89
+ height: 100%;
90
+ display: flex;
91
+ align-items: center;
92
+ justify-content: center;
93
+ }
75
94
  }
@@ -1,4 +1,4 @@
1
- import { html } from "lit";
1
+ import { html, nothing } from "lit";
2
2
  import { ActivityHistoryTimeline } from "./activity-history-timeline";
3
3
  import { repeat } from "lit/directives/repeat.js";
4
4
  import {
@@ -8,15 +8,21 @@ import {
8
8
  } from "../../../domain/model";
9
9
  import { IEntityDescription } from "@primaria/plugins-core";
10
10
  import { format } from "date-fns";
11
+ import { translate } from "../../../localization";
12
+ import { unsafeHTML } from "lit/directives/unsafe-html.js";
13
+ import notFound from "../../../../../UI/images/not-found.svg";
11
14
 
12
15
  export const template = (props: ActivityHistoryTimeline) => {
16
+ if (!props._hasUpdatedOnce) {
17
+ return html`<div class="container"></div>`;
18
+ }
13
19
  return html`<div class="container">
14
20
  ${
15
- props.historyGroups &&
16
- repeat(props.historyGroups, (itemGroup: IActivityHistoryGroup) => {
17
- return html`
18
- <div class="visit">
19
- ${visitHeaderTemplate(itemGroup.items[0] || itemGroup.subGroups[0]?.items[0])}
21
+ props.historyGroups && props.historyGroups.length > 0
22
+ ? repeat(props.historyGroups, (itemGroup: IActivityHistoryGroup) => {
23
+ return html`
24
+ <div class="visit" data-date=${itemGroup.items[0]?.date || itemGroup.subGroups[0]?.items[0]?.date}>
25
+ ${visitHeaderTemplate(props, itemGroup.items[0] || itemGroup.subGroups[0]?.items[0])}
20
26
  <div class="visit__items">
21
27
  ${repeat(
22
28
  itemGroup.items,
@@ -32,7 +38,7 @@ export const template = (props: ActivityHistoryTimeline) => {
32
38
  <div class="diagnostics__items">${repeat(
33
39
  subGroup.items,
34
40
  (item: IActivityHistoryItem) =>
35
- html`<div class="item" data-date=${item.date}>${item.componentFactory(item)}</div> `,
41
+ html`<div class="item">${item.componentFactory(item)}</div> `,
36
42
  )}</div>
37
43
  </div>
38
44
  `,
@@ -40,12 +46,19 @@ export const template = (props: ActivityHistoryTimeline) => {
40
46
  </div>
41
47
  </div>
42
48
  `;
43
- })
49
+ })
50
+ : !props.isAnyCollectionLoadingWithoutAnyLoaded &&
51
+ !props.isSomeCollectionLoadedAndOtherLoading
52
+ ? html`<dss-user-feedback class="feedback" imagesrc=${notFound} title=${translate("noResults")}></dss-user-feedback>`
53
+ : nothing
44
54
  }
45
55
  </div> `;
46
56
  };
47
57
 
48
- const visitHeaderTemplate = (item: IActivityHistoryItem | undefined) =>
58
+ const visitHeaderTemplate = (
59
+ props: ActivityHistoryTimeline,
60
+ item: IActivityHistoryItem | undefined,
61
+ ) =>
49
62
  item &&
50
63
  html`
51
64
  <div class="visit__header">
@@ -54,9 +67,12 @@ const visitHeaderTemplate = (item: IActivityHistoryItem | undefined) =>
54
67
  <div>${format(new Date(item.date), "dd/MM/yyyy")}</div>
55
68
  </div>
56
69
  <div class="title-description">
57
- <div>${item.professional.name} | ${item.professional.role.description} | ${item.center.description} | ${
58
- item.professional.speciality.description
59
- }</div>
70
+ <div>
71
+ ${unsafeHTML(props.highlightMatch(item.professional.name, props.searchString))} |
72
+ ${unsafeHTML(props.highlightMatch(item.professional.role.description, props.searchString))} |
73
+ ${unsafeHTML(props.highlightMatch(item.center.description, props.searchString))} |
74
+ ${unsafeHTML(props.highlightMatch(item.professional.speciality.description, props.searchString))}
75
+ </div>
60
76
  </div>
61
77
  </div>
62
78
  </div>
@@ -68,12 +84,15 @@ const diagnosticHeaderTemplate = (item: IActivityHistoryItem | undefined) =>
68
84
  <div class="diagnostics__header">
69
85
 
70
86
  ${item.diagnostics
71
- .filter((diagnostic: IEntityDescription) => diagnostic.description != null && diagnostic.description.trim() !== "")
72
- .map(
73
- (diagnostic: IEntityDescription) =>
74
- html`<dss-badge text=${
75
- diagnostic.description?.toUpperCase() as string
76
- } state="info" size="sm" outlined></dss-badge>`,
77
- )}
87
+ .filter(
88
+ (diagnostic: IEntityDescription) =>
89
+ diagnostic.description != null && diagnostic.description.trim() !== "",
90
+ )
91
+ .map(
92
+ (diagnostic: IEntityDescription) =>
93
+ html`<dss-badge text=${
94
+ diagnostic.description?.toUpperCase() as string
95
+ } state="info" size="sm" outlined></dss-badge>`,
96
+ )}
78
97
  </div>
79
98
  `;
@@ -3,6 +3,7 @@ import { customElement, property, state } from "lit/decorators.js";
3
3
  import styles from "./styles.css?inline";
4
4
  import { template } from "./template";
5
5
  import { PrimariaApi, PrimariaRegionHost } from "../../../../api/api";
6
+ import { BrokerDisposableHandler } from "../../../../api/broker/primaria-broker";
6
7
  import { lazyInject } from "../../infrastructure/ioc/container";
7
8
  import { TYPES } from "../../infrastructure/ioc/types";
8
9
  import { connectedProperty } from "../../infrastructure/state/connected-property";
@@ -26,22 +27,20 @@ export class ActivityHistory extends PrimariaRegionHost(LitElement) {
26
27
  ${unsafeCSS(styles)}
27
28
  `;
28
29
 
30
+ subscriptions: BrokerDisposableHandler[] = [];
31
+
29
32
  connectedCallback() {
30
33
  super.connectedCallback();
31
- this.api.broker.subscribe(shellEvents.openClinicalMonitoringRequested, () => {
32
- this.maximized = false;
33
- });
34
- const searchBar = this.shadowRoot?.querySelector("dss-search-bar");
35
- if (searchBar) {
36
- searchBar.addEventListener("onSearchChange", this._handleSearchChange);
37
- }
34
+ this.subscriptions.push(
35
+ this.api.broker.subscribe(shellEvents.openClinicalMonitoringRequested, () => {
36
+ this.maximized = false;
37
+ }),
38
+ );
38
39
  }
39
40
 
40
- firstUpdated(_changedProperties) {
41
- super.firstUpdated(_changedProperties);
42
- this.shadowRoot.querySelector("dss-datepicker")?.addEventListener("onValueChange", (e) => {
43
- this._handleSelectDate(e.detail);
44
- });
41
+ disconnectedCallback() {
42
+ super.disconnectedCallback();
43
+ this.subscriptions.forEach((s) => s.dispose());
45
44
  }
46
45
 
47
46
  @property({ type: Boolean })
@@ -59,13 +58,6 @@ export class ActivityHistory extends PrimariaRegionHost(LitElement) {
59
58
  @connectedProperty(activityHistoryCollectionsSelector)
60
59
  historyItems: any[];
61
60
 
62
- @state()
63
- menuOpened = false;
64
-
65
- toggleMenu() {
66
- this.menuOpened = !this.menuOpened;
67
- }
68
-
69
61
  @state()
70
62
  filtersExpanded = false;
71
63
 
@@ -81,15 +73,14 @@ export class ActivityHistory extends PrimariaRegionHost(LitElement) {
81
73
  this.maximized = false;
82
74
  }
83
75
 
76
+ @property()
77
+ searchQuery = "";
84
78
  _handleSearchChange(event) {
85
79
  const selectedItems = event.detail || [];
86
80
  const searchQuery = selectedItems.length > 0 ? selectedItems.join(" ") : "";
87
-
88
- if (searchQuery.length > 2) {
89
- this.api.broker.send(new SearchActivityHistoryItems(searchQuery));
90
- } else {
91
- this.api.broker.send(new SearchActivityHistoryItems(""));
92
- }
81
+ const payload = searchQuery.length > 1 ? searchQuery : "";
82
+ this.searchQuery = searchQuery;
83
+ this.api.broker.send(new SearchActivityHistoryItems(payload));
93
84
  }
94
85
 
95
86
  _handleSelectDate(date: string) {
@@ -107,7 +98,7 @@ export class ActivityHistory extends PrimariaRegionHost(LitElement) {
107
98
  let closestDifference = Number.POSITIVE_INFINITY;
108
99
 
109
100
  const timeline = this.shadowRoot.querySelector("activity-history-timeline") as HTMLElement;
110
- timeline?.shadowRoot.querySelectorAll(".item").forEach((element) => {
101
+ timeline?.shadowRoot.querySelectorAll(".visit").forEach((element) => {
111
102
  const itemDate = new Date(element.dataset.date).getTime();
112
103
  const difference = Math.abs(itemDate - selectedDate);
113
104
 
@@ -127,7 +127,6 @@
127
127
  &[maximized] {
128
128
  .content {
129
129
  width: 100%;
130
- padding: 16px 0 16px 16px;
131
130
  background: var(--color-neutral-50);
132
131
  border-top-right-radius: var(--dss-radius-sm);
133
132
  }
@@ -152,9 +151,9 @@
152
151
  }
153
152
  .content {
154
153
  width: 100%;
155
- padding: 16px 0 16px 16px;
156
154
  background: var(--color-neutral-50);
157
155
  border-bottom-right-radius: var(--dss-radius-sm);
156
+ overflow: hidden;
158
157
  .spinner-container {
159
158
  display: flex;
160
159
  flex-direction: row;
@@ -171,25 +170,4 @@
171
170
  }
172
171
  }
173
172
  }
174
- }
175
- md-menu {
176
- cursor: pointer;
177
- --md-menu-container-color: white;
178
- min-width: 239px;
179
- .menu-item {
180
- display: flex;
181
- flex-direction: row;
182
- align-items: center;
183
- justify-content: space-between;
184
- padding: 1rem;
185
- &:hover {
186
- background-color: #f0f0f0;
187
- }
188
- .two-icons {
189
- display: flex;
190
- align-items: center;
191
- gap: 10px;
192
- }
193
- }
194
- color: var(--color-neutral-900);
195
- }
173
+ }
@@ -1,9 +1,11 @@
1
1
  import { html, nothing } from "lit";
2
2
  import { ActivityHistory } from "./activity-history";
3
+ import "./activity-history-search-header/activity-history-search-header"
3
4
  import "./activity-history-timeline/activity-history-timeline";
4
5
  import "../export-pdf-modal/export-pdf-modal";
5
6
  import { ExportPdf } from "../../features/export-to-pdf/request";
6
7
  import { translate } from "../../localization";
8
+ import { when } from "lit/directives/when.js";
7
9
  export const template = (props: ActivityHistory) =>
8
10
  html`<div class="container" ?maximized=${props.maximized}>
9
11
  ${
@@ -12,11 +14,11 @@ export const template = (props: ActivityHistory) =>
12
14
  : html`<div class="header">
13
15
  <div class="header__left">
14
16
  <div class="title">${translate("activityHistory")}</div>
15
- <dss-search-bar @onSearchChange=${props._handleSearchChange} icon="search" inputsize="md" threshold="2" recentsearchestext="" emptydropdowntext="">
17
+ <dss-search-bar dropdownStyle=${"display: none"} @onSearchChange=${props._handleSearchChange} icon="search" inputsize="md" threshold="2" recentsearchestext="" emptydropdowntext="">
16
18
  <label slot="label" for="searchbar1" aria-hidden="false"></label>
17
- <input slot="input" id="searchbar1" type="text">
19
+ <input slot="input" id="searchbar1" type="text" @input=${(e) => props._handleSearchChange({ detail: [e.target.value] })}>
18
20
  </dss-search-bar>
19
- <dss-datepicker inputsize="md" class="date-picker">
21
+ <dss-datepicker dropdownFixed inputsize="md" class="date-picker" @onValueChange=${(event) => props._handleSelectDate(event.detail)}>
20
22
  <label slot="label" for="myDatepicker">${translate("goToDate")}</label>
21
23
  <input slot="input" id="myDatepicker" type="text" class="dss-input">
22
24
  </dss-datepicker>
@@ -25,53 +27,34 @@ export const template = (props: ActivityHistory) =>
25
27
  <div class="header__right">
26
28
  <dss-icon-button @click=${() => props._maximize()} size="md" variant="primary" icon="arrow_forward" label="Botó maximitzar"></dss-icon-button>
27
29
  <div>|</div>
28
- <primaria-menu>
29
- <div slot="anchor" id="usage-anchor">
30
- <dss-icon-button @click="${props.toggleMenu}" size="md" variant="primary" icon="more_vert" label="Botó opcions"></dss-icon-button>
31
- </div>
32
- ${
33
- props.menuOpened
34
- ? html`
35
- <md-menu slot="content" id="content" anchor="usage-anchor">
36
- <div class="menu-item">
37
- <div class="two-icons">
38
- <dss-icon icon="view_timeline" size="sm"></dss-icon><span>${translate("actions.cronogram")}</span>
39
- </div>
40
- </div>
41
- <div class="menu-item">
42
- <div class="two-icons" @click=${() => props.api.broker.send(new ExportPdf())}>
43
- <dss-icon icon="file_download" size="sm"></dss-icon><span>${translate("actions.exportPdf")}</span>
44
- </div>
45
- </div>
46
- <div class="menu-item">
47
- <span>${translate("actions.noteLegend")}</span>
48
- </div>
49
- </md-menu>`
50
- : nothing
51
- }
52
- </primaria-menu>
30
+ <dss-icon-button size="md" variant="primary" icon="more_vert" label="Botó menu"></dss-icon-button>
31
+ <dss-action-menu position="bottom-start">
32
+ <dss-action-menu-item lefticon="view_timeline" label=${translate("actions.cronogram")}></dss-action-menu-item>
33
+ <dss-action-menu-item lefticon="file_download" label=${translate("actions.exportPdf")} @click=${() => props.api.broker.send(new ExportPdf())}></dss-action-menu-item>
34
+ <dss-action-menu-item label=${translate("actions.noteLegend")}></dss-action-menu-item>
35
+ </dss-action-menu>
53
36
  </div>
54
37
  </div>`
55
- }
56
-
38
+ }
57
39
  <div class="wrapper" ?maximized=${props.maximized}>
58
- <div class="filters-sidebar" ?expanded=${props.filtersExpanded} >
59
- ${
60
- props.filtersExpanded
61
- ? html`<div class="filters-sidebar-opened">${translate("filters.filters")}<dss-icon-button @click=${() => props._toggleFilters()} size="md" variant="primary" icon="keyboard_double_arrow_left"></dss-icon-button></div>`
62
- : html`<dss-icon-button @click=${() => props._toggleFilters()} size="md" variant="primary" icon="keyboard_double_arrow_right"></dss-icon-button>`
63
- }
64
- </div>
65
- <div class="content">
66
- ${
67
- props.isAnyCollectionLoadingWithoutAnyLoaded
68
- ? html`<div class="spinner-full-container"><dss-spinner></dss-spinner></div>`
69
- : props.isSomeCollectionLoadedAndOtherLoading
70
- ? html`<div class="spinner-container"><dss-spinner size="sm"></dss-spinner><div class="busy-description">${translate("busyEntriesLoading")}</div></div>`
71
- : nothing
72
- }
73
- <activity-history-timeline></activity-history-timeline>
74
- </div>
40
+ <div class="filters-sidebar" ?expanded=${props.filtersExpanded} >
41
+ ${
42
+ props.filtersExpanded
43
+ ? html`<div class="filters-sidebar-opened">${translate("filters.filters")}<dss-icon-button @click=${() => props._toggleFilters()} size="md" variant="primary" icon="keyboard_double_arrow_left"></dss-icon-button></div>`
44
+ : html`<dss-icon-button @click=${() => props._toggleFilters()} size="md" variant="primary" icon="keyboard_double_arrow_right"></dss-icon-button>`
45
+ }
46
+ </div>
47
+ <div class="content">
48
+ ${when(props.searchQuery.length > 1,() => html`<activity-history-search-header searchQuery="${props.searchQuery}"></activity-history-search-header>`)}
49
+ ${
50
+ props.isAnyCollectionLoadingWithoutAnyLoaded
51
+ ? html`<div class="spinner-full-container"><dss-spinner></dss-spinner></div>`
52
+ : props.isSomeCollectionLoadedAndOtherLoading
53
+ ? html`<div class="spinner-container"><dss-spinner size="sm"></dss-spinner><div class="busy-description">${translate("busyEntriesLoading")}</div></div>`
54
+ : nothing
55
+ }
56
+ <activity-history-timeline></activity-history-timeline>
57
+ </div>
75
58
  </div>
76
59
  </div>`;
77
60
 
@@ -80,35 +63,20 @@ export const headerMaximizedTemplate = (props: ActivityHistory) => html`
80
63
  <div class="header__maximized">
81
64
  <div class="header__maximized__left">
82
65
  <div class="title">${translate("activityHistory")}</div>
83
- <dss-search-bar @onSearchChange=${props._handleSearchChange} icon="search" inputsize="md" threshold="3" recentsearchestext="" emptydropdowntext="Sense resultats per">
66
+ <dss-search-bar dropdownStyle=${"display: none"} @onSearchChange=${props._handleSearchChange} icon="search" inputsize="md" threshold="3" recentsearchestext="" emptydropdowntext="Sense resultats per">
84
67
  <label slot="label" for="searchbar1" aria-hidden="false"></label>
85
- <input slot="input" id="searchbar1" type="text">
68
+ <input slot="input" id="searchbar1" type="text" @input=${(e) => props._handleSearchChange({ detail: [e.target.value] })}>
86
69
  </dss-search-bar>
87
- <dss-datepicker inputsize="md" class="date-picker" @onValueChange=${props._handleSelectDate}>
70
+ <dss-datepicker dropdownFixed inputsize="md" class="date-picker" @onValueChange=${(event) => props._handleSelectDate(event.detail)}>
88
71
  <label slot="label" for="myDatepicker">${translate("goToDate")}</label>
89
72
  <input slot="input" id="myDatepicker" type="text" class="dss-input">
90
73
  </dss-datepicker>
91
74
  </div>
92
75
  <div class="header__maximized__right">
93
- <primaria-menu>
94
- <div slot="anchor" id="usage-anchor">
95
- <div class="options" @click="${props.toggleMenu}">
96
- <dss-button variant="subtle" size="md" label="${translate("actions.moreOptions")}" icon="more_horiz" iconposition="left"></dss-button>
97
- </div>
98
- </div>
99
- ${
100
- props.menuOpened
101
- ? html`
102
- <md-menu slot="content" id="content" anchor="usage-anchor">
103
- <div class="menu-item">
104
- <div class="two-icons" @click=${() => props.api.broker.send(new ExportPdf())}>
105
- <dss-icon icon="file_download" size="sm"></dss-icon><span>${translate("actions.exportPdf")}</span>
106
- </div>
107
- </div>
108
- </md-menu>`
109
- : nothing
110
- }
111
- </primaria-menu>
76
+ <dss-button variant="subtle" size="md" label="${translate("actions.moreOptions")}" icon="more_horiz" iconposition="left"></dss-button>
77
+ <dss-action-menu position="bottom-start">
78
+ <dss-action-menu-item @click=${() => props.api.broker.send(new ExportPdf())} lefticon="file_download" label=${translate("actions.exportPdf")}></dss-action-menu-item>
79
+ </dss-action-menu>
112
80
  <dss-button label="${translate("actions.entryLegend")}" size="md" variant="secondary" icon="info"></dss-button>
113
81
  <dss-button label="${translate("actions.cronogram")}" size="md" variant="primary" icon="view_timeline"></dss-button>
114
82
  </div>
@@ -1 +1,4 @@
1
1
  export const pluginName = "activity-history";
2
+ export const events = {
3
+ activityHistorySearched: "activity_history_searched",
4
+ };
@@ -14,12 +14,17 @@ const commonFieldsSearchPredicate = (item: IActivityHistoryItem, searchString: s
14
14
  propContainsString(item.professional?.role.description, searchString);
15
15
  const serviceNameContainsSearchString =
16
16
  item.service.description && propContainsString(item.service.description, searchString);
17
+ const diagnosticsMatch = item.diagnostics?.some(diagnostic =>
18
+ propContainsString(diagnostic.id, searchString) ||
19
+ propContainsString(diagnostic.description, searchString)
20
+ );
17
21
  return (
18
22
  professionalNameContainsSearchString ||
19
23
  centerNameContainsSearchString ||
20
24
  specialityNameContainsSearchString ||
21
25
  roleNameContainsSearchString ||
22
- serviceNameContainsSearchString
26
+ serviceNameContainsSearchString||
27
+ diagnosticsMatch
23
28
  );
24
29
  };
25
30
 
@@ -25,11 +25,12 @@ export const isValidActivityHistoryItem = (obj: IActivityHistoryItem) => {
25
25
  const hasValidDiagnostics = (diagnostics) => {
26
26
  return (
27
27
  (diagnostics === null || isArray(diagnostics)) && // null or array
28
- (diagnostics === null || diagnostics.every(
29
- (diagnostic) =>
30
- diagnostic === null ||
31
- (diagnostic && isString(diagnostic.id) && isString(diagnostic.description)) // Permite que un diagnóstico sea null o tenga id y description válidos
32
- ))
28
+ (diagnostics === null ||
29
+ diagnostics.every(
30
+ (diagnostic) =>
31
+ diagnostic === null ||
32
+ (diagnostic && isString(diagnostic.id) && isString(diagnostic.description)), // Permite que un diagnóstico sea null o tenga id y description válidos
33
+ ))
33
34
  );
34
35
  };
35
36
 
@@ -63,3 +64,16 @@ export const ensureAreValidActivityHistoryItems = (items: IActivityHistoryItem[]
63
64
  }
64
65
  return items;
65
66
  };
67
+
68
+ const notifyInvalidItem = (item: IActivityHistoryItem) => {
69
+ console.error("Invalid history item", item);
70
+ };
71
+
72
+ export const validateAndFilterItems = (items: IActivityHistoryItem[]) => {
73
+ const validItems = [] as IActivityHistoryItem[];
74
+ for (const item of items) {
75
+ if (isValidActivityHistoryItem(item)) validItems.push(item);
76
+ else notifyInvalidItem(item);
77
+ }
78
+ return validItems;
79
+ };
@@ -1,11 +1,14 @@
1
1
  import { BrokerExtensions } from "@primaria/plugins-core";
2
2
  import { AddHistoryItemHandler } from "./handler";
3
3
  import { addHistoryItemRequest } from "./request";
4
+ import { BrokerDisposableHandler } from "../../../../api/broker/primaria-broker";
5
+
6
+ let request: BrokerDisposableHandler;
4
7
 
5
8
  export const bootstrapAddHistoryItem = (broker: BrokerExtensions) => {
6
- broker.registerRequest(addHistoryItemRequest, AddHistoryItemHandler);
9
+ request = broker.registerRequest(addHistoryItemRequest, AddHistoryItemHandler);
7
10
  };
8
11
 
9
12
  export const teardownAddHistoryItem = (broker: BrokerExtensions) => {
10
- broker.unregisterRequest(AddHistoryItemHandler);
13
+ request?.dispose();
11
14
  };
@@ -1,11 +1,14 @@
1
1
  import { BrokerExtensions } from "@primaria/plugins-core";
2
2
  import { AddHistoryItemsHandler } from "./handler";
3
3
  import { addHistoryItemsRequest } from "./request";
4
+ import { BrokerDisposableHandler } from "../../../../api/broker/primaria-broker";
5
+
6
+ let request: BrokerDisposableHandler;
4
7
 
5
8
  export const bootstrapAddHistoryItems = (broker: BrokerExtensions) => {
6
- broker.registerRequest(addHistoryItemsRequest, AddHistoryItemsHandler);
9
+ request = broker.registerRequest(addHistoryItemsRequest, AddHistoryItemsHandler);
7
10
  };
8
11
 
9
12
  export const teardownAddHistoryItems = (broker: BrokerExtensions) => {
10
- broker.unregisterRequest(AddHistoryItemsHandler);
13
+ request?.dispose();
11
14
  };
@@ -1,11 +1,14 @@
1
1
  import { BrokerExtensions } from "plugins/core";
2
2
  import { ExportToPdfHandler } from "./handler";
3
3
  import { ExportPdf } from "./request";
4
+ import { BrokerDisposableHandler } from "../../../../api/broker/primaria-broker";
5
+
6
+ let request: BrokerDisposableHandler;
4
7
 
5
8
  export const bootstrapExportPdf = (broker: BrokerExtensions) => {
6
- broker.registerRequest(ExportPdf, ExportToPdfHandler);
9
+ request = broker.registerRequest(ExportPdf, ExportToPdfHandler);
7
10
  };
8
11
 
9
12
  export const teardownExportPdf = (broker: BrokerExtensions) => {
10
- broker.unregisterRequest(ExportToPdfHandler);
13
+ request?.dispose();
11
14
  };
@@ -1,11 +1,14 @@
1
1
  import { BrokerExtensions } from "@primaria/plugins-core";
2
2
  import { injectAsyncHistoryItemsRequest } from "./request";
3
3
  import { InjectAsyncHistoryItemsHandler } from "./handler";
4
+ import { BrokerDisposableHandler } from "../../../../api/broker/primaria-broker";
5
+
6
+ let request: BrokerDisposableHandler;
4
7
 
5
8
  export const bootstrapInjectAsyncHistoryItems = (broker: BrokerExtensions) => {
6
- broker.registerRequest(injectAsyncHistoryItemsRequest, InjectAsyncHistoryItemsHandler);
9
+ request = broker.registerRequest(injectAsyncHistoryItemsRequest, InjectAsyncHistoryItemsHandler);
7
10
  };
8
11
 
9
12
  export const teardownInjectAsyncHistoryItems = (broker: BrokerExtensions) => {
10
- broker.unregisterRequest(InjectAsyncHistoryItemsHandler);
13
+ request?.dispose();
11
14
  };
@@ -8,7 +8,7 @@ import {
8
8
  removeBusyHistoryItem,
9
9
  } from "../../infrastructure/state/actions";
10
10
  import { InjectAsyncHistoryItemsPayload } from "./request";
11
- import { ensureAreValidActivityHistoryItems } from "../../domain/is-valid-history-item/is-valid-history-item";
11
+ import { validateAndFilterItems } from "../../domain/is-valid-history-item/is-valid-history-item";
12
12
 
13
13
  export class InjectAsyncHistoryItemsHandler {
14
14
  constructor(@inject(TYPES.store) private readonly store: Store) {}
@@ -17,11 +17,11 @@ export class InjectAsyncHistoryItemsHandler {
17
17
  try {
18
18
  let items = await payload.asyncTask();
19
19
  if (payload.mapFn) items = items.map(payload.mapFn);
20
- ensureAreValidActivityHistoryItems(items);
20
+ const validItems = validateAndFilterItems(items);
21
21
  this.store.dispatch(
22
22
  addActivityHistoryItems({
23
23
  id: payload.entityId,
24
- items: items,
24
+ items: validItems,
25
25
  componentFactory: payload.componentFactory,
26
26
  searchPredicate: payload.searchPredicate,
27
27
  }),
@@ -1,11 +1,14 @@
1
1
  import { BrokerExtensions } from "@primaria/plugins-core";
2
2
  import { SearchItemsHandler } from "./handler";
3
3
  import { SearchActivityHistoryItems } from "./request";
4
+ import { BrokerDisposableHandler } from "../../../../api/broker/primaria-broker";
5
+
6
+ let request: BrokerDisposableHandler;
4
7
 
5
8
  export const bootstrapSearchItems = (broker: BrokerExtensions) => {
6
- broker.registerRequest(SearchActivityHistoryItems, SearchItemsHandler);
9
+ request = broker.registerRequest(SearchActivityHistoryItems, SearchItemsHandler);
7
10
  };
8
11
 
9
12
  export const teardownSearchItems = (broker: BrokerExtensions) => {
10
- broker.unregisterRequest(SearchItemsHandler);
13
+ request?.dispose();
11
14
  };
@@ -3,12 +3,20 @@ import { inject } from "inversify";
3
3
  import { TYPES } from "../../infrastructure/ioc/types";
4
4
  import { setSearchString } from "../../infrastructure/state/actions";
5
5
  import { SearchActivityHistoryItems } from "./request";
6
+ import { PrimariaApi } from "@uxland/primary-shell";
7
+ import { events } from "../../constants";
6
8
 
7
9
  export class SearchItemsHandler {
8
- constructor(@inject(TYPES.store) private readonly store: Store) {}
10
+ constructor(
11
+ @inject(TYPES.store) private readonly store: Store,
12
+ @inject(TYPES.primaryApi) private api: PrimariaApi,
13
+ ) {}
9
14
  async handle(request: SearchActivityHistoryItems) {
10
15
  try {
11
16
  this.store.dispatch(setSearchString(request.searchString));
17
+ this.api.broker.publish(events.activityHistorySearched, {
18
+ searchQuery: request.searchString,
19
+ });
12
20
  } catch (e) {
13
21
  console.log(e.message);
14
22
  }