@webitel/ui-sdk 24.6.4 → 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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webitel/ui-sdk",
3
- "version": "24.6.4",
3
+ "version": "24.6.6",
4
4
  "private": false,
5
5
  "scripts": {
6
6
  "dev": "vite",
@@ -1,15 +1,23 @@
1
- import { valueSetter, querySetter, localStorageSetter } from '../scripts/setters';
2
- import { queryRestore, localStorageRestore } from '../scripts/restores';
3
- import { valueGetter, queryGetter, localStorageGetter } from '../scripts/getters';
4
-
5
- const convertGetterArray = (context) => (router) => (getters) => {
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) => (router) => (setters) => {
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) => (router) => (restores) => {
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
- get,
78
- set,
79
- restore,
80
- router, // is required for query get/set, if getters/setters are passed as strings
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
- get,
94
- set,
95
- restore,
96
+ defaultValue,
96
97
  }, rest);
97
98
 
98
- this.setupGetters(get, { router });
99
- this.setupSetters(set, { router });
100
- this.setupRestores(restore, { router });
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, { router }) {
106
+ setupGetters(getters) {
106
107
  let getter;
107
108
 
108
109
  if (Array.isArray(getters)) {
109
- getter = convertGetterArray(this)(router)(getters);
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, { router }) {
122
+ setupSetters(setters) {
120
123
  let setter;
121
124
 
122
125
  if (Array.isArray(setters)) {
123
- setter = convertSetterArray(this)(router)(setters);
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, { router }) {
138
+ setupRestores(restores) {
134
139
  let restore;
135
140
 
136
141
  if (Array.isArray(restores)) {
137
- restore = convertRestoreArray(this)(router)(restores);
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
- return router.currentRoute.value.query[context.name];
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
- if (deepEqual(router.currentRoute.value.query[filterQuery], value)) return;
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
- ...router.currentRoute.value.query,
10
+ ...query,
8
11
  [filterQuery]: value,
9
12
  };
10
13
 
11
14
  return router.replace({
12
- name: router.currentRoute.value.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
- this.state[filter.name] = new BaseFilterSchema(filter);
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
  },
@@ -24,6 +24,10 @@ export const useTableStore = (namespace) => {
24
24
  return store.dispatch(`${tableNamespace}/LOAD_DATA_LIST`, payload);
25
25
  }
26
26
 
27
+ function onFilterEvent(payload) {
28
+ return store.dispatch(`${tableNamespace}/ON_FILTER_EVENT`, payload);
29
+ }
30
+
27
31
  function patchProperty(payload) {
28
32
  return store.dispatch(`${tableNamespace}/PATCH_ITEM_PROPERTY`, payload);
29
33
  }
@@ -54,6 +58,7 @@ export const useTableStore = (namespace) => {
54
58
  error,
55
59
 
56
60
  loadData,
61
+ onFilterEvent,
57
62
  patchProperty,
58
63
  deleteData,
59
64
  sort,
@@ -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