@webitel/ui-datalist 1.0.6 → 1.0.7
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 +1 -1
- package/src/filters/classes/FiltersManager.ts +1 -1
- package/src/filters/components/search-bar/dynamic-filter-search.vue +123 -0
- package/src/filters/components/search-bar/types/DynamicFilterSearch.d.ts +5 -0
- package/src/filters/index.ts +1 -1
- package/src/filters/components/dynamic-filter-search.vue +0 -60
package/package.json
CHANGED
|
@@ -55,7 +55,7 @@ class FiltersManager implements IFiltersManager {
|
|
|
55
55
|
return filter;
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
-
deleteFilter({ name }:
|
|
58
|
+
deleteFilter({ name }: { name: FilterName }): IFilter {
|
|
59
59
|
const filter = this.filters.get(name);
|
|
60
60
|
this.filters.delete(name);
|
|
61
61
|
return filter;
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<wt-search-bar
|
|
3
|
+
:placeholder="t('reusable.search')"
|
|
4
|
+
:search-mode="searchMode"
|
|
5
|
+
:search-mode-options="searchModeOptions"
|
|
6
|
+
:value="localSearchValue"
|
|
7
|
+
@input="localSearchValue = $event"
|
|
8
|
+
@search="handleSearch"
|
|
9
|
+
@update:search-mode="updateSearchMode"
|
|
10
|
+
/>
|
|
11
|
+
</template>
|
|
12
|
+
|
|
13
|
+
<script lang="ts" setup>
|
|
14
|
+
import { WtSearchBar } from '@webitel/ui-sdk/components';
|
|
15
|
+
import {computed, type Ref, ref,watch} from 'vue';
|
|
16
|
+
import { useI18n } from 'vue-i18n';
|
|
17
|
+
|
|
18
|
+
import {FilterInitParams, FilterName} from "../../types/Filter";
|
|
19
|
+
import {IFiltersManager} from "../../types/FiltersManager";
|
|
20
|
+
import type { DynamicFilterSearchSearchModeOption } from './types/DynamicFilterSearch';
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @description
|
|
24
|
+
* default search name is used when there are no search modes
|
|
25
|
+
*/
|
|
26
|
+
const defaultSearchName = 'search';
|
|
27
|
+
|
|
28
|
+
const props = defineProps<{
|
|
29
|
+
filtersManager: IFiltersManager;
|
|
30
|
+
searchModeOptions?: DynamicFilterSearchSearchModeOption[];
|
|
31
|
+
isFiltersRestoring?: boolean;
|
|
32
|
+
}>();
|
|
33
|
+
|
|
34
|
+
const emit = defineEmits<{
|
|
35
|
+
'filter:add': [FilterInitParams];
|
|
36
|
+
'filter:update': [FilterInitParams];
|
|
37
|
+
'filter:delete': [{ name: FilterName }];
|
|
38
|
+
}>();
|
|
39
|
+
|
|
40
|
+
const { t } = useI18n();
|
|
41
|
+
|
|
42
|
+
const searchMode: Ref<FilterName> = ref();
|
|
43
|
+
const localSearchValue = ref('');
|
|
44
|
+
|
|
45
|
+
const hasFilter = (filterName = searchMode.value) => {
|
|
46
|
+
return props.filtersManager.filters.has(filterName);
|
|
47
|
+
};
|
|
48
|
+
const addFilter = (filterInitParams: FilterInitParams) => {
|
|
49
|
+
return emit('filter:add', filterInitParams);
|
|
50
|
+
};
|
|
51
|
+
const updateFilter = (filterInitParams: FilterInitParams) => {
|
|
52
|
+
return emit('filter:update', filterInitParams);
|
|
53
|
+
};
|
|
54
|
+
const deleteFilter = ({ name }: { name: FilterName }) => {
|
|
55
|
+
return emit('filter:delete', { name });
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const hasSearchModes = computed(() => {
|
|
59
|
+
return props.searchModeOptions && props.searchModeOptions.length > 0;
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
if (hasSearchModes.value) {
|
|
63
|
+
searchMode.value = props.searchModeOptions[0].value;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const currentSearchName = computed(() => {
|
|
67
|
+
if (hasSearchModes.value) {
|
|
68
|
+
return searchMode.value;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return defaultSearchName;
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
const handleSearch = (value = localSearchValue.value) => {
|
|
75
|
+
if (hasFilter(currentSearchName.value)) {
|
|
76
|
+
updateFilter({
|
|
77
|
+
name: currentSearchName.value,
|
|
78
|
+
value,
|
|
79
|
+
});
|
|
80
|
+
} else {
|
|
81
|
+
addFilter({
|
|
82
|
+
name: currentSearchName.value,
|
|
83
|
+
value,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
const updateSearchMode = (nextSearchMode: DynamicFilterSearchSearchModeOption) => {
|
|
89
|
+
if (hasFilter(currentSearchName.value)) {
|
|
90
|
+
deleteFilter({
|
|
91
|
+
name: currentSearchName.value,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
searchMode.value = nextSearchMode.value;
|
|
95
|
+
localSearchValue.value = '';
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* @description
|
|
100
|
+
* Restoring search value after filters were restored
|
|
101
|
+
*/
|
|
102
|
+
watch(() => props.isFiltersRestoring,
|
|
103
|
+
(next) => {
|
|
104
|
+
if (next) return;
|
|
105
|
+
|
|
106
|
+
let searchModes = [defaultSearchName];
|
|
107
|
+
if (hasSearchModes.value) {
|
|
108
|
+
searchModes = props.searchModeOptions?.map((option) => option.value);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
for (const mode of searchModes) {
|
|
112
|
+
if (hasFilter(mode)) {
|
|
113
|
+
searchMode.value = mode;
|
|
114
|
+
localSearchValue.value = props.filtersManager.filters.get(mode).value;
|
|
115
|
+
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
);
|
|
121
|
+
</script>
|
|
122
|
+
|
|
123
|
+
<style scoped></style>
|
package/src/filters/index.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Filter } from './classes/Filter.ts';
|
|
2
2
|
import { createFiltersManager } from './classes/FiltersManager';
|
|
3
|
-
import DynamicFilterSearchComponent from './components/dynamic-filter-search.vue';
|
|
3
|
+
import DynamicFilterSearchComponent from './components/search-bar/dynamic-filter-search.vue';
|
|
4
4
|
import TableFiltersPanelComponent from './components/table-filters-panel.vue';
|
|
5
5
|
import { FilterOption } from './enums/FilterOption';
|
|
6
6
|
import type {
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<wt-search-bar
|
|
3
|
-
:placeholder="t('reusable.search')"
|
|
4
|
-
:search-mode="props.searchMode"
|
|
5
|
-
:search-mode-options="searchModeOptions"
|
|
6
|
-
:value="model"
|
|
7
|
-
@input="model = $event"
|
|
8
|
-
@search="handleSearch"
|
|
9
|
-
@update:search-mode="onSearchModeChange($event.value)"
|
|
10
|
-
>
|
|
11
|
-
<template
|
|
12
|
-
v-if="props.showTextSearchIcon"
|
|
13
|
-
#search-icon
|
|
14
|
-
>
|
|
15
|
-
<wt-icon icon="stt-search" />
|
|
16
|
-
</template>
|
|
17
|
-
</wt-search-bar>
|
|
18
|
-
</template>
|
|
19
|
-
|
|
20
|
-
<script lang="ts" setup>
|
|
21
|
-
import { WtSearchBar } from '@webitel/ui-sdk/components';
|
|
22
|
-
import { computed } from 'vue';
|
|
23
|
-
import { useI18n } from 'vue-i18n';
|
|
24
|
-
|
|
25
|
-
type ModelValue = string;
|
|
26
|
-
const model = defineModel<ModelValue>();
|
|
27
|
-
|
|
28
|
-
const props = defineProps<{
|
|
29
|
-
searchMode: string;
|
|
30
|
-
searchModeOptions: Record<string, string>;
|
|
31
|
-
showTextSearchIcon?: boolean;
|
|
32
|
-
}>();
|
|
33
|
-
|
|
34
|
-
const emit = defineEmits<{
|
|
35
|
-
'update:search-mode': [string];
|
|
36
|
-
'handle-search': [string];
|
|
37
|
-
}>();
|
|
38
|
-
|
|
39
|
-
const { t } = useI18n();
|
|
40
|
-
|
|
41
|
-
const onSearchModeChange = (value: string) => {
|
|
42
|
-
emit('update:search-mode', value);
|
|
43
|
-
model.value = '';
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
const handleSearch = () => {
|
|
47
|
-
emit('handle-search', model.value);
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
const searchModeOptions = computed(() =>
|
|
51
|
-
Object.values(props.searchModeOptions).map((mode) => {
|
|
52
|
-
return {
|
|
53
|
-
value: mode,
|
|
54
|
-
text: t(`filters.search.${mode}`),
|
|
55
|
-
};
|
|
56
|
-
}),
|
|
57
|
-
);
|
|
58
|
-
</script>
|
|
59
|
-
|
|
60
|
-
<style scoped></style>
|