@webitel/ui-datalist 26.8.16 → 26.8.18

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 (162) hide show
  1. package/package.json +1 -1
  2. package/src/modules/filters/components/column/column-filter-preview.vue +2 -1
  3. package/src/modules/filters/components/column/column-filter.vue +8 -1
  4. package/src/modules/filters/components/config/dynamic-view/dynamic-filter-config-form.vue +2 -2
  5. package/src/modules/filters/components/config/static-view/__tests__/static-filter-field.spec.ts +6 -6
  6. package/src/modules/filters/components/filters-actions-menu.vue +7 -1
  7. package/src/modules/filters/components/table-filters-panel.vue +7 -1
  8. package/src/modules/filters/composables/useFilterValueChange.ts +2 -11
  9. package/src/modules/filters/composables/useFilterValuePreview.ts +9 -3
  10. package/src/modules/filters/modules/filterConfig/components/_custom/filterConfig.ts +4 -8
  11. package/src/modules/filters/modules/filterConfig/components/_custom/type-extension-filter-value-field.vue +2 -2
  12. package/src/modules/filters/modules/filterConfig/components/agent/agent-filter-value-field.vue +10 -4
  13. package/src/modules/filters/modules/filterConfig/components/agent/index.ts +22 -0
  14. package/src/modules/filters/modules/filterConfig/components/auditor/auditor-filter-value-field.vue +7 -1
  15. package/src/modules/filters/modules/filterConfig/components/auditor/index.ts +3 -6
  16. package/src/modules/filters/modules/filterConfig/components/bucket/bucket-filter-value-field.vue +7 -1
  17. package/src/modules/filters/modules/filterConfig/components/bucket/index.ts +3 -6
  18. package/src/modules/filters/modules/filterConfig/components/case-assignee/case-assignee-filter-value-field.vue +7 -1
  19. package/src/modules/filters/modules/filterConfig/components/case-assignee/filterConfig.ts +9 -4
  20. package/src/modules/filters/modules/filterConfig/components/case-author/case-author-filter-value-field.vue +9 -2
  21. package/src/modules/filters/modules/filterConfig/components/case-author/index.ts +22 -0
  22. package/src/modules/filters/modules/filterConfig/components/case-close-reason-groups/case-close-reason-groups-filter-value-field.vue +16 -8
  23. package/src/modules/filters/modules/filterConfig/components/case-close-reason-groups/filterConfig.ts +44 -0
  24. package/src/modules/filters/modules/filterConfig/components/case-close-reason-groups/index.ts +10 -0
  25. package/src/modules/filters/modules/filterConfig/components/case-impacted/case-impacted-filter-value-field.vue +9 -2
  26. package/src/modules/filters/modules/filterConfig/components/case-impacted/index.ts +23 -0
  27. package/src/modules/filters/modules/filterConfig/components/case-priority/case-priority-filter-value-field.vue +9 -2
  28. package/src/modules/filters/modules/filterConfig/components/case-priority/index.ts +26 -0
  29. package/src/modules/filters/modules/filterConfig/components/case-reporter/case-reporter-filter-value-field.vue +9 -2
  30. package/src/modules/filters/modules/filterConfig/components/case-reporter/index.ts +23 -0
  31. package/src/modules/filters/modules/filterConfig/components/case-service/case-service-filter-value-field.vue +18 -5
  32. package/src/modules/filters/modules/filterConfig/components/case-service/filterConfig.ts +33 -0
  33. package/src/modules/filters/modules/filterConfig/components/case-service/index.ts +10 -0
  34. package/src/modules/filters/modules/filterConfig/components/case-sla/case-sla-filter-value-field.vue +9 -2
  35. package/src/modules/filters/modules/filterConfig/components/case-sla/index.ts +22 -0
  36. package/src/modules/filters/modules/filterConfig/components/case-sla-condition/case-sla-condition-filter-value-field.vue +14 -5
  37. package/src/modules/filters/modules/filterConfig/components/case-sla-condition/filterConfig.ts +38 -0
  38. package/src/modules/filters/modules/filterConfig/components/case-sla-condition/index.ts +10 -0
  39. package/src/modules/filters/modules/filterConfig/components/case-source/case-source-filter-value-field.vue +9 -2
  40. package/src/modules/filters/modules/filterConfig/components/case-source/index.ts +22 -0
  41. package/src/modules/filters/modules/filterConfig/components/case-status/case-status-filter-value-field.vue +14 -8
  42. package/src/modules/filters/modules/filterConfig/components/case-status/filterConfig.ts +40 -0
  43. package/src/modules/filters/modules/filterConfig/components/case-status/index.ts +10 -0
  44. package/src/modules/filters/modules/filterConfig/components/contact/contact-filter-value-field.vue +9 -2
  45. package/src/modules/filters/modules/filterConfig/components/contact/index.ts +22 -0
  46. package/src/modules/filters/modules/filterConfig/components/contact-group/contact-group-filter-value-field.vue +10 -2
  47. package/src/modules/filters/modules/filterConfig/components/contact-group/index.ts +7 -2
  48. package/src/modules/filters/modules/filterConfig/components/contact-label/contact-label-filter-value-field.vue +8 -2
  49. package/src/modules/filters/modules/filterConfig/components/contact-label/index.ts +6 -4
  50. package/src/modules/filters/modules/filterConfig/components/contact-owner/contact-owner-filter-value-field.vue +7 -1
  51. package/src/modules/filters/modules/filterConfig/components/contact-owner/index.ts +3 -6
  52. package/src/modules/filters/modules/filterConfig/components/gateway/gateway-filter-value-field.vue +8 -10
  53. package/src/modules/filters/modules/filterConfig/components/gateway/index.ts +31 -0
  54. package/src/modules/filters/modules/filterConfig/components/grantee/grantee-filter-value-field.vue +9 -2
  55. package/src/modules/filters/modules/filterConfig/components/grantee/index.ts +22 -0
  56. package/src/modules/filters/modules/filterConfig/components/index.ts +38 -64
  57. package/src/modules/filters/modules/filterConfig/components/queue/index.ts +3 -6
  58. package/src/modules/filters/modules/filterConfig/components/queue/queue-filter-value-field.vue +7 -1
  59. package/src/modules/filters/modules/filterConfig/components/rated-by/index.ts +22 -0
  60. package/src/modules/filters/modules/filterConfig/components/rated-by/rated-by-filter-value-field.vue +8 -3
  61. package/src/modules/filters/modules/filterConfig/components/region/index.ts +3 -6
  62. package/src/modules/filters/modules/filterConfig/components/region/region-filter-value-field.vue +7 -1
  63. package/src/modules/filters/modules/filterConfig/components/skill/index.ts +3 -6
  64. package/src/modules/filters/modules/filterConfig/components/skill/skill-filter-value-field.vue +7 -1
  65. package/src/modules/filters/modules/filterConfig/components/supervisor/index.ts +6 -6
  66. package/src/modules/filters/modules/filterConfig/components/supervisor/supervisor-filter-value-field.vue +7 -1
  67. package/src/modules/filters/modules/filterConfig/components/tags/index.ts +3 -6
  68. package/src/modules/filters/modules/filterConfig/components/tags/tags-filter-value-field.vue +7 -1
  69. package/src/modules/filters/modules/filterConfig/components/team/index.ts +3 -6
  70. package/src/modules/filters/modules/filterConfig/components/team/team-filter-value-field.vue +7 -1
  71. package/src/modules/filters/modules/filterConfig/components/user/index.ts +22 -0
  72. package/src/modules/filters/modules/filterConfig/components/user/user-filter-value-field.vue +8 -3
  73. package/src/modules/filters/modules/filterConfig/composables/useFilterReadAccess.ts +55 -0
  74. package/src/modules/filters/scripts/__tests__/utils.spec.ts +40 -0
  75. package/src/modules/filters/scripts/canLoadPreviewRecords.ts +35 -0
  76. package/src/modules/filters/scripts/utils.ts +12 -1
  77. package/types/.tsbuildinfo +1 -1
  78. package/types/modules/filters/components/column/column-filter-preview.vue.d.ts +2 -0
  79. package/types/modules/filters/components/column/column-filter.vue.d.ts +2 -0
  80. package/types/modules/filters/components/filters-actions-menu.vue.d.ts +2 -0
  81. package/types/modules/filters/components/table-filters-panel.vue.d.ts +3 -0
  82. package/types/modules/filters/modules/filterConfig/components/agent/agent-filter-value-field.vue.d.ts +2 -2
  83. package/types/modules/filters/modules/filterConfig/components/agent/index.d.ts +29 -0
  84. package/types/modules/filters/modules/filterConfig/components/auditor/index.d.ts +1 -4
  85. package/types/modules/filters/modules/filterConfig/components/bucket/index.d.ts +1 -4
  86. package/types/modules/filters/modules/filterConfig/components/case-author/case-author-filter-value-field.vue.d.ts +2 -0
  87. package/types/modules/filters/modules/filterConfig/components/case-author/index.d.ts +29 -0
  88. package/types/modules/filters/modules/filterConfig/components/case-close-reason-groups/case-close-reason-groups-filter-value-field.vue.d.ts +2 -0
  89. package/types/modules/filters/modules/filterConfig/components/case-close-reason-groups/filterConfig.d.ts +48 -0
  90. package/types/modules/filters/modules/filterConfig/components/case-close-reason-groups/index.d.ts +5 -0
  91. package/types/modules/filters/modules/filterConfig/components/case-impacted/case-impacted-filter-value-field.vue.d.ts +2 -0
  92. package/types/modules/filters/modules/filterConfig/components/case-impacted/index.d.ts +29 -0
  93. package/types/modules/filters/modules/filterConfig/components/case-priority/case-priority-filter-value-field.vue.d.ts +2 -0
  94. package/types/modules/filters/modules/filterConfig/components/case-priority/index.d.ts +29 -0
  95. package/types/modules/filters/modules/filterConfig/components/case-reporter/case-reporter-filter-value-field.vue.d.ts +2 -0
  96. package/types/modules/filters/modules/filterConfig/components/case-reporter/index.d.ts +29 -0
  97. package/types/modules/filters/modules/filterConfig/components/case-service/case-service-filter-value-field.vue.d.ts +7 -2
  98. package/types/modules/filters/modules/filterConfig/components/case-service/filterConfig.d.ts +29 -0
  99. package/types/modules/filters/modules/filterConfig/components/case-service/index.d.ts +5 -0
  100. package/types/modules/filters/modules/filterConfig/components/case-sla/case-sla-filter-value-field.vue.d.ts +2 -0
  101. package/types/modules/filters/modules/filterConfig/components/case-sla/index.d.ts +29 -0
  102. package/types/modules/filters/modules/filterConfig/components/case-sla-condition/case-sla-condition-filter-value-field.vue.d.ts +2 -0
  103. package/types/modules/filters/modules/filterConfig/components/case-sla-condition/filterConfig.d.ts +48 -0
  104. package/types/modules/filters/modules/filterConfig/components/case-sla-condition/index.d.ts +5 -0
  105. package/types/modules/filters/modules/filterConfig/components/case-source/case-source-filter-value-field.vue.d.ts +2 -0
  106. package/types/modules/filters/modules/filterConfig/components/case-source/index.d.ts +29 -0
  107. package/types/modules/filters/modules/filterConfig/components/case-status/case-status-filter-value-field.vue.d.ts +2 -0
  108. package/types/modules/filters/modules/filterConfig/components/case-status/filterConfig.d.ts +49 -0
  109. package/types/modules/filters/modules/filterConfig/components/case-status/index.d.ts +5 -0
  110. package/types/modules/filters/modules/filterConfig/components/contact/contact-filter-value-field.vue.d.ts +2 -0
  111. package/types/modules/filters/modules/filterConfig/components/contact/index.d.ts +29 -0
  112. package/types/modules/filters/modules/filterConfig/components/contact-owner/index.d.ts +1 -4
  113. package/types/modules/filters/modules/filterConfig/components/gateway/gateway-filter-value-field.vue.d.ts +1 -1
  114. package/types/modules/filters/modules/filterConfig/components/gateway/index.d.ts +29 -0
  115. package/types/modules/filters/modules/filterConfig/components/grantee/grantee-filter-value-field.vue.d.ts +2 -0
  116. package/types/modules/filters/modules/filterConfig/components/grantee/index.d.ts +29 -0
  117. package/types/modules/filters/modules/filterConfig/components/index.d.ts +409 -77
  118. package/types/modules/filters/modules/filterConfig/components/queue/index.d.ts +1 -4
  119. package/types/modules/filters/modules/filterConfig/components/rated-by/index.d.ts +29 -0
  120. package/types/modules/filters/modules/filterConfig/components/rated-by/rated-by-filter-value-field.vue.d.ts +1 -1
  121. package/types/modules/filters/modules/filterConfig/components/region/index.d.ts +1 -4
  122. package/types/modules/filters/modules/filterConfig/components/skill/index.d.ts +1 -4
  123. package/types/modules/filters/modules/filterConfig/components/supervisor/index.d.ts +1 -4
  124. package/types/modules/filters/modules/filterConfig/components/tags/index.d.ts +1 -4
  125. package/types/modules/filters/modules/filterConfig/components/team/index.d.ts +1 -4
  126. package/types/modules/filters/modules/filterConfig/components/user/index.d.ts +29 -0
  127. package/types/modules/filters/modules/filterConfig/components/user/user-filter-value-field.vue.d.ts +1 -1
  128. package/types/modules/filters/modules/filterConfig/composables/useFilterReadAccess.d.ts +19 -0
  129. package/types/modules/filters/scripts/canLoadPreviewRecords.d.ts +3 -0
  130. package/types/modules/filters/scripts/utils.d.ts +2 -1
  131. package/src/modules/filters/modules/filterConfig/components/agent/config.js +0 -3
  132. package/src/modules/filters/modules/filterConfig/components/case-author/config.js +0 -3
  133. package/src/modules/filters/modules/filterConfig/components/case-close-reason-groups/config.js +0 -8
  134. package/src/modules/filters/modules/filterConfig/components/case-impacted/config.js +0 -3
  135. package/src/modules/filters/modules/filterConfig/components/case-priority/config.js +0 -3
  136. package/src/modules/filters/modules/filterConfig/components/case-reporter/config.js +0 -3
  137. package/src/modules/filters/modules/filterConfig/components/case-service/config.js +0 -4
  138. package/src/modules/filters/modules/filterConfig/components/case-sla/config.js +0 -3
  139. package/src/modules/filters/modules/filterConfig/components/case-sla-condition/config.js +0 -4
  140. package/src/modules/filters/modules/filterConfig/components/case-source/config.js +0 -3
  141. package/src/modules/filters/modules/filterConfig/components/case-status/config.js +0 -8
  142. package/src/modules/filters/modules/filterConfig/components/contact/config.js +0 -3
  143. package/src/modules/filters/modules/filterConfig/components/gateway/config.js +0 -3
  144. package/src/modules/filters/modules/filterConfig/components/grantee/config.js +0 -3
  145. package/src/modules/filters/modules/filterConfig/components/rated-by/config.js +0 -3
  146. package/src/modules/filters/modules/filterConfig/components/user/config.js +0 -3
  147. package/types/modules/filters/modules/filterConfig/components/agent/config.d.ts +0 -7
  148. package/types/modules/filters/modules/filterConfig/components/case-author/config.d.ts +0 -7
  149. package/types/modules/filters/modules/filterConfig/components/case-close-reason-groups/config.d.ts +0 -16
  150. package/types/modules/filters/modules/filterConfig/components/case-impacted/config.d.ts +0 -7
  151. package/types/modules/filters/modules/filterConfig/components/case-priority/config.d.ts +0 -7
  152. package/types/modules/filters/modules/filterConfig/components/case-reporter/config.d.ts +0 -7
  153. package/types/modules/filters/modules/filterConfig/components/case-service/config.d.ts +0 -14
  154. package/types/modules/filters/modules/filterConfig/components/case-sla/config.d.ts +0 -7
  155. package/types/modules/filters/modules/filterConfig/components/case-sla-condition/config.d.ts +0 -16
  156. package/types/modules/filters/modules/filterConfig/components/case-source/config.d.ts +0 -7
  157. package/types/modules/filters/modules/filterConfig/components/case-status/config.d.ts +0 -17
  158. package/types/modules/filters/modules/filterConfig/components/contact/config.d.ts +0 -7
  159. package/types/modules/filters/modules/filterConfig/components/gateway/config.d.ts +0 -7
  160. package/types/modules/filters/modules/filterConfig/components/grantee/config.d.ts +0 -4
  161. package/types/modules/filters/modules/filterConfig/components/rated-by/config.d.ts +0 -7
  162. package/types/modules/filters/modules/filterConfig/components/user/config.d.ts +0 -7
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webitel/ui-datalist",
3
- "version": "26.8.16",
3
+ "version": "26.8.18",
4
4
  "description": "Toolkit for building data lists in webitel ui system",
5
5
  "scripts": {
6
6
  "build:types": "vue-tsc -b tsconfig.build.json",
@@ -28,7 +28,7 @@ import type { DataField } from '@webitel/api-services/gen/models';
28
28
  import { WtLoader } from '@webitel/ui-sdk/components';
29
29
  import type { WtTableHeader } from '@webitel/ui-sdk/components/wt-table/types/WtTable';
30
30
  import { ComponentSize } from '@webitel/ui-sdk/enums';
31
-
31
+ import type { FilterHasReadAccess } from '@webitel/ui-sdk/modules/Userinfo';
32
32
  import type { IFiltersManager } from '../../classes/FiltersManager';
33
33
  import { useColumnFilter } from '../../composables/useColumnFilter';
34
34
  import { useFilterValuePreview } from '../../composables/useFilterValuePreview';
@@ -48,6 +48,7 @@ const props = defineProps<{
48
48
  filterOptions?: FilterConfigDefinition[];
49
49
  /** custom (type extension) fields the table can filter by; matched to the header by field id */
50
50
  filterableExtensionFields?: DataField[];
51
+ hasReadAccess?: FilterHasReadAccess;
51
52
  }>();
52
53
 
53
54
  const { filterConfig, filter } = useColumnFilter({
@@ -5,6 +5,7 @@
5
5
  :filters-manager="filtersManager"
6
6
  :filter-options="filterOptions"
7
7
  :filterable-extension-fields="filterableExtensionFields"
8
+ :has-read-access="hasReadAccess"
8
9
  />
9
10
  <dynamic-filter-config-form
10
11
  v-else
@@ -21,7 +22,10 @@
21
22
  import type { DataField } from '@webitel/api-services/gen/models';
22
23
 
23
24
  import type { WtTableHeader } from '@webitel/ui-sdk/components/wt-table/types/WtTable';
24
-
25
+ import {
26
+ type FilterHasReadAccess,
27
+ provideFilterReadAccess,
28
+ } from '@webitel/ui-sdk/modules/Userinfo';
25
29
  import type { FilterInitParams } from '../../classes/Filter';
26
30
  import type { IFiltersManager } from '../../classes/FiltersManager';
27
31
  import { useColumnFilter } from '../../composables/useColumnFilter';
@@ -46,12 +50,15 @@ const props = defineProps<{
46
50
  filtersManager: IFiltersManager;
47
51
  filterOptions?: FilterConfigDefinition[];
48
52
  filterableExtensionFields?: DataField[];
53
+ hasReadAccess?: FilterHasReadAccess;
49
54
  formView?: boolean;
50
55
  hide?: () => void;
51
56
  }>();
52
57
 
53
58
  const emit = defineEmits<ColumnFilterEmits>();
54
59
 
60
+ provideFilterReadAccess(() => props.hasReadAccess);
61
+
55
62
  const { filterConfig, filter } = useColumnFilter({
56
63
  header: () => props.header,
57
64
  filtersManager: () => props.filtersManager,
@@ -70,13 +70,13 @@
70
70
  import { useVuelidate } from '@vuelidate/core';
71
71
  import { required } from '@vuelidate/validators';
72
72
  import { WtButton, WtSingleSelect } from '@webitel/ui-sdk/components';
73
- import { isEmpty } from '@webitel/ui-sdk/scripts';
74
73
  import deepcopy from 'deep-copy';
75
74
  import { computed, ref, watch } from 'vue';
76
75
  import { useI18n } from 'vue-i18n';
77
76
 
78
77
  import { FilterInitParams, IFilter } from '../../../classes/Filter';
79
78
  import { BaseFilterConfig } from '../../../modules/filterConfig/classes/FilterConfig';
79
+ import { isEmptyFilterValue } from '../../../scripts/utils';
80
80
  import DynamicFilterConfigFormLabel from './dynamic-filter-config-form-label.vue';
81
81
  import DynamicFilterConfigFormValueInput from './dynamic-filter-config-form-value-input.vue';
82
82
 
@@ -142,7 +142,7 @@ v$.value.$touch();
142
142
  const invalid = ref(false);
143
143
 
144
144
  const isSubmitDisabled = computed(() => {
145
- if (props.columnMode && isEmpty(filterValue.value)) {
145
+ if (props.columnMode && isEmptyFilterValue(filterValue.value)) {
146
146
  return !editMode || !filterName.value || !!props.filterConfig?.notDeletable;
147
147
  }
148
148
 
@@ -23,7 +23,7 @@ const StubInput = {
23
23
  };
24
24
 
25
25
  const deletableConfig = createFilterConfig({
26
- name: FilterOption.Agent,
26
+ name: FilterOption.Tag,
27
27
  valueInputComponent: StubInput,
28
28
  });
29
29
 
@@ -68,7 +68,7 @@ describe('StaticFilterField', () => {
68
68
  expect(wrapper.emitted('add:filter')).toEqual([
69
69
  [
70
70
  {
71
- name: FilterOption.Agent,
71
+ name: FilterOption.Tag,
72
72
  value: [
73
73
  1,
74
74
  ],
@@ -79,7 +79,7 @@ describe('StaticFilterField', () => {
79
79
 
80
80
  it('updates an already applied filter', () => {
81
81
  filtersManager.addFilter({
82
- name: FilterOption.Agent,
82
+ name: FilterOption.Tag,
83
83
  value: [
84
84
  1,
85
85
  ],
@@ -100,7 +100,7 @@ describe('StaticFilterField', () => {
100
100
 
101
101
  it('deletes an applied filter when its field is cleared', () => {
102
102
  filtersManager.addFilter({
103
- name: FilterOption.Agent,
103
+ name: FilterOption.Tag,
104
104
  value: [
105
105
  1,
106
106
  ],
@@ -115,7 +115,7 @@ describe('StaticFilterField', () => {
115
115
 
116
116
  it('deletes an applied range filter when both bounds are cleared', () => {
117
117
  filtersManager.addFilter({
118
- name: FilterOption.Agent,
118
+ name: FilterOption.Tag,
119
119
  value: {
120
120
  from: 10,
121
121
  to: 20,
@@ -135,7 +135,7 @@ describe('StaticFilterField', () => {
135
135
 
136
136
  it('updates an applied range filter when one bound is left', () => {
137
137
  filtersManager.addFilter({
138
- name: FilterOption.Agent,
138
+ name: FilterOption.Tag,
139
139
  value: {
140
140
  from: 10,
141
141
  to: 20,
@@ -55,10 +55,13 @@ import {
55
55
  WtIconAction,
56
56
  } from '@webitel/ui-sdk/components';
57
57
  import { IconAction } from '@webitel/ui-sdk/enums';
58
+ import {
59
+ type FilterHasReadAccess,
60
+ provideFilterReadAccess,
61
+ } from '@webitel/ui-sdk/modules/Userinfo';
58
62
  import type { StoreGeneric } from 'pinia';
59
63
  import { computed, useTemplateRef } from 'vue';
60
64
  import { useI18n } from 'vue-i18n';
61
-
62
65
  import { ApplyPresetAction, SavePresetAction } from '../../filter-presets';
63
66
  import type { IFiltersManager } from '../classes/FiltersManager';
64
67
  import { useFilterConfigsToolkit } from '../composables/useFilterConfigsToolkit';
@@ -75,6 +78,7 @@ const props = defineProps<{
75
78
  filtersManager: IFiltersManager;
76
79
  filterOptions: FilterConfigDefinition[];
77
80
  filterableExtensionFields?: DataField[];
81
+ hasReadAccess?: FilterHasReadAccess;
78
82
  /** enables preset actions */
79
83
  presetNamespace?: string;
80
84
  usePresetsStore?: () => StoreGeneric;
@@ -97,6 +101,8 @@ const applyPreset =
97
101
  const savePreset =
98
102
  useTemplateRef<InstanceType<typeof SavePresetAction>>('savePreset');
99
103
 
104
+ provideFilterReadAccess(() => props.hasReadAccess);
105
+
100
106
  const { filterConfigs, filtersIncluded } = useFilterConfigsToolkit({
101
107
  filterOptions: props.filterOptions,
102
108
  filtersManager: props.filtersManager,
@@ -72,14 +72,16 @@
72
72
  <script lang="ts" setup>
73
73
  import type { DataField } from '@webitel/api-services/gen/models';
74
74
  import { WtIconAction } from '@webitel/ui-sdk/components';
75
+ import type { FilterHasReadAccess } from '@webitel/ui-sdk/modules/Userinfo';
76
+ import { provideFilterReadAccess } from '@webitel/ui-sdk/modules/Userinfo';
75
77
  import { StoreGeneric } from 'pinia';
76
78
  import { computed } from 'vue';
77
-
78
79
  import { ApplyPresetAction, SavePresetAction } from '../../filter-presets';
79
80
  import { FilterInitParams, IFilter } from '../classes/Filter';
80
81
  import { IFiltersManager } from '../classes/FiltersManager';
81
82
  import { useFilterConfigsToolkit } from '../composables/useFilterConfigsToolkit';
82
83
  import { useSelectedFilters } from '../composables/useSelectedFilters';
84
+
83
85
  import { AnyFilterConfig } from '../modules/filterConfig/classes/FilterConfig';
84
86
  import { FilterOption } from '../modules/filterConfig/enums/FilterOption';
85
87
  import StaticFilterField from './config/static-view/static-filter-field.vue';
@@ -137,10 +139,14 @@ type Props = {
137
139
  * [https://webitel.atlassian.net/browse/WTEL-6934]
138
140
  */
139
141
  staticMode?: boolean;
142
+ /** App Read checker. No provider → lookups stay closed. */
143
+ hasReadAccess?: FilterHasReadAccess;
140
144
  };
141
145
 
142
146
  const props = defineProps<Props>();
143
147
 
148
+ provideFilterReadAccess(() => props.hasReadAccess);
149
+
144
150
  /**
145
151
  * @author @dlohvinov
146
152
  *
@@ -1,18 +1,9 @@
1
- import { isEmpty } from '@webitel/ui-sdk/scripts';
2
1
  import { type MaybeRefOrGetter, toValue } from 'vue';
3
2
 
4
3
  import type { FilterValue, IFilter } from '../classes/Filter';
5
4
  import type { StaticFilterEmits } from '../components/types/Filter.types';
6
5
  import type { AnyFilterConfig } from '../modules/filterConfig';
7
-
8
- const isEmptyFilterValue = (value: FilterValue) => {
9
- if (typeof value === 'boolean') return false;
10
- if (isEmpty(value)) return true;
11
- if (typeof value !== 'object' || Array.isArray(value)) return false;
12
- return Object.values(value).every(
13
- (field) => field === null || field === undefined || field === '',
14
- );
15
- };
6
+ import { isEmptyFilterValue } from '../scripts/utils';
16
7
 
17
8
  type StaticFilterEmit = <K extends keyof StaticFilterEmits>(
18
9
  event: K,
@@ -38,7 +29,7 @@ export const useFilterValueChange = ({
38
29
  return emit('delete:filter', currentFilter);
39
30
  }
40
31
 
41
- if (isEmpty(currentFilter?.value)) {
32
+ if (isEmptyFilterValue(currentFilter?.value)) {
42
33
  return emit('add:filter', {
43
34
  name: config.name,
44
35
  value,
@@ -1,3 +1,4 @@
1
+ import { injectFilterReadAccess } from '@webitel/ui-sdk/modules/Userinfo';
1
2
  import { computed, type MaybeRefOrGetter, ref, toValue, watch } from 'vue';
2
3
 
3
4
  import type { IFilter } from '../classes/Filter';
@@ -5,7 +6,7 @@ import type {
5
6
  AnyFilterConfig,
6
7
  FilterConfigSearchMethodParams,
7
8
  } from '../modules/filterConfig/classes/FilterConfig';
8
- import { FilterOptionToPreviewApiSearchMethodMap } from '../modules/filterConfig/components';
9
+ import { canLoadPreviewRecords } from '../scripts/canLoadPreviewRecords';
9
10
 
10
11
  /**
11
12
  * @author @dlohvinov
@@ -24,6 +25,7 @@ export const useFilterValuePreview = ({
24
25
  filter: MaybeRefOrGetter<IFilter | undefined>;
25
26
  filterConfig: MaybeRefOrGetter<AnyFilterConfig>;
26
27
  }) => {
28
+ const getHasReadAccess = injectFilterReadAccess();
27
29
  const localValue = ref();
28
30
 
29
31
  const fillLocalValue = async (currentFilter = toValue(filter)) => {
@@ -42,9 +44,11 @@ export const useFilterValuePreview = ({
42
44
  /* arrow fn here preserves filterConfig class "this" */
43
45
  return config.searchRecords(...params);
44
46
  }
45
- : FilterOptionToPreviewApiSearchMethodMap[filterName];
47
+ : undefined;
46
48
 
47
- if (valueSearchMethod) {
49
+ const canRead = canLoadPreviewRecords(config, getHasReadAccess());
50
+
51
+ if (valueSearchMethod && canRead) {
48
52
  const { items } = await valueSearchMethod(
49
53
  {
50
54
  id: filterValue,
@@ -58,6 +62,8 @@ export const useFilterValuePreview = ({
58
62
  },
59
63
  );
60
64
  localValue.value = items;
65
+ } else if (valueSearchMethod) {
66
+ localValue.value = [];
61
67
  } else {
62
68
  localValue.value = filterValue;
63
69
  }
@@ -46,14 +46,10 @@ class TypeExtensionWtSysTypeFieldFilterConfig
46
46
  extends TypeExtensionFilterConfig
47
47
  implements IWtSysTypeFilterConfig
48
48
  {
49
- async searchRecords(
50
- { id: filterValue, ...rest }: FilterConfigSearchRequestParams,
51
- // {
52
- // filterValue,
53
- // }: {
54
- // filterValue: unknown;
55
- // },
56
- ): Promise<{
49
+ async searchRecords({
50
+ id: filterValue,
51
+ ...rest
52
+ }: FilterConfigSearchRequestParams): Promise<{
57
53
  items: unknown[];
58
54
  next?: boolean;
59
55
  }> {
@@ -17,7 +17,7 @@
17
17
  model ??
18
18
  [] /* so that component won't break when model is nullish at init */
19
19
  "
20
- :search-method="searchRecords"
20
+ :search-method="defaultProps.disabled ? undefined : searchRecords"
21
21
  :required="false /* https://github.com/webitel/webitel-ui-sdk/pull/1359#discussion_r3180877255 */"
22
22
  option-value="id"
23
23
  @update:model-value="model = $event"
@@ -31,7 +31,7 @@
31
31
  model ??
32
32
  [] /* so that component won't break when model is nullish at init */
33
33
  "
34
- :search-method="searchRecords"
34
+ :search-method="defaultProps.disabled ? undefined : searchRecords"
35
35
 
36
36
  :required="false /* https://github.com/webitel/webitel-ui-sdk/pull/1359#discussion_r3180877255 */"
37
37
  option-value="id"
@@ -1,7 +1,8 @@
1
1
  <template>
2
2
  <wt-multi-select
3
3
  :label="labelValue"
4
- :search-method="searchMethod"
4
+ :disabled="!hasReadAccess"
5
+ :search-method="lookupSearchMethod"
5
6
  :model-value="model"
6
7
  :v="!disableValidation && v$.model"
7
8
  option-value="id"
@@ -13,15 +14,17 @@
13
14
  import { useVuelidate } from '@vuelidate/core';
14
15
  import { required } from '@vuelidate/validators';
15
16
  import { WtMultiSelect } from '@webitel/ui-sdk/components';
17
+ import { WtObject } from '@webitel/ui-sdk/enums';
16
18
  import { computed, onMounted, watch } from 'vue';
17
19
  import { useI18n } from 'vue-i18n';
18
- import type { BaseFilterConfig } from '../../classes/FilterConfig';
19
- import { searchMethod } from './config.js';
20
+
21
+ import { WtSysTypeFilterConfig } from '../../classes/FilterConfig';
22
+ import { useFilterReadAccess } from '../../composables/useFilterReadAccess';
20
23
 
21
24
  type ModelValue = number[];
22
25
 
23
26
  const props = defineProps<{
24
- filterConfig?: BaseFilterConfig;
27
+ filterConfig: WtSysTypeFilterConfig;
25
28
  disableValidation?: boolean;
26
29
  }>();
27
30
 
@@ -35,6 +38,9 @@ const emit = defineEmits<{
35
38
 
36
39
  const { t } = useI18n();
37
40
 
41
+ const { hasReadAccess, gateSearch } = useFilterReadAccess(WtObject.Agent);
42
+ const lookupSearchMethod = gateSearch(props.filterConfig.searchRecords);
43
+
38
44
  const labelValue = computed(() => {
39
45
  const value = props.filterConfig?.showFilterName
40
46
  ? props.filterConfig.name
@@ -0,0 +1,22 @@
1
+ import { AgentsAPI } from '@webitel/api-services/api';
2
+ import { WtObject } from '@webitel/ui-sdk/enums';
3
+
4
+ import {
5
+ type FilterConfigBaseParams,
6
+ WtSysTypeFilterConfig,
7
+ } from '../../classes/FilterConfig';
8
+ import { gateFilterSearch } from '../../composables/useFilterReadAccess';
9
+ import { FilterOption } from '../../enums/FilterOption';
10
+ import AgentFilterValueField from './agent-filter-value-field.vue';
11
+ import AgentFilterValuePreview from './agent-filter-value-preview.vue';
12
+
13
+ class AgentFilterConfig extends WtSysTypeFilterConfig {
14
+ readonly name = FilterOption.Agent;
15
+ valueInputComponent = AgentFilterValueField;
16
+ valuePreviewComponent = AgentFilterValuePreview;
17
+
18
+ searchRecords = gateFilterSearch(WtObject.Agent, AgentsAPI.getLookup);
19
+ }
20
+
21
+ export const createAgentFilterConfig = (params?: FilterConfigBaseParams) =>
22
+ new AgentFilterConfig(params);
@@ -1,7 +1,8 @@
1
1
  <template>
2
2
  <wt-multi-select
3
3
  :label="labelValue"
4
- :search-method="props.filterConfig.searchRecords"
4
+ :disabled="!hasReadAccess"
5
+ :search-method="searchMethod"
5
6
  :model-value="model"
6
7
  :v="!disableValidation && v$.model"
7
8
  option-value="id"
@@ -13,10 +14,12 @@
13
14
  import { useVuelidate } from '@vuelidate/core';
14
15
  import { required } from '@vuelidate/validators';
15
16
  import { WtMultiSelect } from '@webitel/ui-sdk/components';
17
+ import { WtObject } from '@webitel/ui-sdk/enums';
16
18
  import { computed, onMounted, watch } from 'vue';
17
19
  import { useI18n } from 'vue-i18n';
18
20
 
19
21
  import { WtSysTypeFilterConfig } from '../../classes/FilterConfig';
22
+ import { useFilterReadAccess } from '../../composables/useFilterReadAccess';
20
23
 
21
24
  type ModelValue = number[];
22
25
 
@@ -34,6 +37,9 @@ const emit = defineEmits<{
34
37
  }>();
35
38
  const { t } = useI18n();
36
39
 
40
+ const { hasReadAccess, gateSearch } = useFilterReadAccess(WtObject.User);
41
+ const searchMethod = gateSearch(props.filterConfig.searchRecords);
42
+
37
43
  const labelValue = computed(() =>
38
44
  t(
39
45
  `webitelUI.filters.${
@@ -1,9 +1,11 @@
1
1
  import { UsersAPI } from '@webitel/api-services/api';
2
+ import { WtObject } from '@webitel/ui-sdk/enums';
2
3
 
3
4
  import {
4
5
  type FilterConfigBaseParams,
5
6
  WtSysTypeFilterConfig,
6
7
  } from '../../classes/FilterConfig';
8
+ import { gateFilterSearch } from '../../composables/useFilterReadAccess';
7
9
  import { FilterOption } from '../../enums/FilterOption';
8
10
  import AuditorFilterValueField from './auditor-filter-value-field.vue';
9
11
  import AuditorFilterValuePreview from './auditor-filter-value-preview.vue';
@@ -13,12 +15,7 @@ class AuditorFilterConfig extends WtSysTypeFilterConfig {
13
15
  valueInputComponent = AuditorFilterValueField;
14
16
  valuePreviewComponent = AuditorFilterValuePreview;
15
17
 
16
- searchRecords(params: object): Promise<{
17
- items: unknown[];
18
- next?: boolean;
19
- }> {
20
- return UsersAPI.getLookup(params);
21
- }
18
+ searchRecords = gateFilterSearch(WtObject.User, UsersAPI.getLookup);
22
19
  }
23
20
 
24
21
  export const createAuditorFilterConfig = (params?: FilterConfigBaseParams) =>
@@ -1,7 +1,8 @@
1
1
  <template>
2
2
  <wt-multi-select
3
3
  :label="labelValue"
4
- :search-method="props.filterConfig.searchRecords"
4
+ :disabled="!hasReadAccess"
5
+ :search-method="searchMethod"
5
6
  :model-value="model"
6
7
  :v="!disableValidation && v$.model"
7
8
  option-value="id"
@@ -13,10 +14,12 @@
13
14
  import { useVuelidate } from '@vuelidate/core';
14
15
  import { required } from '@vuelidate/validators';
15
16
  import { WtMultiSelect } from '@webitel/ui-sdk/components';
17
+ import { WtObject } from '@webitel/ui-sdk/enums';
16
18
  import { computed, onMounted, watch } from 'vue';
17
19
  import { useI18n } from 'vue-i18n';
18
20
 
19
21
  import { WtSysTypeFilterConfig } from '../../classes/FilterConfig';
22
+ import { useFilterReadAccess } from '../../composables/useFilterReadAccess';
20
23
 
21
24
  type ModelValue = number[];
22
25
 
@@ -34,6 +37,9 @@ const emit = defineEmits<{
34
37
  }>();
35
38
  const { t } = useI18n();
36
39
 
40
+ const { hasReadAccess, gateSearch } = useFilterReadAccess(WtObject.Bucket);
41
+ const searchMethod = gateSearch(props.filterConfig.searchRecords);
42
+
37
43
  const labelValue = computed(() =>
38
44
  t(
39
45
  `webitelUI.filters.${
@@ -1,9 +1,11 @@
1
1
  import { BucketsAPI } from '@webitel/api-services/api';
2
+ import { WtObject } from '@webitel/ui-sdk/enums';
2
3
 
3
4
  import {
4
5
  type FilterConfigBaseParams,
5
6
  WtSysTypeFilterConfig,
6
7
  } from '../../classes/FilterConfig';
8
+ import { gateFilterSearch } from '../../composables/useFilterReadAccess';
7
9
  import { FilterOption } from '../../enums/FilterOption';
8
10
  import BucketFilterValueField from './bucket-filter-value-field.vue';
9
11
  import BucketFilterValuePreview from './bucket-filter-value-preview.vue';
@@ -13,12 +15,7 @@ class BucketFilterConfig extends WtSysTypeFilterConfig {
13
15
  valueInputComponent = BucketFilterValueField;
14
16
  valuePreviewComponent = BucketFilterValuePreview;
15
17
 
16
- searchRecords(params: object): Promise<{
17
- items: unknown[];
18
- next?: boolean;
19
- }> {
20
- return BucketsAPI.getLookup(params);
21
- }
18
+ searchRecords = gateFilterSearch(WtObject.Bucket, BucketsAPI.getLookup);
22
19
  }
23
20
 
24
21
  export const createBucketFilterConfig = (params?: FilterConfigBaseParams) =>
@@ -1,7 +1,8 @@
1
1
  <template>
2
2
  <wt-multi-select
3
3
  :label="t('webitelUI.filters.filterValue')"
4
- :search-method="props.filterConfig.searchRecords"
4
+ :disabled="!hasReadAccess"
5
+ :search-method="searchMethod"
5
6
  :v="!disableValidation && vList"
6
7
  :model-value="value.list"
7
8
  data-key="id"
@@ -20,9 +21,11 @@
20
21
  import { useVuelidate } from '@vuelidate/core';
21
22
  import { requiredIf } from '@vuelidate/validators';
22
23
  import { WtCheckbox, WtMultiSelect } from '@webitel/ui-sdk/components';
24
+ import { WtObject } from '@webitel/ui-sdk/enums';
23
25
  import { computed, watch } from 'vue';
24
26
  import { useI18n } from 'vue-i18n';
25
27
 
28
+ import { useFilterReadAccess } from '../../composables/useFilterReadAccess';
26
29
  import { CaseAssigneeFilterConfig } from './index';
27
30
 
28
31
  type ModelValue = {
@@ -68,6 +71,9 @@ const emit = defineEmits<{
68
71
 
69
72
  const { t } = useI18n();
70
73
 
74
+ const { hasReadAccess, gateSearch } = useFilterReadAccess(WtObject.Contact);
75
+ const searchMethod = gateSearch(props.filterConfig.searchRecords);
76
+
71
77
  const v$ = useVuelidate<{
72
78
  model: ModelValue;
73
79
  }>(
@@ -1,4 +1,5 @@
1
1
  import { ContactsAPI } from '@webitel/api-services/api';
2
+ import { WtObject } from '@webitel/ui-sdk/enums';
2
3
 
3
4
  import {
4
5
  type FilterConfigBaseParams,
@@ -6,6 +7,7 @@ import {
6
7
  type FilterConfigSearchRequestParams,
7
8
  WtSysTypeFilterConfig,
8
9
  } from '../../classes/FilterConfig';
10
+ import { gateFilterSearch } from '../../composables/useFilterReadAccess';
9
11
  import { FilterOption } from '../../enums/FilterOption';
10
12
  import CaseAssigneeFilterValueField from './case-assignee-filter-value-field.vue';
11
13
  import CaseAssigneeFilterValuePreview from './case-assignee-filter-value-preview.vue';
@@ -15,7 +17,7 @@ class CaseAssigneeFilterConfig extends WtSysTypeFilterConfig {
15
17
  valueInputComponent = CaseAssigneeFilterValueField;
16
18
  valuePreviewComponent = CaseAssigneeFilterValuePreview;
17
19
 
18
- searchRecords(
20
+ async searchRecords(
19
21
  params: FilterConfigSearchRequestParams,
20
22
  { filterValue }: FilterConfigSearchFilterContext = {},
21
23
  ): Promise<{
@@ -23,15 +25,18 @@ class CaseAssigneeFilterConfig extends WtSysTypeFilterConfig {
23
25
  next?: boolean;
24
26
  }> {
25
27
  if (filterValue?.unassigned && !filterValue.list?.length)
26
- return Promise.resolve({
28
+ return {
27
29
  items: [],
28
- });
30
+ };
29
31
  const id =
30
32
  params.id?.list /* general logic from dynamic-filter-preview.vue*/ ||
31
33
  params.id /* wt-select options loadings */ ||
32
34
  filterValue?.list; /* newest and coolest, but not implemented on all filters 🥲 */
33
35
 
34
- return ContactsAPI.getLookup({
36
+ return gateFilterSearch(
37
+ WtObject.Contact,
38
+ ContactsAPI.getLookup,
39
+ )({
35
40
  ...params,
36
41
  id,
37
42
  });
@@ -1,7 +1,8 @@
1
1
  <template>
2
2
  <wt-multi-select
3
3
  :label="t('webitelUI.filters.filterValue')"
4
- :search-method="searchMethod"
4
+ :disabled="!hasReadAccess"
5
+ :search-method="lookupSearchMethod"
5
6
  :v="!disableValidation && v$.model"
6
7
  :model-value="model"
7
8
  option-value="id"
@@ -13,14 +14,17 @@
13
14
  import { useVuelidate } from '@vuelidate/core';
14
15
  import { required } from '@vuelidate/validators';
15
16
  import { WtMultiSelect } from '@webitel/ui-sdk/components';
17
+ import { WtObject } from '@webitel/ui-sdk/enums';
16
18
  import { computed, watch } from 'vue';
17
19
  import { useI18n } from 'vue-i18n';
18
20
 
19
- import { searchMethod } from './config.js';
21
+ import { WtSysTypeFilterConfig } from '../../classes/FilterConfig';
22
+ import { useFilterReadAccess } from '../../composables/useFilterReadAccess';
20
23
 
21
24
  type ModelValue = number[];
22
25
 
23
26
  const props = defineProps<{
27
+ filterConfig: WtSysTypeFilterConfig;
24
28
  disableValidation?: boolean;
25
29
  }>();
26
30
 
@@ -33,6 +37,9 @@ const emit = defineEmits<{
33
37
  }>();
34
38
  const { t } = useI18n();
35
39
 
40
+ const { hasReadAccess, gateSearch } = useFilterReadAccess(WtObject.User);
41
+ const lookupSearchMethod = gateSearch(props.filterConfig.searchRecords);
42
+
36
43
  const v$ = useVuelidate(
37
44
  computed(() => ({
38
45
  model: {
@@ -0,0 +1,22 @@
1
+ import { UsersAPI } from '@webitel/api-services/api';
2
+ import { WtObject } from '@webitel/ui-sdk/enums';
3
+
4
+ import {
5
+ type FilterConfigBaseParams,
6
+ WtSysTypeFilterConfig,
7
+ } from '../../classes/FilterConfig';
8
+ import { gateFilterSearch } from '../../composables/useFilterReadAccess';
9
+ import { FilterOption } from '../../enums/FilterOption';
10
+ import CaseAuthorFilterValueField from './case-author-filter-value-field.vue';
11
+ import CaseAuthorFilterValuePreview from './case-author-filter-value-preview.vue';
12
+
13
+ class CaseAuthorFilterConfig extends WtSysTypeFilterConfig {
14
+ readonly name = FilterOption.CaseAuthor;
15
+ valueInputComponent = CaseAuthorFilterValueField;
16
+ valuePreviewComponent = CaseAuthorFilterValuePreview;
17
+
18
+ searchRecords = gateFilterSearch(WtObject.User, UsersAPI.getLookup);
19
+ }
20
+
21
+ export const createCaseAuthorFilterConfig = (params?: FilterConfigBaseParams) =>
22
+ new CaseAuthorFilterConfig(params);