@mediusinc/mng-commons 5.5.0-rc.0 → 5.5.0-rc.2
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/core/descriptors/table.descriptor.d.ts +4 -2
- package/core/directives/rerender.directive.d.ts +9 -0
- package/core/helpers/route.d.ts +25 -25
- package/core/index.d.ts +2 -0
- package/core/reactivity/effect.d.ts +16 -0
- package/esm2022/core/components/notification/notification-wrapper.component.mjs +4 -4
- package/esm2022/core/components/pages/error/error.page.component.mjs +4 -4
- package/esm2022/core/components/pages/not-found/not-found.page.component.mjs +4 -4
- package/esm2022/core/data-list/data-list-params-helpers.mjs +18 -3
- package/esm2022/core/descriptors/table.descriptor.mjs +1 -1
- package/esm2022/core/directives/component.directive.mjs +4 -4
- package/esm2022/core/directives/rerender.directive.mjs +25 -0
- package/esm2022/core/directives/template.directive.mjs +4 -4
- package/esm2022/core/index.mjs +4 -1
- package/esm2022/core/pipes/boolean.pipe.mjs +6 -6
- package/esm2022/core/pipes/class-map.pipe.mjs +4 -4
- package/esm2022/core/pipes/enum.pipe.mjs +4 -4
- package/esm2022/core/pipes/enumerate-async.pipe.mjs +4 -4
- package/esm2022/core/pipes/enumerate.pipe.mjs +4 -4
- package/esm2022/core/pipes/getter.pipe.mjs +5 -5
- package/esm2022/core/pipes/i18n-property.pipe.mjs +4 -4
- package/esm2022/core/pipes/json-path.pipe.mjs +4 -4
- package/esm2022/core/pipes/parametrize.pipe.mjs +4 -4
- package/esm2022/core/pipes/template.pipe.mjs +4 -4
- package/esm2022/core/reactivity/effect.mjs +22 -0
- package/esm2022/core/security/permission.service.mjs +4 -4
- package/esm2022/core/services/commons-init.service.mjs +4 -4
- package/esm2022/core/services/commons-router.service.mjs +4 -4
- package/esm2022/core/services/commons-storage.service.mjs +4 -4
- package/esm2022/core/services/commons.service.mjs +8 -8
- package/esm2022/filter/descriptors/filter-lookup.descriptor.mjs +32 -25
- package/esm2022/filter/descriptors/filter.descriptor.mjs +53 -1
- package/esm2022/form/components/autocomplete/autocomplete.component.mjs +4 -4
- package/esm2022/form/components/date-range/date-range.component.mjs +4 -4
- package/esm2022/form/components/dropdown/dropdown.component.mjs +4 -4
- package/esm2022/form/components/number-range/number-range.component.mjs +4 -4
- package/esm2022/form/directives/input-trim.directive.mjs +4 -4
- package/esm2022/table/api/descriptors/sort.descriptor.mjs +2 -2
- package/esm2022/table/api/descriptors/table.descriptor.mjs +32 -8
- package/esm2022/table/components/column-filter/column-filter.component.mjs +33 -40
- package/esm2022/table/components/column-value/column-value.component.mjs +6 -6
- package/esm2022/table/components/filter/filter-active-tag/filter-active-tag.component.mjs +7 -7
- package/esm2022/table/components/filter/filter-form/filter-form.component.mjs +24 -34
- package/esm2022/table/components/filter/filter-overlay-with-tag/filter-overlay-with-tag.component.mjs +44 -45
- package/esm2022/table/components/table/table.component.mjs +114 -430
- package/esm2022/table/helpers/filters.mjs +9 -25
- package/esm2022/table/helpers/table.mjs +24 -0
- package/esm2022/table/index.mjs +2 -2
- package/esm2022/table/models/column-preferences.model.mjs +1 -1
- package/esm2022/table/models/filter.model.mjs +1 -1
- package/esm2022/table/pipes/filter-value.pipe.mjs +4 -4
- package/esm2022/table/pipes/locale-default-row-class.pipe.mjs +4 -4
- package/esm2022/table/pipes/table-column-filter-class.pipe.mjs +4 -4
- package/esm2022/table/services/table-data.service.mjs +194 -0
- package/esm2022/table/services/table-metadata.service.mjs +136 -0
- package/esm2022/table/services/table-preferences.service.mjs +142 -0
- package/esm2022/tableview/action/components/action/action.component.mjs +6 -7
- package/esm2022/tableview/action/components/editor/action-editor.component.mjs +4 -4
- package/esm2022/tableview/action/components/editor/injector-context/action-editor-injector-context.component.mjs +69 -46
- package/esm2022/tableview/action/components/localization/data-language-dropdown.component.mjs +4 -4
- package/esm2022/tableview/action/components/route/action-route.component.mjs +5 -6
- package/esm2022/tableview/action/components/table/action-table.component.mjs +4 -4
- package/esm2022/tableview/action/helpers/action-execution.mjs +25 -0
- package/esm2022/tableview/action/models/execution/action-instance.model.mjs +2 -3
- package/esm2022/tableview/action/services/action-executor.service.mjs +12 -79
- package/esm2022/tableview/action/services/component-action-executor.service.mjs +4 -4
- package/esm2022/tableview/action/services/data-provider-executor.service.mjs +4 -4
- package/esm2022/tableview/action/services/navigation.service.mjs +4 -4
- package/esm2022/tableview/action/services/root-action-executor.service.mjs +4 -4
- package/esm2022/tableview/action/services/view-container.service.mjs +4 -4
- package/esm2022/tableview/api/action/descriptors/action-confirmation.descriptor.mjs +13 -1
- package/esm2022/tableview/api/action/descriptors/action-editor.descriptor.mjs +67 -10
- package/esm2022/tableview/api/action/descriptors/action-link-descriptor.factory.mjs +2 -2
- package/esm2022/tableview/api/action/descriptors/action-link.descriptor.mjs +17 -1
- package/esm2022/tableview/api/action/descriptors/action.descriptor.mjs +32 -7
- package/esm2022/tableview/api/action/models/execution/action-instance-state.model.mjs +2 -2
- package/esm2022/tableview/api/editor/descriptors/field-base.descriptor.mjs +20 -1
- package/esm2022/tableview/api/editor/descriptors/field-many.descriptor.mjs +2 -1
- package/esm2022/tableview/api/editor/models/formly-custom-field.model.mjs +4 -4
- package/esm2022/tableview/api/tableview/descriptors/tableview.descriptor.mjs +13 -5
- package/esm2022/tableview/api/tableview/helpers/tableview-default-actions.mjs +3 -2
- package/esm2022/tableview/api/tableview/helpers/tableview-descriptor-helpers.mjs +2 -2
- package/esm2022/tableview/editor/components/editor/auto-save-status/auto-save-status.component.mjs +4 -4
- package/esm2022/tableview/editor/components/editor/form-editor.component.mjs +31 -38
- package/esm2022/tableview/editor/components/formly/constants.mjs +2 -0
- package/esm2022/tableview/editor/components/formly/fields/formly-field-action/formly-field-action.component.mjs +4 -4
- package/esm2022/tableview/editor/components/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +7 -5
- package/esm2022/tableview/editor/components/formly/fields/formly-field-custom/formly-field-custom.component.mjs +4 -4
- package/esm2022/tableview/editor/components/formly/fields/formly-field-datepicker/formly-field-datepicker.component.mjs +7 -5
- package/esm2022/tableview/editor/components/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +7 -5
- package/esm2022/tableview/editor/components/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +4 -4
- package/esm2022/tableview/editor/components/formly/fields/formly-field-input/formly-field-input.component.mjs +5 -5
- package/esm2022/tableview/editor/components/formly/fields/formly-field-label/formly-field-label.component.mjs +4 -4
- package/esm2022/tableview/editor/components/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +5 -6
- package/esm2022/tableview/editor/components/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +10 -6
- package/esm2022/tableview/editor/components/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +11 -7
- package/esm2022/tableview/editor/components/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +4 -4
- package/esm2022/tableview/editor/components/formly/fields/formly-field-type.abstract.component.mjs +6 -5
- package/esm2022/tableview/editor/components/formly/pipes/formly-field-label.pipe.mjs +4 -4
- package/esm2022/tableview/editor/components/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.mjs +4 -4
- package/esm2022/tableview/editor/components/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +10 -5
- package/esm2022/tableview/editor/helpers/editor-autosave.mjs +2 -2
- package/esm2022/tableview/editor/services/form-editor.service.mjs +4 -4
- package/esm2022/tableview/index.mjs +1 -2
- package/esm2022/tableview/tableview/components/route/tableview-route.component.mjs +4 -4
- package/esm2022/tableview/tableview/components/tableview/tableview.component.mjs +4 -4
- package/fesm2022/mediusinc-mng-commons-core.mjs +130 -71
- package/fesm2022/mediusinc-mng-commons-core.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-filter.mjs +83 -24
- package/fesm2022/mediusinc-mng-commons-filter.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-form-api.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-form.mjs +15 -15
- package/fesm2022/mediusinc-mng-commons-form.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-model.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-table-api.mjs +32 -8
- package/fesm2022/mediusinc-mng-commons-table-api.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-table.mjs +700 -603
- package/fesm2022/mediusinc-mng-commons-table.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-tableview-api.mjs +165 -26
- package/fesm2022/mediusinc-mng-commons-tableview-api.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-tableview.mjs +265 -317
- package/fesm2022/mediusinc-mng-commons-tableview.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons.mjs.map +1 -1
- package/filter/descriptors/filter-lookup.descriptor.d.ts +17 -20
- package/filter/descriptors/filter.descriptor.d.ts +32 -2
- package/form/components/date-range/date-range.component.d.ts +3 -3
- package/form/components/number-range/number-range.component.d.ts +2 -2
- package/package.json +4 -4
- package/table/api/descriptors/column.descriptor.d.ts +1 -1
- package/table/api/descriptors/sort.descriptor.d.ts +2 -2
- package/table/api/descriptors/table.descriptor.d.ts +21 -7
- package/table/components/column-filter/column-filter.component.d.ts +8 -14
- package/table/components/filter/filter-active-tag/filter-active-tag.component.d.ts +5 -5
- package/table/components/filter/filter-form/filter-form.component.d.ts +10 -19
- package/table/components/filter/filter-overlay-with-tag/filter-overlay-with-tag.component.d.ts +11 -13
- package/table/components/table/table.component.d.ts +20 -64
- package/table/helpers/filters.d.ts +4 -7
- package/table/helpers/table.d.ts +6 -0
- package/table/index.d.ts +1 -1
- package/table/models/column-preferences.model.d.ts +2 -2
- package/table/models/filter.model.d.ts +14 -2
- package/table/services/table-data.service.d.ts +36 -0
- package/table/services/table-metadata.service.d.ts +31 -0
- package/table/services/table-preferences.service.d.ts +25 -0
- package/tableview/action/components/editor/injector-context/action-editor-injector-context.component.d.ts +4 -7
- package/tableview/action/components/localization/data-language-dropdown.component.d.ts +1 -1
- package/tableview/action/helpers/action-execution.d.ts +7 -0
- package/tableview/action/models/execution/action-instance.model.d.ts +1 -2
- package/tableview/action/services/action-executor.service.d.ts +1 -2
- package/tableview/api/action/descriptors/action-confirmation.descriptor.d.ts +1 -0
- package/tableview/api/action/descriptors/action-editor.descriptor.d.ts +12 -4
- package/tableview/api/action/descriptors/action-link.descriptor.d.ts +1 -0
- package/tableview/api/action/descriptors/action.descriptor.d.ts +5 -3
- package/tableview/api/action/models/execution/action-instance-state.model.d.ts +1 -1
- package/tableview/api/editor/descriptors/field-base.descriptor.d.ts +15 -10
- package/tableview/api/editor/descriptors/field-group.descriptor.d.ts +1 -1
- package/tableview/api/tableview/descriptors/tableview.descriptor.d.ts +6 -4
- package/tableview/editor/components/editor/form-editor.component.d.ts +3 -2
- package/tableview/editor/components/formly/constants.d.ts +1 -0
- package/tableview/editor/components/formly/fields/formly-field-fieldset/formly-field-fieldset.component.d.ts +1 -1
- package/tableview/editor/components/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.d.ts +1 -0
- package/tableview/editor/components/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.d.ts +1 -0
- package/tableview/editor/components/formly/fields/formly-field-type.abstract.component.d.ts +2 -1
- package/tableview/editor/components/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.d.ts +1 -0
- package/tableview/index.d.ts +0 -1
- package/version-info.json +5 -5
- package/esm2022/table/services/data-list.service.mjs +0 -29
- package/esm2022/tableview/action/models/execution/action-instance-state.model.mjs +0 -32
- package/table/services/data-list.service.d.ts +0 -19
- package/tableview/action/models/execution/action-instance-state.model.d.ts +0 -30
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { Injectable, Injector, computed, inject, signal } from '@angular/core';
|
|
2
|
+
import { CommonsService, toObservable as commonsToObservable, effectWithDeps } from '@mediusinc/mng-commons/core';
|
|
3
|
+
import { TableDynamicDescriptorInst, TablePaginationModeEnum } from '@mediusinc/mng-commons/table/api';
|
|
4
|
+
import { tableCreateFilterMeta, tableCreateSortMeta } from '../helpers/table';
|
|
5
|
+
import { TableMetadataService } from './table-metadata.service';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export class TableDataService {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.#injector = inject(Injector);
|
|
10
|
+
this.#commons = inject(CommonsService);
|
|
11
|
+
this.#metadata = inject(TableMetadataService);
|
|
12
|
+
// signal sources
|
|
13
|
+
this.#dataSources = signal({});
|
|
14
|
+
// data sources
|
|
15
|
+
this.#manualLoading = computed(() => this.#dataSources()?.manualLoading?.());
|
|
16
|
+
// results that are set directly via input and are not result of a asynchronous operation (aka data provider)
|
|
17
|
+
this.#synchronousResult = computed(() => {
|
|
18
|
+
const dataSources = this.#dataSources();
|
|
19
|
+
if (dataSources?.dataProvider?.() !== undefined) {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
if (dataSources?.dataListResult?.() !== undefined) {
|
|
23
|
+
return dataSources?.dataListResult();
|
|
24
|
+
}
|
|
25
|
+
if (dataSources?.arrayItems?.() !== undefined) {
|
|
26
|
+
return { data: dataSources.arrayItems(), totalCount: dataSources.arrayItems()?.length ?? 0 };
|
|
27
|
+
}
|
|
28
|
+
return undefined;
|
|
29
|
+
});
|
|
30
|
+
this.#dataProvider = computed(() => this.#dataSources()?.dataProvider?.());
|
|
31
|
+
this.#dataProviderService = computed(() => {
|
|
32
|
+
const dataProvider = this.#dataProvider();
|
|
33
|
+
return dataProvider?.serviceType ? this.#injector.get(dataProvider.serviceType) : null;
|
|
34
|
+
});
|
|
35
|
+
this.#synchronousResultEffect = effectWithDeps([this.#synchronousResult], ([res]) => {
|
|
36
|
+
if (res != null) {
|
|
37
|
+
this.#setData(res.data ?? [], res.totalCount);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
this.#synchronousLoadingEffect = effectWithDeps([this.#synchronousResult, this.#manualLoading], ([res, manualLoading]) => {
|
|
41
|
+
if (res != null && manualLoading == null) {
|
|
42
|
+
this.#loading.set(false);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
this.#manualLoadingEffect = effectWithDeps([this.#manualLoading], ([manualLoading]) => {
|
|
46
|
+
if (manualLoading != null) {
|
|
47
|
+
this.#loading.set(manualLoading);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
// pagination
|
|
51
|
+
this.#params = signal(undefined);
|
|
52
|
+
this.params = this.#params.asReadonly();
|
|
53
|
+
this.#sortMeta = signal(undefined);
|
|
54
|
+
this.sortMeta = this.#sortMeta.asReadonly();
|
|
55
|
+
this.#filterMeta = signal({});
|
|
56
|
+
this.filterMeta = this.#filterMeta.asReadonly();
|
|
57
|
+
this.#isSortAndFilterMetaInitialized = signal(false);
|
|
58
|
+
this.#defaultParamsEffect = effectWithDeps([this.#metadata.defaultParams], ([defaultParams]) => {
|
|
59
|
+
this.#sortMeta.set(tableCreateSortMeta(defaultParams));
|
|
60
|
+
this.#filterMeta.set(tableCreateFilterMeta(defaultParams));
|
|
61
|
+
this.#isSortAndFilterMetaInitialized.set(true);
|
|
62
|
+
}, { firstOnly: true });
|
|
63
|
+
this.#isSearchMetaInitialized = signal(false);
|
|
64
|
+
this.#searchMeta = signal(undefined);
|
|
65
|
+
this.searchMeta = this.#searchMeta.asReadonly();
|
|
66
|
+
this.isAllPaginationMetaInitialized = computed(() => this.#isSortAndFilterMetaInitialized() && this.#isSortAndFilterMetaInitialized());
|
|
67
|
+
this.paginationMode = computed(() => {
|
|
68
|
+
const descriptor = this.#metadata.descriptor();
|
|
69
|
+
if (descriptor.paginationMode != null) {
|
|
70
|
+
// descriptor choice is the strongest - if defined, use this value
|
|
71
|
+
return descriptor.paginationMode;
|
|
72
|
+
}
|
|
73
|
+
else if (this.#dataProvider() != null) {
|
|
74
|
+
// when data provider is used, use pagination
|
|
75
|
+
return TablePaginationModeEnum.Pagination;
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
return TablePaginationModeEnum.None;
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
this.offset = computed(() => this.params()?.offset ?? 0);
|
|
82
|
+
this.rows = computed(() => {
|
|
83
|
+
if (this.params()?.limit) {
|
|
84
|
+
return this.params()?.limit;
|
|
85
|
+
}
|
|
86
|
+
const descriptor = this.#metadata.descriptor();
|
|
87
|
+
const rowsPerPageOptions = this.#metadata.rowsPerPageOptions();
|
|
88
|
+
if (descriptor.defaultNumRows && rowsPerPageOptions.includes(descriptor.defaultNumRows)) {
|
|
89
|
+
return descriptor.defaultNumRows;
|
|
90
|
+
}
|
|
91
|
+
return rowsPerPageOptions[0];
|
|
92
|
+
});
|
|
93
|
+
// data
|
|
94
|
+
this.#data = signal([]);
|
|
95
|
+
this.data = this.#data.asReadonly();
|
|
96
|
+
this.#count = signal(0);
|
|
97
|
+
this.count = this.#count.asReadonly();
|
|
98
|
+
this.#loading = signal(true);
|
|
99
|
+
this.loading = this.#loading.asReadonly();
|
|
100
|
+
}
|
|
101
|
+
#injector;
|
|
102
|
+
#commons;
|
|
103
|
+
#metadata;
|
|
104
|
+
// signal sources
|
|
105
|
+
#dataSources;
|
|
106
|
+
// data sources
|
|
107
|
+
#manualLoading;
|
|
108
|
+
// results that are set directly via input and are not result of a asynchronous operation (aka data provider)
|
|
109
|
+
#synchronousResult;
|
|
110
|
+
#dataProvider;
|
|
111
|
+
#dataProviderService;
|
|
112
|
+
#synchronousResultEffect;
|
|
113
|
+
#synchronousLoadingEffect;
|
|
114
|
+
#manualLoadingEffect;
|
|
115
|
+
#dataProviderSubscription;
|
|
116
|
+
// pagination
|
|
117
|
+
#params;
|
|
118
|
+
#sortMeta;
|
|
119
|
+
#filterMeta;
|
|
120
|
+
#isSortAndFilterMetaInitialized;
|
|
121
|
+
#defaultParamsEffect;
|
|
122
|
+
#isSearchMetaInitialized;
|
|
123
|
+
#searchMeta;
|
|
124
|
+
// data
|
|
125
|
+
#data;
|
|
126
|
+
#count;
|
|
127
|
+
#loading;
|
|
128
|
+
setDataSources(arrayItems, dataListResult, dataProvider, manualLoading) {
|
|
129
|
+
this.#dataSources.set({ arrayItems, dataListResult, dataProvider, manualLoading });
|
|
130
|
+
}
|
|
131
|
+
fetchWithDataProvider(params, onErrorFn) {
|
|
132
|
+
const dataProvider = this.#dataProvider();
|
|
133
|
+
if (!dataProvider || params.limit === 0) {
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
this.#dataProviderSubscription?.unsubscribe();
|
|
137
|
+
this.#loading.set(true);
|
|
138
|
+
this.#dataProviderSubscription = commonsToObservable(dataProvider.getAll(params, this.#dataProviderService(), this.#metadata.descriptor().isLocalized ? (this.#commons.appDataLocale() ?? undefined) : undefined)).subscribe({
|
|
139
|
+
next: res => {
|
|
140
|
+
const descriptorInput = this.#metadata.descriptorFromSource();
|
|
141
|
+
if (descriptorInput instanceof TableDynamicDescriptorInst) {
|
|
142
|
+
this.#metadata.setDescriptor(descriptorInput.toTableDescriptorFromData(res));
|
|
143
|
+
}
|
|
144
|
+
this.#setData(res?.data ?? [], res?.totalCount);
|
|
145
|
+
this.#loading.set(false);
|
|
146
|
+
},
|
|
147
|
+
error: err => {
|
|
148
|
+
onErrorFn(err);
|
|
149
|
+
this.#setData([]);
|
|
150
|
+
this.#loading.set(false);
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
setParams(params, fromQueryParams = false) {
|
|
156
|
+
if (!fromQueryParams && this.compareWithCurrentParams(params)) {
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
this.#params.set(params);
|
|
160
|
+
this.#sortMeta.set(tableCreateSortMeta(params));
|
|
161
|
+
this.#filterMeta.set(tableCreateFilterMeta(params));
|
|
162
|
+
this.#isSortAndFilterMetaInitialized.set(true);
|
|
163
|
+
if (fromQueryParams && !this.#isSearchMetaInitialized() && params?.search) {
|
|
164
|
+
this.#searchMeta.set({ value: params.search, caseSensitive: params.filters?.['global']?.caseSensitive ?? false });
|
|
165
|
+
}
|
|
166
|
+
this.#isSearchMetaInitialized.set(true);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Compare the given params with the stored params in the DataListService.
|
|
170
|
+
*
|
|
171
|
+
* @param {DataListParams} params - The params to compare with the stored params.
|
|
172
|
+
*
|
|
173
|
+
* @return {boolean} - True if the given params match the stored params, otherwise false.
|
|
174
|
+
*/
|
|
175
|
+
compareWithCurrentParams(params) {
|
|
176
|
+
return (params.offset === this.offset() &&
|
|
177
|
+
params.limit === this.rows() &&
|
|
178
|
+
JSON.stringify(tableCreateSortMeta(params)) === JSON.stringify(this.#sortMeta()) &&
|
|
179
|
+
JSON.stringify(tableCreateFilterMeta(params)) === JSON.stringify(this.#filterMeta()));
|
|
180
|
+
}
|
|
181
|
+
#setData(data, count) {
|
|
182
|
+
this.#data.set([...data]);
|
|
183
|
+
this.#count.set(count ?? data.length);
|
|
184
|
+
}
|
|
185
|
+
ngOnDestroy() {
|
|
186
|
+
this.#dataProviderSubscription?.unsubscribe();
|
|
187
|
+
}
|
|
188
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: TableDataService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
189
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: TableDataService }); }
|
|
190
|
+
}
|
|
191
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: TableDataService, decorators: [{
|
|
192
|
+
type: Injectable
|
|
193
|
+
}] });
|
|
194
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtZGF0YS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGFibGUvc3JjL3NlcnZpY2VzL3RhYmxlLWRhdGEuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFFLFFBQVEsRUFBcUIsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFLaEcsT0FBTyxFQUF3QixjQUFjLEVBQWtDLFlBQVksSUFBSSxtQkFBbUIsRUFBRSxjQUFjLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUN2SyxPQUFPLEVBQXFCLDBCQUEwQixFQUFFLHVCQUF1QixFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFFekgsT0FBTyxFQUFDLHFCQUFxQixFQUFFLG1CQUFtQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDNUUsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7O0FBVTlELE1BQU0sT0FBTyxnQkFBZ0I7SUFEN0I7UUFFYSxjQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdCLGFBQVEsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDbEMsY0FBUyxHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBRWxELGlCQUFpQjtRQUNSLGlCQUFZLEdBQUcsTUFBTSxDQUFvQixFQUFFLENBQUMsQ0FBQztRQUV0RCxlQUFlO1FBQ04sbUJBQWMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqRiw2R0FBNkc7UUFDcEcsdUJBQWtCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUN4QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDeEMsSUFBSSxXQUFXLEVBQUUsWUFB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LENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLENBQUMseUJBQXlCLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDbEQsQ0FBQzsrR0F2TFEsZ0JBQWdCO21IQUFoQixnQkFBZ0I7OzRGQUFoQixnQkFBZ0I7a0JBRDVCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGUsIEluamVjdG9yLCBPbkRlc3Ryb3ksIFNpZ25hbCwgY29tcHV0ZWQsIGluamVjdCwgc2lnbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtTb3J0TWV0YX0gZnJvbSAncHJpbWVuZy9hcGknO1xuaW1wb3J0IHtTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge0NvbW1vbnNGaWx0ZXJNZXRhZGF0YSwgQ29tbW9uc1NlcnZpY2UsIERhdGFMaXN0UGFyYW1zLCBEYXRhTGlzdFJlc3VsdCwgdG9PYnNlcnZhYmxlIGFzIGNvbW1vbnNUb09ic2VydmFibGUsIGVmZmVjdFdpdGhEZXBzfSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL2NvcmUnO1xuaW1wb3J0IHtJVGFibGVEYXRhUHJvdmlkZXIsIFRhYmxlRHluYW1pY0Rlc2NyaXB0b3JJbnN0LCBUYWJsZVBhZ2luYXRpb25Nb2RlRW51bX0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy90YWJsZS9hcGknO1xuXG5pbXBvcnQge3RhYmxlQ3JlYXRlRmlsdGVyTWV0YSwgdGFibGVDcmVhdGVTb3J0TWV0YX0gZnJvbSAnLi4vaGVscGVycy90YWJsZSc7XG5pbXBvcnQge1RhYmxlTWV0YWRhdGFTZXJ2aWNlfSBmcm9tICcuL3RhYmxlLW1ldGFkYXRhLnNlcnZpY2UnO1xuXG5pbnRlcmZhY2UgRGF0YVNvdXJjZXM8SXRlbSA9IGFueT4ge1xuICAgIGFycmF5SXRlbXM/OiBTaWduYWw8SXRlbVtdIHwgdW5kZWZpbmVkPjtcbiAgICBkYXRhTGlzdFJlc3VsdD86IFNpZ25hbDxEYXRhTGlzdFJlc3VsdDxJdGVtPiB8IHVuZGVmaW5lZD47XG4gICAgZGF0YVByb3ZpZGVyPzogU2lnbmFsPElUYWJsZURhdGFQcm92aWRlcjxJdGVtPiB8IHVuZGVmaW5lZD47XG4gICAgbWFudWFsTG9hZGluZz86IFNpZ25hbDxib29sZWFuIHwgdW5kZWZpbmVkPjtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFRhYmxlRGF0YVNlcnZpY2U8SXRlbT4gaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAgIHJlYWRvbmx5ICNpbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG4gICAgcmVhZG9ubHkgI2NvbW1vbnMgPSBpbmplY3QoQ29tbW9uc1NlcnZpY2UpO1xuICAgIHJlYWRvbmx5ICNtZXRhZGF0YSA9IGluamVjdChUYWJsZU1ldGFkYXRhU2VydmljZSk7XG5cbiAgICAvLyBzaWduYWwgc291cmNlc1xuICAgIHJlYWRvbmx5ICNkYXRhU291cmNlcyA9IHNpZ25hbDxEYXRhU291cmNlczxJdGVtPj4oe30pO1xuXG4gICAgLy8gZGF0YSBzb3VyY2VzXG4gICAgcmVhZG9ubHkgI21hbnVhbExvYWRpbmcgPSBjb21wdXRlZCgoKSA9PiB0aGlzLiNkYXRhU291cmNlcygpPy5tYW51YWxMb2FkaW5nPy4oKSk7XG4gICAgLy8gcmVzdWx0cyB0aGF0IGFyZSBzZXQgZGlyZWN0bHkgdmlhIGlucHV0IGFuZCBhcmUgbm90IHJlc3VsdCBvZiBhIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gKGFrYSBkYXRhIHByb3ZpZGVyKVxuICAgIHJlYWRvbmx5ICNzeW5jaHJvbm91c1Jlc3VsdCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgZGF0YVNvdXJjZXMgPSB0aGlzLiNkYXRhU291cmNlcygpO1xuICAgICAgICBpZiAoZGF0YVNvdXJjZXM/LmRhdGFQcm92aWRlcj8uKCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YVNvdXJjZXM/LmRhdGFMaXN0UmVzdWx0Py4oKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YVNvdXJjZXM/LmRhdGFMaXN0UmVzdWx0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGFTb3VyY2VzPy5hcnJheUl0ZW1zPy4oKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gPERhdGFMaXN0UmVzdWx0PntkYXRhOiBkYXRhU291cmNlcy5hcnJheUl0ZW1zKCksIHRvdGFsQ291bnQ6IGRhdGFTb3VyY2VzLmFycmF5SXRlbXMoKT8ubGVuZ3RoID8/IDB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgcmVhZG9ubHkgI2RhdGFQcm92aWRlciA9IGNvbXB1dGVkKCgpID0+IHRoaXMuI2RhdGFTb3VyY2VzKCk/LmRhdGFQcm92aWRlcj8uKCkpO1xuICAgIHJlYWRvbmx5ICNkYXRhUHJvdmlkZXJTZXJ2aWNlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhUHJvdmlkZXIgPSB0aGlzLiNkYXRhUHJvdmlkZXIoKTtcbiAgICAgICAgcmV0dXJuIGRhdGFQcm92aWRlcj8uc2VydmljZVR5cGUgPyB0aGlzLiNpbmplY3Rvci5nZXQ8YW55PihkYXRhUHJvdmlkZXIuc2VydmljZVR5cGUpIDogbnVsbDtcbiAgICB9KTtcbiAgICByZWFkb25seSAjc3luY2hyb25vdXNSZXN1bHRFZmZlY3QgPSBlZmZlY3RXaXRoRGVwcyhbdGhpcy4jc3luY2hyb25vdXNSZXN1bHRdLCAoW3Jlc10pID0+IHtcbiAgICAgICAgaWYgKHJlcyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLiNzZXREYXRhKHJlcy5kYXRhID8/IFtdLCByZXMudG90YWxDb3VudCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZWFkb25seSAjc3luY2hyb25vdXNMb2FkaW5nRWZmZWN0ID0gZWZmZWN0V2l0aERlcHMoW3RoaXMuI3N5bmNocm9ub3VzUmVzdWx0LCB0aGlzLiNtYW51YWxMb2FkaW5nXSwgKFtyZXMsIG1hbnVhbExvYWRpbmddKSA9PiB7XG4gICAgICAgIGlmIChyZXMgIT0gbnVsbCAmJiBtYW51YWxMb2FkaW5nID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuI2xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJlYWRvbmx5ICNtYW51YWxMb2FkaW5nRWZmZWN0ID0gZWZmZWN0V2l0aERlcHMoW3RoaXMuI21hbnVhbExvYWRpbmddLCAoW21hbnVhbExvYWRpbmddKSA9PiB7XG4gICAgICAgIGlmIChtYW51YWxMb2FkaW5nICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuI2xvYWRpbmcuc2V0KG1hbnVhbExvYWRpbmcpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgI2RhdGFQcm92aWRlclN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcblxuICAgIC8vIHBhZ2luYXRpb25cbiAgICByZWFkb25seSAjcGFyYW1zID0gc2lnbmFsPERhdGFMaXN0UGFyYW1zIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICAgIHJlYWRvbmx5IHBhcmFtcyA9IHRoaXMuI3BhcmFtcy5hc1JlYWRvbmx5KCk7XG4gICAgcmVhZG9ubHkgI3NvcnRNZXRhID0gc2lnbmFsPFNvcnRNZXRhW10gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gICAgcmVhZG9ubHkgc29ydE1ldGEgPSB0aGlzLiNzb3J0TWV0YS5hc1JlYWRvbmx5KCk7XG4gICAgcmVhZG9ubHkgI2ZpbHRlck1ldGEgPSBzaWduYWw8UmVjb3JkPHN0cmluZywgQ29tbW9uc0ZpbHRlck1ldGFkYXRhPj4oe30pO1xuICAgIHJlYWRvbmx5IGZpbHRlck1ldGEgPSB0aGlzLiNmaWx0ZXJNZXRhLmFzUmVhZG9ubHkoKTtcbiAgICByZWFkb25seSAjaXNTb3J0QW5kRmlsdGVyTWV0YUluaXRpYWxpemVkID0gc2lnbmFsKGZhbHNlKTtcbiAgICByZWFkb25seSAjZGVmYXVsdFBhcmFtc0VmZmVjdCA9IGVmZmVjdFdpdGhEZXBzKFxuICAgICAgICBbdGhpcy4jbWV0YWRhdGEuZGVmYXVsdFBhcmFtc10sXG4gICAgICAgIChbZGVmYXVsdFBhcmFtc10pID0+IHtcbiAgICAgICAgICAgIHRoaXMuI3NvcnRNZXRhLnNldCh0YWJsZUNyZWF0ZVNvcnRNZXRhKGRlZmF1bHRQYXJhbXMpKTtcbiAgICAgICAgICAgIHRoaXMuI2ZpbHRlck1ldGEuc2V0KHRhYmxlQ3JlYXRlRmlsdGVyTWV0YShkZWZhdWx0UGFyYW1zKSk7XG4gICAgICAgICAgICB0aGlzLiNpc1NvcnRBbmRGaWx0ZXJNZXRhSW5pdGlhbGl6ZWQuc2V0KHRydWUpO1xuICAgICAgICB9LFxuICAgICAgICB7Zmlyc3RPbmx5OiB0cnVlfVxuICAgICk7XG4gICAgcmVhZG9ubHkgI2lzU2VhcmNoTWV0YUluaXRpYWxpemVkID0gc2lnbmFsKGZhbHNlKTtcbiAgICByZWFkb25seSAjc2VhcmNoTWV0YSA9IHNpZ25hbDx7dmFsdWU6IHN0cmluZzsgY2FzZVNlbnNpdGl2ZTogYm9vbGVhbn0gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gICAgcmVhZG9ubHkgc2VhcmNoTWV0YSA9IHRoaXMuI3NlYXJjaE1ldGEuYXNSZWFkb25seSgpO1xuICAgIHJlYWRvbmx5IGlzQWxsUGFnaW5hdGlvbk1ldGFJbml0aWFsaXplZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuI2lzU29ydEFuZEZpbHRlck1ldGFJbml0aWFsaXplZCgpICYmIHRoaXMuI2lzU29ydEFuZEZpbHRlck1ldGFJbml0aWFsaXplZCgpKTtcbiAgICByZWFkb25seSBwYWdpbmF0aW9uTW9kZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IHRoaXMuI21ldGFkYXRhLmRlc2NyaXB0b3IoKTtcbiAgICAgICAgaWYgKGRlc2NyaXB0b3IucGFnaW5hdGlvbk1vZGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gZGVzY3JpcHRvciBjaG9pY2UgaXMgdGhlIHN0cm9uZ2VzdCAtIGlmIGRlZmluZWQsIHVzZSB0aGlzIHZhbHVlXG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvci5wYWdpbmF0aW9uTW9kZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLiNkYXRhUHJvdmlkZXIoKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyB3aGVuIGRhdGEgcHJvdmlkZXIgaXMgdXNlZCwgdXNlIHBhZ2luYXRpb25cbiAgICAgICAgICAgIHJldHVybiBUYWJsZVBhZ2luYXRpb25Nb2RlRW51bS5QYWdpbmF0aW9uO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFRhYmxlUGFnaW5hdGlvbk1vZGVFbnVtLk5vbmU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZWFkb25seSBvZmZzZXQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnBhcmFtcygpPy5vZmZzZXQgPz8gMCk7XG4gICAgcmVhZG9ubHkgcm93cyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMucGFyYW1zKCk/LmxpbWl0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJhbXMoKT8ubGltaXQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gdGhpcy4jbWV0YWRhdGEuZGVzY3JpcHRvcigpO1xuICAgICAgICBjb25zdCByb3dzUGVyUGFnZU9wdGlvbnMgPSB0aGlzLiNtZXRhZGF0YS5yb3dzUGVyUGFnZU9wdGlvbnMoKTtcbiAgICAgICAgaWYgKGRlc2NyaXB0b3IuZGVmYXVsdE51bVJvd3MgJiYgcm93c1BlclBhZ2VPcHRpb25zLmluY2x1ZGVzKGRlc2NyaXB0b3IuZGVmYXVsdE51bVJvd3MpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvci5kZWZhdWx0TnVtUm93cztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByb3dzUGVyUGFnZU9wdGlvbnNbMF07XG4gICAgfSk7XG5cbiAgICAvLyBkYXRhXG4gICAgcmVhZG9ubHkgI2RhdGEgPSBzaWduYWw8SXRlbVtdPihbXSk7XG4gICAgcmVhZG9ubHkgZGF0YSA9IHRoaXMuI2RhdGEuYXNSZWFkb25seSgpO1xuICAgIHJlYWRvbmx5ICNjb3VudCA9IHNpZ25hbCgwKTtcbiAgICByZWFkb25seSBjb3VudCA9IHRoaXMuI2NvdW50LmFzUmVhZG9ubHkoKTtcbiAgICByZWFkb25seSAjbG9hZGluZyA9IHNpZ25hbCh0cnVlKTtcbiAgICByZWFkb25seSBsb2FkaW5nID0gdGhpcy4jbG9hZGluZy5hc1JlYWRvbmx5KCk7XG5cbiAgICBzZXREYXRhU291cmNlcyhcbiAgICAgICAgYXJyYXlJdGVtczogU2lnbmFsPEl0ZW1bXSB8IHVuZGVmaW5lZD4sXG4gICAgICAgIGRhdGFMaXN0UmVzdWx0OiBTaWduYWw8RGF0YUxpc3RSZXN1bHQ8SXRlbT4gfCB1bmRlZmluZWQ+LFxuICAgICAgICBkYXRhUHJvdmlkZXI6IFNpZ25hbDxJVGFibGVEYXRhUHJvdmlkZXI8SXRlbSwgYW55LCBhbnksIGFueT4gfCB1bmRlZmluZWQ+LFxuICAgICAgICBtYW51YWxMb2FkaW5nOiBTaWduYWw8Ym9vbGVhbiB8IHVuZGVmaW5lZD5cbiAgICApIHtcbiAgICAgICAgdGhpcy4jZGF0YVNvdXJjZXMuc2V0KHthcnJheUl0ZW1zLCBkYXRhTGlzdFJlc3VsdCwgZGF0YVByb3ZpZGVyLCBtYW51YWxMb2FkaW5nfSk7XG4gICAgfVxuXG4gICAgZmV0Y2hXaXRoRGF0YVByb3ZpZGVyKHBhcmFtczogRGF0YUxpc3RQYXJhbXMsIG9uRXJyb3JGbjogKGVycm9yOiBFcnJvcikgPT4gdm9pZCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBkYXRhUHJvdmlkZXIgPSB0aGlzLiNkYXRhUHJvdmlkZXIoKTtcbiAgICAgICAgaWYgKCFkYXRhUHJvdmlkZXIgfHwgcGFyYW1zLmxpbWl0ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLiNkYXRhUHJvdmlkZXJTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuI2xvYWRpbmcuc2V0KHRydWUpO1xuXG4gICAgICAgIHRoaXMuI2RhdGFQcm92aWRlclN1YnNjcmlwdGlvbiA9IGNvbW1vbnNUb09ic2VydmFibGUoXG4gICAgICAgICAgICBkYXRhUHJvdmlkZXIuZ2V0QWxsKFxuICAgICAgICAgICAgICAgIHBhcmFtcyBhcyBEYXRhTGlzdFBhcmFtczxhbnksIGFueT4sXG4gICAgICAgICAgICAgICAgdGhpcy4jZGF0YVByb3ZpZGVyU2VydmljZSgpLFxuICAgICAgICAgICAgICAgIHRoaXMuI21ldGFkYXRhLmRlc2NyaXB0b3IoKS5pc0xvY2FsaXplZCA/ICh0aGlzLiNjb21tb25zLmFwcERhdGFMb2NhbGUoKSA/PyB1bmRlZmluZWQpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICApXG4gICAgICAgICkuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIG5leHQ6IHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRvcklucHV0ID0gdGhpcy4jbWV0YWRhdGEuZGVzY3JpcHRvckZyb21Tb3VyY2UoKTtcbiAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvcklucHV0IGluc3RhbmNlb2YgVGFibGVEeW5hbWljRGVzY3JpcHRvckluc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jbWV0YWRhdGEuc2V0RGVzY3JpcHRvcihkZXNjcmlwdG9ySW5wdXQudG9UYWJsZURlc2NyaXB0b3JGcm9tRGF0YShyZXMpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy4jc2V0RGF0YShyZXM/LmRhdGEgPz8gW10sIHJlcz8udG90YWxDb3VudCk7XG4gICAgICAgICAgICAgICAgdGhpcy4jbG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiBlcnIgPT4ge1xuICAgICAgICAgICAgICAgIG9uRXJyb3JGbihlcnIpO1xuICAgICAgICAgICAgICAgIHRoaXMuI3NldERhdGEoW10pO1xuICAgICAgICAgICAgICAgIHRoaXMuI2xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgc2V0UGFyYW1zKHBhcmFtczogRGF0YUxpc3RQYXJhbXMsIGZyb21RdWVyeVBhcmFtcyA9IGZhbHNlKSB7XG4gICAgICAgIGlmICghZnJvbVF1ZXJ5UGFyYW1zICYmIHRoaXMuY29tcGFyZVdpdGhDdXJyZW50UGFyYW1zKHBhcmFtcykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuI3BhcmFtcy5zZXQocGFyYW1zKTtcbiAgICAgICAgdGhpcy4jc29ydE1ldGEuc2V0KHRhYmxlQ3JlYXRlU29ydE1ldGEocGFyYW1zKSk7XG4gICAgICAgIHRoaXMuI2ZpbHRlck1ldGEuc2V0KHRhYmxlQ3JlYXRlRmlsdGVyTWV0YShwYXJhbXMpKTtcbiAgICAgICAgdGhpcy4jaXNTb3J0QW5kRmlsdGVyTWV0YUluaXRpYWxpemVkLnNldCh0cnVlKTtcbiAgICAgICAgaWYgKGZyb21RdWVyeVBhcmFtcyAmJiAhdGhpcy4jaXNTZWFyY2hNZXRhSW5pdGlhbGl6ZWQoKSAmJiBwYXJhbXM/LnNlYXJjaCkge1xuICAgICAgICAgICAgdGhpcy4jc2VhcmNoTWV0YS5zZXQoe3ZhbHVlOiBwYXJhbXMuc2VhcmNoLCBjYXNlU2Vuc2l0aXZlOiBwYXJhbXMuZmlsdGVycz8uWydnbG9iYWwnXT8uY2FzZVNlbnNpdGl2ZSA/PyBmYWxzZX0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2lzU2VhcmNoTWV0YUluaXRpYWxpemVkLnNldCh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wYXJlIHRoZSBnaXZlbiBwYXJhbXMgd2l0aCB0aGUgc3RvcmVkIHBhcmFtcyBpbiB0aGUgRGF0YUxpc3RTZXJ2aWNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtEYXRhTGlzdFBhcmFtc30gcGFyYW1zIC0gVGhlIHBhcmFtcyB0byBjb21wYXJlIHdpdGggdGhlIHN0b3JlZCBwYXJhbXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSAtIFRydWUgaWYgdGhlIGdpdmVuIHBhcmFtcyBtYXRjaCB0aGUgc3RvcmVkIHBhcmFtcywgb3RoZXJ3aXNlIGZhbHNlLlxuICAgICAqL1xuICAgIHByaXZhdGUgY29tcGFyZVdpdGhDdXJyZW50UGFyYW1zKHBhcmFtczogRGF0YUxpc3RQYXJhbXMpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHBhcmFtcy5vZmZzZXQgPT09IHRoaXMub2Zmc2V0KCkgJiZcbiAgICAgICAgICAgIHBhcmFtcy5saW1pdCA9PT0gdGhpcy5yb3dzKCkgJiZcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRhYmxlQ3JlYXRlU29ydE1ldGEocGFyYW1zKSkgPT09IEpTT04uc3RyaW5naWZ5KHRoaXMuI3NvcnRNZXRhKCkpICYmXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0YWJsZUNyZWF0ZUZpbHRlck1ldGEocGFyYW1zKSkgPT09IEpTT04uc3RyaW5naWZ5KHRoaXMuI2ZpbHRlck1ldGEoKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAjc2V0RGF0YShkYXRhOiBJdGVtW10sIGNvdW50PzogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuI2RhdGEuc2V0KFsuLi5kYXRhXSk7XG4gICAgICAgIHRoaXMuI2NvdW50LnNldChjb3VudCA/PyBkYXRhLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuI2RhdGFQcm92aWRlclN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { Injectable, Injector, computed, inject, signal } from '@angular/core';
|
|
2
|
+
import { takeUntilDestroyed, toObservable, toSignal } from '@angular/core/rxjs-interop';
|
|
3
|
+
import { PrimeNGConfig } from 'primeng/api';
|
|
4
|
+
import { combineLatest, of, switchMap } from 'rxjs';
|
|
5
|
+
import { COMMONS_MODULE_CONFIG_IT, toObservable as commonsToObservable, effectWithDeps } from '@mediusinc/mng-commons/core';
|
|
6
|
+
import { FilterDisplayTypeEnum } from '@mediusinc/mng-commons/filter';
|
|
7
|
+
import { TableDynamicDescriptorInst, tableDescriptor } from '@mediusinc/mng-commons/table/api';
|
|
8
|
+
import { createFilterDescriptorsFromGeneric, filterApplySerializationConfigToCmp, filterGenerateMatchModeOptions, filterGetDateConfig, filterGetDefaultMatchMode, filterGetNumberConfig } from '../helpers/filters';
|
|
9
|
+
import { COMMONS_TABLE_FEATURE_CONFIG_IT } from './table-feature-config.token';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
export class TableMetadataService {
|
|
12
|
+
static { this.cmpTypeName = 'TableComponent'; }
|
|
13
|
+
#injector;
|
|
14
|
+
#translationObserver;
|
|
15
|
+
// signal sources
|
|
16
|
+
#signalSources;
|
|
17
|
+
#descriptor;
|
|
18
|
+
#updateDescriptorFromSourceEffect;
|
|
19
|
+
#genericFilters;
|
|
20
|
+
// search
|
|
21
|
+
#searchFieldsFromSignalSource;
|
|
22
|
+
#searchFields;
|
|
23
|
+
#searchFieldsEffect;
|
|
24
|
+
constructor() {
|
|
25
|
+
this.#injector = inject(Injector);
|
|
26
|
+
this.primeConfig = inject(PrimeNGConfig);
|
|
27
|
+
this.moduleConfig = inject(COMMONS_MODULE_CONFIG_IT, { optional: true });
|
|
28
|
+
this.tableModuleConfig = inject(COMMONS_TABLE_FEATURE_CONFIG_IT, { optional: true });
|
|
29
|
+
this.serializationCfg = {};
|
|
30
|
+
this.#translationObserver = toSignal(this.primeConfig.translationObserver);
|
|
31
|
+
this.defaultFilterDisplayType = this.tableModuleConfig?.filterDisplayType ?? FilterDisplayTypeEnum.Column;
|
|
32
|
+
// signal sources
|
|
33
|
+
this.#signalSources = signal({});
|
|
34
|
+
// descriptors
|
|
35
|
+
this.descriptorFromSource = computed(() => this.#signalSources().descriptor?.());
|
|
36
|
+
this.#descriptor = signal(tableDescriptor());
|
|
37
|
+
this.descriptor = this.#descriptor.asReadonly();
|
|
38
|
+
this.#updateDescriptorFromSourceEffect = effectWithDeps([this.descriptorFromSource], ([d]) => {
|
|
39
|
+
if (d != null) {
|
|
40
|
+
this.#descriptor.set(d);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
// pagination
|
|
44
|
+
this.rowsPerPageOptions = computed(() => {
|
|
45
|
+
const descriptor = this.descriptor();
|
|
46
|
+
if (Array.isArray(descriptor.rowsPerPageOptions) && descriptor.rowsPerPageOptions.length > 0) {
|
|
47
|
+
return descriptor.rowsPerPageOptions;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
return [25, 50, 100];
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
// filters
|
|
54
|
+
this.filterDescriptors = computed(() => this.descriptor().filters);
|
|
55
|
+
this.filters = computed(() => {
|
|
56
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
57
|
+
const observer = this.#translationObserver(); // need this one to track language changes
|
|
58
|
+
return this.filterDescriptors().map(d => this.mapDescriptorToMetadata(d));
|
|
59
|
+
});
|
|
60
|
+
this.genericFilterDescriptor = computed(() => this.descriptor().genericFilter);
|
|
61
|
+
this.#genericFilters = signal([]);
|
|
62
|
+
this.genericFilters = this.#genericFilters.asReadonly();
|
|
63
|
+
// search
|
|
64
|
+
this.#searchFieldsFromSignalSource = computed(() => this.#signalSources().searchFields?.());
|
|
65
|
+
this.#searchFields = signal([]);
|
|
66
|
+
this.searchFields = this.#searchFields.asReadonly();
|
|
67
|
+
this.#searchFieldsEffect = effectWithDeps([this.descriptor, this.#searchFieldsFromSignalSource], ([descriptor, searchFieldsFromSignalSource]) => {
|
|
68
|
+
this.#searchFields.set(searchFieldsFromSignalSource ?? (descriptor.search && descriptor.searchFields ? descriptor.searchFields : this.descriptor().columns.map(c => c.property)));
|
|
69
|
+
});
|
|
70
|
+
// params
|
|
71
|
+
this.defaultParams = computed(() => {
|
|
72
|
+
const params = {
|
|
73
|
+
offset: 0,
|
|
74
|
+
limit: this.rowsPerPageOptions()[0],
|
|
75
|
+
sort: this.descriptor()
|
|
76
|
+
.sorts.filter(s => s.defaultIsEnabled)
|
|
77
|
+
.sort((s1, s2) => (s1.defaultOrder ?? 1000) - (s2.defaultOrder ?? 1000))
|
|
78
|
+
.map(s => ({
|
|
79
|
+
property: s.property,
|
|
80
|
+
ascending: s.defaultIsAscending
|
|
81
|
+
})),
|
|
82
|
+
filters: {}
|
|
83
|
+
};
|
|
84
|
+
this.filters()
|
|
85
|
+
.filter(f => f.descriptor.hasDefaultValue)
|
|
86
|
+
.forEach(f => {
|
|
87
|
+
params.filters[f.descriptor.property] = {
|
|
88
|
+
value: f.descriptor.defaultValue,
|
|
89
|
+
matchMode: f.defaultMatchMode
|
|
90
|
+
};
|
|
91
|
+
});
|
|
92
|
+
return params;
|
|
93
|
+
});
|
|
94
|
+
filterApplySerializationConfigToCmp(this.moduleConfig, this.serializationCfg);
|
|
95
|
+
combineLatest([toObservable(this.genericFilterDescriptor), toObservable(this.#translationObserver)])
|
|
96
|
+
.pipe(switchMap(([genericFilterDescriptor]) => {
|
|
97
|
+
if (genericFilterDescriptor) {
|
|
98
|
+
const dataProvider = this.genericFilterDescriptor()?.propertyLookup;
|
|
99
|
+
const genericFilterService = dataProvider?.serviceType ? this.#injector.get(dataProvider.serviceType) : null;
|
|
100
|
+
// fetch filterable properties
|
|
101
|
+
return commonsToObservable(genericFilterDescriptor.propertyLookup.lookup({}, genericFilterService));
|
|
102
|
+
}
|
|
103
|
+
return of([]);
|
|
104
|
+
}), takeUntilDestroyed())
|
|
105
|
+
.subscribe({
|
|
106
|
+
next: genericFilters => {
|
|
107
|
+
// set descriptors from generic filter data
|
|
108
|
+
this.#genericFilters.set(createFilterDescriptorsFromGeneric(genericFilters, this.genericFilterDescriptor()?.valueLookup).map(d => this.mapDescriptorToMetadata(d)));
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
setSignalSources(descriptor, searchFields) {
|
|
113
|
+
this.#signalSources.set({ descriptor, searchFields });
|
|
114
|
+
}
|
|
115
|
+
setDescriptor(descriptor) {
|
|
116
|
+
if (this.descriptorFromSource() instanceof TableDynamicDescriptorInst) {
|
|
117
|
+
this.#descriptor.set(descriptor);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
mapDescriptorToMetadata(descriptor) {
|
|
121
|
+
const matchModes = filterGenerateMatchModeOptions(this.primeConfig, descriptor, this.serializationCfg);
|
|
122
|
+
return {
|
|
123
|
+
descriptor: descriptor,
|
|
124
|
+
matchModes: matchModes,
|
|
125
|
+
defaultMatchMode: filterGetDefaultMatchMode(descriptor, matchModes),
|
|
126
|
+
dateConfig: filterGetDateConfig(descriptor, this.serializationCfg),
|
|
127
|
+
numberConfig: filterGetNumberConfig(descriptor)
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: TableMetadataService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
131
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: TableMetadataService }); }
|
|
132
|
+
}
|
|
133
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: TableMetadataService, decorators: [{
|
|
134
|
+
type: Injectable
|
|
135
|
+
}], ctorParameters: () => [] });
|
|
136
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtbWV0YWRhdGEuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RhYmxlL3NyYy9zZXJ2aWNlcy90YWJsZS1tZXRhZGF0YS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUUsUUFBUSxFQUFVLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3JGLE9BQU8sRUFBQyxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFFdEYsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMxQyxPQUFPLEVBQUMsYUFBYSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFbEQsT0FBTyxFQUFDLHdCQUF3QixFQUE4QyxZQUFZLElBQUksbUJBQW1CLEVBQUUsY0FBYyxFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDdEssT0FBTyxFQUFtQixxQkFBcUIsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQ3RGLE9BQU8sRUFBc0IsMEJBQTBCLEVBQUUsZUFBZSxFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFFbEgsT0FBTyxFQUNILGtDQUFrQyxFQUNsQyxtQ0FBbUMsRUFDbkMsOEJBQThCLEVBQzlCLG1CQUFtQixFQUNuQix5QkFBeUIsRUFDekIscUJBQXFCLEVBQ3hCLE1BQU0sb0JBQW9CLENBQUM7QUFFNUIsT0FBTyxFQUFDLCtCQUErQixFQUFDLE1BQU0sOEJBQThCLENBQUM7O0FBUTdFLE1BQU0sT0FBTyxvQkFBb0I7YUFDYixnQkFBVyxHQUFHLGdCQUFnQixBQUFuQixDQUFvQjtJQUV0QyxTQUFTLENBQW9CO0lBTTdCLG9CQUFvQixDQUFrRDtJQUcvRSxpQkFBaUI7SUFDUixjQUFjLENBQTZCO0lBSTNDLFdBQVcsQ0FBeUY7SUFFN0csaUNBQWlDLENBSTlC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QUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN2RyxPQUFPO1lBQ0gsVUFBVSxFQUFFLFVBQVU7WUFDdEIsVUFBVSxFQUFFLFVBQVU7WUFDdEIsZ0JBQWdCLEVBQUUseUJBQXlCLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQztZQUNuRSxVQUFVLEVBQUUsbUJBQW1CLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztZQUNsRSxZQUFZLEVBQUUscUJBQXFCLENBQUMsVUFBVSxDQUFDO1NBQ2xELENBQUM7SUFDTixDQUFDOytHQWpJUSxvQkFBb0I7bUhBQXBCLG9CQUFvQjs7NEZBQXBCLG9CQUFvQjtrQkFEaEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZSwgSW5qZWN0b3IsIFNpZ25hbCwgY29tcHV0ZWQsIGluamVjdCwgc2lnbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7dGFrZVVudGlsRGVzdHJveWVkLCB0b09ic2VydmFibGUsIHRvU2lnbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5cbmltcG9ydCB7UHJpbWVOR0NvbmZpZ30gZnJvbSAncHJpbWVuZy9hcGknO1xuaW1wb3J0IHtjb21iaW5lTGF0ZXN0LCBvZiwgc3dpdGNoTWFwfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtDT01NT05TX01PRFVMRV9DT05GSUdfSVQsIENvbW1vbnNTZXJpYWxpemF0aW9uQ29uZmlnLCBEYXRhTGlzdFBhcmFtcywgdG9PYnNlcnZhYmxlIGFzIGNvbW1vbnNUb09ic2VydmFibGUsIGVmZmVjdFdpdGhEZXBzfSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL2NvcmUnO1xuaW1wb3J0IHtGaWx0ZXJEZXNjcmlwdG9yLCBGaWx0ZXJEaXNwbGF5VHlwZUVudW19IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvZmlsdGVyJztcbmltcG9ydCB7VGFibGVEZXNjcmlwdG9ySW5zdCwgVGFibGVEeW5hbWljRGVzY3JpcHRvckluc3QsIHRhYmxlRGVzY3JpcHRvcn0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy90YWJsZS9hcGknO1xuXG5pbXBvcnQge1xuICAgIGNyZWF0ZUZpbHRlckRlc2NyaXB0b3JzRnJvbUdlbmVyaWMsXG4gICAgZmlsdGVyQXBwbHlTZXJpYWxpemF0aW9uQ29uZmlnVG9DbXAsXG4gICAgZmlsdGVyR2VuZXJhdGVNYXRjaE1vZGVPcHRpb25zLFxuICAgIGZpbHRlckdldERhdGVDb25maWcsXG4gICAgZmlsdGVyR2V0RGVmYXVsdE1hdGNoTW9kZSxcbiAgICBmaWx0ZXJHZXROdW1iZXJDb25maWdcbn0gZnJvbSAnLi4vaGVscGVycy9maWx0ZXJzJztcbmltcG9ydCB7RmlsdGVyTWV0YWRhdGF9IGZyb20gJy4uL21vZGVscy9maWx0ZXIubW9kZWwnO1xuaW1wb3J0IHtDT01NT05TX1RBQkxFX0ZFQVRVUkVfQ09ORklHX0lUfSBmcm9tICcuL3RhYmxlLWZlYXR1cmUtY29uZmlnLnRva2VuJztcblxuaW50ZXJmYWNlIFNpZ25hbFNvdXJjZXM8SXRlbSA9IGFueT4ge1xuICAgIGRlc2NyaXB0b3I/OiBTaWduYWw8VGFibGVEZXNjcmlwdG9ySW5zdDxJdGVtLCBhbnksIGFueT4+O1xuICAgIHNlYXJjaEZpZWxkcz86IFNpZ25hbDxzdHJpbmdbXSB8IHVuZGVmaW5lZD47XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBUYWJsZU1ldGFkYXRhU2VydmljZSB7XG4gICAgc3RhdGljIHJlYWRvbmx5IGNtcFR5cGVOYW1lID0gJ1RhYmxlQ29tcG9uZW50JztcblxuICAgIHJlYWRvbmx5ICNpbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG4gICAgcmVhZG9ubHkgcHJpbWVDb25maWcgPSBpbmplY3QoUHJpbWVOR0NvbmZpZyk7XG4gICAgcmVhZG9ubHkgbW9kdWxlQ29uZmlnID0gaW5qZWN0KENPTU1PTlNfTU9EVUxFX0NPTkZJR19JVCwge29wdGlvbmFsOiB0cnVlfSk7XG4gICAgcmVhZG9ubHkgdGFibGVNb2R1bGVDb25maWcgPSBpbmplY3QoQ09NTU9OU19UQUJMRV9GRUFUVVJFX0NPTkZJR19JVCwge29wdGlvbmFsOiB0cnVlfSk7XG5cbiAgICByZWFkb25seSBzZXJpYWxpemF0aW9uQ2ZnOiBDb21tb25zU2VyaWFsaXphdGlvbkNvbmZpZyA9IHt9O1xuICAgIHJlYWRvbmx5ICN0cmFuc2xhdGlvbk9ic2VydmVyID0gdG9TaWduYWwodGhpcy5wcmltZUNvbmZpZy50cmFuc2xhdGlvbk9ic2VydmVyKTtcbiAgICByZWFkb25seSBkZWZhdWx0RmlsdGVyRGlzcGxheVR5cGU6IEZpbHRlckRpc3BsYXlUeXBlRW51bSA9IHRoaXMudGFibGVNb2R1bGVDb25maWc/LmZpbHRlckRpc3BsYXlUeXBlID8/IEZpbHRlckRpc3BsYXlUeXBlRW51bS5Db2x1bW47XG5cbiAgICAvLyBzaWduYWwgc291cmNlc1xuICAgIHJlYWRvbmx5ICNzaWduYWxTb3VyY2VzID0gc2lnbmFsPFNpZ25hbFNvdXJjZXM+KHt9KTtcblxuICAgIC8vIGRlc2NyaXB0b3JzXG4gICAgcmVhZG9ubHkgZGVzY3JpcHRvckZyb21Tb3VyY2UgPSBjb21wdXRlZCgoKSA9PiB0aGlzLiNzaWduYWxTb3VyY2VzKCkuZGVzY3JpcHRvcj8uKCkpO1xuICAgIHJlYWRvbmx5ICNkZXNjcmlwdG9yID0gc2lnbmFsPFRhYmxlRGVzY3JpcHRvckluc3Q8YW55LCBhbnksIGFueT4+KHRhYmxlRGVzY3JpcHRvcjxzdHJpbmcsIHN0cmluZywgc3RyaW5nPigpKTtcbiAgICByZWFkb25seSBkZXNjcmlwdG9yID0gdGhpcy4jZGVzY3JpcHRvci5hc1JlYWRvbmx5KCk7XG4gICAgI3VwZGF0ZURlc2NyaXB0b3JGcm9tU291cmNlRWZmZWN0ID0gZWZmZWN0V2l0aERlcHMoW3RoaXMuZGVzY3JpcHRvckZyb21Tb3VyY2VdLCAoW2RdKSA9PiB7XG4gICAgICAgIGlmIChkICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuI2Rlc2NyaXB0b3Iuc2V0KGQpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBwYWdpbmF0aW9uXG4gICAgcm93c1BlclBhZ2VPcHRpb25zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gdGhpcy5kZXNjcmlwdG9yKCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRlc2NyaXB0b3Iucm93c1BlclBhZ2VPcHRpb25zKSAmJiBkZXNjcmlwdG9yLnJvd3NQZXJQYWdlT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvci5yb3dzUGVyUGFnZU9wdGlvbnM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gWzI1LCA1MCwgMTAwXTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gZmlsdGVyc1xuICAgIHJlYWRvbmx5IGZpbHRlckRlc2NyaXB0b3JzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5kZXNjcmlwdG9yKCkuZmlsdGVycyk7XG4gICAgcmVhZG9ubHkgZmlsdGVycyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICBjb25zdCBvYnNlcnZlciA9IHRoaXMuI3RyYW5zbGF0aW9uT2JzZXJ2ZXIoKTsgLy8gbmVlZCB0aGlzIG9uZSB0byB0cmFjayBsYW5ndWFnZSBjaGFuZ2VzXG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlckRlc2NyaXB0b3JzKCkubWFwKGQgPT4gdGhpcy5tYXBEZXNjcmlwdG9yVG9NZXRhZGF0YShkKSk7XG4gICAgfSk7XG4gICAgcmVhZG9ubHkgZ2VuZXJpY0ZpbHRlckRlc2NyaXB0b3IgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmRlc2NyaXB0b3IoKS5nZW5lcmljRmlsdGVyKTtcbiAgICByZWFkb25seSAjZ2VuZXJpY0ZpbHRlcnMgPSBzaWduYWw8RmlsdGVyTWV0YWRhdGFbXT4oW10pO1xuICAgIHJlYWRvbmx5IGdlbmVyaWNGaWx0ZXJzID0gdGhpcy4jZ2VuZXJpY0ZpbHRlcnMuYXNSZWFkb25seSgpO1xuXG4gICAgLy8gc2VhcmNoXG4gICAgcmVhZG9ubHkgI3NlYXJjaEZpZWxkc0Zyb21TaWduYWxTb3VyY2UgPSBjb21wdXRlZCgoKSA9PiB0aGlzLiNzaWduYWxTb3VyY2VzKCkuc2VhcmNoRmllbGRzPy4oKSk7XG4gICAgcmVhZG9ubHkgI3NlYXJjaEZpZWxkcyA9IHNpZ25hbDxzdHJpbmdbXT4oW10pO1xuICAgIHJlYWRvbmx5IHNlYXJjaEZpZWxkcyA9IHRoaXMuI3NlYXJjaEZpZWxkcy5hc1JlYWRvbmx5KCk7XG4gICAgI3NlYXJjaEZpZWxkc0VmZmVjdCA9IGVmZmVjdFdpdGhEZXBzKFt0aGlzLmRlc2NyaXB0b3IsIHRoaXMuI3NlYXJjaEZpZWxkc0Zyb21TaWduYWxTb3VyY2VdLCAoW2Rlc2NyaXB0b3IsIHNlYXJjaEZpZWxkc0Zyb21TaWduYWxTb3VyY2VdKSA9PiB7XG4gICAgICAgIHRoaXMuI3NlYXJjaEZpZWxkcy5zZXQoXG4gICAgICAgICAgICBzZWFyY2hGaWVsZHNGcm9tU2lnbmFsU291cmNlID8/IChkZXNjcmlwdG9yLnNlYXJjaCAmJiBkZXNjcmlwdG9yLnNlYXJjaEZpZWxkcyA/IGRlc2NyaXB0b3Iuc2VhcmNoRmllbGRzIDogdGhpcy5kZXNjcmlwdG9yKCkuY29sdW1ucy5tYXAoYyA9PiBjLnByb3BlcnR5KSlcbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIC8vIHBhcmFtc1xuICAgIHJlYWRvbmx5IGRlZmF1bHRQYXJhbXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcmFtczogRGF0YUxpc3RQYXJhbXMgPSB7XG4gICAgICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgICAgICBsaW1pdDogdGhpcy5yb3dzUGVyUGFnZU9wdGlvbnMoKVswXSxcbiAgICAgICAgICAgIHNvcnQ6IHRoaXMuZGVzY3JpcHRvcigpXG4gICAgICAgICAgICAgICAgLnNvcnRzLmZpbHRlcihzID0+IHMuZGVmYXVsdElzRW5hYmxlZClcbiAgICAgICAgICAgICAgICAuc29ydCgoczEsIHMyKSA9PiAoczEuZGVmYXVsdE9yZGVyID8/IDEwMDApIC0gKHMyLmRlZmF1bHRPcmRlciA/PyAxMDAwKSlcbiAgICAgICAgICAgICAgICAubWFwKHMgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IHMucHJvcGVydHksXG4gICAgICAgICAgICAgICAgICAgIGFzY2VuZGluZzogcy5kZWZhdWx0SXNBc2NlbmRpbmdcbiAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICBmaWx0ZXJzOiB7fVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuZmlsdGVycygpXG4gICAgICAgICAgICAuZmlsdGVyKGYgPT4gZi5kZXNjcmlwdG9yLmhhc0RlZmF1bHRWYWx1ZSlcbiAgICAgICAgICAgIC5mb3JFYWNoKGYgPT4ge1xuICAgICAgICAgICAgICAgIHBhcmFtcy5maWx0ZXJzIVtmLmRlc2NyaXB0b3IucHJvcGVydHldID0ge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZi5kZXNjcmlwdG9yLmRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hNb2RlOiBmLmRlZmF1bHRNYXRjaE1vZGVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHBhcmFtcztcbiAgICB9KTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBmaWx0ZXJBcHBseVNlcmlhbGl6YXRpb25Db25maWdUb0NtcCh0aGlzLm1vZHVsZUNvbmZpZywgdGhpcy5zZXJpYWxpemF0aW9uQ2ZnKTtcblxuICAgICAgICBjb21iaW5lTGF0ZXN0KFt0b09ic2VydmFibGUodGhpcy5nZW5lcmljRmlsdGVyRGVzY3JpcHRvciksIHRvT2JzZXJ2YWJsZSh0aGlzLiN0cmFuc2xhdGlvbk9ic2VydmVyKV0pXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKFtnZW5lcmljRmlsdGVyRGVzY3JpcHRvcl0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdlbmVyaWNGaWx0ZXJEZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhUHJvdmlkZXIgPSB0aGlzLmdlbmVyaWNGaWx0ZXJEZXNjcmlwdG9yKCk/LnByb3BlcnR5TG9va3VwO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2VuZXJpY0ZpbHRlclNlcnZpY2UgPSBkYXRhUHJvdmlkZXI/LnNlcnZpY2VUeXBlID8gdGhpcy4jaW5qZWN0b3IuZ2V0PGFueT4oZGF0YVByb3ZpZGVyLnNlcnZpY2VUeXBlKSA6IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZldGNoIGZpbHRlcmFibGUgcHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbW1vbnNUb09ic2VydmFibGUoZ2VuZXJpY0ZpbHRlckRlc2NyaXB0b3IucHJvcGVydHlMb29rdXAubG9va3VwKHt9LCBnZW5lcmljRmlsdGVyU2VydmljZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvZihbXSk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgIG5leHQ6IGdlbmVyaWNGaWx0ZXJzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGRlc2NyaXB0b3JzIGZyb20gZ2VuZXJpYyBmaWx0ZXIgZGF0YVxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNnZW5lcmljRmlsdGVycy5zZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVGaWx0ZXJEZXNjcmlwdG9yc0Zyb21HZW5lcmljKGdlbmVyaWNGaWx0ZXJzLCB0aGlzLmdlbmVyaWNGaWx0ZXJEZXNjcmlwdG9yKCk/LnZhbHVlTG9va3VwKS5tYXAoZCA9PiB0aGlzLm1hcERlc2NyaXB0b3JUb01ldGFkYXRhKGQpKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRTaWduYWxTb3VyY2VzKGRlc2NyaXB0b3I6IFNpZ25hbDxUYWJsZURlc2NyaXB0b3JJbnN0PGFueSwgYW55Pj4sIHNlYXJjaEZpZWxkczogU2lnbmFsPHN0cmluZ1tdIHwgdW5kZWZpbmVkPikge1xuICAgICAgICB0aGlzLiNzaWduYWxTb3VyY2VzLnNldCh7ZGVzY3JpcHRvciwgc2VhcmNoRmllbGRzfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldERlc2NyaXB0b3IoZGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9ySW5zdDxhbnksIGFueSwgYW55Pikge1xuICAgICAgICBpZiAodGhpcy5kZXNjcmlwdG9yRnJvbVNvdXJjZSgpIGluc3RhbmNlb2YgVGFibGVEeW5hbWljRGVzY3JpcHRvckluc3QpIHtcbiAgICAgICAgICAgIHRoaXMuI2Rlc2NyaXB0b3Iuc2V0KGRlc2NyaXB0b3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYXBEZXNjcmlwdG9yVG9NZXRhZGF0YShkZXNjcmlwdG9yOiBGaWx0ZXJEZXNjcmlwdG9yPGFueSwgYW55Pik6IEZpbHRlck1ldGFkYXRhIHtcbiAgICAgICAgY29uc3QgbWF0Y2hNb2RlcyA9IGZpbHRlckdlbmVyYXRlTWF0Y2hNb2RlT3B0aW9ucyh0aGlzLnByaW1lQ29uZmlnLCBkZXNjcmlwdG9yLCB0aGlzLnNlcmlhbGl6YXRpb25DZmcpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGVzY3JpcHRvcjogZGVzY3JpcHRvcixcbiAgICAgICAgICAgIG1hdGNoTW9kZXM6IG1hdGNoTW9kZXMsXG4gICAgICAgICAgICBkZWZhdWx0TWF0Y2hNb2RlOiBmaWx0ZXJHZXREZWZhdWx0TWF0Y2hNb2RlKGRlc2NyaXB0b3IsIG1hdGNoTW9kZXMpLFxuICAgICAgICAgICAgZGF0ZUNvbmZpZzogZmlsdGVyR2V0RGF0ZUNvbmZpZyhkZXNjcmlwdG9yLCB0aGlzLnNlcmlhbGl6YXRpb25DZmcpLFxuICAgICAgICAgICAgbnVtYmVyQ29uZmlnOiBmaWx0ZXJHZXROdW1iZXJDb25maWcoZGVzY3JpcHRvcilcbiAgICAgICAgfTtcbiAgICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { Injectable, computed, inject, signal } from '@angular/core';
|
|
2
|
+
import { Router } from '@angular/router';
|
|
3
|
+
import { CommonsStorageService } from '@mediusinc/mng-commons/core';
|
|
4
|
+
import { FilterDisplayTypeEnum } from '@mediusinc/mng-commons/filter';
|
|
5
|
+
import { generateTableLayoutPrefsKey } from '../helpers/table-layout-prefs';
|
|
6
|
+
import { TableMetadataService } from './table-metadata.service';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
export class TablePreferencesService {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.#router = inject(Router);
|
|
11
|
+
this.#storageService = inject(CommonsStorageService);
|
|
12
|
+
this.#metadata = inject(TableMetadataService);
|
|
13
|
+
this.localstorageKey = computed(() => {
|
|
14
|
+
const descriptor = this.#metadata.descriptor();
|
|
15
|
+
return descriptor.model.i18nBaseKey ? generateTableLayoutPrefsKey(descriptor.model.i18nBaseKey, this.#router.url, descriptor.identifier) : null;
|
|
16
|
+
});
|
|
17
|
+
this.#layoutPrefsSaveCnt = signal(0);
|
|
18
|
+
this.layoutPreferences = computed(() => {
|
|
19
|
+
const lsKey = this.localstorageKey();
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
21
|
+
const cnt = this.#layoutPrefsSaveCnt(); // needed to force updates on user changes
|
|
22
|
+
const layoutPrefs = lsKey ? this.#storageService.getItem(TableMetadataService.cmpTypeName, lsKey) : undefined;
|
|
23
|
+
return layoutPrefs ?? { columnWidths: {} };
|
|
24
|
+
});
|
|
25
|
+
// columns
|
|
26
|
+
this.columnsWithPrefs = computed(() => this.#computeColumnsWithLayout());
|
|
27
|
+
}
|
|
28
|
+
#router;
|
|
29
|
+
#storageService;
|
|
30
|
+
#metadata;
|
|
31
|
+
#layoutPrefsSaveCnt;
|
|
32
|
+
/**
|
|
33
|
+
* Method is called on column resize
|
|
34
|
+
* @param element event's element
|
|
35
|
+
*/
|
|
36
|
+
onColumnResize({ element }) {
|
|
37
|
+
const fieldId = element.id;
|
|
38
|
+
const width = element.offsetWidth;
|
|
39
|
+
const layoutPrefs = this.layoutPreferences();
|
|
40
|
+
const col = this.columnsWithPrefs().find(el => el.descriptor.property === fieldId);
|
|
41
|
+
if (col)
|
|
42
|
+
col.width = width;
|
|
43
|
+
if (!layoutPrefs.columnWidths)
|
|
44
|
+
layoutPrefs.columnWidths = {};
|
|
45
|
+
layoutPrefs.columnWidths[fieldId] = width;
|
|
46
|
+
this.#saveLayoutPreferences(layoutPrefs);
|
|
47
|
+
}
|
|
48
|
+
onColumnToggle(event) {
|
|
49
|
+
const layoutPrefs = this.layoutPreferences();
|
|
50
|
+
const selectedColumns = event.value.map(v => v.descriptor.property);
|
|
51
|
+
layoutPrefs.columnHidden = this.columnsWithPrefs()
|
|
52
|
+
.filter(c => selectedColumns.indexOf(c.descriptor.property) < 0)
|
|
53
|
+
.map(c => c.descriptor.property);
|
|
54
|
+
this.#saveLayoutPreferences(layoutPrefs, true);
|
|
55
|
+
}
|
|
56
|
+
onColumnToggleAll() {
|
|
57
|
+
const layoutPrefs = this.layoutPreferences();
|
|
58
|
+
const columns = [...this.columnsWithPrefs()];
|
|
59
|
+
const isVisible = !this.columnsWithPrefs().some(c => c.isVisible);
|
|
60
|
+
for (const col of columns) {
|
|
61
|
+
if (isVisible !== col.isVisible) {
|
|
62
|
+
col.isVisible = isVisible;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
layoutPrefs.columnHidden = columns.filter(c => !c.isVisible).map(c => c.descriptor.property);
|
|
66
|
+
this.#saveLayoutPreferences(layoutPrefs);
|
|
67
|
+
}
|
|
68
|
+
onColumnReorder(event) {
|
|
69
|
+
if (event.dropIndex !== undefined && event.dropIndex >= 0 && event.dragIndex !== undefined && event.dragIndex >= 0 && event.dropIndex !== event.dragIndex) {
|
|
70
|
+
const eventDropIndex = event.dropIndex;
|
|
71
|
+
const eventDragIndex = event.dragIndex;
|
|
72
|
+
const prevVisibleColumns = this.columnsWithPrefs().filter(c => c.isVisible);
|
|
73
|
+
const colAtDrop = prevVisibleColumns[eventDropIndex];
|
|
74
|
+
const colAtDrag = prevVisibleColumns[eventDragIndex];
|
|
75
|
+
const colAtDropIndex = this.columnsWithPrefs().findIndex(el => el.id === colAtDrop.id);
|
|
76
|
+
const colAtDragIndex = this.columnsWithPrefs().findIndex(el => el.id === colAtDrag.id);
|
|
77
|
+
if (colAtDropIndex > -1 && colAtDragIndex > -1) {
|
|
78
|
+
let columns = [...this.columnsWithPrefs()];
|
|
79
|
+
columns.splice(colAtDragIndex, 1);
|
|
80
|
+
const dropIndex = columns.findIndex(el => el.id === colAtDrop.id) + (eventDropIndex > eventDragIndex ? 1 : 0);
|
|
81
|
+
columns = [...columns.slice(0, dropIndex), colAtDrag, ...columns.slice(dropIndex)];
|
|
82
|
+
const layoutPrefs = this.layoutPreferences();
|
|
83
|
+
layoutPrefs.columnOrder = columns.map(el => el.descriptor.property);
|
|
84
|
+
this.#saveLayoutPreferences(layoutPrefs);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Reset column order and column visibility to default settings
|
|
90
|
+
*/
|
|
91
|
+
clearLayoutPreferences() {
|
|
92
|
+
const key = this.localstorageKey();
|
|
93
|
+
if (key) {
|
|
94
|
+
this.#storageService.removeItem(TableMetadataService.cmpTypeName, key);
|
|
95
|
+
this.#layoutPrefsSaveCnt.update(v => v + 1);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
#saveLayoutPreferences(layoutPrefs, forceUpdate = false) {
|
|
99
|
+
const key = this.localstorageKey();
|
|
100
|
+
if (key) {
|
|
101
|
+
this.#storageService.setItem(TableMetadataService.cmpTypeName, key, layoutPrefs);
|
|
102
|
+
if (forceUpdate) {
|
|
103
|
+
this.#layoutPrefsSaveCnt.update(v => v + 1);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
#computeColumnsWithLayout() {
|
|
108
|
+
const descriptor = this.#metadata.descriptor();
|
|
109
|
+
const layoutPrefs = this.layoutPreferences();
|
|
110
|
+
// initialize columns with additional properties
|
|
111
|
+
const timestamp = new Date().getTime();
|
|
112
|
+
const columns = descriptor.columns.map(col => ({
|
|
113
|
+
id: `${col.property}-${timestamp}`,
|
|
114
|
+
descriptor: col,
|
|
115
|
+
filter: this.#metadata
|
|
116
|
+
.filters()
|
|
117
|
+
.find(f => f.descriptor.showOnColumn === col.property &&
|
|
118
|
+
((f.descriptor.displayType == null && this.#metadata.defaultFilterDisplayType === FilterDisplayTypeEnum.Column) ||
|
|
119
|
+
f.descriptor.displayType === FilterDisplayTypeEnum.Column)),
|
|
120
|
+
sort: descriptor.sorts.find(f => f.showOnColumn === col.property),
|
|
121
|
+
disabled: !col.isToggleable,
|
|
122
|
+
isVisible: layoutPrefs.columnHidden ? !layoutPrefs.columnHidden.includes(col.property) : col.isVisible,
|
|
123
|
+
width: layoutPrefs.columnWidths?.[col.property]
|
|
124
|
+
}));
|
|
125
|
+
if (layoutPrefs.columnOrder) {
|
|
126
|
+
for (let i = 0; i < layoutPrefs.columnOrder.length; i++) {
|
|
127
|
+
const colName = layoutPrefs.columnOrder[i];
|
|
128
|
+
const colWithPrefs = columns.find(el => el.descriptor.property === colName);
|
|
129
|
+
if (colWithPrefs) {
|
|
130
|
+
colWithPrefs.orderIdx = i;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return columns.sort((a, b) => (a.orderIdx !== undefined && b.orderIdx !== undefined ? a.orderIdx - b.orderIdx : 0));
|
|
135
|
+
}
|
|
136
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: TablePreferencesService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
137
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: TablePreferencesService }); }
|
|
138
|
+
}
|
|
139
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: TablePreferencesService, decorators: [{
|
|
140
|
+
type: Injectable
|
|
141
|
+
}] });
|
|
142
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtcHJlZmVyZW5jZXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RhYmxlL3NyYy9zZXJ2aWNlcy90YWJsZS1wcmVmZXJlbmNlcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkUsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBS3ZDLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBR3BFLE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBRTFFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDOztBQUc5RCxNQUFNLE9BQU8sdUJBQXVCO0lBRHBDO1FBRWEsWUFBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QixvQkFBZSxHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ2hELGNBQVMsR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUV6QyxvQkFBZSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDckMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMvQyxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQywyQkFBMkIsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNwSixDQUFDLENBQUMsQ0FBQztRQUNN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QyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEtBQUssT0FBTyxDQUFDLENBQUM7Z0JBQzVFLElBQUksWUFBWSxFQUFFLENBQUM7b0JBQ2YsWUFBWSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7Z0JBQzlCLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxTQUFTLElBQUksQ0FBQyxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4SCxDQUFDOytHQXpJUSx1QkFBdUI7bUhBQXZCLHVCQUF1Qjs7NEZBQXZCLHVCQUF1QjtrQkFEbkMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZSwgY29tcHV0ZWQsIGluamVjdCwgc2lnbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Um91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQge011bHRpU2VsZWN0Q2hhbmdlRXZlbnR9IGZyb20gJ3ByaW1lbmcvbXVsdGlzZWxlY3QnO1xuaW1wb3J0IHtUYWJsZUNvbHVtblJlb3JkZXJFdmVudH0gZnJvbSAncHJpbWVuZy90YWJsZSc7XG5cbmltcG9ydCB7Q29tbW9uc1N0b3JhZ2VTZXJ2aWNlfSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL2NvcmUnO1xuaW1wb3J0IHtGaWx0ZXJEaXNwbGF5VHlwZUVudW19IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvZmlsdGVyJztcbmltcG9ydCB7VGFibGVMYXlvdXRQcmVmZXJlbmNlc30gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy90YWJsZS9hcGknO1xuXG5pbXBvcnQge2dlbmVyYXRlVGFibGVMYXlvdXRQcmVmc0tleX0gZnJvbSAnLi4vaGVscGVycy90YWJsZS1sYXlvdXQtcHJlZnMnO1xuaW1wb3J0IHtDb2x1bW5XaXRoUHJlZmVyZW5jZXN9IGZyb20gJy4uL21vZGVscy9jb2x1bW4tcHJlZmVyZW5jZXMubW9kZWwnO1xuaW1wb3J0IHtUYWJsZU1ldGFkYXRhU2VydmljZX0gZnJvbSAnLi90YWJsZS1tZXRhZGF0YS5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFRhYmxlUHJlZmVyZW5jZXNTZXJ2aWNlIHtcbiAgICByZWFkb25seSAjcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gICAgcmVhZG9ubHkgI3N0b3JhZ2VTZXJ2aWNlID0gaW5qZWN0KENvbW1vbnNTdG9yYWdlU2VydmljZSk7XG4gICAgcmVhZG9ubHkgI21ldGFkYXRhID0gaW5qZWN0KFRhYmxlTWV0YWRhdGFTZXJ2aWNlKTtcblxuICAgIHJlYWRvbmx5IGxvY2Fsc3RvcmFnZUtleSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IHRoaXMuI21ldGFkYXRhLmRlc2NyaXB0b3IoKTtcbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3IubW9kZWwuaTE4bkJhc2VLZXkgPyBnZW5lcmF0ZVRhYmxlTGF5b3V0UHJlZnNLZXkoZGVzY3JpcHRvci5tb2RlbC5pMThuQmFzZUtleSwgdGhpcy4jcm91dGVyLnVybCwgZGVzY3JpcHRvci5pZGVudGlmaWVyKSA6IG51bGw7XG4gICAgfSk7XG4gICAgcmVhZG9ubHkgI2xheW91dFByZWZzU2F2ZUNudCA9IHNpZ25hbCgwKTtcbiAgICByZWFkb25seSBsYXlvdXRQcmVmZXJlbmNlcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgbHNLZXkgPSB0aGlzLmxvY2Fsc3RvcmFnZUtleSgpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgIGNvbnN0IGNudCA9IHRoaXMuI2xheW91dFByZWZzU2F2ZUNudCgpOyAvLyBuZWVkZWQgdG8gZm9yY2UgdXBkYXRlcyBvbiB1c2VyIGNoYW5nZXNcbiAgICAgICAgY29uc3QgbGF5b3V0UHJlZnMgPSBsc0tleSA/IHRoaXMuI3N0b3JhZ2VTZXJ2aWNlLmdldEl0ZW08VGFibGVMYXlvdXRQcmVmZXJlbmNlcz4oVGFibGVNZXRhZGF0YVNlcnZpY2UuY21wVHlwZU5hbWUsIGxzS2V5KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIGxheW91dFByZWZzID8/IHtjb2x1bW5XaWR0aHM6IHt9fTtcbiAgICB9KTtcblxuICAgIC8vIGNvbHVtbnNcbiAgICBjb2x1bW5zV2l0aFByZWZzID0gY29tcHV0ZWQ8Q29sdW1uV2l0aFByZWZlcmVuY2VzW10+KCgpID0+IHRoaXMuI2NvbXB1dGVDb2x1bW5zV2l0aExheW91dCgpKTtcblxuICAgIC8qKlxuICAgICAqIE1ldGhvZCBpcyBjYWxsZWQgb24gY29sdW1uIHJlc2l6ZVxuICAgICAqIEBwYXJhbSBlbGVtZW50IGV2ZW50J3MgZWxlbWVudFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNvbHVtblJlc2l6ZSh7ZWxlbWVudH06IGFueSk6IHZvaWQge1xuICAgICAgICBjb25zdCBmaWVsZElkOiBzdHJpbmcgPSBlbGVtZW50LmlkO1xuICAgICAgICBjb25zdCB3aWR0aDogbnVtYmVyID0gZWxlbWVudC5vZmZzZXRXaWR0aDtcblxuICAgICAgICBjb25zdCBsYXlvdXRQcmVmcyA9IHRoaXMubGF5b3V0UHJlZmVyZW5jZXMoKTtcbiAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2x1bW5zV2l0aFByZWZzKCkuZmluZChlbCA9PiBlbC5kZXNjcmlwdG9yLnByb3BlcnR5ID09PSBmaWVsZElkKTtcbiAgICAgICAgaWYgKGNvbCkgY29sLndpZHRoID0gd2lkdGg7XG4gICAgICAgIGlmICghbGF5b3V0UHJlZnMuY29sdW1uV2lkdGhzKSBsYXlvdXRQcmVmcy5jb2x1bW5XaWR0aHMgPSB7fTtcblxuICAgICAgICBsYXlvdXRQcmVmcy5jb2x1bW5XaWR0aHNbZmllbGRJZF0gPSB3aWR0aDtcbiAgICAgICAgdGhpcy4jc2F2ZUxheW91dFByZWZlcmVuY2VzKGxheW91dFByZWZzKTtcbiAgICB9XG5cbiAgICBvbkNvbHVtblRvZ2dsZShldmVudDogTXVsdGlTZWxlY3RDaGFuZ2VFdmVudCkge1xuICAgICAgICBjb25zdCBsYXlvdXRQcmVmcyA9IHRoaXMubGF5b3V0UHJlZmVyZW5jZXMoKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRDb2x1bW5zID0gKGV2ZW50LnZhbHVlIGFzIENvbHVtbldpdGhQcmVmZXJlbmNlc1tdKS5tYXAodiA9PiB2LmRlc2NyaXB0b3IucHJvcGVydHkpO1xuICAgICAgICBsYXlvdXRQcmVmcy5jb2x1bW5IaWRkZW4gPSB0aGlzLmNvbHVtbnNXaXRoUHJlZnMoKVxuICAgICAgICAgICAgLmZpbHRlcihjID0+IHNlbGVjdGVkQ29sdW1ucy5pbmRleE9mKGMuZGVzY3JpcHRvci5wcm9wZXJ0eSkgPCAwKVxuICAgICAgICAgICAgLm1hcChjID0+IGMuZGVzY3JpcHRvci5wcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuI3NhdmVMYXlvdXRQcmVmZXJlbmNlcyhsYXlvdXRQcmVmcywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgb25Db2x1bW5Ub2dnbGVBbGwoKSB7XG4gICAgICAgIGNvbnN0IGxheW91dFByZWZzID0gdGhpcy5sYXlvdXRQcmVmZXJlbmNlcygpO1xuICAgICAgICBjb25zdCBjb2x1bW5zID0gWy4uLnRoaXMuY29sdW1uc1dpdGhQcmVmcygpXTtcbiAgICAgICAgY29uc3QgaXNWaXNpYmxlID0gIXRoaXMuY29sdW1uc1dpdGhQcmVmcygpLnNvbWUoYyA9PiBjLmlzVmlzaWJsZSk7XG4gICAgICAgIGZvciAoY29uc3QgY29sIG9mIGNvbHVtbnMpIHtcbiAgICAgICAgICAgIGlmIChpc1Zpc2libGUgIT09IGNvbC5pc1Zpc2libGUpIHtcbiAgICAgICAgICAgICAgICBjb2wuaXNWaXNpYmxlID0gaXNWaXNpYmxlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxheW91dFByZWZzLmNvbHVtbkhpZGRlbiA9IGNvbHVtbnMuZmlsdGVyKGMgPT4gIWMuaXNWaXNpYmxlKS5tYXAoYyA9PiBjLmRlc2NyaXB0b3IucHJvcGVydHkpO1xuICAgICAgICB0aGlzLiNzYXZlTGF5b3V0UHJlZmVyZW5jZXMobGF5b3V0UHJlZnMpO1xuICAgIH1cblxuICAgIG9uQ29sdW1uUmVvcmRlcihldmVudDogVGFibGVDb2x1bW5SZW9yZGVyRXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LmRyb3BJbmRleCAhPT0gdW5kZWZpbmVkICYmIGV2ZW50LmRyb3BJbmRleCA+PSAwICYmIGV2ZW50LmRyYWdJbmRleCAhPT0gdW5kZWZpbmVkICYmIGV2ZW50LmRyYWdJbmRleCA+PSAwICYmIGV2ZW50LmRyb3BJbmRleCAhPT0gZXZlbnQuZHJhZ0luZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBldmVudERyb3BJbmRleCA9IGV2ZW50LmRyb3BJbmRleDtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50RHJhZ0luZGV4ID0gZXZlbnQuZHJhZ0luZGV4O1xuICAgICAgICAgICAgY29uc3QgcHJldlZpc2libGVDb2x1bW5zID0gdGhpcy5jb2x1bW5zV2l0aFByZWZzKCkuZmlsdGVyKGMgPT4gYy5pc1Zpc2libGUpO1xuICAgICAgICAgICAgY29uc3QgY29sQXREcm9wID0gcHJldlZpc2libGVDb2x1bW5zW2V2ZW50RHJvcEluZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IGNvbEF0RHJhZyA9IHByZXZWaXNpYmxlQ29sdW1uc1tldmVudERyYWdJbmRleF07XG4gICAgICAgICAgICBjb25zdCBjb2xBdERyb3BJbmRleCA9IHRoaXMuY29sdW1uc1dpdGhQcmVmcygpLmZpbmRJbmRleChlbCA9PiBlbC5pZCA9PT0gY29sQXREcm9wLmlkKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbEF0RHJhZ0luZGV4ID0gdGhpcy5jb2x1bW5zV2l0aFByZWZzKCkuZmluZEluZGV4KGVsID0+IGVsLmlkID09PSBjb2xBdERyYWcuaWQpO1xuXG4gICAgICAgICAgICBpZiAoY29sQXREcm9wSW5kZXggPiAtMSAmJiBjb2xBdERyYWdJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbHVtbnMgPSBbLi4udGhpcy5jb2x1bW5zV2l0aFByZWZzKCldO1xuICAgICAgICAgICAgICAgIGNvbHVtbnMuc3BsaWNlKGNvbEF0RHJhZ0luZGV4LCAxKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkcm9wSW5kZXggPSBjb2x1bW5zLmZpbmRJbmRleChlbCA9PiBlbC5pZCA9PT0gY29sQXREcm9wLmlkKSArIChldmVudERyb3BJbmRleCA+IGV2ZW50RHJhZ0luZGV4ID8gMSA6IDApO1xuICAgICAgICAgICAgICAgIGNvbHVtbnMgPSBbLi4uY29sdW1ucy5zbGljZSgwLCBkcm9wSW5kZXgpLCBjb2xBdERyYWcsIC4uLmNvbHVtbnMuc2xpY2UoZHJvcEluZGV4KV07XG4gICAgICAgICAgICAgICAgY29uc3QgbGF5b3V0UHJlZnMgPSB0aGlzLmxheW91dFByZWZlcmVuY2VzKCk7XG4gICAgICAgICAgICAgICAgbGF5b3V0UHJlZnMuY29sdW1uT3JkZXIgPSBjb2x1bW5zLm1hcChlbCA9PiBlbC5kZXNjcmlwdG9yLnByb3BlcnR5KTtcbiAgICAgICAgICAgICAgICB0aGlzLiNzYXZlTGF5b3V0UHJlZmVyZW5jZXMobGF5b3V0UHJlZnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzZXQgY29sdW1uIG9yZGVyIGFuZCBjb2x1bW4gdmlzaWJpbGl0eSB0byBkZWZhdWx0IHNldHRpbmdzXG4gICAgICovXG4gICAgY2xlYXJMYXlvdXRQcmVmZXJlbmNlcygpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5sb2NhbHN0b3JhZ2VLZXkoKTtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgdGhpcy4jc3RvcmFnZVNlcnZpY2UucmVtb3ZlSXRlbShUYWJsZU1ldGFkYXRhU2VydmljZS5jbXBUeXBlTmFtZSwga2V5KTtcbiAgICAgICAgICAgIHRoaXMuI2xheW91dFByZWZzU2F2ZUNudC51cGRhdGUodiA9PiB2ICsgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAjc2F2ZUxheW91dFByZWZlcmVuY2VzKGxheW91dFByZWZzOiBUYWJsZUxheW91dFByZWZlcmVuY2VzLCBmb3JjZVVwZGF0ZSA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMubG9jYWxzdG9yYWdlS2V5KCk7XG4gICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgIHRoaXMuI3N0b3JhZ2VTZXJ2aWNlLnNldEl0ZW0oVGFibGVNZXRhZGF0YVNlcnZpY2UuY21wVHlwZU5hbWUsIGtleSwgbGF5b3V0UHJlZnMpO1xuICAgICAgICAgICAgaWYgKGZvcmNlVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jbGF5b3V0UHJlZnNTYXZlQ250LnVwZGF0ZSh2ID0+IHYgKyAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgICNjb21wdXRlQ29sdW1uc1dpdGhMYXlvdXQoKSB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB0aGlzLiNtZXRhZGF0YS5kZXNjcmlwdG9yKCk7XG4gICAgICAgIGNvbnN0IGxheW91dFByZWZzID0gdGhpcy5sYXlvdXRQcmVmZXJlbmNlcygpO1xuXG4gICAgICAgIC8vIGluaXRpYWxpemUgY29sdW1ucyB3aXRoIGFkZGl0aW9uYWwgcHJvcGVydGllc1xuICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgY29uc3QgY29sdW1uczogQ29sdW1uV2l0aFByZWZlcmVuY2VzW10gPSBkZXNjcmlwdG9yLmNvbHVtbnMubWFwKGNvbCA9PiAoe1xuICAgICAgICAgICAgaWQ6IGAke2NvbC5wcm9wZXJ0eX0tJHt0aW1lc3RhbXB9YCxcbiAgICAgICAgICAgIGRlc2NyaXB0b3I6IGNvbCxcbiAgICAgICAgICAgIGZpbHRlcjogdGhpcy4jbWV0YWRhdGFcbiAgICAgICAgICAgICAgICAuZmlsdGVycygpXG4gICAgICAgICAgICAgICAgLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgIGYgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGYuZGVzY3JpcHRvci5zaG93T25Db2x1bW4gPT09IGNvbC5wcm9wZXJ0eSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKChmLmRlc2NyaXB0b3IuZGlzcGxheVR5cGUgPT0gbnVsbCAmJiB0aGlzLiNtZXRhZGF0YS5kZWZhdWx0RmlsdGVyRGlzcGxheVR5cGUgPT09IEZpbHRlckRpc3BsYXlUeXBlRW51bS5Db2x1bW4pIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5kZXNjcmlwdG9yLmRpc3BsYXlUeXBlID09PSBGaWx0ZXJEaXNwbGF5VHlwZUVudW0uQ29sdW1uKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBzb3J0OiBkZXNjcmlwdG9yLnNvcnRzLmZpbmQoZiA9PiBmLnNob3dPbkNvbHVtbiA9PT0gY29sLnByb3BlcnR5KSxcbiAgICAgICAgICAgIGRpc2FibGVkOiAhY29sLmlzVG9nZ2xlYWJsZSxcbiAgICAgICAgICAgIGlzVmlzaWJsZTogbGF5b3V0UHJlZnMuY29sdW1uSGlkZGVuID8gIWxheW91dFByZWZzLmNvbHVtbkhpZGRlbi5pbmNsdWRlcyhjb2wucHJvcGVydHkpIDogY29sLmlzVmlzaWJsZSxcbiAgICAgICAgICAgIHdpZHRoOiBsYXlvdXRQcmVmcy5jb2x1bW5XaWR0aHM/Lltjb2wucHJvcGVydHldXG4gICAgICAgIH0pKTtcblxuICAgICAgICBpZiAobGF5b3V0UHJlZnMuY29sdW1uT3JkZXIpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGF5b3V0UHJlZnMuY29sdW1uT3JkZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2xOYW1lID0gbGF5b3V0UHJlZnMuY29sdW1uT3JkZXJbaV07XG4gICAgICAgICAgICAgICAgY29uc3QgY29sV2l0aFByZWZzID0gY29sdW1ucy5maW5kKGVsID0+IGVsLmRlc2NyaXB0b3IucHJvcGVydHkgPT09IGNvbE5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChjb2xXaXRoUHJlZnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29sV2l0aFByZWZzLm9yZGVySWR4ID0gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29sdW1ucy5zb3J0KChhLCBiKSA9PiAoYS5vcmRlcklkeCAhPT0gdW5kZWZpbmVkICYmIGIub3JkZXJJZHggIT09IHVuZGVmaW5lZCA/IGEub3JkZXJJZHggLSBiLm9yZGVySWR4IDogMCkpO1xuICAgIH1cbn1cbiJdfQ==
|