@uxland/primary-shell 4.1.1 → 4.3.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.
- package/dist/index.js +5532 -5039
- package/dist/index.js.map +1 -1
- package/dist/index.umd.cjs +474 -389
- package/dist/index.umd.cjs.map +1 -1
- package/dist/primary/shell/src/UI/components/shell-header/shell-header.d.ts +1 -0
- package/dist/primary/shell/src/api/api.d.ts +2 -0
- package/dist/primary/shell/src/api/http-client/http-client.d.ts +3 -2
- package/dist/primary/shell/src/api/plugin-busy-manager/plugin-busy-list/component.d.ts +12 -0
- package/dist/primary/shell/src/api/plugin-busy-manager/plugin-busy-list/template.d.ts +3 -0
- package/dist/primary/shell/src/api/plugin-busy-manager/plugin-busy-manager.d.ts +19 -0
- package/dist/primary/shell/src/api/plugin-busy-manager/plugin-busy-manager.test.d.ts +1 -0
- package/dist/primary/shell/src/api/token-manager/token-manager.d.ts +1 -1
- package/dist/primary/shell/src/events.d.ts +1 -0
- package/dist/primary/shell/src/features/exit/bootstrapper.d.ts +2 -0
- package/dist/primary/shell/src/features/exit/handler.d.ts +10 -0
- package/dist/primary/shell/src/features/exit/request.d.ts +4 -0
- package/dist/primary/shell/src/handle-plugins.d.ts +2 -2
- package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/add/add-async-history-items/request.d.ts +1 -1
- package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/add/add-async-history-items/validate-add-async-items-command.d.ts +4 -0
- package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/add/add-history-items/reducer.d.ts +1 -1
- package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/domain/model.d.ts +3 -0
- package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/UI/active-filters-badges/active-filters-badges.d.ts +14 -0
- package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/UI/active-filters-badges/template.d.ts +4 -0
- package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/UI/active-filters-header/active-filters-header.d.ts +9 -0
- package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/UI/active-filters-header/template.d.ts +4 -0
- package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/common-filters/selectors.d.ts +152 -0
- package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/custom-filters/selectors.d.ts +147 -1
- package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/filter/utils.d.ts +2 -0
- package/dist/primary/shell/src/internal-plugins/activity-history/activity-history-item/list/UI/timeline/activity-history-timeline.d.ts +2 -0
- package/dist/primary/shell/src/internal-plugins/activity-history/handle-views.d.ts +4 -0
- package/dist/primary/shell/src/internal-plugins/activity-history/infrastructure/ioc/container.d.ts +1 -0
- package/dist/primary/shell/src/internal-plugins/activity-history/infrastructure/ioc/types.d.ts +0 -1
- package/dist/primary/shell/src/internal-plugins/activity-history/localization.d.ts +4 -0
- package/dist/primary/shell/src/internal-plugins/activity-history/main.d.ts +0 -1
- package/dist/primary/shell/src/locales.d.ts +4 -0
- package/dist/style.css +1 -1
- package/package.json +2 -2
- package/src/UI/components/index.ts +3 -2
- package/src/UI/components/shell-header/shell-header.ts +5 -0
- package/src/UI/components/shell-header/template.ts +2 -2
- package/src/api/api.ts +10 -3
- package/src/api/broker/factory.ts +1 -1
- package/src/api/http-client/http-client.test.ts +60 -6
- package/src/api/http-client/http-client.ts +17 -10
- package/src/api/plugin-busy-manager/plugin-busy-list/component.ts +19 -0
- package/src/api/plugin-busy-manager/plugin-busy-list/styles.css +20 -0
- package/src/api/plugin-busy-manager/plugin-busy-list/template.ts +13 -0
- package/src/api/plugin-busy-manager/plugin-busy-manager.test.ts +49 -0
- package/src/api/plugin-busy-manager/plugin-busy-manager.ts +38 -0
- package/src/api/token-manager/token-manager.test.ts +0 -12
- package/src/api/token-manager/token-manager.ts +12 -7
- package/src/disposer.ts +0 -1
- package/src/events.ts +1 -0
- package/src/features/bootstrapper.ts +3 -0
- package/src/features/exit/bootstrapper.ts +17 -0
- package/src/features/exit/handler.ts +51 -0
- package/src/features/exit/request.ts +3 -0
- package/src/handle-plugins.ts +7 -6
- package/src/handle-views.ts +4 -1
- package/src/internal-plugins/activity-history/activity-history-item/add/add-async-history-items/handler.ts +2 -0
- package/src/internal-plugins/activity-history/activity-history-item/add/add-async-history-items/request.ts +1 -1
- package/src/internal-plugins/activity-history/activity-history-item/add/add-async-history-items/validate-add-async-items-command.ts +15 -0
- package/src/internal-plugins/activity-history/activity-history-item/add/add-history-items/reducer.ts +10 -7
- package/src/internal-plugins/activity-history/activity-history-item/domain/model.ts +4 -0
- package/src/internal-plugins/activity-history/activity-history-item/filter/UI/active-filters-badges/active-filters-badges.ts +51 -0
- package/src/internal-plugins/activity-history/activity-history-item/filter/UI/active-filters-badges/styles.css +31 -0
- package/src/internal-plugins/activity-history/activity-history-item/filter/UI/active-filters-badges/template.ts +103 -0
- package/src/internal-plugins/activity-history/activity-history-item/filter/UI/active-filters-header/active-filters-header.ts +29 -0
- package/src/internal-plugins/activity-history/activity-history-item/filter/UI/active-filters-header/styles.css +12 -0
- package/src/internal-plugins/activity-history/activity-history-item/filter/UI/active-filters-header/template.ts +19 -0
- package/src/internal-plugins/activity-history/activity-history-item/filter/common-filters/selectors.ts +10 -0
- package/src/internal-plugins/activity-history/activity-history-item/filter/custom-filters/selectors.ts +26 -0
- package/src/internal-plugins/activity-history/activity-history-item/filter/custom-filters/set-custom-filter-value/reducer.ts +7 -1
- package/src/internal-plugins/activity-history/activity-history-item/filter/utils.ts +9 -0
- package/src/internal-plugins/activity-history/activity-history-item/list/UI/main-view/template.ts +1 -1
- package/src/internal-plugins/activity-history/activity-history-item/list/UI/timeline/activity-history-timeline.ts +30 -0
- package/src/internal-plugins/activity-history/activity-history-item/list/UI/timeline/template.ts +7 -4
- package/src/internal-plugins/activity-history/activity-history-item/list/bootstrapper.ts +1 -0
- package/src/internal-plugins/activity-history/activity-history-item/search/activity-history-search-results/styles.css +1 -10
- package/src/internal-plugins/activity-history/activity-history-item/search/bootstrapper.ts +1 -0
- package/src/internal-plugins/activity-history/handle-views.ts +17 -0
- package/src/internal-plugins/activity-history/infrastructure/ioc/container.ts +5 -0
- package/src/internal-plugins/activity-history/infrastructure/ioc/types.ts +0 -1
- package/src/internal-plugins/activity-history/localization.ts +13 -10
- package/src/internal-plugins/activity-history/main.ts +4 -10
- package/src/locales.ts +8 -4
- package/dist/primary/shell/src/internal-plugins/activity-history/utils/get-locale-manager-dependency.d.ts +0 -1
- package/src/internal-plugins/activity-history/utils/get-locale-manager-dependency.ts +0 -7
package/src/handle-views.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { shellApi } from "./api/api";
|
|
|
2
2
|
import { shellRegions } from "./api/region-manager/regions";
|
|
3
3
|
import { clinicalMonitoringId, pocTestEventsId } from "./constants";
|
|
4
4
|
import { shellEvents } from "./events";
|
|
5
|
+
import { ExitShell } from "./features/exit/request";
|
|
5
6
|
import { ClinicalMonitoring } from "./UI/components/clinical-monitoring/clinical-monitoring";
|
|
6
7
|
import { PocEventsEcap } from "./UI/components/poc-events-ecap/poc-events-ecap";
|
|
7
8
|
import { PrimariaNavItem } from "./UI/shared-components/primaria-nav-item/primaria-nav-item";
|
|
@@ -257,7 +258,9 @@ const registerUpperNavMenuViews = () => {
|
|
|
257
258
|
const menuItem = new PrimariaNavItem({
|
|
258
259
|
icon: "add_box",
|
|
259
260
|
label: "Pàgina inici",
|
|
260
|
-
callbackFn: () => {
|
|
261
|
+
callbackFn: () => {
|
|
262
|
+
shellApi.broker.send(new ExitShell());
|
|
263
|
+
},
|
|
261
264
|
});
|
|
262
265
|
return Promise.resolve(menuItem);
|
|
263
266
|
},
|
|
@@ -4,12 +4,14 @@ import { addBusyHistoryItem, removeBusyHistoryItem } from "../../list/handle-bus
|
|
|
4
4
|
import { addErrorHistoryItem } from "../../list/handle-error/actions";
|
|
5
5
|
import { addHistoryItemsCommand } from "../add-history-items/request";
|
|
6
6
|
import { InjectAsyncHistoryItemsPayload } from "./request";
|
|
7
|
+
import { validateAddAsyncCommand } from "./validate-add-async-items-command";
|
|
7
8
|
|
|
8
9
|
export class InjectAsyncHistoryItemsHandler extends BaseHandler {
|
|
9
10
|
async handle(payload: InjectAsyncHistoryItemsPayload) {
|
|
10
11
|
this.store.dispatch(addBusyHistoryItem(payload.entityId));
|
|
11
12
|
try {
|
|
12
13
|
const items = await payload.asyncDataProvider();
|
|
14
|
+
validateAddAsyncCommand(payload, items);
|
|
13
15
|
this.api.broker.send(addHistoryItemsCommand, {
|
|
14
16
|
entityId: payload.entityId,
|
|
15
17
|
items,
|
|
@@ -7,7 +7,7 @@ export interface InjectAsyncHistoryItemsPayload {
|
|
|
7
7
|
componentFactory: (item: IActivityHistoryItem) => HTMLElement;
|
|
8
8
|
searchPredicate?: (searchString: string, item: IActivityHistoryItem) => boolean;
|
|
9
9
|
errorMessage: string;
|
|
10
|
-
filters
|
|
10
|
+
filters: IActivityHistoryCommonFilterGroup;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
export const addAsyncHistoryItemsCommand = "inject_async_history_items_request";
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { IActivityHistoryItem } from "../../domain/model";
|
|
2
|
+
import { InjectAsyncHistoryItemsPayload } from "./request";
|
|
3
|
+
|
|
4
|
+
export const validateAddAsyncCommand = (payload: InjectAsyncHistoryItemsPayload, items: IActivityHistoryItem[]) => {
|
|
5
|
+
if(payload.entityId !== payload.filters.id)
|
|
6
|
+
throw new Error("entityId and filters.id must be the same");
|
|
7
|
+
if(!payload.filters.title)
|
|
8
|
+
throw new Error("filters.title is required");
|
|
9
|
+
if(!payload.asyncDataProvider)
|
|
10
|
+
throw new Error("asyncDataProvider is required");
|
|
11
|
+
if(!payload.componentFactory)
|
|
12
|
+
throw new Error("componentFactory is required");
|
|
13
|
+
if(!payload.errorMessage)
|
|
14
|
+
throw new Error("errorMessage is required for failure asyncDataProviders");
|
|
15
|
+
};
|
package/src/internal-plugins/activity-history/activity-history-item/add/add-history-items/reducer.ts
CHANGED
|
@@ -12,11 +12,14 @@ export function addActivityHistoryItemsReducer(
|
|
|
12
12
|
}>,
|
|
13
13
|
) {
|
|
14
14
|
const { id, items, componentFactory, searchPredicate } = action.payload;
|
|
15
|
-
|
|
16
|
-
state
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
15
|
+
return {
|
|
16
|
+
...state,
|
|
17
|
+
collections: addItemsToCollection(
|
|
18
|
+
state.collections,
|
|
19
|
+
id,
|
|
20
|
+
items,
|
|
21
|
+
componentFactory,
|
|
22
|
+
searchPredicate,
|
|
23
|
+
),
|
|
24
|
+
};
|
|
22
25
|
}
|
|
@@ -29,6 +29,10 @@ export interface IActivityHistoryItem {
|
|
|
29
29
|
type?: string;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
+
export interface IActivityHistoryItemWithComponent extends IActivityHistoryItem {
|
|
33
|
+
component: HTMLElement;
|
|
34
|
+
}
|
|
35
|
+
|
|
32
36
|
export interface IActivityHistoryItemCollection {
|
|
33
37
|
id: string;
|
|
34
38
|
items: IActivityHistoryItem[];
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { LitElement, css, html, unsafeCSS } from "lit";
|
|
2
|
+
import { customElement } from "lit/decorators.js";
|
|
3
|
+
import { connectedProperty } from "../../../../infrastructure/state/connected-property";
|
|
4
|
+
import { lazyInject } from "../../../../infrastructure/ioc/container";
|
|
5
|
+
import { PrimariaApi } from "../../../../../../api/api";
|
|
6
|
+
import { TYPES } from "../../../../infrastructure/ioc/types";
|
|
7
|
+
import { template } from "./template";
|
|
8
|
+
import styles from "./styles.css?inline";
|
|
9
|
+
import { activeGroupsWithEnabledFilters } from "../../custom-filters/selectors";
|
|
10
|
+
import { SetCustomFilterValue } from "../../custom-filters/set-custom-filter-value/request";
|
|
11
|
+
import { IActivityHistoryCustomFilterGroup, IActivityHistoryFilterGroup } from "../../model";
|
|
12
|
+
import { activityHistoryEnabledCommonFiltersSelector } from "../../common-filters/selectors";
|
|
13
|
+
import { SetCommonFilter } from "../../common-filters/set-common-filter/request";
|
|
14
|
+
|
|
15
|
+
//@ts-ignore
|
|
16
|
+
@customElement("active-filters-badges")
|
|
17
|
+
export class ActiveFiltersBadges extends LitElement {
|
|
18
|
+
render() {
|
|
19
|
+
return html`${template(this)}`;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
static styles = css`
|
|
23
|
+
${unsafeCSS(styles)}
|
|
24
|
+
`;
|
|
25
|
+
|
|
26
|
+
@lazyInject(TYPES.primaryApi)
|
|
27
|
+
api: PrimariaApi;
|
|
28
|
+
|
|
29
|
+
activityHistoryCommonFiltersSelector;
|
|
30
|
+
|
|
31
|
+
@connectedProperty(activityHistoryEnabledCommonFiltersSelector)
|
|
32
|
+
enabledCommonFilters: IActivityHistoryFilterGroup[];
|
|
33
|
+
|
|
34
|
+
@connectedProperty(activeGroupsWithEnabledFilters)
|
|
35
|
+
enabledFilters: IActivityHistoryCustomFilterGroup[];
|
|
36
|
+
|
|
37
|
+
_onDeleteFilterValue(filterGroupId: string, filterId: string, optionId: string, value: boolean) {
|
|
38
|
+
this.api.broker.send(
|
|
39
|
+
new SetCustomFilterValue({
|
|
40
|
+
filterGroupId,
|
|
41
|
+
filterId,
|
|
42
|
+
optionId,
|
|
43
|
+
enabled: value,
|
|
44
|
+
}),
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
_onDeleteCommonFilterValue(filterId: string) {
|
|
49
|
+
this.api.broker.send(new SetCommonFilter({ id: filterId, enabled: false }));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
.filters-container{
|
|
2
|
+
display: flex;
|
|
3
|
+
gap: var(--dss-spacing-md);
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
.filters-header{
|
|
7
|
+
font-weight: 700;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
.filter-groups{
|
|
11
|
+
display: flex;
|
|
12
|
+
gap: var(--dss-spacing-xs);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.filter-group{
|
|
16
|
+
display: flex;
|
|
17
|
+
gap: var(--dss-spacing-xs);
|
|
18
|
+
color: var(--color-neutral-600);
|
|
19
|
+
font-weight: 600;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.popover-content {
|
|
23
|
+
box-sizing: border-box;
|
|
24
|
+
display: flex;
|
|
25
|
+
flex-wrap: wrap;
|
|
26
|
+
gap: var(--dss-spacing-xs);
|
|
27
|
+
padding: 10px;
|
|
28
|
+
max-width: 368px;
|
|
29
|
+
max-height: 336px;
|
|
30
|
+
overflow: auto;
|
|
31
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { html, nothing } from "lit";
|
|
2
|
+
import { ActiveFiltersBadges } from "./active-filters-badges";
|
|
3
|
+
import { translate } from "../../../../localization";
|
|
4
|
+
import { formatShowFilterTitle, normalizeDeletedFilterBooleanValue } from "../../utils";
|
|
5
|
+
|
|
6
|
+
const MAX_VISIBLE_CHIPS = 5;
|
|
7
|
+
|
|
8
|
+
const renderChip = (id, filter, value, props) => html`
|
|
9
|
+
<dss-chip
|
|
10
|
+
label=${value}
|
|
11
|
+
size="sm"
|
|
12
|
+
hasdelete
|
|
13
|
+
selected
|
|
14
|
+
@click=${() => props._onDeleteFilterValue(id, filter.id, value, false)}
|
|
15
|
+
@onDelete=${() => props._onDeleteFilterValue(id, filter.id, value, false)}
|
|
16
|
+
></dss-chip>
|
|
17
|
+
`;
|
|
18
|
+
|
|
19
|
+
const renderCommonChip = (filter, props) => html`
|
|
20
|
+
<dss-chip
|
|
21
|
+
label=${formatShowFilterTitle(filter.title)}
|
|
22
|
+
size="sm"
|
|
23
|
+
hasdelete
|
|
24
|
+
selected
|
|
25
|
+
@click=${() => props._onDeleteCommonFilterValue(filter.id)}
|
|
26
|
+
@onDelete=${() => props._onDeleteCommonFilterValue(filter.id)}
|
|
27
|
+
></dss-chip>
|
|
28
|
+
`;
|
|
29
|
+
|
|
30
|
+
const renderFilterTitle = (title) => html`<div class="filter-title">${`${title}:`}</div>`;
|
|
31
|
+
|
|
32
|
+
export const template = (props: ActiveFiltersBadges) => {
|
|
33
|
+
if (props.enabledFilters.length === 0 && props.enabledCommonFilters.length === 0) return nothing;
|
|
34
|
+
|
|
35
|
+
let visibleCount = 0;
|
|
36
|
+
const visibleChips: any[] = [];
|
|
37
|
+
const hiddenElements: any[] = [];
|
|
38
|
+
const hiddenChips: any[] = [];
|
|
39
|
+
|
|
40
|
+
for (const filter of props.enabledCommonFilters) {
|
|
41
|
+
const chip = renderCommonChip(filter, props);
|
|
42
|
+
|
|
43
|
+
if (visibleCount < MAX_VISIBLE_CHIPS) {
|
|
44
|
+
visibleChips.push(chip);
|
|
45
|
+
visibleCount++;
|
|
46
|
+
} else {
|
|
47
|
+
hiddenElements.push(chip);
|
|
48
|
+
hiddenChips.push(chip);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
for (const { title, id, filters } of props.enabledFilters) {
|
|
53
|
+
let titleAddedToVisible = false;
|
|
54
|
+
let titleAddedToHidden = false;
|
|
55
|
+
|
|
56
|
+
for (const filter of filters) {
|
|
57
|
+
for (const value of [...new Set(filter.enabledValues)]) {
|
|
58
|
+
const chip = renderChip(id, filter, normalizeDeletedFilterBooleanValue(value), props);
|
|
59
|
+
|
|
60
|
+
if (visibleCount < MAX_VISIBLE_CHIPS) {
|
|
61
|
+
if (!titleAddedToVisible) {
|
|
62
|
+
visibleChips.push(renderFilterTitle(title));
|
|
63
|
+
titleAddedToVisible = true;
|
|
64
|
+
}
|
|
65
|
+
visibleChips.push(chip);
|
|
66
|
+
visibleCount++;
|
|
67
|
+
} else {
|
|
68
|
+
if (!titleAddedToHidden) {
|
|
69
|
+
hiddenElements.push(renderFilterTitle(title));
|
|
70
|
+
titleAddedToHidden = true;
|
|
71
|
+
}
|
|
72
|
+
hiddenElements.push(chip);
|
|
73
|
+
hiddenChips.push(chip);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return html`
|
|
80
|
+
<div class="filters-container">
|
|
81
|
+
<div class="filters-header">${translate("chipHeader.selection")}</div>
|
|
82
|
+
<div class="filter-groups">
|
|
83
|
+
${visibleChips}
|
|
84
|
+
${
|
|
85
|
+
hiddenChips.length > 0
|
|
86
|
+
? html`
|
|
87
|
+
<div>
|
|
88
|
+
<dss-button label="+ ${hiddenChips.length}" size="sm" variant="primary"></dss-button>
|
|
89
|
+
<dss-popover title=${translate("chipHeader.selection")} position="bottom" popoverFixed>
|
|
90
|
+
<dss-popover-body slot="body">
|
|
91
|
+
<div class="popover-content">
|
|
92
|
+
${hiddenElements}
|
|
93
|
+
</div>
|
|
94
|
+
</dss-popover-body>
|
|
95
|
+
</dss-popover>
|
|
96
|
+
</div>
|
|
97
|
+
`
|
|
98
|
+
: nothing
|
|
99
|
+
}
|
|
100
|
+
</div>
|
|
101
|
+
</div>
|
|
102
|
+
`;
|
|
103
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { LitElement, css, html, unsafeCSS } from "lit";
|
|
2
|
+
import { template } from "./template";
|
|
3
|
+
import styles from "./styles.css?inline";
|
|
4
|
+
import { customElement } from "lit/decorators.js";
|
|
5
|
+
import { connectedProperty } from "../../../../infrastructure/state/connected-property";
|
|
6
|
+
import { activityHistorySearchStringSelector } from "../../../search/selectors";
|
|
7
|
+
import { areCustomFiltersActive } from "../../custom-filters/selectors";
|
|
8
|
+
import { areCommonFiltersActive } from "../../common-filters/selectors";
|
|
9
|
+
|
|
10
|
+
//@ts-ignore
|
|
11
|
+
@customElement("active-filters-header")
|
|
12
|
+
export class ActiveFiltersHeader extends LitElement {
|
|
13
|
+
render() {
|
|
14
|
+
return html`${template(this)}`;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
static styles = css`
|
|
18
|
+
${unsafeCSS(styles)}
|
|
19
|
+
`;
|
|
20
|
+
|
|
21
|
+
@connectedProperty(activityHistorySearchStringSelector)
|
|
22
|
+
searchString: string;
|
|
23
|
+
|
|
24
|
+
@connectedProperty(areCustomFiltersActive)
|
|
25
|
+
areCustomFiltersActive: boolean;
|
|
26
|
+
|
|
27
|
+
@connectedProperty(areCommonFiltersActive)
|
|
28
|
+
areCommonFiltersActive: boolean;
|
|
29
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
.active-filters-header{
|
|
2
|
+
display: flex;
|
|
3
|
+
flex-direction: column;
|
|
4
|
+
border-width: 0px 0px 1px 0px;
|
|
5
|
+
border-style: solid;
|
|
6
|
+
border-color: #D8D8D8;
|
|
7
|
+
background-color: #FFFFFF;
|
|
8
|
+
padding: var(--dss-spacing-sm) var(--dss-spacing-md);
|
|
9
|
+
gap: var(--dss-spacing-xs);
|
|
10
|
+
font-size: 14px;
|
|
11
|
+
line-height: 24px;
|
|
12
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { html, nothing } from "lit";
|
|
2
|
+
import { ActiveFiltersHeader } from "./active-filters-header";
|
|
3
|
+
import { when } from "lit/directives/when.js";
|
|
4
|
+
|
|
5
|
+
export const template = (props: ActiveFiltersHeader) => {
|
|
6
|
+
if (
|
|
7
|
+
!props.areCustomFiltersActive &&
|
|
8
|
+
!props.areCommonFiltersActive &&
|
|
9
|
+
props.searchString.length < 1
|
|
10
|
+
)
|
|
11
|
+
return nothing;
|
|
12
|
+
|
|
13
|
+
return html`
|
|
14
|
+
<div class="active-filters-header">
|
|
15
|
+
<active-filters-badges></active-filters-badges>
|
|
16
|
+
${when(props.searchString.length > 1, () => html`<activity-history-search-results searchQuery=${props.searchString}></activity-history-search-results>`)}
|
|
17
|
+
</div>
|
|
18
|
+
`;
|
|
19
|
+
};
|
|
@@ -12,3 +12,13 @@ export const isEnabledCommonFilterSelector = (filterId: string) =>
|
|
|
12
12
|
activityHistoryCommonFiltersSelector,
|
|
13
13
|
(filterSpecs) => filterSpecs?.find((s) => s.id === filterId)?.enabled,
|
|
14
14
|
);
|
|
15
|
+
|
|
16
|
+
export const activityHistoryEnabledCommonFiltersSelector = createSelector(
|
|
17
|
+
activityHistoryCommonFiltersSelector,
|
|
18
|
+
(filters) => filters.filter((f) => f.enabled),
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
export const areCommonFiltersActive = createSelector(
|
|
22
|
+
activityHistoryEnabledCommonFiltersSelector,
|
|
23
|
+
(filters) => !!filters.length,
|
|
24
|
+
);
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createSelector } from "@reduxjs/toolkit";
|
|
2
2
|
import {
|
|
3
|
+
IActivityHistoryCustomFilter,
|
|
3
4
|
IActivityHistoryCustomFilterGroup,
|
|
4
5
|
IActivityHistoryFilterGroup,
|
|
5
6
|
isNotCommonFilterGroup,
|
|
@@ -18,3 +19,28 @@ const sortBySortProperty = (
|
|
|
18
19
|
a: IActivityHistoryCustomFilterGroup,
|
|
19
20
|
b: IActivityHistoryCustomFilterGroup,
|
|
20
21
|
) => Number(a.sort) - Number(b.sort);
|
|
22
|
+
|
|
23
|
+
export const areCustomFiltersActive = createSelector(
|
|
24
|
+
activityHistoryCustomFilterGroupsSelector,
|
|
25
|
+
(filters: IActivityHistoryCustomFilterGroup[]) => {
|
|
26
|
+
return filters.some((filter) =>
|
|
27
|
+
filter.filters.some((singleFilter) => singleFilter.enabledValues?.length),
|
|
28
|
+
);
|
|
29
|
+
},
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
export const activeGroupsWithEnabledFilters = createSelector(
|
|
33
|
+
activityHistoryCustomFilterGroupsSelector,
|
|
34
|
+
(filters: IActivityHistoryCustomFilterGroup[]) => {
|
|
35
|
+
return filters
|
|
36
|
+
.filter((group) => group.enabled)
|
|
37
|
+
.map(({ id, title, enabled, sort, filters }) => ({
|
|
38
|
+
id,
|
|
39
|
+
title,
|
|
40
|
+
enabled,
|
|
41
|
+
sort,
|
|
42
|
+
filters: filters.filter((filter) => filter.enabledValues?.length),
|
|
43
|
+
}))
|
|
44
|
+
.filter((group) => group.filters.length > 0);
|
|
45
|
+
},
|
|
46
|
+
);
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { PayloadAction } from "@reduxjs/toolkit";
|
|
2
2
|
import { SetCustomFilterValuePayload } from "./request";
|
|
3
|
+
import { IActivityHistoryCustomFilter, IActivityHistoryCustomFilterGroup } from "../../model";
|
|
3
4
|
|
|
4
5
|
export function setCustomFilterValueReducer(
|
|
5
6
|
state,
|
|
@@ -22,8 +23,13 @@ export function setCustomFilterValueReducer(
|
|
|
22
23
|
});
|
|
23
24
|
}
|
|
24
25
|
|
|
25
|
-
const setMultipleOptionsFilterValue = (
|
|
26
|
+
const setMultipleOptionsFilterValue = (
|
|
27
|
+
filter: IActivityHistoryCustomFilter,
|
|
28
|
+
payload: SetCustomFilterValuePayload,
|
|
29
|
+
) => {
|
|
26
30
|
const { optionId, enabled } = payload;
|
|
31
|
+
//Si el option ya estaba habilitado, no cambiamos nada
|
|
32
|
+
if (filter.enabledValues?.some((id) => id === optionId) && enabled) return filter;
|
|
27
33
|
return {
|
|
28
34
|
...filter,
|
|
29
35
|
enabledValues: enabled
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { translate } from "../../localization";
|
|
2
|
+
|
|
3
|
+
export const formatShowFilterTitle = (title: string) => {
|
|
4
|
+
const filterTitle = title.replace(/veure/gi, "").trim();
|
|
5
|
+
return filterTitle.charAt(0).toUpperCase() + filterTitle.slice(1);
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export const normalizeDeletedFilterBooleanValue = (value) =>
|
|
9
|
+
value === true ? translate("filters.deleted") : value;
|
package/src/internal-plugins/activity-history/activity-history-item/list/UI/main-view/template.ts
CHANGED
|
@@ -33,7 +33,7 @@ export const template = (props: ActivityHistoryMain) =>
|
|
|
33
33
|
<div class="wrapper" ?maximized=${props.maximized}>
|
|
34
34
|
<activity-history-filters .wrapperMaximized=${props.maximized}></activity-history-filters>
|
|
35
35
|
<div class="content">
|
|
36
|
-
|
|
36
|
+
<active-filters-header></active-filters-header>
|
|
37
37
|
<activity-history-busy></activity-history-busy>
|
|
38
38
|
<activity-history-timeline></activity-history-timeline>
|
|
39
39
|
</div>
|
|
@@ -40,6 +40,36 @@ export class ActivityHistoryTimeline extends LitElement {
|
|
|
40
40
|
this._hasUpdatedOnce = true;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
+
async updated(changedProperties) {
|
|
44
|
+
if (changedProperties.has("historyGroups") && this.historyGroups?.length) {
|
|
45
|
+
// Resolver los elementos antes de actualizar el template
|
|
46
|
+
await this.prepareComponents(this.historyGroups);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async prepareComponents(historyGroups) {
|
|
51
|
+
for (const group of historyGroups) {
|
|
52
|
+
// Resolver items del grupo principal
|
|
53
|
+
group.items = await Promise.all(
|
|
54
|
+
group.items.map(async (item) => ({
|
|
55
|
+
...item,
|
|
56
|
+
component: await item.componentFactory({ item }),
|
|
57
|
+
})),
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
// Resolver subgrupos
|
|
61
|
+
for (const subGroup of group.subGroups) {
|
|
62
|
+
subGroup.items = await Promise.all(
|
|
63
|
+
subGroup.items.map(async (item) => ({
|
|
64
|
+
...item,
|
|
65
|
+
component: await item.componentFactory({ item }),
|
|
66
|
+
})),
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
this.requestUpdate(); // 🔥 Forzar actualización del template
|
|
71
|
+
}
|
|
72
|
+
|
|
43
73
|
highlightMatch(text: string, searchString: string): string {
|
|
44
74
|
if (!this.searchString || this.searchString.length < 2) return text;
|
|
45
75
|
const regex = new RegExp(`(${searchString})`, "gi");
|
package/src/internal-plugins/activity-history/activity-history-item/list/UI/timeline/template.ts
CHANGED
|
@@ -9,6 +9,7 @@ import { ifDefined } from "lit/directives/if-defined.js";
|
|
|
9
9
|
import {
|
|
10
10
|
IActivityHistoryGroup,
|
|
11
11
|
IActivityHistoryItem,
|
|
12
|
+
IActivityHistoryItemWithComponent,
|
|
12
13
|
IActivityHistorySubGroup,
|
|
13
14
|
} from "../../../domain/model";
|
|
14
15
|
import { translate } from "../../../../localization";
|
|
@@ -27,8 +28,9 @@ export const template = (props: ActivityHistoryTimeline) => {
|
|
|
27
28
|
<div class="visit__items">
|
|
28
29
|
${repeat(
|
|
29
30
|
itemGroup.items,
|
|
30
|
-
(item
|
|
31
|
-
|
|
31
|
+
(item) => item.id,
|
|
32
|
+
(item: IActivityHistoryItemWithComponent) =>
|
|
33
|
+
html`<div class="item">${item.component}</div> `,
|
|
32
34
|
)}
|
|
33
35
|
${repeat(
|
|
34
36
|
itemGroup.subGroups,
|
|
@@ -38,8 +40,9 @@ export const template = (props: ActivityHistoryTimeline) => {
|
|
|
38
40
|
${diagnosticHeaderTemplate(subGroup.items[0])}
|
|
39
41
|
<div class="diagnostics__items">${repeat(
|
|
40
42
|
subGroup.items,
|
|
41
|
-
(item
|
|
42
|
-
|
|
43
|
+
(item) => item.id,
|
|
44
|
+
(item: IActivityHistoryItemWithComponent) =>
|
|
45
|
+
html`<div class="item">${item?.component}</div> `,
|
|
43
46
|
)}</div>
|
|
44
47
|
</div>
|
|
45
48
|
`,
|
|
@@ -1,14 +1,5 @@
|
|
|
1
1
|
.search-header {
|
|
2
|
-
padding-inline: 16px;
|
|
3
|
-
padding-top: 12px;
|
|
4
|
-
padding-bottom: 12px;
|
|
5
|
-
gap: var(--dss-spacing-xs);
|
|
6
|
-
border-width: 0px 0px 1px 0px;
|
|
7
|
-
border-style: solid;
|
|
8
|
-
border-color: #D8D8D8;
|
|
9
|
-
background-color: #FFFFFF;
|
|
10
2
|
color: var(--color-neutral-900);
|
|
11
3
|
font-weight: 600;
|
|
12
|
-
|
|
13
|
-
line-height: 24px;
|
|
4
|
+
|
|
14
5
|
}
|
|
@@ -4,6 +4,7 @@ import { SearchActivityHistoryItems } from "./request";
|
|
|
4
4
|
import { BrokerDisposableHandler } from "../../../../api/broker/primaria-broker";
|
|
5
5
|
import "./activity-history-search-results/activity-history-search-results";
|
|
6
6
|
import "./activity-history-search-bar/activity-history-search-bar";
|
|
7
|
+
import "../filter/UI/active-filters-badges/active-filters-badges";
|
|
7
8
|
|
|
8
9
|
let request: BrokerDisposableHandler;
|
|
9
10
|
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { PrimariaApi } from "../../api/api";
|
|
2
|
+
import { clinicalMonitoringRegions } from "../../api/region-manager/regions";
|
|
3
|
+
import { ActivityHistoryMain } from "./activity-history-item/list/UI/main-view/activity-history-main";
|
|
4
|
+
import { container } from "./infrastructure/ioc/container";
|
|
5
|
+
import { TYPES } from "./infrastructure/ioc/types";
|
|
6
|
+
|
|
7
|
+
export const registerViews = (api: PrimariaApi) => {
|
|
8
|
+
api.regionManager.registerView(clinicalMonitoringRegions.content, {
|
|
9
|
+
id: api.pluginInfo.pluginId,
|
|
10
|
+
factory: () => Promise.resolve(new ActivityHistoryMain()),
|
|
11
|
+
});
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export const unregisterViews = () => {
|
|
15
|
+
const api = container.get(TYPES.primaryApi) as PrimariaApi;
|
|
16
|
+
api.regionManager.removeView(clinicalMonitoringRegions.content, api.pluginInfo.pluginId);
|
|
17
|
+
};
|
|
@@ -12,3 +12,8 @@ export const bindDeps = (api: PrimariaApi) => {
|
|
|
12
12
|
container.bind(TYPES.primaryApi).toConstantValue(api);
|
|
13
13
|
container.bind(TYPES.store).toConstantValue(store);
|
|
14
14
|
};
|
|
15
|
+
|
|
16
|
+
export const unbindDeps = () => {
|
|
17
|
+
container.unbind(TYPES.primaryApi);
|
|
18
|
+
container.unbind(TYPES.store);
|
|
19
|
+
};
|
|
@@ -1,7 +1,4 @@
|
|
|
1
1
|
import { PrimariaApi } from "../../api/api";
|
|
2
|
-
import { container } from "./infrastructure/ioc/container";
|
|
3
|
-
import { TYPES } from "./infrastructure/ioc/types";
|
|
4
|
-
import { getLocaleManagerDependency } from "./utils/get-locale-manager-dependency";
|
|
5
2
|
|
|
6
3
|
type LocaleKeys<T> = T extends object
|
|
7
4
|
? {
|
|
@@ -17,15 +14,15 @@ export type ActivityHistoryLocales = LocaleKeys<
|
|
|
17
14
|
|
|
18
15
|
const defaultLang = "ca";
|
|
19
16
|
|
|
17
|
+
let pluginLocaleManager;
|
|
18
|
+
|
|
20
19
|
export const initializeLocalization = async (api: PrimariaApi) => {
|
|
21
|
-
|
|
22
|
-
container.bind(TYPES.localeManager).toConstantValue(pluginLocaleManager);
|
|
20
|
+
pluginLocaleManager = await api.createLocaleManager(locales);
|
|
23
21
|
};
|
|
24
22
|
|
|
25
23
|
export const translate = (path: ActivityHistoryLocales) => {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
else return path;
|
|
24
|
+
if (pluginLocaleManager) return (pluginLocaleManager as any).translate(path);
|
|
25
|
+
return path;
|
|
29
26
|
};
|
|
30
27
|
|
|
31
28
|
export const locales = {
|
|
@@ -54,14 +51,15 @@ export const locales = {
|
|
|
54
51
|
allActivityHistory: "Tot l’històric d’activitat",
|
|
55
52
|
onlyAppliedFilters: "Només amb filtres aplicats",
|
|
56
53
|
selectDateRange: "En el cas que sigui necessari, selecciona un rang de dates",
|
|
57
|
-
helpText:
|
|
54
|
+
helpText:
|
|
55
|
+
"Sense seleccionar data, s'aplicarà la de la primera entrada. Sense seleccionar data de fi, s'aplicarà la de l'última entrada.",
|
|
58
56
|
startDate: "Data Inici",
|
|
59
57
|
endDate: "Data Fi",
|
|
60
58
|
cancel: "Cancel·lar",
|
|
61
59
|
export: "Exportar",
|
|
62
60
|
},
|
|
63
61
|
filters: {
|
|
64
|
-
filters: "Filtres",
|
|
62
|
+
filters: "Filtres",
|
|
65
63
|
searchFilter: "Cercar filtre",
|
|
66
64
|
ownFilters: "Els meus",
|
|
67
65
|
rellevantFilters: "Rellevants",
|
|
@@ -73,6 +71,8 @@ export const locales = {
|
|
|
73
71
|
|
|
74
72
|
selected: "seleccionats",
|
|
75
73
|
applyFilters: "Aplicar filtres",
|
|
74
|
+
|
|
75
|
+
deleted: "Eliminats",
|
|
76
76
|
},
|
|
77
77
|
tooltips: {
|
|
78
78
|
subjective: "Subjectiu",
|
|
@@ -84,6 +84,9 @@ export const locales = {
|
|
|
84
84
|
variablees: "Variables",
|
|
85
85
|
prescriptions: "Prescripcions",
|
|
86
86
|
},
|
|
87
|
+
chipHeader: {
|
|
88
|
+
selection: "Selecció:",
|
|
89
|
+
},
|
|
87
90
|
},
|
|
88
91
|
},
|
|
89
92
|
};
|