@webitel/ui-datalist 1.0.5 → 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.
Files changed (29) hide show
  1. package/package.json +4 -3
  2. package/src/filter-presets/components/_shared/preset-filters-preview.vue +2 -11
  3. package/src/filter-presets/components/apply-preset/apply-preset-action.vue +5 -0
  4. package/src/filter-presets/components/save-preset/save-preset-action.vue +31 -4
  5. package/src/filter-presets/components/save-preset/save-preset-popup.vue +5 -1
  6. package/src/filters/classes/FiltersManager.ts +9 -3
  7. package/src/filters/components/dynamic-filter-add-action.vue +2 -3
  8. package/src/filters/components/filter-options/_shared/lookup-filter-preview/lookup-filter-value-preview.vue +21 -0
  9. package/src/filters/components/filter-options/agent/agent-filter-value-preview.vue +4 -20
  10. package/src/filters/components/filter-options/agent/config.js +0 -1
  11. package/src/filters/components/filter-options/contact/contact-filter-value-preview.vue +4 -20
  12. package/src/filters/components/filter-options/created-at/created-at-filter-value-field.vue +97 -0
  13. package/src/filters/components/filter-options/created-at/created-at-filter-value-preview.vue +64 -0
  14. package/src/filters/components/filter-options/gateway/gateway-filter-value-preview.vue +6 -21
  15. package/src/filters/components/filter-options/grantee/grantee-filter-value-preview.vue +6 -21
  16. package/src/filters/components/filter-options/index.ts +45 -0
  17. package/src/filters/components/filter-options/queue/queue-filter-value-preview.vue +4 -20
  18. package/src/filters/components/filter-options/rated-by/rated-by-filter-value-preview.vue +6 -21
  19. package/src/filters/components/filter-options/service-case/config.js +1 -1
  20. package/src/filters/components/filter-options/team/team-filter-value-preview.vue +4 -20
  21. package/src/filters/components/filter-options/user/user-filter-value-preview.vue +6 -21
  22. package/src/filters/components/preview/dynamic-filter-preview-info.vue +1 -0
  23. package/src/filters/components/preview/dynamic-filter-preview.vue +82 -19
  24. package/src/filters/components/search-bar/dynamic-filter-search.vue +123 -0
  25. package/src/filters/components/search-bar/types/DynamicFilterSearch.d.ts +5 -0
  26. package/src/filters/components/table-filters-panel.vue +25 -27
  27. package/src/filters/enums/FilterOption.ts +12 -2
  28. package/src/filters/index.ts +1 -1
  29. package/src/filters/components/dynamic-filter-search.vue +0 -60
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webitel/ui-datalist",
3
- "version": "1.0.5",
3
+ "version": "1.0.7",
4
4
  "description": "Toolkit for building data lists in webitel ui system",
5
5
  "scripts": {
6
6
  "lint:fix": "eslint --fix ./src && prettier --write --check ./src",
@@ -29,12 +29,13 @@
29
29
  "peerDependencies": {
30
30
  "vue": "^3.5",
31
31
  "axios": "^1",
32
- "pinia": "^3.x"
32
+ "pinia": "^3.x",
33
+ "date-fns": "^4"
33
34
  },
34
35
  "dependencies": {
35
36
  "@vuelidate/core": "^2.0.3",
36
37
  "@vuelidate/validators": "^2.0.4",
37
- "@webitel/ui-sdk": "^25.4.48"
38
+ "@webitel/ui-sdk": "^25.4.55"
38
39
  },
39
40
  "devDependencies": {
40
41
  "vue-tsc": "^2.2.8",
@@ -9,16 +9,8 @@
9
9
  v-for="filter of props.filters"
10
10
  :key="filter.name"
11
11
  :filter="filter"
12
- dummy
13
- >
14
- <template #info>
15
- <component
16
- :is="FilterOptionToPreviewComponentMap[filter.name]"
17
- :value="filter.value"
18
- >
19
- </component>
20
- </template>
21
- </dynamic-filter-preview>
12
+ readonly
13
+ />
22
14
  </template>
23
15
  </dynamic-filter-panel-wrapper>
24
16
  </div>
@@ -30,7 +22,6 @@ import { useI18n } from 'vue-i18n';
30
22
 
31
23
  import type { IFilter } from '../../../filters';
32
24
  import DynamicFilterPanelWrapper from '../../../filters/components/dynamic-filter-panel-wrapper.vue';
33
- import { FilterOptionToPreviewComponentMap } from '../../../filters/components/filter-options';
34
25
  import DynamicFilterPreview from '../../../filters/components/preview/dynamic-filter-preview.vue';
35
26
 
36
27
  type Props = {
@@ -91,6 +91,11 @@ const props = defineProps<{
91
91
  */
92
92
  namespace: string;
93
93
  usePresetsStore: Store;
94
+ /**
95
+ * @description
96
+ * Is needed for preset to exclude filter values, not related to filters panel
97
+ */
98
+ filterOptions: FilterOption[];
94
99
  }>();
95
100
 
96
101
  const emit = defineEmits<{
@@ -14,7 +14,7 @@
14
14
  !presetToOverwriteWith /* on 'overwrite preset' popup hide this popup, but don't reset it*/
15
15
  "
16
16
  :shown="true /* coz visibility is controlled by v-if*/"
17
- :filters-manager="props.filtersManager"
17
+ :filters-manager="localFiltersManager"
18
18
  :namespace="namespace"
19
19
  @submit="handlePresetSubmit"
20
20
  @close="showSaveForm = false"
@@ -32,11 +32,15 @@
32
32
  <script lang="ts" setup>
33
33
  import { WtIconAction } from '@webitel/ui-sdk/components';
34
34
  import { IconAction } from '@webitel/ui-sdk/enums';
35
- import { computed, inject, type Ref, ref } from 'vue';
35
+ import { computed, inject, reactive, type Ref, ref, watch } from 'vue';
36
36
  import { useI18n } from 'vue-i18n';
37
37
  import { EnginePresetQuery } from 'webitel-sdk';
38
38
 
39
- import { IFiltersManager } from '../../../filters';
39
+ import {
40
+ createFiltersManager,
41
+ FilterOption,
42
+ IFiltersManager,
43
+ } from '../../../filters';
40
44
  import {
41
45
  addPreset,
42
46
  getPresetList,
@@ -47,21 +51,44 @@ import SavePresetPopup, { SubmitConfig } from './save-preset-popup.vue';
47
51
 
48
52
  const props = defineProps<{
49
53
  /**
54
+ * @description
50
55
  * presets "section" namespace
51
56
  */
52
57
  namespace: string;
58
+ /**
59
+ * @author @dlohvinov
60
+ * serves as a source for local filters manager
61
+ */
53
62
  filtersManager: IFiltersManager;
63
+ /**
64
+ * @description
65
+ * Is needed for preset to exclude filter values, not related to filters panel
66
+ */
67
+ filterOptions: FilterOption[];
54
68
  }>();
55
69
 
56
70
  const eventBus = inject('$eventBus');
57
71
 
72
+ const localFiltersManager = reactive(createFiltersManager());
73
+
74
+ watch(
75
+ props.filtersManager,
76
+ () => {
77
+ localFiltersManager.reset();
78
+ localFiltersManager.fromString(
79
+ props.filtersManager.toString({ include: props.filterOptions }),
80
+ );
81
+ },
82
+ { immediate: true },
83
+ );
84
+
58
85
  const { t } = useI18n();
59
86
 
60
87
  /**
61
88
  * disable "save" btn if there's nothing to save
62
89
  * */
63
90
  const disableAction = computed(() => {
64
- return !props.filtersManager.getAllKeys().length;
91
+ return !localFiltersManager.getAllKeys().length;
65
92
  });
66
93
 
67
94
  /**
@@ -53,7 +53,7 @@ import { computed, reactive, ref } from 'vue';
53
53
  import { useI18n } from 'vue-i18n';
54
54
  import { EnginePresetQuery } from 'webitel-sdk';
55
55
 
56
- import type { IFiltersManager } from '../../../index';
56
+ import type { IFiltersManager } from '../../../filters';
57
57
  import PresetDescriptionField from '../_shared/input-fields/preset-description-field.vue';
58
58
  import PresetNameField from '../_shared/input-fields/preset-name-field.vue';
59
59
  import PresetFiltersPreview from '../_shared/preset-filters-preview.vue';
@@ -65,6 +65,10 @@ export type SubmitConfig = {
65
65
  };
66
66
 
67
67
  const props = defineProps<{
68
+ /**
69
+ * @description
70
+ * is needed here for `.toString()`
71
+ */
68
72
  filtersManager: IFiltersManager;
69
73
  }>();
70
74
 
@@ -55,7 +55,7 @@ class FiltersManager implements IFiltersManager {
55
55
  return filter;
56
56
  }
57
57
 
58
- deleteFilter({ name }: IFilter): IFilter {
58
+ deleteFilter({ name }: { name: FilterName }): IFilter {
59
59
  const filter = this.filters.get(name);
60
60
  this.filters.delete(name);
61
61
  return filter;
@@ -70,8 +70,14 @@ class FiltersManager implements IFiltersManager {
70
70
  return filters;
71
71
  }
72
72
 
73
- toString(): string {
74
- const filtersData = [...this.filters.values()].reduce(
73
+ toString({
74
+ include,
75
+ exclude,
76
+ }: {
77
+ include?: FilterName[];
78
+ exclude?: FilterName[];
79
+ } = {}): string {
80
+ const filtersData = this.getFiltersList({ include, exclude }).reduce(
75
81
  (acc, { name, label, value }) => {
76
82
  if (isEmpty(value) && value == null) return acc;
77
83
 
@@ -21,8 +21,7 @@
21
21
  :options="props.filterOptions"
22
22
  @cancel="() => tooltipSlotScope.hide()"
23
23
  @submit="
24
- (payload) =>
25
- submitFilterChange(payload, { hide: tooltipSlotScope.hide })
24
+ (payload) => submit(payload, { hide: tooltipSlotScope.hide })
26
25
  "
27
26
  />
28
27
  </slot>
@@ -54,7 +53,7 @@ const emit = defineEmits<{
54
53
  'add:filter': [FilterInitParams];
55
54
  }>();
56
55
 
57
- const submitFilterChange = (payload: FilterInitParams, { hide }) => {
56
+ const submit = (payload: FilterInitParams, { hide }) => {
58
57
  emit('add:filter', payload);
59
58
  hide();
60
59
  };
@@ -0,0 +1,21 @@
1
+ <template>
2
+ <ul v-if="value">
3
+ <li
4
+ v-for="({ name, id }, index) of value"
5
+ :key="id || index"
6
+ >
7
+ {{ name }}
8
+ </li>
9
+ </ul>
10
+ </template>
11
+
12
+ <script lang="ts" setup>
13
+ defineProps<{
14
+ /**
15
+ * would be great to use a type for this
16
+ * */
17
+ value: Record<string, unknown>[];
18
+ }>();
19
+ </script>
20
+
21
+ <style scoped></style>
@@ -1,31 +1,15 @@
1
1
  <template>
2
- <ul v-if="localValue">
3
- <li
4
- v-for="({ name }, index) of localValue"
5
- :key="index"
6
- >
7
- {{ name }}
8
- </li>
9
- </ul>
2
+ <lookup-filter-value-preview v-bind="props" />
10
3
  </template>
11
4
 
12
5
  <script lang="ts" setup>
13
- import { ref } from 'vue';
6
+ import type { EngineAgent } from 'webitel-sdk';
14
7
 
15
- import { searchMethod } from './config.js';
8
+ import LookupFilterValuePreview from '../_shared/lookup-filter-preview/lookup-filter-value-preview.vue';
16
9
 
17
10
  const props = defineProps<{
18
- value: number[];
11
+ value: EngineAgent[];
19
12
  }>();
20
-
21
- const localValue = ref([]);
22
-
23
- const getLocalValue = async () => {
24
- const { items } = await searchMethod({ id: props.value });
25
- localValue.value = items;
26
- };
27
-
28
- getLocalValue();
29
13
  </script>
30
14
 
31
15
  <style scoped></style>
@@ -1,4 +1,3 @@
1
1
  import AgentsAPI from '@webitel/ui-sdk/api/clients/agents/agents';
2
2
 
3
3
  export const searchMethod = AgentsAPI.getLookup;
4
- export const localePath = '';
@@ -1,31 +1,15 @@
1
1
  <template>
2
- <ul v-if="localValue">
3
- <li
4
- v-for="({ name }, index) of localValue"
5
- :key="index"
6
- >
7
- {{ name }}
8
- </li>
9
- </ul>
2
+ <lookup-filter-value-preview v-bind="props" />
10
3
  </template>
11
4
 
12
5
  <script lang="ts" setup>
13
- import { ref } from 'vue';
6
+ import type { WebitelContactsContact } from 'webitel-sdk';
14
7
 
15
- import { searchMethod } from './config.js';
8
+ import LookupFilterValuePreview from '../_shared/lookup-filter-preview/lookup-filter-value-preview.vue';
16
9
 
17
10
  const props = defineProps<{
18
- value: number[];
11
+ value: WebitelContactsContact[];
19
12
  }>();
20
-
21
- const localValue = ref([]);
22
-
23
- const getLocalValue = async () => {
24
- const { items } = await searchMethod({ id: props.value });
25
- localValue.value = items;
26
- };
27
-
28
- getLocalValue();
29
13
  </script>
30
14
 
31
15
  <style scoped></style>
@@ -0,0 +1,97 @@
1
+ <template>
2
+ <div class="created-at-filter-value-field">
3
+ <wt-radio
4
+ v-for="value of radioOpts"
5
+ :key="value"
6
+ v-model="selectedRadioValue"
7
+ :label="t(`webitelUI.filters.datetime.${value}`)"
8
+ :value="value"
9
+ @input="handleRadioChange"
10
+ />
11
+ <wt-datepicker
12
+ v-if="showDatepickers"
13
+ :value="model.from"
14
+ :label="t('reusable.from')"
15
+ mode="datetime"
16
+ @input="changeAbsoluteValue($event, 'from')"
17
+ />
18
+ <wt-datepicker
19
+ v-if="showDatepickers"
20
+ :value="model.to"
21
+ :label="t('reusable.to')"
22
+ mode="datetime"
23
+ @input="changeAbsoluteValue($event, 'to')"
24
+ />
25
+ </div>
26
+ </template>
27
+
28
+ <script lang="ts" setup>
29
+ import { WtRadio } from '@webitel/ui-sdk/components';
30
+ import { RelativeDatetimeValue } from '@webitel/ui-sdk/enums';
31
+ import { endOfToday, startOfToday } from 'date-fns';
32
+ import { computed, ref } from 'vue';
33
+ import { useI18n } from 'vue-i18n';
34
+
35
+ const model = defineModel<
36
+ RelativeDatetimeValue | { from: number; to: number }
37
+ >();
38
+
39
+ const { t } = useI18n();
40
+
41
+ const radioOpts = [
42
+ RelativeDatetimeValue.Today,
43
+ RelativeDatetimeValue.ThisWeek,
44
+ RelativeDatetimeValue.ThisMonth,
45
+ RelativeDatetimeValue.Custom,
46
+ ];
47
+
48
+ const selectedRadioValue = ref();
49
+
50
+ const initialize = () => {
51
+ if (!model.value) {
52
+ /* initialize */
53
+ selectedRadioValue.value = radioOpts[0];
54
+ model.value = selectedRadioValue.value;
55
+ } else if (typeof model.value === 'string') {
56
+ /* RelativeDatetimeValue */
57
+ selectedRadioValue.value = model.value;
58
+ } else {
59
+ /* { from, to } */
60
+ selectedRadioValue.value = RelativeDatetimeValue.Custom;
61
+ }
62
+ };
63
+
64
+ initialize();
65
+
66
+ const showDatepickers = computed(() => {
67
+ return selectedRadioValue.value === RelativeDatetimeValue.Custom;
68
+ });
69
+
70
+ const handleRadioChange = (value: RelativeDatetimeValue) => {
71
+ if (value === RelativeDatetimeValue.Custom) {
72
+ model.value = {
73
+ from: startOfToday().getTime(),
74
+ to: endOfToday().getTime(),
75
+ };
76
+ } else {
77
+ model.value = value;
78
+ }
79
+ };
80
+
81
+ const changeAbsoluteValue = (value: number, prop: 'from' | 'to') => {
82
+ const newModelValue = {
83
+ ...(model.value as { from: number; to: number }),
84
+ [prop]: value,
85
+ };
86
+
87
+ model.value = newModelValue;
88
+ };
89
+ </script>
90
+
91
+ <style scoped>
92
+ .created-at-filter-value-field {
93
+ display: flex;
94
+ flex-direction: column;
95
+ gap: var(--spacing-xs);
96
+ }
97
+ </style>
@@ -0,0 +1,64 @@
1
+ <template>
2
+ <div class="created-at-filter-value-preview">
3
+ <p v-if="isRelativeValue">
4
+ {{ t(`webitelUI.filters.datetime.${props.value}`) }}
5
+ </p>
6
+
7
+ <template v-else>
8
+ <div>
9
+ <p class="created-at-filter-value-preview__title">
10
+ {{ t('reusable.from') }}
11
+ </p>
12
+
13
+ <span>{{ from }}</span>
14
+ </div>
15
+
16
+ <div>
17
+ <p class="created-at-filter-value-preview__title">
18
+ {{ t('reusable.to') }}
19
+ </p>
20
+
21
+ <span>{{ to }}</span>
22
+ </div>
23
+ </template>
24
+ </div>
25
+ </template>
26
+
27
+ <script lang="ts" setup>
28
+ import { RelativeDatetimeValue } from '@webitel/ui-sdk/enums';
29
+ import { isRelativeDatetimeValue } from '@webitel/ui-sdk/scripts';
30
+ import { computed } from 'vue';
31
+ import { useI18n } from 'vue-i18n';
32
+
33
+ const props = defineProps<{
34
+ value: { from: number; to: number } | RelativeDatetimeValue;
35
+ }>();
36
+
37
+ const { t } = useI18n();
38
+
39
+ const isRelativeValue = computed(() => {
40
+ return isRelativeDatetimeValue(props.value);
41
+ });
42
+
43
+ const from = computed(() => {
44
+ return isRelativeDatetimeValue.value
45
+ ? false
46
+ : new Date(props.value.from).toLocaleString();
47
+ });
48
+
49
+ const to = computed(() => {
50
+ return isRelativeDatetimeValue.value
51
+ ? false
52
+ : new Date(props.value.to).toLocaleString();
53
+ });
54
+ </script>
55
+
56
+ <style lang="scss" scoped>
57
+ @use '@webitel/styleguide/typography' as *;
58
+
59
+ .duration-filter-value-preview {
60
+ &__title {
61
+ @extend %typo-subtitle-1;
62
+ }
63
+ }
64
+ </style>
@@ -1,31 +1,16 @@
1
1
  <template>
2
- <ul v-if="localValue">
3
- <li
4
- v-for="({ name }, index) of localValue"
5
- :key="index"
6
- >
7
- {{ name }}
8
- </li>
9
- </ul>
2
+ <lookup-filter-value-preview v-bind="props" />
10
3
  </template>
11
4
 
12
5
  <script lang="ts" setup>
13
- import { ref } from 'vue';
14
-
15
- import { searchMethod } from './config.js';
6
+ import LookupFilterValuePreview from '../_shared/lookup-filter-preview/lookup-filter-value-preview.vue';
16
7
 
17
8
  const props = defineProps<{
18
- value: number[];
9
+ /**
10
+ * would be great to use generated type for this
11
+ * */
12
+ value: Record<string, unknown>[];
19
13
  }>();
20
-
21
- const localValue = ref([]);
22
-
23
- const getLocalValue = async () => {
24
- const { items } = await searchMethod({ id: props.value });
25
- localValue.value = items;
26
- };
27
-
28
- getLocalValue();
29
14
  </script>
30
15
 
31
16
  <style scoped></style>
@@ -1,31 +1,16 @@
1
1
  <template>
2
- <ul v-if="localValue">
3
- <li
4
- v-for="({ name }, index) of localValue"
5
- :key="index"
6
- >
7
- {{ name }}
8
- </li>
9
- </ul>
2
+ <lookup-filter-value-preview v-bind="props" />
10
3
  </template>
11
4
 
12
5
  <script lang="ts" setup>
13
- import { ref } from 'vue';
14
-
15
- import { searchMethod } from './config.js';
6
+ import LookupFilterValuePreview from '../_shared/lookup-filter-preview/lookup-filter-value-preview.vue';
16
7
 
17
8
  const props = defineProps<{
18
- value: number[];
9
+ /**
10
+ * would be great to use generated type for this
11
+ * */
12
+ value: Record<string, unknown>[];
19
13
  }>();
20
-
21
- const localValue = ref([]);
22
-
23
- const getLocalValue = async () => {
24
- const { items } = await searchMethod({ ids: props.value });
25
- localValue.value = items;
26
- };
27
-
28
- getLocalValue();
29
14
  </script>
30
15
 
31
16
  <style scoped></style>