@webitel/ui-datalist 26.8.17 → 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 (157) 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/static-view/__tests__/static-filter-field.spec.ts +6 -6
  5. package/src/modules/filters/components/filters-actions-menu.vue +7 -1
  6. package/src/modules/filters/components/table-filters-panel.vue +7 -1
  7. package/src/modules/filters/composables/useFilterValuePreview.ts +9 -3
  8. package/src/modules/filters/modules/filterConfig/components/_custom/filterConfig.ts +4 -8
  9. package/src/modules/filters/modules/filterConfig/components/_custom/type-extension-filter-value-field.vue +2 -2
  10. package/src/modules/filters/modules/filterConfig/components/agent/agent-filter-value-field.vue +10 -4
  11. package/src/modules/filters/modules/filterConfig/components/agent/index.ts +22 -0
  12. package/src/modules/filters/modules/filterConfig/components/auditor/auditor-filter-value-field.vue +7 -1
  13. package/src/modules/filters/modules/filterConfig/components/auditor/index.ts +3 -6
  14. package/src/modules/filters/modules/filterConfig/components/bucket/bucket-filter-value-field.vue +7 -1
  15. package/src/modules/filters/modules/filterConfig/components/bucket/index.ts +3 -6
  16. package/src/modules/filters/modules/filterConfig/components/case-assignee/case-assignee-filter-value-field.vue +7 -1
  17. package/src/modules/filters/modules/filterConfig/components/case-assignee/filterConfig.ts +9 -4
  18. package/src/modules/filters/modules/filterConfig/components/case-author/case-author-filter-value-field.vue +9 -2
  19. package/src/modules/filters/modules/filterConfig/components/case-author/index.ts +22 -0
  20. package/src/modules/filters/modules/filterConfig/components/case-close-reason-groups/case-close-reason-groups-filter-value-field.vue +16 -8
  21. package/src/modules/filters/modules/filterConfig/components/case-close-reason-groups/filterConfig.ts +44 -0
  22. package/src/modules/filters/modules/filterConfig/components/case-close-reason-groups/index.ts +10 -0
  23. package/src/modules/filters/modules/filterConfig/components/case-impacted/case-impacted-filter-value-field.vue +9 -2
  24. package/src/modules/filters/modules/filterConfig/components/case-impacted/index.ts +23 -0
  25. package/src/modules/filters/modules/filterConfig/components/case-priority/case-priority-filter-value-field.vue +9 -2
  26. package/src/modules/filters/modules/filterConfig/components/case-priority/index.ts +26 -0
  27. package/src/modules/filters/modules/filterConfig/components/case-reporter/case-reporter-filter-value-field.vue +9 -2
  28. package/src/modules/filters/modules/filterConfig/components/case-reporter/index.ts +23 -0
  29. package/src/modules/filters/modules/filterConfig/components/case-service/case-service-filter-value-field.vue +18 -5
  30. package/src/modules/filters/modules/filterConfig/components/case-service/filterConfig.ts +33 -0
  31. package/src/modules/filters/modules/filterConfig/components/case-service/index.ts +10 -0
  32. package/src/modules/filters/modules/filterConfig/components/case-sla/case-sla-filter-value-field.vue +9 -2
  33. package/src/modules/filters/modules/filterConfig/components/case-sla/index.ts +22 -0
  34. package/src/modules/filters/modules/filterConfig/components/case-sla-condition/case-sla-condition-filter-value-field.vue +14 -5
  35. package/src/modules/filters/modules/filterConfig/components/case-sla-condition/filterConfig.ts +38 -0
  36. package/src/modules/filters/modules/filterConfig/components/case-sla-condition/index.ts +10 -0
  37. package/src/modules/filters/modules/filterConfig/components/case-source/case-source-filter-value-field.vue +9 -2
  38. package/src/modules/filters/modules/filterConfig/components/case-source/index.ts +22 -0
  39. package/src/modules/filters/modules/filterConfig/components/case-status/case-status-filter-value-field.vue +14 -8
  40. package/src/modules/filters/modules/filterConfig/components/case-status/filterConfig.ts +40 -0
  41. package/src/modules/filters/modules/filterConfig/components/case-status/index.ts +10 -0
  42. package/src/modules/filters/modules/filterConfig/components/contact/contact-filter-value-field.vue +9 -2
  43. package/src/modules/filters/modules/filterConfig/components/contact/index.ts +22 -0
  44. package/src/modules/filters/modules/filterConfig/components/contact-group/contact-group-filter-value-field.vue +10 -2
  45. package/src/modules/filters/modules/filterConfig/components/contact-group/index.ts +7 -2
  46. package/src/modules/filters/modules/filterConfig/components/contact-label/contact-label-filter-value-field.vue +8 -2
  47. package/src/modules/filters/modules/filterConfig/components/contact-label/index.ts +6 -4
  48. package/src/modules/filters/modules/filterConfig/components/contact-owner/contact-owner-filter-value-field.vue +7 -1
  49. package/src/modules/filters/modules/filterConfig/components/contact-owner/index.ts +3 -6
  50. package/src/modules/filters/modules/filterConfig/components/gateway/gateway-filter-value-field.vue +8 -10
  51. package/src/modules/filters/modules/filterConfig/components/gateway/index.ts +31 -0
  52. package/src/modules/filters/modules/filterConfig/components/grantee/grantee-filter-value-field.vue +9 -2
  53. package/src/modules/filters/modules/filterConfig/components/grantee/index.ts +22 -0
  54. package/src/modules/filters/modules/filterConfig/components/index.ts +38 -64
  55. package/src/modules/filters/modules/filterConfig/components/queue/index.ts +3 -6
  56. package/src/modules/filters/modules/filterConfig/components/queue/queue-filter-value-field.vue +7 -1
  57. package/src/modules/filters/modules/filterConfig/components/rated-by/index.ts +22 -0
  58. package/src/modules/filters/modules/filterConfig/components/rated-by/rated-by-filter-value-field.vue +8 -3
  59. package/src/modules/filters/modules/filterConfig/components/region/index.ts +3 -6
  60. package/src/modules/filters/modules/filterConfig/components/region/region-filter-value-field.vue +7 -1
  61. package/src/modules/filters/modules/filterConfig/components/skill/index.ts +3 -6
  62. package/src/modules/filters/modules/filterConfig/components/skill/skill-filter-value-field.vue +7 -1
  63. package/src/modules/filters/modules/filterConfig/components/supervisor/index.ts +6 -6
  64. package/src/modules/filters/modules/filterConfig/components/supervisor/supervisor-filter-value-field.vue +7 -1
  65. package/src/modules/filters/modules/filterConfig/components/tags/index.ts +3 -6
  66. package/src/modules/filters/modules/filterConfig/components/tags/tags-filter-value-field.vue +7 -1
  67. package/src/modules/filters/modules/filterConfig/components/team/index.ts +3 -6
  68. package/src/modules/filters/modules/filterConfig/components/team/team-filter-value-field.vue +7 -1
  69. package/src/modules/filters/modules/filterConfig/components/user/index.ts +22 -0
  70. package/src/modules/filters/modules/filterConfig/components/user/user-filter-value-field.vue +8 -3
  71. package/src/modules/filters/modules/filterConfig/composables/useFilterReadAccess.ts +55 -0
  72. package/src/modules/filters/scripts/canLoadPreviewRecords.ts +35 -0
  73. package/types/.tsbuildinfo +1 -1
  74. package/types/modules/filters/components/column/column-filter-preview.vue.d.ts +2 -0
  75. package/types/modules/filters/components/column/column-filter.vue.d.ts +2 -0
  76. package/types/modules/filters/components/filters-actions-menu.vue.d.ts +2 -0
  77. package/types/modules/filters/components/table-filters-panel.vue.d.ts +3 -0
  78. package/types/modules/filters/modules/filterConfig/components/agent/agent-filter-value-field.vue.d.ts +2 -2
  79. package/types/modules/filters/modules/filterConfig/components/agent/index.d.ts +29 -0
  80. package/types/modules/filters/modules/filterConfig/components/auditor/index.d.ts +1 -4
  81. package/types/modules/filters/modules/filterConfig/components/bucket/index.d.ts +1 -4
  82. package/types/modules/filters/modules/filterConfig/components/case-author/case-author-filter-value-field.vue.d.ts +2 -0
  83. package/types/modules/filters/modules/filterConfig/components/case-author/index.d.ts +29 -0
  84. package/types/modules/filters/modules/filterConfig/components/case-close-reason-groups/case-close-reason-groups-filter-value-field.vue.d.ts +2 -0
  85. package/types/modules/filters/modules/filterConfig/components/case-close-reason-groups/filterConfig.d.ts +48 -0
  86. package/types/modules/filters/modules/filterConfig/components/case-close-reason-groups/index.d.ts +5 -0
  87. package/types/modules/filters/modules/filterConfig/components/case-impacted/case-impacted-filter-value-field.vue.d.ts +2 -0
  88. package/types/modules/filters/modules/filterConfig/components/case-impacted/index.d.ts +29 -0
  89. package/types/modules/filters/modules/filterConfig/components/case-priority/case-priority-filter-value-field.vue.d.ts +2 -0
  90. package/types/modules/filters/modules/filterConfig/components/case-priority/index.d.ts +29 -0
  91. package/types/modules/filters/modules/filterConfig/components/case-reporter/case-reporter-filter-value-field.vue.d.ts +2 -0
  92. package/types/modules/filters/modules/filterConfig/components/case-reporter/index.d.ts +29 -0
  93. package/types/modules/filters/modules/filterConfig/components/case-service/case-service-filter-value-field.vue.d.ts +7 -2
  94. package/types/modules/filters/modules/filterConfig/components/case-service/filterConfig.d.ts +29 -0
  95. package/types/modules/filters/modules/filterConfig/components/case-service/index.d.ts +5 -0
  96. package/types/modules/filters/modules/filterConfig/components/case-sla/case-sla-filter-value-field.vue.d.ts +2 -0
  97. package/types/modules/filters/modules/filterConfig/components/case-sla/index.d.ts +29 -0
  98. package/types/modules/filters/modules/filterConfig/components/case-sla-condition/case-sla-condition-filter-value-field.vue.d.ts +2 -0
  99. package/types/modules/filters/modules/filterConfig/components/case-sla-condition/filterConfig.d.ts +48 -0
  100. package/types/modules/filters/modules/filterConfig/components/case-sla-condition/index.d.ts +5 -0
  101. package/types/modules/filters/modules/filterConfig/components/case-source/case-source-filter-value-field.vue.d.ts +2 -0
  102. package/types/modules/filters/modules/filterConfig/components/case-source/index.d.ts +29 -0
  103. package/types/modules/filters/modules/filterConfig/components/case-status/case-status-filter-value-field.vue.d.ts +2 -0
  104. package/types/modules/filters/modules/filterConfig/components/case-status/filterConfig.d.ts +49 -0
  105. package/types/modules/filters/modules/filterConfig/components/case-status/index.d.ts +5 -0
  106. package/types/modules/filters/modules/filterConfig/components/contact/contact-filter-value-field.vue.d.ts +2 -0
  107. package/types/modules/filters/modules/filterConfig/components/contact/index.d.ts +29 -0
  108. package/types/modules/filters/modules/filterConfig/components/contact-owner/index.d.ts +1 -4
  109. package/types/modules/filters/modules/filterConfig/components/gateway/gateway-filter-value-field.vue.d.ts +1 -1
  110. package/types/modules/filters/modules/filterConfig/components/gateway/index.d.ts +29 -0
  111. package/types/modules/filters/modules/filterConfig/components/grantee/grantee-filter-value-field.vue.d.ts +2 -0
  112. package/types/modules/filters/modules/filterConfig/components/grantee/index.d.ts +29 -0
  113. package/types/modules/filters/modules/filterConfig/components/index.d.ts +409 -77
  114. package/types/modules/filters/modules/filterConfig/components/queue/index.d.ts +1 -4
  115. package/types/modules/filters/modules/filterConfig/components/rated-by/index.d.ts +29 -0
  116. package/types/modules/filters/modules/filterConfig/components/rated-by/rated-by-filter-value-field.vue.d.ts +1 -1
  117. package/types/modules/filters/modules/filterConfig/components/region/index.d.ts +1 -4
  118. package/types/modules/filters/modules/filterConfig/components/skill/index.d.ts +1 -4
  119. package/types/modules/filters/modules/filterConfig/components/supervisor/index.d.ts +1 -4
  120. package/types/modules/filters/modules/filterConfig/components/tags/index.d.ts +1 -4
  121. package/types/modules/filters/modules/filterConfig/components/team/index.d.ts +1 -4
  122. package/types/modules/filters/modules/filterConfig/components/user/index.d.ts +29 -0
  123. package/types/modules/filters/modules/filterConfig/components/user/user-filter-value-field.vue.d.ts +1 -1
  124. package/types/modules/filters/modules/filterConfig/composables/useFilterReadAccess.d.ts +19 -0
  125. package/types/modules/filters/scripts/canLoadPreviewRecords.d.ts +3 -0
  126. package/src/modules/filters/modules/filterConfig/components/agent/config.js +0 -3
  127. package/src/modules/filters/modules/filterConfig/components/case-author/config.js +0 -3
  128. package/src/modules/filters/modules/filterConfig/components/case-close-reason-groups/config.js +0 -8
  129. package/src/modules/filters/modules/filterConfig/components/case-impacted/config.js +0 -3
  130. package/src/modules/filters/modules/filterConfig/components/case-priority/config.js +0 -3
  131. package/src/modules/filters/modules/filterConfig/components/case-reporter/config.js +0 -3
  132. package/src/modules/filters/modules/filterConfig/components/case-service/config.js +0 -4
  133. package/src/modules/filters/modules/filterConfig/components/case-sla/config.js +0 -3
  134. package/src/modules/filters/modules/filterConfig/components/case-sla-condition/config.js +0 -4
  135. package/src/modules/filters/modules/filterConfig/components/case-source/config.js +0 -3
  136. package/src/modules/filters/modules/filterConfig/components/case-status/config.js +0 -8
  137. package/src/modules/filters/modules/filterConfig/components/contact/config.js +0 -3
  138. package/src/modules/filters/modules/filterConfig/components/gateway/config.js +0 -3
  139. package/src/modules/filters/modules/filterConfig/components/grantee/config.js +0 -3
  140. package/src/modules/filters/modules/filterConfig/components/rated-by/config.js +0 -3
  141. package/src/modules/filters/modules/filterConfig/components/user/config.js +0 -3
  142. package/types/modules/filters/modules/filterConfig/components/agent/config.d.ts +0 -7
  143. package/types/modules/filters/modules/filterConfig/components/case-author/config.d.ts +0 -7
  144. package/types/modules/filters/modules/filterConfig/components/case-close-reason-groups/config.d.ts +0 -16
  145. package/types/modules/filters/modules/filterConfig/components/case-impacted/config.d.ts +0 -7
  146. package/types/modules/filters/modules/filterConfig/components/case-priority/config.d.ts +0 -7
  147. package/types/modules/filters/modules/filterConfig/components/case-reporter/config.d.ts +0 -7
  148. package/types/modules/filters/modules/filterConfig/components/case-service/config.d.ts +0 -14
  149. package/types/modules/filters/modules/filterConfig/components/case-sla/config.d.ts +0 -7
  150. package/types/modules/filters/modules/filterConfig/components/case-sla-condition/config.d.ts +0 -16
  151. package/types/modules/filters/modules/filterConfig/components/case-source/config.d.ts +0 -7
  152. package/types/modules/filters/modules/filterConfig/components/case-status/config.d.ts +0 -17
  153. package/types/modules/filters/modules/filterConfig/components/contact/config.d.ts +0 -7
  154. package/types/modules/filters/modules/filterConfig/components/gateway/config.d.ts +0 -7
  155. package/types/modules/filters/modules/filterConfig/components/grantee/config.d.ts +0 -4
  156. package/types/modules/filters/modules/filterConfig/components/rated-by/config.d.ts +0 -7
  157. package/types/modules/filters/modules/filterConfig/components/user/config.d.ts +0 -7
@@ -1,9 +1,11 @@
1
1
  import { QueuesAPI } 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 QueueFilterValueField from './queue-filter-value-field.vue';
9
11
  import QueueFilterValuePreview from './queue-filter-value-preview.vue';
@@ -13,12 +15,7 @@ class QueueFilterConfig extends WtSysTypeFilterConfig {
13
15
  valueInputComponent = QueueFilterValueField;
14
16
  valuePreviewComponent = QueueFilterValuePreview;
15
17
 
16
- searchRecords(params: object): Promise<{
17
- items: unknown[];
18
- next?: boolean;
19
- }> {
20
- return QueuesAPI.getLookup(params);
21
- }
18
+ searchRecords = gateFilterSearch(WtObject.Queue, QueuesAPI.getLookup);
22
19
  }
23
20
 
24
21
  export const createQueueFilterConfig = (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.Queue);
41
+ const searchMethod = gateSearch(props.filterConfig.searchRecords);
42
+
37
43
  const labelValue = computed(() =>
38
44
  t(
39
45
  `webitelUI.filters.${
@@ -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 RatedByFilterValueField from './rated-by-filter-value-field.vue';
11
+ import RatedByFilterValuePreview from './rated-by-filter-value-preview.vue';
12
+
13
+ class RatedByFilterConfig extends WtSysTypeFilterConfig {
14
+ readonly name = FilterOption.RatedBy;
15
+ valueInputComponent = RatedByFilterValueField;
16
+ valuePreviewComponent = RatedByFilterValuePreview;
17
+
18
+ searchRecords = gateFilterSearch(WtObject.User, UsersAPI.getLookup);
19
+ }
20
+
21
+ export const createRatedByFilterConfig = (params?: FilterConfigBaseParams) =>
22
+ new RatedByFilterConfig(params);
@@ -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,16 +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
21
  import { WtSysTypeFilterConfig } from '../../classes/FilterConfig';
20
- import { searchMethod } from './config.js';
22
+ import { useFilterReadAccess } from '../../composables/useFilterReadAccess';
21
23
 
22
24
  type ModelValue = number[];
23
25
 
24
26
  const props = defineProps<{
25
- filterConfig?: WtSysTypeFilterConfig;
27
+ filterConfig: WtSysTypeFilterConfig;
26
28
  disableValidation?: boolean;
27
29
  }>();
28
30
 
@@ -35,6 +37,9 @@ const emit = defineEmits<{
35
37
  }>();
36
38
  const { t } = useI18n();
37
39
 
40
+ const { hasReadAccess, gateSearch } = useFilterReadAccess(WtObject.User);
41
+ const lookupSearchMethod = gateSearch(props.filterConfig.searchRecords);
42
+
38
43
  const labelValue = computed(() => {
39
44
  const value = props?.filterConfig?.showFilterName
40
45
  ? props?.filterConfig.name
@@ -1,9 +1,11 @@
1
1
  import { RegionsAPI } 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 RegionFilterValueField from './region-filter-value-field.vue';
9
11
  import RegionFilterValuePreview from './region-filter-value-preview.vue';
@@ -12,12 +14,7 @@ class RegionFilterConfig extends WtSysTypeFilterConfig {
12
14
  readonly name = FilterOption.Region;
13
15
  valueInputComponent = RegionFilterValueField;
14
16
  valuePreviewComponent = RegionFilterValuePreview;
15
- searchRecords(params: object): Promise<{
16
- items: unknown[];
17
- next?: boolean;
18
- }> {
19
- return RegionsAPI.getLookup(params);
20
- }
17
+ searchRecords = gateFilterSearch(WtObject.Region, RegionsAPI.getLookup);
21
18
  }
22
19
 
23
20
  export const createRegionFilterConfig = (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.Region);
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 { SkillsAPI } 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 SkillFilterValueField from './skill-filter-value-field.vue';
9
11
  import SkillFilterValuePreview from './skill-filter-value-preview.vue';
@@ -13,12 +15,7 @@ class SkillFilterConfig extends WtSysTypeFilterConfig {
13
15
  valueInputComponent = SkillFilterValueField;
14
16
  valuePreviewComponent = SkillFilterValuePreview;
15
17
 
16
- searchRecords(params: object): Promise<{
17
- items: unknown[];
18
- next?: boolean;
19
- }> {
20
- return SkillsAPI.getLookup(params);
21
- }
18
+ searchRecords = gateFilterSearch(WtObject.Skill, SkillsAPI.getLookup);
22
19
  }
23
20
 
24
21
  export const createSkillFilterConfig = (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.Skill);
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 { AgentsAPI } 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 SupervisorFilterValueField from './supervisor-filter-value-field.vue';
9
11
  import SupervisorFilterValuePreview from './supervisor-filter-value-preview.vue';
@@ -13,12 +15,10 @@ class SupervisorFilterConfig extends WtSysTypeFilterConfig {
13
15
  valueInputComponent = SupervisorFilterValueField;
14
16
  valuePreviewComponent = SupervisorFilterValuePreview;
15
17
 
16
- searchRecords(params: object): Promise<{
17
- items: unknown[];
18
- next?: boolean;
19
- }> {
20
- return AgentsAPI.getSupervisorOptions(params);
21
- }
18
+ searchRecords = gateFilterSearch(
19
+ WtObject.Agent,
20
+ AgentsAPI.getSupervisorOptions,
21
+ );
22
22
  }
23
23
 
24
24
  export const createSupervisorFilterConfig = (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.Agent);
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 { QueuesAPI } 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 TagsFilterValueField from './tags-filter-value-field.vue';
9
11
  import TagsFilterValuePreview from './tags-filter-value-preview.vue';
@@ -13,12 +15,7 @@ class QueueTagsFilterConfig extends WtSysTypeFilterConfig {
13
15
  valueInputComponent = TagsFilterValueField;
14
16
  valuePreviewComponent = TagsFilterValuePreview;
15
17
 
16
- searchRecords(params: object): Promise<{
17
- items: unknown[];
18
- next?: boolean;
19
- }> {
20
- return QueuesAPI.getQueuesTags(params);
21
- }
18
+ searchRecords = gateFilterSearch(WtObject.Queue, QueuesAPI.getQueuesTags);
22
19
  }
23
20
 
24
21
  export const createQueueTagsFilterConfig = (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="selectedOptions"
6
7
  :v="!disableValidation && v$.model"
7
8
  chips-view
@@ -15,10 +16,12 @@
15
16
  import { useVuelidate } from '@vuelidate/core';
16
17
  import { required } from '@vuelidate/validators';
17
18
  import { WtMultiSelect } from '@webitel/ui-sdk/components';
19
+ import { WtObject } from '@webitel/ui-sdk/enums';
18
20
  import { computed, onMounted, watch } from 'vue';
19
21
  import { useI18n } from 'vue-i18n';
20
22
 
21
23
  import { WtSysTypeFilterConfig } from '../../classes/FilterConfig';
24
+ import { useFilterReadAccess } from '../../composables/useFilterReadAccess';
22
25
 
23
26
  /**
24
27
  * Queue tags are free-form strings, so the filter stores names rather than ids
@@ -44,6 +47,9 @@ const emit = defineEmits<{
44
47
  }>();
45
48
  const { t } = useI18n();
46
49
 
50
+ const { hasReadAccess, gateSearch } = useFilterReadAccess(WtObject.Queue);
51
+ const searchMethod = gateSearch(props.filterConfig.searchRecords);
52
+
47
53
  const labelValue = computed(() =>
48
54
  t(
49
55
  `webitelUI.filters.${
@@ -1,9 +1,11 @@
1
1
  import { TeamsAPI } 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 TeamFilterValueField from './team-filter-value-field.vue';
9
11
  import TeamFilterValuePreview from './team-filter-value-preview.vue';
@@ -13,12 +15,7 @@ class TeamFilterConfig extends WtSysTypeFilterConfig {
13
15
  valueInputComponent = TeamFilterValueField;
14
16
  valuePreviewComponent = TeamFilterValuePreview;
15
17
 
16
- searchRecords(params: object): Promise<{
17
- items: unknown[];
18
- next?: boolean;
19
- }> {
20
- return TeamsAPI.getLookup(params);
21
- }
18
+ searchRecords = gateFilterSearch(WtObject.Team, TeamsAPI.getLookup);
22
19
  }
23
20
 
24
21
  export const createTeamFilterConfig = (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
  const props = defineProps<{
22
25
  filterConfig: WtSysTypeFilterConfig;
@@ -34,6 +37,9 @@ const emit = defineEmits<{
34
37
  }>();
35
38
  const { t } = useI18n();
36
39
 
40
+ const { hasReadAccess, gateSearch } = useFilterReadAccess(WtObject.Team);
41
+ const searchMethod = gateSearch(props.filterConfig.searchRecords);
42
+
37
43
  const v$ = useVuelidate(
38
44
  computed(() => ({
39
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 UserFilterValueField from './user-filter-value-field.vue';
11
+ import UserFilterValuePreview from './user-filter-value-preview.vue';
12
+
13
+ class UserFilterConfig extends WtSysTypeFilterConfig {
14
+ readonly name = FilterOption.User;
15
+ valueInputComponent = UserFilterValueField;
16
+ valuePreviewComponent = UserFilterValuePreview;
17
+
18
+ searchRecords = gateFilterSearch(WtObject.User, UsersAPI.getLookup);
19
+ }
20
+
21
+ export const createUserFilterConfig = (params?: FilterConfigBaseParams) =>
22
+ new UserFilterConfig(params);
@@ -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,18 +14,19 @@
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';
20
- import { searchMethod } from './config.js';
22
+ import { useFilterReadAccess } from '../../composables/useFilterReadAccess';
21
23
 
22
24
  type ModelValue = number[];
23
25
 
24
26
  const model = defineModel<ModelValue>();
25
27
 
26
28
  const props = defineProps<{
27
- filterConfig?: WtSysTypeFilterConfig;
29
+ filterConfig: WtSysTypeFilterConfig;
28
30
  disableValidation?: boolean;
29
31
  }>();
30
32
 
@@ -35,6 +37,9 @@ const emit = defineEmits<{
35
37
  }>();
36
38
  const { t } = useI18n();
37
39
 
40
+ const { hasReadAccess, gateSearch } = useFilterReadAccess(WtObject.User);
41
+ const lookupSearchMethod = gateSearch(props.filterConfig.searchRecords);
42
+
38
43
  const labelValue = computed(() => {
39
44
  const value = props?.filterConfig?.showFilterName
40
45
  ? props?.filterConfig.name
@@ -0,0 +1,55 @@
1
+ import type { WtObject } from '@webitel/ui-sdk/enums';
2
+ import {
3
+ type FilterHasReadAccess,
4
+ injectFilterReadAccess,
5
+ } from '@webitel/ui-sdk/modules/Userinfo';
6
+ import { computed } from 'vue';
7
+
8
+ export type { FilterHasReadAccess };
9
+
10
+ type SearchResult<Item> = {
11
+ items?: Item[];
12
+ next?: boolean;
13
+ };
14
+
15
+ type GatedSearchResult<Item> = {
16
+ items: Item[];
17
+ next?: boolean;
18
+ };
19
+
20
+ export type GatedFilterSearch<Args extends unknown[], Item> = ((
21
+ ...args: Args
22
+ ) => Promise<GatedSearchResult<Item>>) & {
23
+ accessObject: WtObject;
24
+ };
25
+
26
+ export const gateFilterSearch = <Item, Args extends unknown[]>(
27
+ object: WtObject,
28
+ search: (...args: Args) => Promise<SearchResult<Item>>,
29
+ ): GatedFilterSearch<Args, Item> => {
30
+ const gated = (async (...args) => {
31
+ const result = await search(...args);
32
+ return {
33
+ ...result,
34
+ items: result.items ?? [],
35
+ };
36
+ }) as GatedFilterSearch<Args, Item>;
37
+
38
+ // preview has no WtObject of its own and checks Read against this tag
39
+ gated.accessObject = object;
40
+ return gated;
41
+ };
42
+
43
+ export const useFilterReadAccess = (object: WtObject) => {
44
+ const getHasReadAccess = injectFilterReadAccess();
45
+
46
+ const hasReadAccess = computed(() => getHasReadAccess()?.(object) ?? false);
47
+
48
+ const gateSearch = <T>(search: T) =>
49
+ computed(() => (hasReadAccess.value ? search : undefined));
50
+
51
+ return {
52
+ hasReadAccess,
53
+ gateSearch,
54
+ };
55
+ };
@@ -0,0 +1,35 @@
1
+ import type { DataField } from '@webitel/api-services/gen/models';
2
+ import type { WtObject } from '@webitel/ui-sdk/enums';
3
+ import {
4
+ type FilterHasReadAccess,
5
+ hasLookupFieldReadAccess,
6
+ } from '@webitel/ui-sdk/modules/Userinfo';
7
+
8
+ import type { AnyFilterConfig } from '../modules/filterConfig/classes/FilterConfig';
9
+
10
+ const isCustomLookupConfig = (
11
+ config: AnyFilterConfig,
12
+ ): config is AnyFilterConfig & {
13
+ field: DataField;
14
+ } => 'field' in config;
15
+
16
+ const readAccessObject = (config: AnyFilterConfig): WtObject | undefined => {
17
+ if (!('searchRecords' in config)) return undefined;
18
+ if (!('accessObject' in config.searchRecords)) return undefined;
19
+
20
+ return config.searchRecords.accessObject as WtObject | undefined;
21
+ };
22
+
23
+ export const canLoadPreviewRecords = (
24
+ config: AnyFilterConfig,
25
+ checker: FilterHasReadAccess | undefined,
26
+ ) => {
27
+ if (isCustomLookupConfig(config)) {
28
+ return hasLookupFieldReadAccess(config.field, checker);
29
+ }
30
+
31
+ const accessObject = readAccessObject(config);
32
+ if (!accessObject) return true;
33
+
34
+ return checker?.(accessObject) ?? false;
35
+ };