@webitel/ui-sdk 25.4.55 → 25.4.56
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/CHANGELOG.md +14 -0
- package/dist/ui-sdk.css +1 -1
- package/dist/ui-sdk.js +93 -99
- package/dist/ui-sdk.umd.cjs +1 -1
- package/package.json +1 -1
- package/src/components/wt-context-menu/types/WtContextMenu.d.ts +4 -0
- package/src/components/wt-search-bar/types/WtSearchBar.d.ts +17 -0
- package/src/components/wt-search-bar/wt-search-bar.vue +23 -10
- package/src/modules/Filters/v2/filter-presets/api/PresetQuery.api.ts +0 -123
- package/src/modules/Filters/v2/filter-presets/components/_shared/input-fields/preset-description-field.vue +0 -33
- package/src/modules/Filters/v2/filter-presets/components/_shared/input-fields/preset-name-field.vue +0 -29
- package/src/modules/Filters/v2/filter-presets/components/_shared/preset-filters-preview.vue +0 -45
- package/src/modules/Filters/v2/filter-presets/components/apply-preset/apply-preset-action.vue +0 -234
- package/src/modules/Filters/v2/filter-presets/components/apply-preset/preset-preview.vue +0 -210
- package/src/modules/Filters/v2/filter-presets/components/save-preset/overwrite-preset-popup.vue +0 -64
- package/src/modules/Filters/v2/filter-presets/components/save-preset/save-preset-action.vue +0 -139
- package/src/modules/Filters/v2/filter-presets/components/save-preset/save-preset-popup.vue +0 -136
- package/src/modules/Filters/v2/filter-presets/index.ts +0 -5
- package/src/modules/Filters/v2/filter-presets/stores/createFilterPresetsStore.ts +0 -17
- package/src/modules/Filters/v2/filter-presets/stores/headers/headers.ts +0 -24
- package/src/modules/Filters/v2/filters/classes/Filter.ts +0 -30
- package/src/modules/Filters/v2/filters/classes/FilterStorage.ts +0 -34
- package/src/modules/Filters/v2/filters/classes/FilterStorageOptions.d.ts +0 -6
- package/src/modules/Filters/v2/filters/classes/FiltersManager.ts +0 -189
- package/src/modules/Filters/v2/filters/components/config/dynamic-filter-config-form-label.vue +0 -50
- package/src/modules/Filters/v2/filters/components/config/dynamic-filter-config-form.vue +0 -140
- package/src/modules/Filters/v2/filters/components/config/dynamic-filter-config-view.vue +0 -40
- package/src/modules/Filters/v2/filters/components/dynamic-filter-add-action.vue +0 -54
- package/src/modules/Filters/v2/filters/components/dynamic-filter-panel-wrapper.vue +0 -57
- package/src/modules/Filters/v2/filters/components/dynamic-filter-search.vue +0 -80
- package/src/modules/Filters/v2/filters/components/filter-options/_shared/composables/booleanFilterToolkit.ts +0 -39
- package/src/modules/Filters/v2/filters/components/filter-options/_shared/composables/useFromToSecToPreviewTime.ts +0 -41
- package/src/modules/Filters/v2/filters/components/filter-options/_shared/date-time-filter/date-time-filter-value-field.vue +0 -56
- package/src/modules/Filters/v2/filters/components/filter-options/_shared/durations/duration-filter-value-field.vue +0 -84
- package/src/modules/Filters/v2/filters/components/filter-options/_shared/has-options/has-option-filter-value-field.vue +0 -38
- package/src/modules/Filters/v2/filters/components/filter-options/_shared/types/BooleanFilter.ts +0 -1
- package/src/modules/Filters/v2/filters/components/filter-options/actual-reaction-time/actual-reaction-time-filter-value-field.vue +0 -18
- package/src/modules/Filters/v2/filters/components/filter-options/actual-reaction-time/actual-reaction-time-filter-value-preview.vue +0 -44
- package/src/modules/Filters/v2/filters/components/filter-options/actual-resolution-time/actual-resolution-time-filter-value-field.vue +0 -18
- package/src/modules/Filters/v2/filters/components/filter-options/actual-resolution-time/actual-resolution-time-filter-value-preview.vue +0 -44
- package/src/modules/Filters/v2/filters/components/filter-options/agent/agent-filter-value-field.vue +0 -58
- package/src/modules/Filters/v2/filters/components/filter-options/agent/agent-filter-value-preview.vue +0 -31
- package/src/modules/Filters/v2/filters/components/filter-options/agent/config.js +0 -4
- package/src/modules/Filters/v2/filters/components/filter-options/amd-result/amd-result-filter-value-field.vue +0 -52
- package/src/modules/Filters/v2/filters/components/filter-options/amd-result/amd-result-filter-value-preview.vue +0 -18
- package/src/modules/Filters/v2/filters/components/filter-options/assignee/assignee-filter-value-field.vue +0 -74
- package/src/modules/Filters/v2/filters/components/filter-options/assignee/assignee-filter-value-preview.vue +0 -36
- package/src/modules/Filters/v2/filters/components/filter-options/assignee/config.js +0 -4
- package/src/modules/Filters/v2/filters/components/filter-options/author/author-filter-value-field.vue +0 -56
- package/src/modules/Filters/v2/filters/components/filter-options/author/author-filter-value-preview.vue +0 -31
- package/src/modules/Filters/v2/filters/components/filter-options/author/config.js +0 -4
- package/src/modules/Filters/v2/filters/components/filter-options/cause/cause-filter-value-field.vue +0 -52
- package/src/modules/Filters/v2/filters/components/filter-options/cause/cause-filter-value-preview.vue +0 -18
- package/src/modules/Filters/v2/filters/components/filter-options/close-reason-groups-case/close-reason-groups-case-filter-value-field.vue +0 -102
- package/src/modules/Filters/v2/filters/components/filter-options/close-reason-groups-case/close-reason-groups-case-filter-value-preview.vue +0 -34
- package/src/modules/Filters/v2/filters/components/filter-options/close-reason-groups-case/config.js +0 -7
- package/src/modules/Filters/v2/filters/components/filter-options/contact/config.js +0 -4
- package/src/modules/Filters/v2/filters/components/filter-options/contact/contact-filter-value-field.vue +0 -56
- package/src/modules/Filters/v2/filters/components/filter-options/contact/contact-filter-value-preview.vue +0 -31
- package/src/modules/Filters/v2/filters/components/filter-options/contact-group/config.js +0 -4
- package/src/modules/Filters/v2/filters/components/filter-options/contact-group/contact-group-filter-value-field.vue +0 -74
- package/src/modules/Filters/v2/filters/components/filter-options/contact-group/contact-group-filter-value-preview.vue +0 -38
- package/src/modules/Filters/v2/filters/components/filter-options/created-at-from/created-at-from-filter-value-field.vue +0 -24
- package/src/modules/Filters/v2/filters/components/filter-options/created-at-from/created-at-from-filter-value-preview.vue +0 -15
- package/src/modules/Filters/v2/filters/components/filter-options/created-at-to/created-at-to-filter-value-field.vue +0 -24
- package/src/modules/Filters/v2/filters/components/filter-options/created-at-to/created-at-to-filter-value-preview.vue +0 -15
- package/src/modules/Filters/v2/filters/components/filter-options/direction/direction-filter-value-field.vue +0 -51
- package/src/modules/Filters/v2/filters/components/filter-options/direction/direction-filter-value-preview.vue +0 -17
- package/src/modules/Filters/v2/filters/components/filter-options/gateway/config.js +0 -4
- package/src/modules/Filters/v2/filters/components/filter-options/gateway/gateway-filter-value-field.vue +0 -56
- package/src/modules/Filters/v2/filters/components/filter-options/gateway/gateway-filter-value-preview.vue +0 -31
- package/src/modules/Filters/v2/filters/components/filter-options/grantee/config.js +0 -4
- package/src/modules/Filters/v2/filters/components/filter-options/grantee/grantee-filter-value-field.vue +0 -56
- package/src/modules/Filters/v2/filters/components/filter-options/grantee/grantee-filter-value-preview.vue +0 -31
- package/src/modules/Filters/v2/filters/components/filter-options/has-attachment/has-attachment-filter-value-field.vue +0 -43
- package/src/modules/Filters/v2/filters/components/filter-options/has-attachment/has-attachment-filter-value-preview.vue +0 -24
- package/src/modules/Filters/v2/filters/components/filter-options/has-file/has-file-filter-value-field.vue +0 -33
- package/src/modules/Filters/v2/filters/components/filter-options/has-file/has-file-filter-value-preview.vue +0 -15
- package/src/modules/Filters/v2/filters/components/filter-options/has-rating/has-rating-filter-value-field.vue +0 -33
- package/src/modules/Filters/v2/filters/components/filter-options/has-rating/has-rating-filter-value-preview.vue +0 -15
- package/src/modules/Filters/v2/filters/components/filter-options/has-transcription/has-transcription-filter-value-field.vue +0 -33
- package/src/modules/Filters/v2/filters/components/filter-options/has-transcription/has-transcription-filter-value-preview.vue +0 -15
- package/src/modules/Filters/v2/filters/components/filter-options/impacted/config.js +0 -4
- package/src/modules/Filters/v2/filters/components/filter-options/impacted/impacted-filter-value-field.vue +0 -56
- package/src/modules/Filters/v2/filters/components/filter-options/impacted/impacted-filter-value-preview.vue +0 -31
- package/src/modules/Filters/v2/filters/components/filter-options/index.ts +0 -250
- package/src/modules/Filters/v2/filters/components/filter-options/priority-case/config.js +0 -4
- package/src/modules/Filters/v2/filters/components/filter-options/priority-case/priority-case-filter-value-field.vue +0 -57
- package/src/modules/Filters/v2/filters/components/filter-options/priority-case/priority-case-filter-value-preview.vue +0 -31
- package/src/modules/Filters/v2/filters/components/filter-options/queue/config.js +0 -4
- package/src/modules/Filters/v2/filters/components/filter-options/queue/queue-filter-value-field.vue +0 -56
- package/src/modules/Filters/v2/filters/components/filter-options/queue/queue-filter-value-preview.vue +0 -31
- package/src/modules/Filters/v2/filters/components/filter-options/rated-by/config.js +0 -4
- package/src/modules/Filters/v2/filters/components/filter-options/rated-by/rated-by-filter-value-field.vue +0 -56
- package/src/modules/Filters/v2/filters/components/filter-options/rated-by/rated-by-filter-value-preview.vue +0 -31
- package/src/modules/Filters/v2/filters/components/filter-options/rating/rating-from-to-filter-value-field.vue +0 -101
- package/src/modules/Filters/v2/filters/components/filter-options/rating/rating-from-to-filter-value-preview.vue +0 -39
- package/src/modules/Filters/v2/filters/components/filter-options/reaction-time/reaction-time-filter-value-field.vue +0 -18
- package/src/modules/Filters/v2/filters/components/filter-options/reaction-time/reaction-time-filter-value-preview.vue +0 -44
- package/src/modules/Filters/v2/filters/components/filter-options/reporter/config.js +0 -4
- package/src/modules/Filters/v2/filters/components/filter-options/reporter/reporter-filter-value-field.vue +0 -56
- package/src/modules/Filters/v2/filters/components/filter-options/reporter/reporter-filter-value-preview.vue +0 -31
- package/src/modules/Filters/v2/filters/components/filter-options/resolution-time/resolution-time-filter-value-field.vue +0 -18
- package/src/modules/Filters/v2/filters/components/filter-options/resolution-time/resolution-time-filter-value-preview.vue +0 -44
- package/src/modules/Filters/v2/filters/components/filter-options/score/score-from-to-filter-value-field.vue +0 -100
- package/src/modules/Filters/v2/filters/components/filter-options/score/score-from-to-filter-value-preview.vue +0 -39
- package/src/modules/Filters/v2/filters/components/filter-options/service-case/config.js +0 -6
- package/src/modules/Filters/v2/filters/components/filter-options/service-case/service-case-filter-value-field.vue +0 -82
- package/src/modules/Filters/v2/filters/components/filter-options/service-case/service-case-filter-value-preview.vue +0 -34
- package/src/modules/Filters/v2/filters/components/filter-options/sla/config.js +0 -4
- package/src/modules/Filters/v2/filters/components/filter-options/sla/sla-filter-value-field.vue +0 -57
- package/src/modules/Filters/v2/filters/components/filter-options/sla/sla-filter-value-preview.vue +0 -31
- package/src/modules/Filters/v2/filters/components/filter-options/sla-condition/config.js +0 -6
- package/src/modules/Filters/v2/filters/components/filter-options/sla-condition/sla-condition-filter-value-field.vue +0 -98
- package/src/modules/Filters/v2/filters/components/filter-options/sla-condition/sla-condition-filter-value-preview.vue +0 -37
- package/src/modules/Filters/v2/filters/components/filter-options/source-case/config.js +0 -4
- package/src/modules/Filters/v2/filters/components/filter-options/source-case/source-case-filter-value-field.vue +0 -57
- package/src/modules/Filters/v2/filters/components/filter-options/source-case/source-case-filter-value-preview.vue +0 -31
- package/src/modules/Filters/v2/filters/components/filter-options/status-case/config.js +0 -7
- package/src/modules/Filters/v2/filters/components/filter-options/status-case/status-case-filter-value-field.vue +0 -102
- package/src/modules/Filters/v2/filters/components/filter-options/status-case/status-case-filter-value-preview.vue +0 -37
- package/src/modules/Filters/v2/filters/components/filter-options/tag/tag-filter-value-field.vue +0 -52
- package/src/modules/Filters/v2/filters/components/filter-options/tag/tag-filter-value-preview.vue +0 -38
- package/src/modules/Filters/v2/filters/components/filter-options/talk-duration/TalkDurationFilter.d.ts +0 -4
- package/src/modules/Filters/v2/filters/components/filter-options/talk-duration/talk-duration-filter-value-field.vue +0 -19
- package/src/modules/Filters/v2/filters/components/filter-options/talk-duration/talk-duration-filter-value-preview.vue +0 -44
- package/src/modules/Filters/v2/filters/components/filter-options/team/config.js +0 -4
- package/src/modules/Filters/v2/filters/components/filter-options/team/team-filter-value-field.vue +0 -56
- package/src/modules/Filters/v2/filters/components/filter-options/team/team-filter-value-preview.vue +0 -31
- package/src/modules/Filters/v2/filters/components/filter-options/total-duration/TotalDurationFilter.d.ts +0 -4
- package/src/modules/Filters/v2/filters/components/filter-options/total-duration/total-duration-filter-value-field.vue +0 -19
- package/src/modules/Filters/v2/filters/components/filter-options/total-duration/total-duration-filter-value-preview.vue +0 -44
- package/src/modules/Filters/v2/filters/components/filter-options/user/config.js +0 -4
- package/src/modules/Filters/v2/filters/components/filter-options/user/user-filter-value-field.vue +0 -56
- package/src/modules/Filters/v2/filters/components/filter-options/user/user-filter-value-preview.vue +0 -31
- package/src/modules/Filters/v2/filters/components/filter-options/variable/variable-filter-value-field.vue +0 -50
- package/src/modules/Filters/v2/filters/components/filter-options/variable/variable-filter-value-preview.vue +0 -39
- package/src/modules/Filters/v2/filters/components/preview/dynamic-filter-preview-info.vue +0 -35
- package/src/modules/Filters/v2/filters/components/preview/dynamic-filter-preview.vue +0 -76
- package/src/modules/Filters/v2/filters/components/table-filters-panel.vue +0 -87
- package/src/modules/Filters/v2/filters/createTableFiltersStore.ts +0 -81
- package/src/modules/Filters/v2/filters/enums/FilterOption.ts +0 -43
- package/src/modules/Filters/v2/filters/enums/amd-result-options.ts +0 -38
- package/src/modules/Filters/v2/filters/enums/boolean-options.ts +0 -16
- package/src/modules/Filters/v2/filters/enums/direction-options.ts +0 -20
- package/src/modules/Filters/v2/filters/enums/hangup-cause-options.ts +0 -265
- package/src/modules/Filters/v2/filters/enums/tag-options.ts +0 -8
- package/src/modules/Filters/v2/filters/index.ts +0 -29
- package/src/modules/Filters/v2/filters/scripts/utils.ts +0 -31
- package/src/modules/Filters/v2/filters/types/Filter.d.ts +0 -46
- package/src/modules/Filters/v2/filters/types/FilterSearch.d.ts +0 -10
- package/src/modules/Filters/v2/filters/types/FiltersManager.d.ts +0 -76
- package/src/modules/Filters/v2/headers/createTableHeadersStore.ts +0 -140
- package/src/modules/Filters/v2/index.ts +0 -0
- package/src/modules/Filters/v2/pagination/createTablePaginationStore.ts +0 -64
- package/src/modules/Filters/v2/persist/PersistedStorage.types.ts +0 -51
- package/src/modules/Filters/v2/persist/useLocalStoragePersistedStorage.ts +0 -37
- package/src/modules/Filters/v2/persist/usePersistedStorage.ts +0 -151
- package/src/modules/Filters/v2/persist/useRoutePersistedStorage.ts +0 -41
- package/src/modules/Filters/v2/table/createTableStore.store.ts +0 -206
- package/src/modules/Filters/v2/types/tableStore.types.ts +0 -61
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
export type FilterName = string;
|
|
2
|
-
export type FilterLabel = string;
|
|
3
|
-
export type FilterValue =
|
|
4
|
-
| object
|
|
5
|
-
| []
|
|
6
|
-
| string
|
|
7
|
-
| number
|
|
8
|
-
| boolean
|
|
9
|
-
| undefined
|
|
10
|
-
| null;
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* represents user-input data, that should be (re)stored
|
|
14
|
-
*/
|
|
15
|
-
export interface FilterData {
|
|
16
|
-
value: FilterValue;
|
|
17
|
-
label?: FilterLabel;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export interface FilterInitParams extends FilterData {
|
|
21
|
-
name: FilterName;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export interface FilterEnumOption {
|
|
25
|
-
locale: string;
|
|
26
|
-
value: FilterValue;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export interface FilterConfig {
|
|
30
|
-
/**
|
|
31
|
-
* Perform simple type conversion on store/restore,
|
|
32
|
-
* without need to provide custom store/restore functions
|
|
33
|
-
*/
|
|
34
|
-
storableType?: string;
|
|
35
|
-
/**
|
|
36
|
-
* list of persistence storages that should be used for this filter
|
|
37
|
-
*/
|
|
38
|
-
storage?: string[];
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export interface IFilter {
|
|
42
|
-
name: FilterName;
|
|
43
|
-
value: FilterValue;
|
|
44
|
-
label?: FilterLabel;
|
|
45
|
-
set: (data: FilterData) => IFilter;
|
|
46
|
-
}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
FilterConfig,
|
|
3
|
-
FilterInitParams,
|
|
4
|
-
FilterLabel,
|
|
5
|
-
FilterName,
|
|
6
|
-
FilterValue,
|
|
7
|
-
IFilter,
|
|
8
|
-
} from './Filter.types.ts';
|
|
9
|
-
|
|
10
|
-
export interface IFiltersManager {
|
|
11
|
-
filters: Map<FilterName, IFilter>;
|
|
12
|
-
|
|
13
|
-
hasFilter: (name: FilterName) => boolean;
|
|
14
|
-
getFilter: (name: FilterName) => IFilter;
|
|
15
|
-
addFilter: (
|
|
16
|
-
params: FilterInitParams,
|
|
17
|
-
payload?: object,
|
|
18
|
-
config?: FilterConfig,
|
|
19
|
-
) => IFilter;
|
|
20
|
-
updateFilter: ({
|
|
21
|
-
name,
|
|
22
|
-
}: {
|
|
23
|
-
name: FilterName;
|
|
24
|
-
value?: FilterValue;
|
|
25
|
-
label?: FilterLabel;
|
|
26
|
-
}) => IFilter;
|
|
27
|
-
deleteFilter: (name: FilterName) => IFilter;
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Converts filters data to String, that can be stored
|
|
31
|
-
*/
|
|
32
|
-
toString: () => string;
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Restores filters from string
|
|
36
|
-
*/
|
|
37
|
-
fromString: (snapshotStr: string) => void;
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* deletes filters
|
|
41
|
-
* If include/exclude are not provided, all filters will be deleted
|
|
42
|
-
*/
|
|
43
|
-
reset: ({
|
|
44
|
-
include,
|
|
45
|
-
exclude,
|
|
46
|
-
}?: {
|
|
47
|
-
include?: FilterName[];
|
|
48
|
-
exclude?: FilterName[];
|
|
49
|
-
}) => void;
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* @returns Array<FilterName>
|
|
53
|
-
*/
|
|
54
|
-
getAllKeys: () => FilterName[];
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* @returns { FilterName: FilterValue }
|
|
58
|
-
*/
|
|
59
|
-
|
|
60
|
-
getAllValues: () => { [name: FilterName]: FilterValue };
|
|
61
|
-
/**
|
|
62
|
-
* @returns Array<IFilter>
|
|
63
|
-
* @param include
|
|
64
|
-
* @param exclude
|
|
65
|
-
*/
|
|
66
|
-
|
|
67
|
-
getFiltersList: ({
|
|
68
|
-
include,
|
|
69
|
-
exclude,
|
|
70
|
-
}?: {
|
|
71
|
-
include?: FilterName[];
|
|
72
|
-
exclude?: FilterName[];
|
|
73
|
-
}) => IFilter[];
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
export type FiltersManagerConfig = FilterConfig;
|
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
import { defineStore } from 'pinia';
|
|
2
|
-
import { computed, ref } from 'vue';
|
|
3
|
-
|
|
4
|
-
import { WtTableHeader } from '../../../../components/wt-table/types/WtTable';
|
|
5
|
-
import { sortToQueryAdapter } from '../../../../scripts';
|
|
6
|
-
import { SortSymbols } from '../../../../scripts/sortQueryAdapters';
|
|
7
|
-
import { PersistedStorageType } from '../persist/PersistedStorage.types';
|
|
8
|
-
import { usePersistedStorage } from '../persist/usePersistedStorage.ts';
|
|
9
|
-
|
|
10
|
-
export const createTableHeadersStore = (
|
|
11
|
-
namespace: string,
|
|
12
|
-
{ headers: rawHeaders },
|
|
13
|
-
) => {
|
|
14
|
-
const id = `${namespace}/headers`;
|
|
15
|
-
|
|
16
|
-
return defineStore(id, () => {
|
|
17
|
-
const headers = ref(rawHeaders);
|
|
18
|
-
|
|
19
|
-
const shownHeaders = computed(() => {
|
|
20
|
-
return headers.value.filter((header) => header.show);
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
const fields = computed(() => {
|
|
24
|
-
return shownHeaders.value.map((header) => header.field);
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
const sort = computed(() => {
|
|
28
|
-
const encodeSortQuery = ({ column, order }) =>
|
|
29
|
-
`${sortToQueryAdapter(order)}${column.field}`;
|
|
30
|
-
|
|
31
|
-
const sortedCol = headers.value.find((header) => header.sort);
|
|
32
|
-
|
|
33
|
-
return sortedCol
|
|
34
|
-
? encodeSortQuery({ column: sortedCol, order: sortedCol.sort })
|
|
35
|
-
: null;
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
const $reset = () => {
|
|
39
|
-
headers.value = rawHeaders;
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
const updateShownHeaders = (value) => {
|
|
43
|
-
headers.value = value;
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
const updateFields = (fields: string[]) => {
|
|
47
|
-
const newHeaders = headers.value.map((header: WtTableHeader) => {
|
|
48
|
-
return {
|
|
49
|
-
...header,
|
|
50
|
-
show: fields.includes(header.field),
|
|
51
|
-
};
|
|
52
|
-
});
|
|
53
|
-
updateShownHeaders(newHeaders);
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
const updateSort = (column) => {
|
|
57
|
-
const getNextSortOrder = (sort) => {
|
|
58
|
-
switch (sort) {
|
|
59
|
-
case SortSymbols.NONE:
|
|
60
|
-
return SortSymbols.ASC;
|
|
61
|
-
case SortSymbols.ASC:
|
|
62
|
-
return SortSymbols.DESC;
|
|
63
|
-
case SortSymbols.DESC:
|
|
64
|
-
return SortSymbols.NONE;
|
|
65
|
-
default:
|
|
66
|
-
return SortSymbols.ASC;
|
|
67
|
-
}
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
const changeHeadersSort = ({ headers, sortedHeader, order }) => {
|
|
71
|
-
return headers.map((header) => {
|
|
72
|
-
if (header.sort === undefined) return header;
|
|
73
|
-
|
|
74
|
-
// reset all headers by default
|
|
75
|
-
let newSort = null;
|
|
76
|
-
|
|
77
|
-
if (header.field === sortedHeader.field) {
|
|
78
|
-
newSort = order;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
return {
|
|
82
|
-
...header,
|
|
83
|
-
sort: newSort,
|
|
84
|
-
};
|
|
85
|
-
});
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
const order = getNextSortOrder(column.sort);
|
|
89
|
-
|
|
90
|
-
const newHeaders = changeHeadersSort({
|
|
91
|
-
headers: headers.value,
|
|
92
|
-
sortedHeader: column,
|
|
93
|
-
order,
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
headers.value = newHeaders;
|
|
97
|
-
};
|
|
98
|
-
const setupPersistence = async () => {
|
|
99
|
-
const { restore: restoreFields } = usePersistedStorage({
|
|
100
|
-
name: 'fields',
|
|
101
|
-
value: fields,
|
|
102
|
-
storages: [
|
|
103
|
-
PersistedStorageType.LocalStorage,
|
|
104
|
-
PersistedStorageType.Route,
|
|
105
|
-
],
|
|
106
|
-
storagePath: id,
|
|
107
|
-
onStore: (save, { name }) => {
|
|
108
|
-
const value = fields.value.join(',');
|
|
109
|
-
return save({ name, value });
|
|
110
|
-
},
|
|
111
|
-
onRestore: async (restore, name) => {
|
|
112
|
-
const value = (await restore(name)) as string;
|
|
113
|
-
if (value) {
|
|
114
|
-
return updateFields(value.split(','));
|
|
115
|
-
}
|
|
116
|
-
},
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
const { restore: restoreSort } = usePersistedStorage({
|
|
120
|
-
name: 'sort',
|
|
121
|
-
value: sort,
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
return Promise.allSettled([restoreFields(), restoreSort()]);
|
|
125
|
-
};
|
|
126
|
-
|
|
127
|
-
return {
|
|
128
|
-
headers,
|
|
129
|
-
shownHeaders,
|
|
130
|
-
fields,
|
|
131
|
-
sort,
|
|
132
|
-
|
|
133
|
-
updateShownHeaders,
|
|
134
|
-
updateSort,
|
|
135
|
-
|
|
136
|
-
setupPersistence,
|
|
137
|
-
$reset,
|
|
138
|
-
};
|
|
139
|
-
});
|
|
140
|
-
};
|
|
File without changes
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { defineStore } from 'pinia';
|
|
2
|
-
import { ref } from 'vue';
|
|
3
|
-
|
|
4
|
-
import { usePersistedStorage } from '../persist/usePersistedStorage.ts';
|
|
5
|
-
|
|
6
|
-
export const createTablePaginationStore = (namespace: string) => {
|
|
7
|
-
const id = `${namespace}/pagination`;
|
|
8
|
-
|
|
9
|
-
return defineStore(id, () => {
|
|
10
|
-
const page = ref(1);
|
|
11
|
-
const size = ref(10);
|
|
12
|
-
const next = ref(false);
|
|
13
|
-
|
|
14
|
-
const updatePage = (newPage: number) => {
|
|
15
|
-
page.value = newPage;
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
const updateSize = (newSize: number) => {
|
|
19
|
-
size.value = newSize;
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
const $reset = () => {
|
|
23
|
-
page.value = 1;
|
|
24
|
-
size.value = 10;
|
|
25
|
-
next.value = false;
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
const setupPersistence = () => {
|
|
29
|
-
const { restore: restorePage } = usePersistedStorage({
|
|
30
|
-
name: 'page',
|
|
31
|
-
value: page,
|
|
32
|
-
onRestore: async (restore, name) => {
|
|
33
|
-
const value = await restore(name);
|
|
34
|
-
const numValue = +value;
|
|
35
|
-
if (numValue) page.value = numValue;
|
|
36
|
-
},
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
const { restore: restoreSize } = usePersistedStorage({
|
|
40
|
-
name: 'size',
|
|
41
|
-
value: size,
|
|
42
|
-
onRestore: async (restore, name) => {
|
|
43
|
-
const value = await restore(name);
|
|
44
|
-
const numValue = +value;
|
|
45
|
-
if (numValue) size.value = numValue;
|
|
46
|
-
},
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
return Promise.allSettled([restorePage(), restoreSize()]);
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
return {
|
|
53
|
-
page,
|
|
54
|
-
size,
|
|
55
|
-
next,
|
|
56
|
-
|
|
57
|
-
updatePage,
|
|
58
|
-
updateSize,
|
|
59
|
-
|
|
60
|
-
setupPersistence,
|
|
61
|
-
$reset,
|
|
62
|
-
};
|
|
63
|
-
});
|
|
64
|
-
};
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { Ref, WatchOptions } from 'vue';
|
|
2
|
-
|
|
3
|
-
export enum PersistedStorageType {
|
|
4
|
-
LocalStorage = 'localStorage',
|
|
5
|
-
Route = 'route',
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
// in route query, or in localStorage
|
|
9
|
-
export type PersistStorableValue = string;
|
|
10
|
-
|
|
11
|
-
export type PersistableValue =
|
|
12
|
-
| PersistStorableValue
|
|
13
|
-
| { toString: () => PersistStorableValue };
|
|
14
|
-
|
|
15
|
-
export interface StorageLike {
|
|
16
|
-
getItem(key: string): Promise<PersistableValue | null>;
|
|
17
|
-
|
|
18
|
-
setItem(key: string, value: PersistableValue): Promise<void>;
|
|
19
|
-
|
|
20
|
-
removeItem(key: string): Promise<void>;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export interface PersistedPropertyConfig {
|
|
24
|
-
name: string;
|
|
25
|
-
value: Ref<PersistableValue>;
|
|
26
|
-
storages?: PersistedStorageType | PersistedStorageType[];
|
|
27
|
-
storagePath?: string;
|
|
28
|
-
startWatchManually?: boolean;
|
|
29
|
-
watchConfig?: WatchOptions;
|
|
30
|
-
onStore?: (
|
|
31
|
-
save: ({
|
|
32
|
-
name,
|
|
33
|
-
value,
|
|
34
|
-
}: {
|
|
35
|
-
name: string;
|
|
36
|
-
value: PersistableValue;
|
|
37
|
-
}) => Promise<void>,
|
|
38
|
-
{ value, name },
|
|
39
|
-
) => Promise<void>;
|
|
40
|
-
onRestore?: (
|
|
41
|
-
restore: (name: string) => Promise<PersistableValue>,
|
|
42
|
-
name: string,
|
|
43
|
-
) => Promise<void>;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export interface PersistedStorageController {
|
|
47
|
-
watch: () => void;
|
|
48
|
-
unwatch: () => void;
|
|
49
|
-
restore: () => Promise<void>;
|
|
50
|
-
reset: () => Promise<void>;
|
|
51
|
-
}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { StorageLike } from './PersistedStorage.types.ts';
|
|
2
|
-
|
|
3
|
-
const separator = ';';
|
|
4
|
-
|
|
5
|
-
const makePath = (storagePath: string, key: string) => `${storagePath}/${key}`;
|
|
6
|
-
|
|
7
|
-
export const useLocalStoragePersistedStorage = ({
|
|
8
|
-
storagePath = '',
|
|
9
|
-
}: {
|
|
10
|
-
storagePath: string;
|
|
11
|
-
}): StorageLike => {
|
|
12
|
-
const getItem = async (key: string) => {
|
|
13
|
-
const value = localStorage.getItem(makePath(storagePath, key));
|
|
14
|
-
try {
|
|
15
|
-
return value.split(separator).join();
|
|
16
|
-
} catch {
|
|
17
|
-
return value;
|
|
18
|
-
}
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
const setItem = async (key: string, inputValue: string | string[]) => {
|
|
22
|
-
const value = Array.isArray(inputValue)
|
|
23
|
-
? inputValue.join(separator)
|
|
24
|
-
: inputValue;
|
|
25
|
-
localStorage.setItem(makePath(storagePath, key), value);
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
const removeItem = async (key: string) => {
|
|
29
|
-
localStorage.removeItem(makePath(storagePath, key));
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
return {
|
|
33
|
-
getItem,
|
|
34
|
-
setItem,
|
|
35
|
-
removeItem,
|
|
36
|
-
};
|
|
37
|
-
};
|
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
import { watch } from 'vue';
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
PersistableValue,
|
|
5
|
-
PersistedPropertyConfig,
|
|
6
|
-
PersistedStorageController,
|
|
7
|
-
PersistedStorageType,
|
|
8
|
-
} from './PersistedStorage.types.ts';
|
|
9
|
-
import { useLocalStoragePersistedStorage } from './useLocalStoragePersistedStorage.ts';
|
|
10
|
-
import { useRoutePersistedStorage } from './useRoutePersistedStorage.ts';
|
|
11
|
-
|
|
12
|
-
export const usePersistedStorage = ({
|
|
13
|
-
name,
|
|
14
|
-
value,
|
|
15
|
-
storages: configStorages = [PersistedStorageType.Route],
|
|
16
|
-
storagePath,
|
|
17
|
-
startWatchManually = false,
|
|
18
|
-
onStore,
|
|
19
|
-
onRestore,
|
|
20
|
-
}: PersistedPropertyConfig): PersistedStorageController => {
|
|
21
|
-
let unwatch = null;
|
|
22
|
-
|
|
23
|
-
const setItemFns = [];
|
|
24
|
-
const getItemFns: Array<(name: string) => Promise<PersistableValue>> = [];
|
|
25
|
-
const removeItemFns = [];
|
|
26
|
-
|
|
27
|
-
const composedValueGetter = async (
|
|
28
|
-
name: string,
|
|
29
|
-
): Promise<PersistableValue[]> => {
|
|
30
|
-
const settledResults = await Promise.allSettled(
|
|
31
|
-
getItemFns.map((getter) => getter(name)),
|
|
32
|
-
);
|
|
33
|
-
|
|
34
|
-
return settledResults.reduce((acc, result) => {
|
|
35
|
-
if (result.status === 'fulfilled') {
|
|
36
|
-
return [...acc, result.value];
|
|
37
|
-
}
|
|
38
|
-
return acc;
|
|
39
|
-
}, []);
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
const storages = Array.isArray(configStorages)
|
|
43
|
-
? configStorages
|
|
44
|
-
: [configStorages];
|
|
45
|
-
|
|
46
|
-
/*
|
|
47
|
-
order matters, as the first storage in the list has the highest priority
|
|
48
|
-
*/
|
|
49
|
-
if (storages.includes(PersistedStorageType.Route)) {
|
|
50
|
-
const { setItem, getItem, removeItem } = useRoutePersistedStorage();
|
|
51
|
-
setItemFns.push(setItem);
|
|
52
|
-
getItemFns.push(getItem);
|
|
53
|
-
removeItemFns.push(removeItem);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
if (storages.includes(PersistedStorageType.LocalStorage)) {
|
|
57
|
-
const { setItem, getItem, removeItem } = useLocalStoragePersistedStorage({
|
|
58
|
-
storagePath,
|
|
59
|
-
});
|
|
60
|
-
setItemFns.push(setItem);
|
|
61
|
-
getItemFns.push(getItem);
|
|
62
|
-
removeItemFns.push(removeItem);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const startWatch = () => {
|
|
66
|
-
unwatch = watch(
|
|
67
|
-
value,
|
|
68
|
-
async () => {
|
|
69
|
-
/*
|
|
70
|
-
if onStore callback is provided,
|
|
71
|
-
call custom logic for storing value
|
|
72
|
-
*/
|
|
73
|
-
if (onStore) {
|
|
74
|
-
/*
|
|
75
|
-
wrap all setItemFns in one callback
|
|
76
|
-
so that onStore is called only once on each value change
|
|
77
|
-
*/
|
|
78
|
-
const save = async ({ name, value: storedValue }) => {
|
|
79
|
-
setItemFns.forEach((setter) => {
|
|
80
|
-
setter(name, storedValue);
|
|
81
|
-
});
|
|
82
|
-
};
|
|
83
|
-
await onStore(save, { name, value });
|
|
84
|
-
} else {
|
|
85
|
-
/*
|
|
86
|
-
else, perform default storing logic
|
|
87
|
-
*/
|
|
88
|
-
const storedValue = value.value;
|
|
89
|
-
setItemFns.forEach((setter) => {
|
|
90
|
-
setter(name, storedValue);
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
},
|
|
94
|
-
{ deep: true },
|
|
95
|
-
);
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
const restore = async () => {
|
|
99
|
-
/*
|
|
100
|
-
if onRestore callback is provided,
|
|
101
|
-
call custom logic for restoring value
|
|
102
|
-
*/
|
|
103
|
-
if (onRestore) {
|
|
104
|
-
/*
|
|
105
|
-
wrap all getItemFns in one callback
|
|
106
|
-
so that onRestore is called only once on each value change
|
|
107
|
-
*/
|
|
108
|
-
const restore = async (name: string) => {
|
|
109
|
-
const restoredValues = await composedValueGetter(name);
|
|
110
|
-
/*
|
|
111
|
-
not sure if value to restore should be picked automatically
|
|
112
|
-
before running onRestore
|
|
113
|
-
*/
|
|
114
|
-
return restoredValues.find((value) => {
|
|
115
|
-
return value != null;
|
|
116
|
-
});
|
|
117
|
-
};
|
|
118
|
-
await onRestore(restore, name);
|
|
119
|
-
} else {
|
|
120
|
-
/*
|
|
121
|
-
else, perform default restoring logic
|
|
122
|
-
*/
|
|
123
|
-
const restoredValues = await composedValueGetter(name);
|
|
124
|
-
const restoredValue = restoredValues.find((value) => value !== null);
|
|
125
|
-
|
|
126
|
-
if (restoredValue !== undefined) {
|
|
127
|
-
value.value = restoredValue;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
/*
|
|
131
|
-
start watching after restoring value to prevent restored value
|
|
132
|
-
from storing again
|
|
133
|
-
*/
|
|
134
|
-
if (!startWatchManually) {
|
|
135
|
-
startWatch();
|
|
136
|
-
}
|
|
137
|
-
};
|
|
138
|
-
|
|
139
|
-
const reset = async () => {
|
|
140
|
-
await Promise.all(removeItemFns.map((removeItem) => removeItem(name)));
|
|
141
|
-
};
|
|
142
|
-
|
|
143
|
-
const endWatch = () => unwatch && unwatch();
|
|
144
|
-
|
|
145
|
-
return {
|
|
146
|
-
watch: startWatch,
|
|
147
|
-
unwatch: endWatch,
|
|
148
|
-
restore,
|
|
149
|
-
reset,
|
|
150
|
-
};
|
|
151
|
-
};
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { useRoute, useRouter } from 'vue-router';
|
|
2
|
-
|
|
3
|
-
import { StorageLike } from './PersistedStorage.types.ts';
|
|
4
|
-
|
|
5
|
-
export const useRoutePersistedStorage = (): StorageLike => {
|
|
6
|
-
const router = useRouter();
|
|
7
|
-
const route = useRoute();
|
|
8
|
-
|
|
9
|
-
const getItem = async (key: string) => {
|
|
10
|
-
return route.query[key];
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
const setItem = async (key: string, value: string | string[]) => {
|
|
14
|
-
await router.replace({
|
|
15
|
-
name: route.name,
|
|
16
|
-
params: route.params,
|
|
17
|
-
hash: route.hash,
|
|
18
|
-
query: {
|
|
19
|
-
...route.query,
|
|
20
|
-
[key]: value,
|
|
21
|
-
},
|
|
22
|
-
});
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
const removeItem = async (key: string) => {
|
|
26
|
-
const query = { ...route.query };
|
|
27
|
-
delete query[key];
|
|
28
|
-
await router.replace({
|
|
29
|
-
name: route.name,
|
|
30
|
-
params: route.params,
|
|
31
|
-
hash: route.hash,
|
|
32
|
-
query,
|
|
33
|
-
});
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
return {
|
|
37
|
-
getItem,
|
|
38
|
-
setItem,
|
|
39
|
-
removeItem,
|
|
40
|
-
};
|
|
41
|
-
};
|