@webitel/ui-sdk 24.6.5 → 24.6.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ui-sdk.mjs +1 -1
- package/dist/ui-sdk.umd.js +1 -1
- package/package.json +1 -1
- package/src/modules/Filters/classes/BaseFilterSchema.js +39 -32
- package/src/modules/Filters/scripts/getters/queryGetter.js +3 -2
- package/src/modules/Filters/scripts/utils/changeRouteQuery.js +6 -3
- package/src/modules/Filters/store/FiltersStoreModule.js +22 -4
- package/src/modules/Filters/store/__tests__/FiltersStoreModule.spec.js +15 -2
- package/src/modules/TableStoreModule/store/__tests__/TableStoreModule.spec.js +11 -0
package/package.json
CHANGED
|
@@ -1,15 +1,23 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import {
|
|
2
|
+
localStorageGetter,
|
|
3
|
+
queryGetter,
|
|
4
|
+
valueGetter,
|
|
5
|
+
} from '../scripts/getters';
|
|
6
|
+
import { localStorageRestore, queryRestore } from '../scripts/restores';
|
|
7
|
+
import {
|
|
8
|
+
localStorageSetter,
|
|
9
|
+
querySetter,
|
|
10
|
+
valueSetter,
|
|
11
|
+
} from '../scripts/setters';
|
|
12
|
+
|
|
13
|
+
const convertGetterArray = (context) => (getters) => {
|
|
6
14
|
const availableGetters = ['value', 'query', 'localStorage'];
|
|
7
15
|
|
|
8
16
|
getters.forEach((getter) => {
|
|
9
17
|
if (!availableGetters.includes(getter)) throw new Error(`Unknown getter: ${getter}`);
|
|
10
18
|
});
|
|
11
19
|
|
|
12
|
-
const getter = () => {
|
|
20
|
+
const getter = ({ router }) => {
|
|
13
21
|
if (getters.includes('value')) {
|
|
14
22
|
const value = valueGetter(context)();
|
|
15
23
|
if (value) return value;
|
|
@@ -31,13 +39,13 @@ const convertGetterArray = (context) => (router) => (getters) => {
|
|
|
31
39
|
return getter;
|
|
32
40
|
};
|
|
33
41
|
|
|
34
|
-
const convertSetterArray = (context) => (
|
|
42
|
+
const convertSetterArray = (context) => (setters) => {
|
|
35
43
|
const availableSetters = ['value', 'query', 'localStorage'];
|
|
36
44
|
setters.forEach((setter) => {
|
|
37
45
|
if (!availableSetters.includes(setter)) throw new Error(`Unknown setter: ${setter}`);
|
|
38
46
|
});
|
|
39
47
|
|
|
40
|
-
const setter = async (value) => {
|
|
48
|
+
const setter = async (value, { router }) => {
|
|
41
49
|
if (setters.includes('value')) valueSetter(context)(value);
|
|
42
50
|
if (setters.includes('query')) await querySetter(context)(router)(value);
|
|
43
51
|
if (setters.includes('localStorage')) localStorageSetter(context)(value);
|
|
@@ -48,14 +56,14 @@ const convertSetterArray = (context) => (router) => (setters) => {
|
|
|
48
56
|
return setter;
|
|
49
57
|
};
|
|
50
58
|
|
|
51
|
-
const convertRestoreArray = (context) => (
|
|
59
|
+
const convertRestoreArray = (context) => (restores) => {
|
|
52
60
|
const availableRestores = ['query', 'localStorage'];
|
|
53
61
|
|
|
54
62
|
restores.forEach((restore) => {
|
|
55
63
|
if (!availableRestores.includes(restore)) throw new Error(`Unknown restore: ${restore}`);
|
|
56
64
|
});
|
|
57
65
|
|
|
58
|
-
const restore = () => {
|
|
66
|
+
const restore = ({ router }) => {
|
|
59
67
|
if (restores.includes('query')) {
|
|
60
68
|
const restoredValue = queryRestore(context)(router)();
|
|
61
69
|
if (restoredValue) return restoredValue;
|
|
@@ -73,40 +81,35 @@ const convertRestoreArray = (context) => (router) => (restores) => {
|
|
|
73
81
|
export default class BaseFilterSchema {
|
|
74
82
|
constructor({
|
|
75
83
|
name,
|
|
76
|
-
value,
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
84
|
+
value = '',
|
|
85
|
+
defaultValue = '',
|
|
86
|
+
get = ['value', 'query'],
|
|
87
|
+
set = ['value', 'query'],
|
|
88
|
+
restore = ['query'],
|
|
81
89
|
...rest
|
|
82
90
|
} = {}) {
|
|
83
91
|
if (!name) throw new Error('Filter name is required');
|
|
84
|
-
if (value === undefined) throw new Error(`Filter value is required: ${name}`);
|
|
85
|
-
|
|
86
|
-
if (!get) throw new Error(`Filter getter is required: ${name}`);
|
|
87
|
-
if (!set) throw new Error(`Filter setter is required: ${name}`);
|
|
88
|
-
if (!restore) throw new Error(`Filter restore is required: ${name}`);
|
|
89
92
|
|
|
90
93
|
Object.assign(this, {
|
|
91
94
|
name,
|
|
92
95
|
value,
|
|
93
|
-
|
|
94
|
-
set,
|
|
95
|
-
restore,
|
|
96
|
+
defaultValue,
|
|
96
97
|
}, rest);
|
|
97
98
|
|
|
98
|
-
this.setupGetters(get
|
|
99
|
-
this.setupSetters(set
|
|
100
|
-
this.setupRestores(restore
|
|
99
|
+
this.setupGetters(get);
|
|
100
|
+
this.setupSetters(set);
|
|
101
|
+
this.setupRestores(restore);
|
|
101
102
|
|
|
102
103
|
return this;
|
|
103
104
|
}
|
|
104
105
|
|
|
105
|
-
setupGetters(getters
|
|
106
|
+
setupGetters(getters) {
|
|
106
107
|
let getter;
|
|
107
108
|
|
|
108
109
|
if (Array.isArray(getters)) {
|
|
109
|
-
|
|
110
|
+
if (getters.includes('query')) this.requireRouter = true;
|
|
111
|
+
|
|
112
|
+
getter = convertGetterArray(this)(getters);
|
|
110
113
|
} else if (typeof getters === 'function') {
|
|
111
114
|
getter = getters(this);
|
|
112
115
|
} else {
|
|
@@ -116,11 +119,13 @@ export default class BaseFilterSchema {
|
|
|
116
119
|
this.get = getter;
|
|
117
120
|
}
|
|
118
121
|
|
|
119
|
-
setupSetters(setters
|
|
122
|
+
setupSetters(setters) {
|
|
120
123
|
let setter;
|
|
121
124
|
|
|
122
125
|
if (Array.isArray(setters)) {
|
|
123
|
-
|
|
126
|
+
if (setters.includes('query')) this.requireRouter = true;
|
|
127
|
+
|
|
128
|
+
setter = convertSetterArray(this)(setters);
|
|
124
129
|
} else if (typeof setters === 'function') {
|
|
125
130
|
setter = setters(this);
|
|
126
131
|
} else {
|
|
@@ -130,11 +135,13 @@ export default class BaseFilterSchema {
|
|
|
130
135
|
this.set = setter;
|
|
131
136
|
}
|
|
132
137
|
|
|
133
|
-
setupRestores(restores
|
|
138
|
+
setupRestores(restores) {
|
|
134
139
|
let restore;
|
|
135
140
|
|
|
136
141
|
if (Array.isArray(restores)) {
|
|
137
|
-
|
|
142
|
+
if (restores.includes('query')) this.requireRouter = true;
|
|
143
|
+
|
|
144
|
+
restore = convertRestoreArray(this)(restores);
|
|
138
145
|
} else if (typeof restores === 'function') {
|
|
139
146
|
restore = restores(this);
|
|
140
147
|
} else {
|
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
// context === filter "this"
|
|
3
3
|
const queryGetter = (context) => (router) => () => {
|
|
4
4
|
if (!router) throw new Error('Router is required for queryGetter!');
|
|
5
|
-
if (!router) throw new Error('Router is required for queryGetter!');
|
|
6
5
|
|
|
7
|
-
|
|
6
|
+
const query = router.currentRoute.value?.query || router.currentRoute.query || {};
|
|
7
|
+
|
|
8
|
+
return query[context.name];
|
|
8
9
|
};
|
|
9
10
|
|
|
10
11
|
export default queryGetter;
|
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
import deepEqual from 'deep-equal';
|
|
2
2
|
|
|
3
3
|
const changeRouteQuery = (router) => ({ filterQuery, value }) => {
|
|
4
|
-
|
|
4
|
+
const name = router.currentRoute?.value?.name || router.currentRoute?.name;
|
|
5
|
+
const query = router.currentRoute?.value?.query || router.currentRoute?.query || {};
|
|
6
|
+
|
|
7
|
+
if (deepEqual(query[filterQuery], value)) return;
|
|
5
8
|
|
|
6
9
|
const newQuery = {
|
|
7
|
-
...
|
|
10
|
+
...query,
|
|
8
11
|
[filterQuery]: value,
|
|
9
12
|
};
|
|
10
13
|
|
|
11
14
|
return router.replace({
|
|
12
|
-
name
|
|
15
|
+
name,
|
|
13
16
|
query: newQuery,
|
|
14
17
|
});
|
|
15
18
|
};
|
|
@@ -7,9 +7,19 @@ import FilterEvent from '../enums/FilterEvent.enum';
|
|
|
7
7
|
export default class FiltersStoreModule extends BaseStoreModule {
|
|
8
8
|
state = {
|
|
9
9
|
_emitter: mitt(),
|
|
10
|
+
_requireRouter: false,
|
|
10
11
|
};
|
|
11
12
|
|
|
12
13
|
getters = {
|
|
14
|
+
ROUTER: (state, g, rootState) => {
|
|
15
|
+
if (!state._requireRouter) return null;
|
|
16
|
+
if (rootState.router === undefined) {
|
|
17
|
+
throw new Error('"rootState.router" is needed for filters to work properly.' +
|
|
18
|
+
' Please, provide to root state, or setup it in filters module as getter "ROUTER"');
|
|
19
|
+
}
|
|
20
|
+
return rootState.router;
|
|
21
|
+
},
|
|
22
|
+
|
|
13
23
|
_STATE_FILTER_NAMES: (state) => Object.keys(state)
|
|
14
24
|
.filter((key) => !key.startsWith('_')),
|
|
15
25
|
|
|
@@ -18,7 +28,9 @@ export default class FiltersStoreModule extends BaseStoreModule {
|
|
|
18
28
|
const filter = state[filterName];
|
|
19
29
|
if (!filter) throw new Error(`Unknown filter: ${filterName}`);
|
|
20
30
|
|
|
21
|
-
return filter.get(
|
|
31
|
+
return filter.get({
|
|
32
|
+
router: this.getters.ROUTER,
|
|
33
|
+
});
|
|
22
34
|
},
|
|
23
35
|
|
|
24
36
|
// get all filters values
|
|
@@ -40,7 +52,9 @@ export default class FiltersStoreModule extends BaseStoreModule {
|
|
|
40
52
|
}) => {
|
|
41
53
|
const filter = context.state[name];
|
|
42
54
|
|
|
43
|
-
await filter.set(value
|
|
55
|
+
await filter.set(value, {
|
|
56
|
+
router: context.getters.ROUTER,
|
|
57
|
+
});
|
|
44
58
|
|
|
45
59
|
if (!silent) await context.dispatch('EMIT', {
|
|
46
60
|
event: FilterEvent.FILTER_SET,
|
|
@@ -53,7 +67,9 @@ export default class FiltersStoreModule extends BaseStoreModule {
|
|
|
53
67
|
|
|
54
68
|
RESTORE_FILTER: async (context, { name }) => {
|
|
55
69
|
const filter = context.state[name];
|
|
56
|
-
const value = filter.restore(
|
|
70
|
+
const value = filter.restore({
|
|
71
|
+
router: context.getters.ROUTER,
|
|
72
|
+
});
|
|
57
73
|
|
|
58
74
|
if (value) {
|
|
59
75
|
await context.dispatch('SET_FILTER', ({
|
|
@@ -119,7 +135,9 @@ export default class FiltersStoreModule extends BaseStoreModule {
|
|
|
119
135
|
|
|
120
136
|
addFilter(filter) {
|
|
121
137
|
const setup = (filter) => {
|
|
122
|
-
|
|
138
|
+
const stateFilter = new BaseFilterSchema(filter);
|
|
139
|
+
if (stateFilter.requireRouter) this.state._requireRouter = true;
|
|
140
|
+
this.state[filter.name] = stateFilter;
|
|
123
141
|
};
|
|
124
142
|
|
|
125
143
|
if (Array.isArray(filter)) filter.forEach((f) => setup(f));
|
|
@@ -19,6 +19,9 @@ describe('FiltersStoreModule', () => {
|
|
|
19
19
|
]).getModule();
|
|
20
20
|
|
|
21
21
|
const store = createStore({
|
|
22
|
+
state: {
|
|
23
|
+
router: null,
|
|
24
|
+
},
|
|
22
25
|
modules: {
|
|
23
26
|
filters,
|
|
24
27
|
},
|
|
@@ -49,6 +52,9 @@ describe('FiltersStoreModule', () => {
|
|
|
49
52
|
.getModule();
|
|
50
53
|
|
|
51
54
|
const store = createStore({
|
|
55
|
+
state: {
|
|
56
|
+
router: null,
|
|
57
|
+
},
|
|
52
58
|
modules: {
|
|
53
59
|
filters,
|
|
54
60
|
},
|
|
@@ -84,21 +90,25 @@ describe('FiltersStoreModule', () => {
|
|
|
84
90
|
.addFilter({
|
|
85
91
|
name: 'vi',
|
|
86
92
|
value: 1,
|
|
93
|
+
requireRouter: true,
|
|
87
94
|
get: (context) => () => {
|
|
88
95
|
return valueGetter(context)();
|
|
89
96
|
},
|
|
90
|
-
set: (context) => async (v) => {
|
|
97
|
+
set: (context) => async (v, { router }) => {
|
|
91
98
|
valueSetter(context)(v);
|
|
92
99
|
await querySetter(context)(router)(v);
|
|
93
100
|
return context;
|
|
94
101
|
},
|
|
95
|
-
restore: (context) => () => {
|
|
102
|
+
restore: (context) => ({ router }) => {
|
|
96
103
|
return queryRestore(context)(router)();
|
|
97
104
|
},
|
|
98
105
|
})
|
|
99
106
|
.getModule();
|
|
100
107
|
|
|
101
108
|
const store = createStore({
|
|
109
|
+
state: {
|
|
110
|
+
router,
|
|
111
|
+
},
|
|
102
112
|
modules: {
|
|
103
113
|
filters,
|
|
104
114
|
},
|
|
@@ -140,6 +150,9 @@ describe('FiltersStoreModule', () => {
|
|
|
140
150
|
.getModule();
|
|
141
151
|
|
|
142
152
|
const store = createStore({
|
|
153
|
+
state: {
|
|
154
|
+
router,
|
|
155
|
+
},
|
|
143
156
|
modules: {
|
|
144
157
|
filters,
|
|
145
158
|
},
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { createRouter, createWebHistory } from 'vue-router';
|
|
1
2
|
import { createStore } from 'vuex';
|
|
2
3
|
import { SortSymbols } from '../../../../scripts/sortQueryAdapters';
|
|
3
4
|
import FilterEvent from '../../../Filters/enums/FilterEvent.enum';
|
|
@@ -20,6 +21,11 @@ describe('TableStoreModule', () => {
|
|
|
20
21
|
});
|
|
21
22
|
|
|
22
23
|
describe('TableStoreModule integration with FiltersStoreModule', () => {
|
|
24
|
+
const router = createRouter({
|
|
25
|
+
history: createWebHistory(),
|
|
26
|
+
routes: [],
|
|
27
|
+
});
|
|
28
|
+
|
|
23
29
|
it('filters restore event triggers LOAD_DATA_LIST', async () => {
|
|
24
30
|
const filters = new FiltersStoreModule()
|
|
25
31
|
.addFilter({
|
|
@@ -42,6 +48,7 @@ describe('TableStoreModule integration with FiltersStoreModule', () => {
|
|
|
42
48
|
.mockImplementationOnce(mock);
|
|
43
49
|
|
|
44
50
|
const store = createStore({
|
|
51
|
+
state: { router },
|
|
45
52
|
modules: { table },
|
|
46
53
|
});
|
|
47
54
|
|
|
@@ -79,6 +86,7 @@ describe('TableStoreModule integration with FiltersStoreModule', () => {
|
|
|
79
86
|
.mockImplementationOnce(mock);
|
|
80
87
|
|
|
81
88
|
const store = createStore({
|
|
89
|
+
state: { router },
|
|
82
90
|
modules: { table },
|
|
83
91
|
});
|
|
84
92
|
|
|
@@ -130,6 +138,7 @@ describe('TableStoreModule integration with FiltersStoreModule', () => {
|
|
|
130
138
|
.mockImplementationOnce(vi.fn());
|
|
131
139
|
|
|
132
140
|
const store = createStore({
|
|
141
|
+
state: { router },
|
|
133
142
|
modules: { table },
|
|
134
143
|
});
|
|
135
144
|
|
|
@@ -174,6 +183,7 @@ describe('TableStoreModule integration with FiltersStoreModule', () => {
|
|
|
174
183
|
.mockImplementationOnce(vi.fn());
|
|
175
184
|
|
|
176
185
|
const store = createStore({
|
|
186
|
+
state: { router },
|
|
177
187
|
modules: { table },
|
|
178
188
|
});
|
|
179
189
|
|
|
@@ -219,6 +229,7 @@ describe('TableStoreModule integration with FiltersStoreModule', () => {
|
|
|
219
229
|
.mockImplementationOnce(vi.fn());
|
|
220
230
|
|
|
221
231
|
const store = createStore({
|
|
232
|
+
state: { router },
|
|
222
233
|
modules: { table },
|
|
223
234
|
});
|
|
224
235
|
|