@webitel/ui-sdk 0.9.55 → 0.9.59
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.common.js +67 -52
- package/dist/ui-sdk.common.js.map +1 -1
- package/dist/ui-sdk.css +1 -1
- package/dist/ui-sdk.umd.js +67 -52
- package/dist/ui-sdk.umd.js.map +1 -1
- package/dist/ui-sdk.umd.min.js +1 -1
- package/dist/ui-sdk.umd.min.js.map +1 -1
- package/package.json +1 -1
- package/src/components/organisms/wt-player/wt-player.vue +20 -5
- package/src/css/components/molecules/wt-datepicker/_variables.scss +2 -2
- package/src/css/components/molecules/wt-datepicker/datepicker-calendar.scss +2 -1
- package/src/css/components/organisms/wt-player/_variables.scss +3 -1
- package/src/locale/ru/ru.js +1 -1
- package/src/locale/ua/ua.js +1 -1
- package/src/modules/QueryFilters/components/__tests__/filter-pagination.spec.js +71 -0
- package/src/modules/QueryFilters/components/__tests__/filter-search.spec.js +23 -28
- package/src/modules/QueryFilters/components/filter-pagination.vue +110 -0
- package/src/modules/QueryFilters/components/filter-search.vue +1 -1
- package/src/modules/QueryFilters/mixins/__tests__/apiFilterMixin.spec.js +15 -14
- package/src/modules/QueryFilters/mixins/__tests__/enumFilterMixin.spec.js +50 -35
- package/src/modules/QueryFilters/mixins/__tests__/sortFilterMixin.spec.js +16 -11
- package/src/modules/QueryFilters/mixins/baseFilterMixin/baseFilterMixin.js +8 -2
- package/src/modules/QueryFilters/mixins/enumFilterMixin.js +11 -9
- package/src/modules/QueryFilters/store/QueryControllerStoreModule.js +60 -0
- package/src/modules/QueryFilters/store/QueryFiltersStoreModule.js +5 -0
- package/src/modules/QueryFilters/store/__tests__/QueryControllerStoreModule.spec.js +42 -0
- package/src/modules/QueryFilters/api/__tests__/defaults.spec.js +0 -18
- package/src/modules/QueryFilters/api/defaults.js +0 -16
- package/src/modules/QueryFilters/mixins/__tests__/paginationFilterMixin.spec.js +0 -74
- package/src/modules/QueryFilters/mixins/__tests__/urlControllerMixin.spec.js +0 -48
- package/src/modules/QueryFilters/mixins/_urlControllerMixin/_urlControllerMixin.js +0 -39
- package/src/modules/QueryFilters/mixins/paginationFilterMixin.js +0 -66
- package/src/modules/QueryFilters/store/queryFilters.js +0 -6
|
@@ -31,16 +31,18 @@ export default {
|
|
|
31
31
|
},
|
|
32
32
|
methods: {
|
|
33
33
|
restoreValue(value) {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
34
|
+
if (value && value.length) {
|
|
35
|
+
let newValue;
|
|
36
|
+
if (Array.isArray(value)) {
|
|
37
|
+
newValue = this.localizedOptions
|
|
38
|
+
.filter((option) => value
|
|
39
|
+
.some((value) => value === option[this.storedProp]));
|
|
40
|
+
} else {
|
|
41
|
+
newValue = this.localizedOptions
|
|
42
|
+
.find((option) => value === option[this.storedProp]);
|
|
43
|
+
}
|
|
44
|
+
this.setValue({ filter: this.filterQuery, value: newValue });
|
|
42
45
|
}
|
|
43
|
-
this.setValue({ filter: this.filterQuery, value: newValue });
|
|
44
46
|
},
|
|
45
47
|
},
|
|
46
48
|
};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import deepEqual from 'deep-equal';
|
|
2
|
+
import BaseStoreModule from '../../../store/BaseStoreModules/BaseStoreModule';
|
|
3
|
+
|
|
4
|
+
export default class QueryControllerStoreModule extends BaseStoreModule {
|
|
5
|
+
actions = {
|
|
6
|
+
// OVERRIDE ME
|
|
7
|
+
BEFORE_CHANGE_ROUTE_QUERY_HOOK: (context, { query }) => query,
|
|
8
|
+
// OVERRIDE ME
|
|
9
|
+
AFTER_CHANGE_ROUTE_QUERY_HOOK: (context, { query }) => query,
|
|
10
|
+
_CHANGE_ROUTE_QUERY: async (context, { filterQuery, value }) => {
|
|
11
|
+
try {
|
|
12
|
+
const { router } = context.state;
|
|
13
|
+
let query = { ...router.currentRoute.query };
|
|
14
|
+
query[filterQuery] = value;
|
|
15
|
+
query = await context.dispatch('BEFORE_CHANGE_ROUTE_QUERY_HOOK', { query });
|
|
16
|
+
await router.replace({
|
|
17
|
+
name: router.currentRoute.name,
|
|
18
|
+
query,
|
|
19
|
+
});
|
|
20
|
+
await context.dispatch('AFTER_CHANGE_ROUTE_QUERY_HOOK', { query });
|
|
21
|
+
} catch (err) {
|
|
22
|
+
throw err;
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
SET_VALUE_TO_QUERY: async (
|
|
26
|
+
context,
|
|
27
|
+
{ filterQuery, value, storedProp = 'id' },
|
|
28
|
+
) => {
|
|
29
|
+
try {
|
|
30
|
+
let newValue = '';
|
|
31
|
+
if (Array.isArray(value)) {
|
|
32
|
+
if (value.length && typeof value[0] !== 'object') {
|
|
33
|
+
newValue = value;
|
|
34
|
+
} else {
|
|
35
|
+
newValue = value.map((item) => item[storedProp]);
|
|
36
|
+
}
|
|
37
|
+
} else if (typeof value === 'object' && value !== null) {
|
|
38
|
+
newValue = value[storedProp];
|
|
39
|
+
} else {
|
|
40
|
+
newValue = value;
|
|
41
|
+
}
|
|
42
|
+
if (!deepEqual(context.state.router.currentRoute.query[filterQuery], newValue)) {
|
|
43
|
+
await context.dispatch('_CHANGE_ROUTE_QUERY', {
|
|
44
|
+
value: newValue,
|
|
45
|
+
filterQuery,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
} catch (err) {
|
|
49
|
+
throw err;
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
GET_VALUE_FROM_QUERY: (context, { filterQuery }) => context.state.router.currentRoute.query[filterQuery],
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
constructor({ router } = {}) {
|
|
56
|
+
super();
|
|
57
|
+
if (!router) throw new Error('Pass router object to QueryController Store Module');
|
|
58
|
+
this.state.router = router;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -43,6 +43,11 @@ export default class QueryFiltersStoreModule extends BaseStoreModule {
|
|
|
43
43
|
},
|
|
44
44
|
};
|
|
45
45
|
|
|
46
|
+
generateQueryControllerActions(controllerNamespace) {
|
|
47
|
+
this.actions.SET_VALUE_TO_QUERY = (context, payload) => context.dispatch(`${controllerNamespace}/SET_VALUE_TO_QUERY`, payload, { root: true });
|
|
48
|
+
this.actions.GET_VALUE_FROM_QUERY = (context, payload) => context.dispatch(`${controllerNamespace}/GET_VALUE_FROM_QUERY`, payload, { root: true });
|
|
49
|
+
}
|
|
50
|
+
|
|
46
51
|
constructor({ state = {} } = {}) {
|
|
47
52
|
super();
|
|
48
53
|
this.state = state;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { createLocalVue } from '@vue/test-utils';
|
|
2
|
+
import VueRouter from 'vue-router';
|
|
3
|
+
import Vuex from 'vuex';
|
|
4
|
+
import QueryContrllerStoreModule from '../QueryControllerStoreModule';
|
|
5
|
+
|
|
6
|
+
const localVue = createLocalVue();
|
|
7
|
+
localVue.use(Vuex);
|
|
8
|
+
localVue.use(VueRouter);
|
|
9
|
+
const router = new VueRouter();
|
|
10
|
+
|
|
11
|
+
const filterQuery = 'team';
|
|
12
|
+
|
|
13
|
+
describe('Query Controller Store Module Actions', () => {
|
|
14
|
+
const store = new Vuex.Store({
|
|
15
|
+
...new QueryContrllerStoreModule({ router }).getModule(),
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
beforeEach(() => {
|
|
19
|
+
router.replace('/');
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it('Array of objects', async () => {
|
|
23
|
+
const value = [{ name: 'team 1', id: '1' }, { name: 'team 2', id: '2' }];
|
|
24
|
+
await store.dispatch('SET_VALUE_TO_QUERY', { filterQuery, value });
|
|
25
|
+
const queryValue = await store.dispatch('GET_VALUE_FROM_QUERY', { filterQuery });
|
|
26
|
+
expect(queryValue).toEqual(['1', '2']);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('Array of values', async () => {
|
|
30
|
+
const value = ['hello', '1'];
|
|
31
|
+
await store.dispatch('SET_VALUE_TO_QUERY', { filterQuery, value });
|
|
32
|
+
const queryValue = await store.dispatch('GET_VALUE_FROM_QUERY', { filterQuery });
|
|
33
|
+
expect(queryValue).toEqual(value);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('String value', async () => {
|
|
37
|
+
const value = 'hello there';
|
|
38
|
+
await store.dispatch('SET_VALUE_TO_QUERY', { filterQuery, value });
|
|
39
|
+
const queryValue = await store.dispatch('GET_VALUE_FROM_QUERY', { filterQuery });
|
|
40
|
+
expect(queryValue).toEqual(value);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { listResponseHandler } from '../defaults';
|
|
2
|
-
|
|
3
|
-
describe('filter api Defaults', () => {
|
|
4
|
-
it('listResponseHandler returns only lookups from response', () => {
|
|
5
|
-
const response = {
|
|
6
|
-
items: [
|
|
7
|
-
{ name: 'jest1', id: 1, myField: '1' },
|
|
8
|
-
{ name: 'jest2', id: 2, obj: [] },
|
|
9
|
-
],
|
|
10
|
-
next: true,
|
|
11
|
-
};
|
|
12
|
-
const expectedResult = [
|
|
13
|
-
{ name: 'jest1', id: 1 },
|
|
14
|
-
{ name: 'jest2', id: 2 },
|
|
15
|
-
];
|
|
16
|
-
expect(listResponseHandler(response)).toEqual(expectedResult);
|
|
17
|
-
});
|
|
18
|
-
});
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
const PAGE = 1;
|
|
2
|
-
const SIZE = 20;
|
|
3
|
-
const FIELDS = ['id', 'name'];
|
|
4
|
-
|
|
5
|
-
export const defaultParams = {
|
|
6
|
-
page: PAGE,
|
|
7
|
-
size: SIZE,
|
|
8
|
-
fields: FIELDS,
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
export const listResponseHandler = (response) => (
|
|
12
|
-
response.items.map((item) => ({
|
|
13
|
-
name: item.name,
|
|
14
|
-
id: item.id,
|
|
15
|
-
}))
|
|
16
|
-
);
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import { createLocalVue, shallowMount } from '@vue/test-utils';
|
|
2
|
-
import VueRouter from 'vue-router';
|
|
3
|
-
import paginationFilterMixin from '../paginationFilterMixin';
|
|
4
|
-
|
|
5
|
-
const localVue = createLocalVue();
|
|
6
|
-
localVue.use(VueRouter);
|
|
7
|
-
const router = new VueRouter();
|
|
8
|
-
const page = 2;
|
|
9
|
-
const size = 20;
|
|
10
|
-
|
|
11
|
-
describe('Pagination filter mixin', () => {
|
|
12
|
-
const setPage = jest.fn();
|
|
13
|
-
const setSize = jest.fn();
|
|
14
|
-
let wrapper;
|
|
15
|
-
const Component = {
|
|
16
|
-
render() {},
|
|
17
|
-
mixins: [paginationFilterMixin],
|
|
18
|
-
data: () => ({ page, size }),
|
|
19
|
-
methods: { setPage, setSize },
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
beforeEach(() => {
|
|
23
|
-
setPage.mockClear();
|
|
24
|
-
setSize.mockClear();
|
|
25
|
-
if (Object.keys(router.currentRoute.query).length) router.replace({ query: null });
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
it('Correctly sets value from $route query', async () => {
|
|
29
|
-
await router.replace({ query: { page, size } });
|
|
30
|
-
wrapper = shallowMount(Component, {
|
|
31
|
-
localVue,
|
|
32
|
-
router,
|
|
33
|
-
});
|
|
34
|
-
expect(setPage).toHaveBeenCalledWith(page);
|
|
35
|
-
expect(setSize).toHaveBeenCalledWith(size);
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it('At "prev" page, changes query and emits event', async () => {
|
|
39
|
-
await router.replace({ query: { page, size } });
|
|
40
|
-
wrapper = shallowMount(Component, {
|
|
41
|
-
localVue,
|
|
42
|
-
router,
|
|
43
|
-
});
|
|
44
|
-
wrapper._emitted.input = []; // reset emitted events
|
|
45
|
-
wrapper.vm.prev();
|
|
46
|
-
expect(wrapper.emitted().input).toBeTruthy();
|
|
47
|
-
expect(wrapper.vm.$route.query.page).toBe(`${page - 1}`);
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
it('At "next" page, changes query and emits event', async () => {
|
|
51
|
-
await router.replace({ query: { page, size } });
|
|
52
|
-
wrapper = shallowMount(Component, {
|
|
53
|
-
localVue,
|
|
54
|
-
router,
|
|
55
|
-
});
|
|
56
|
-
wrapper._emitted.input = []; // reset emitted events
|
|
57
|
-
wrapper.vm.next();
|
|
58
|
-
expect(wrapper.emitted().input).toBeTruthy();
|
|
59
|
-
expect(wrapper.vm.$route.query.page).toBe(`${page + 1}`);
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
it('At "sizeChange", changes query and emits event', async () => {
|
|
63
|
-
const newSize = 40;
|
|
64
|
-
await router.replace({ query: { page, size } });
|
|
65
|
-
wrapper = shallowMount(Component, {
|
|
66
|
-
localVue,
|
|
67
|
-
router,
|
|
68
|
-
});
|
|
69
|
-
wrapper._emitted.input = []; // reset emitted events
|
|
70
|
-
wrapper.vm.sizeChange(newSize);
|
|
71
|
-
expect(wrapper.emitted().input).toBeTruthy();
|
|
72
|
-
expect(wrapper.vm.$route.query.size).toBe(`${newSize}`);
|
|
73
|
-
});
|
|
74
|
-
});
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { shallowMount, createLocalVue } from '@vue/test-utils';
|
|
2
|
-
import VueRouter from 'vue-router';
|
|
3
|
-
import _urlControllerMixin from '../_urlControllerMixin/_urlControllerMixin';
|
|
4
|
-
|
|
5
|
-
const localVue = createLocalVue();
|
|
6
|
-
localVue.use(VueRouter);
|
|
7
|
-
const router = new VueRouter();
|
|
8
|
-
|
|
9
|
-
const $t = () => {};
|
|
10
|
-
const filterQuery = 'team';
|
|
11
|
-
|
|
12
|
-
describe('URL Controller mixin Set and Get operations', () => {
|
|
13
|
-
let wrapper;
|
|
14
|
-
const Component = {
|
|
15
|
-
render() {},
|
|
16
|
-
mixins: [_urlControllerMixin],
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
beforeEach(() => {
|
|
20
|
-
router.replace('/');
|
|
21
|
-
wrapper = shallowMount(Component, {
|
|
22
|
-
localVue,
|
|
23
|
-
router,
|
|
24
|
-
mocks: { $t },
|
|
25
|
-
});
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
it('Array of objects', async () => {
|
|
29
|
-
const value = [{ name: 'team 1', id: '1' }, { name: 'team 2', id: '2' }];
|
|
30
|
-
wrapper.vm.setValueToQuery({ filterQuery, value });
|
|
31
|
-
const queryValue = wrapper.vm.getValueFromQuery({ filterQuery });
|
|
32
|
-
expect(queryValue).toEqual(['1', '2']);
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
it('Array of values', async () => {
|
|
36
|
-
const value = ['hello', '1'];
|
|
37
|
-
wrapper.vm.setValueToQuery({ filterQuery, value });
|
|
38
|
-
const queryValue = wrapper.vm.getValueFromQuery({ filterQuery });
|
|
39
|
-
expect(queryValue).toEqual(value);
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
it('String value', async () => {
|
|
43
|
-
const value = 'hello there';
|
|
44
|
-
wrapper.vm.setValueToQuery({ filterQuery, value });
|
|
45
|
-
const queryValue = wrapper.vm.getValueFromQuery({ filterQuery });
|
|
46
|
-
expect(queryValue).toEqual(value);
|
|
47
|
-
});
|
|
48
|
-
});
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import deepEqual from 'deep-equal';
|
|
2
|
-
|
|
3
|
-
export default {
|
|
4
|
-
methods: {
|
|
5
|
-
changeRouteQuery({ filterQuery, value }) {
|
|
6
|
-
const query = { ...this.$route.query };
|
|
7
|
-
query[filterQuery] = value;
|
|
8
|
-
return this.$router.replace({
|
|
9
|
-
name: this.$router.currentRoute.name,
|
|
10
|
-
query,
|
|
11
|
-
});
|
|
12
|
-
},
|
|
13
|
-
|
|
14
|
-
setValueToQuery({ filterQuery, value, storedProp = 'id' }) {
|
|
15
|
-
let newValue = '';
|
|
16
|
-
if (Array.isArray(value)) {
|
|
17
|
-
if (value.length && typeof value[0] !== 'object') {
|
|
18
|
-
newValue = value;
|
|
19
|
-
} else {
|
|
20
|
-
newValue = value.map((item) => item[storedProp]);
|
|
21
|
-
}
|
|
22
|
-
} else if (typeof value === 'object' && value !== null) {
|
|
23
|
-
newValue = value[storedProp];
|
|
24
|
-
} else {
|
|
25
|
-
newValue = value;
|
|
26
|
-
}
|
|
27
|
-
if (!deepEqual(this.$route.query[filterQuery], newValue)) {
|
|
28
|
-
this.changeRouteQuery({
|
|
29
|
-
value: newValue,
|
|
30
|
-
filterQuery,
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
},
|
|
34
|
-
|
|
35
|
-
getValueFromQuery({ filterQuery }) {
|
|
36
|
-
return this.$route.query[filterQuery];
|
|
37
|
-
},
|
|
38
|
-
},
|
|
39
|
-
};
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import baseFilterMixin from './baseFilterMixin/baseFilterMixin';
|
|
2
|
-
|
|
3
|
-
export default {
|
|
4
|
-
mixins: [baseFilterMixin],
|
|
5
|
-
|
|
6
|
-
props: {
|
|
7
|
-
isNext: {
|
|
8
|
-
type: Boolean,
|
|
9
|
-
default: true,
|
|
10
|
-
},
|
|
11
|
-
},
|
|
12
|
-
|
|
13
|
-
computed: {
|
|
14
|
-
isPrev() {
|
|
15
|
-
return this.page > 1;
|
|
16
|
-
},
|
|
17
|
-
},
|
|
18
|
-
|
|
19
|
-
methods: {
|
|
20
|
-
restore() {
|
|
21
|
-
this.restorePage();
|
|
22
|
-
this.restoreSize();
|
|
23
|
-
},
|
|
24
|
-
|
|
25
|
-
restorePage() {
|
|
26
|
-
const defaultPage = 1;
|
|
27
|
-
const value = +this.getValueFromQuery({ filterQuery: 'page' }) || defaultPage;
|
|
28
|
-
this.setPage(value);
|
|
29
|
-
},
|
|
30
|
-
|
|
31
|
-
restoreSize() {
|
|
32
|
-
const defaultSize = 10;
|
|
33
|
-
const value = +this.getValueFromQuery({ filterQuery: 'size' }) || defaultSize;
|
|
34
|
-
this.setSize(value);
|
|
35
|
-
},
|
|
36
|
-
|
|
37
|
-
next() {
|
|
38
|
-
this.$emit('input');
|
|
39
|
-
const value = this.page + 1;
|
|
40
|
-
this.setPage(value);
|
|
41
|
-
this.setValueToQuery({
|
|
42
|
-
filterQuery: 'page',
|
|
43
|
-
value,
|
|
44
|
-
});
|
|
45
|
-
},
|
|
46
|
-
|
|
47
|
-
prev() {
|
|
48
|
-
this.$emit('input');
|
|
49
|
-
const value = this.page - 1;
|
|
50
|
-
this.setPage(value);
|
|
51
|
-
this.setValueToQuery({
|
|
52
|
-
filterQuery: 'page',
|
|
53
|
-
value,
|
|
54
|
-
});
|
|
55
|
-
},
|
|
56
|
-
|
|
57
|
-
sizeChange(value) {
|
|
58
|
-
this.$emit('input');
|
|
59
|
-
this.setSize(value);
|
|
60
|
-
this.setValueToQuery({
|
|
61
|
-
filterQuery: 'size',
|
|
62
|
-
value,
|
|
63
|
-
});
|
|
64
|
-
},
|
|
65
|
-
},
|
|
66
|
-
};
|