@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.
- package/package.json +1 -1
- package/src/modules/filters/components/column/column-filter-preview.vue +2 -1
- package/src/modules/filters/components/column/column-filter.vue +8 -1
- package/src/modules/filters/components/config/dynamic-view/dynamic-filter-config-form.vue +2 -2
- package/src/modules/filters/components/config/static-view/__tests__/static-filter-field.spec.ts +6 -6
- package/src/modules/filters/components/filters-actions-menu.vue +7 -1
- package/src/modules/filters/components/table-filters-panel.vue +7 -1
- package/src/modules/filters/composables/useFilterValueChange.ts +2 -11
- package/src/modules/filters/composables/useFilterValuePreview.ts +9 -3
- package/src/modules/filters/modules/filterConfig/components/_custom/filterConfig.ts +4 -8
- package/src/modules/filters/modules/filterConfig/components/_custom/type-extension-filter-value-field.vue +2 -2
- package/src/modules/filters/modules/filterConfig/components/agent/agent-filter-value-field.vue +10 -4
- package/src/modules/filters/modules/filterConfig/components/agent/index.ts +22 -0
- package/src/modules/filters/modules/filterConfig/components/auditor/auditor-filter-value-field.vue +7 -1
- package/src/modules/filters/modules/filterConfig/components/auditor/index.ts +3 -6
- package/src/modules/filters/modules/filterConfig/components/bucket/bucket-filter-value-field.vue +7 -1
- package/src/modules/filters/modules/filterConfig/components/bucket/index.ts +3 -6
- package/src/modules/filters/modules/filterConfig/components/case-assignee/case-assignee-filter-value-field.vue +7 -1
- package/src/modules/filters/modules/filterConfig/components/case-assignee/filterConfig.ts +9 -4
- package/src/modules/filters/modules/filterConfig/components/case-author/case-author-filter-value-field.vue +9 -2
- package/src/modules/filters/modules/filterConfig/components/case-author/index.ts +22 -0
- package/src/modules/filters/modules/filterConfig/components/case-close-reason-groups/case-close-reason-groups-filter-value-field.vue +16 -8
- package/src/modules/filters/modules/filterConfig/components/case-close-reason-groups/filterConfig.ts +44 -0
- package/src/modules/filters/modules/filterConfig/components/case-close-reason-groups/index.ts +10 -0
- package/src/modules/filters/modules/filterConfig/components/case-impacted/case-impacted-filter-value-field.vue +9 -2
- package/src/modules/filters/modules/filterConfig/components/case-impacted/index.ts +23 -0
- package/src/modules/filters/modules/filterConfig/components/case-priority/case-priority-filter-value-field.vue +9 -2
- package/src/modules/filters/modules/filterConfig/components/case-priority/index.ts +26 -0
- package/src/modules/filters/modules/filterConfig/components/case-reporter/case-reporter-filter-value-field.vue +9 -2
- package/src/modules/filters/modules/filterConfig/components/case-reporter/index.ts +23 -0
- package/src/modules/filters/modules/filterConfig/components/case-service/case-service-filter-value-field.vue +18 -5
- package/src/modules/filters/modules/filterConfig/components/case-service/filterConfig.ts +33 -0
- package/src/modules/filters/modules/filterConfig/components/case-service/index.ts +10 -0
- package/src/modules/filters/modules/filterConfig/components/case-sla/case-sla-filter-value-field.vue +9 -2
- package/src/modules/filters/modules/filterConfig/components/case-sla/index.ts +22 -0
- package/src/modules/filters/modules/filterConfig/components/case-sla-condition/case-sla-condition-filter-value-field.vue +14 -5
- package/src/modules/filters/modules/filterConfig/components/case-sla-condition/filterConfig.ts +38 -0
- package/src/modules/filters/modules/filterConfig/components/case-sla-condition/index.ts +10 -0
- package/src/modules/filters/modules/filterConfig/components/case-source/case-source-filter-value-field.vue +9 -2
- package/src/modules/filters/modules/filterConfig/components/case-source/index.ts +22 -0
- package/src/modules/filters/modules/filterConfig/components/case-status/case-status-filter-value-field.vue +14 -8
- package/src/modules/filters/modules/filterConfig/components/case-status/filterConfig.ts +40 -0
- package/src/modules/filters/modules/filterConfig/components/case-status/index.ts +10 -0
- package/src/modules/filters/modules/filterConfig/components/contact/contact-filter-value-field.vue +9 -2
- package/src/modules/filters/modules/filterConfig/components/contact/index.ts +22 -0
- package/src/modules/filters/modules/filterConfig/components/contact-group/contact-group-filter-value-field.vue +10 -2
- package/src/modules/filters/modules/filterConfig/components/contact-group/index.ts +7 -2
- package/src/modules/filters/modules/filterConfig/components/contact-label/contact-label-filter-value-field.vue +8 -2
- package/src/modules/filters/modules/filterConfig/components/contact-label/index.ts +6 -4
- package/src/modules/filters/modules/filterConfig/components/contact-owner/contact-owner-filter-value-field.vue +7 -1
- package/src/modules/filters/modules/filterConfig/components/contact-owner/index.ts +3 -6
- package/src/modules/filters/modules/filterConfig/components/gateway/gateway-filter-value-field.vue +8 -10
- package/src/modules/filters/modules/filterConfig/components/gateway/index.ts +31 -0
- package/src/modules/filters/modules/filterConfig/components/grantee/grantee-filter-value-field.vue +9 -2
- package/src/modules/filters/modules/filterConfig/components/grantee/index.ts +22 -0
- package/src/modules/filters/modules/filterConfig/components/index.ts +38 -64
- package/src/modules/filters/modules/filterConfig/components/queue/index.ts +3 -6
- package/src/modules/filters/modules/filterConfig/components/queue/queue-filter-value-field.vue +7 -1
- package/src/modules/filters/modules/filterConfig/components/rated-by/index.ts +22 -0
- package/src/modules/filters/modules/filterConfig/components/rated-by/rated-by-filter-value-field.vue +8 -3
- package/src/modules/filters/modules/filterConfig/components/region/index.ts +3 -6
- package/src/modules/filters/modules/filterConfig/components/region/region-filter-value-field.vue +7 -1
- package/src/modules/filters/modules/filterConfig/components/skill/index.ts +3 -6
- package/src/modules/filters/modules/filterConfig/components/skill/skill-filter-value-field.vue +7 -1
- package/src/modules/filters/modules/filterConfig/components/supervisor/index.ts +6 -6
- package/src/modules/filters/modules/filterConfig/components/supervisor/supervisor-filter-value-field.vue +7 -1
- package/src/modules/filters/modules/filterConfig/components/tags/index.ts +3 -6
- package/src/modules/filters/modules/filterConfig/components/tags/tags-filter-value-field.vue +7 -1
- package/src/modules/filters/modules/filterConfig/components/team/index.ts +3 -6
- package/src/modules/filters/modules/filterConfig/components/team/team-filter-value-field.vue +7 -1
- package/src/modules/filters/modules/filterConfig/components/user/index.ts +22 -0
- package/src/modules/filters/modules/filterConfig/components/user/user-filter-value-field.vue +8 -3
- package/src/modules/filters/modules/filterConfig/composables/useFilterReadAccess.ts +55 -0
- package/src/modules/filters/scripts/__tests__/utils.spec.ts +40 -0
- package/src/modules/filters/scripts/canLoadPreviewRecords.ts +35 -0
- package/src/modules/filters/scripts/utils.ts +12 -1
- package/types/.tsbuildinfo +1 -1
- package/types/modules/filters/components/column/column-filter-preview.vue.d.ts +2 -0
- package/types/modules/filters/components/column/column-filter.vue.d.ts +2 -0
- package/types/modules/filters/components/filters-actions-menu.vue.d.ts +2 -0
- package/types/modules/filters/components/table-filters-panel.vue.d.ts +3 -0
- package/types/modules/filters/modules/filterConfig/components/agent/agent-filter-value-field.vue.d.ts +2 -2
- package/types/modules/filters/modules/filterConfig/components/agent/index.d.ts +29 -0
- package/types/modules/filters/modules/filterConfig/components/auditor/index.d.ts +1 -4
- package/types/modules/filters/modules/filterConfig/components/bucket/index.d.ts +1 -4
- package/types/modules/filters/modules/filterConfig/components/case-author/case-author-filter-value-field.vue.d.ts +2 -0
- package/types/modules/filters/modules/filterConfig/components/case-author/index.d.ts +29 -0
- package/types/modules/filters/modules/filterConfig/components/case-close-reason-groups/case-close-reason-groups-filter-value-field.vue.d.ts +2 -0
- package/types/modules/filters/modules/filterConfig/components/case-close-reason-groups/filterConfig.d.ts +48 -0
- package/types/modules/filters/modules/filterConfig/components/case-close-reason-groups/index.d.ts +5 -0
- package/types/modules/filters/modules/filterConfig/components/case-impacted/case-impacted-filter-value-field.vue.d.ts +2 -0
- package/types/modules/filters/modules/filterConfig/components/case-impacted/index.d.ts +29 -0
- package/types/modules/filters/modules/filterConfig/components/case-priority/case-priority-filter-value-field.vue.d.ts +2 -0
- package/types/modules/filters/modules/filterConfig/components/case-priority/index.d.ts +29 -0
- package/types/modules/filters/modules/filterConfig/components/case-reporter/case-reporter-filter-value-field.vue.d.ts +2 -0
- package/types/modules/filters/modules/filterConfig/components/case-reporter/index.d.ts +29 -0
- package/types/modules/filters/modules/filterConfig/components/case-service/case-service-filter-value-field.vue.d.ts +7 -2
- package/types/modules/filters/modules/filterConfig/components/case-service/filterConfig.d.ts +29 -0
- package/types/modules/filters/modules/filterConfig/components/case-service/index.d.ts +5 -0
- package/types/modules/filters/modules/filterConfig/components/case-sla/case-sla-filter-value-field.vue.d.ts +2 -0
- package/types/modules/filters/modules/filterConfig/components/case-sla/index.d.ts +29 -0
- package/types/modules/filters/modules/filterConfig/components/case-sla-condition/case-sla-condition-filter-value-field.vue.d.ts +2 -0
- package/types/modules/filters/modules/filterConfig/components/case-sla-condition/filterConfig.d.ts +48 -0
- package/types/modules/filters/modules/filterConfig/components/case-sla-condition/index.d.ts +5 -0
- package/types/modules/filters/modules/filterConfig/components/case-source/case-source-filter-value-field.vue.d.ts +2 -0
- package/types/modules/filters/modules/filterConfig/components/case-source/index.d.ts +29 -0
- package/types/modules/filters/modules/filterConfig/components/case-status/case-status-filter-value-field.vue.d.ts +2 -0
- package/types/modules/filters/modules/filterConfig/components/case-status/filterConfig.d.ts +49 -0
- package/types/modules/filters/modules/filterConfig/components/case-status/index.d.ts +5 -0
- package/types/modules/filters/modules/filterConfig/components/contact/contact-filter-value-field.vue.d.ts +2 -0
- package/types/modules/filters/modules/filterConfig/components/contact/index.d.ts +29 -0
- package/types/modules/filters/modules/filterConfig/components/contact-owner/index.d.ts +1 -4
- package/types/modules/filters/modules/filterConfig/components/gateway/gateway-filter-value-field.vue.d.ts +1 -1
- package/types/modules/filters/modules/filterConfig/components/gateway/index.d.ts +29 -0
- package/types/modules/filters/modules/filterConfig/components/grantee/grantee-filter-value-field.vue.d.ts +2 -0
- package/types/modules/filters/modules/filterConfig/components/grantee/index.d.ts +29 -0
- package/types/modules/filters/modules/filterConfig/components/index.d.ts +409 -77
- package/types/modules/filters/modules/filterConfig/components/queue/index.d.ts +1 -4
- package/types/modules/filters/modules/filterConfig/components/rated-by/index.d.ts +29 -0
- package/types/modules/filters/modules/filterConfig/components/rated-by/rated-by-filter-value-field.vue.d.ts +1 -1
- package/types/modules/filters/modules/filterConfig/components/region/index.d.ts +1 -4
- package/types/modules/filters/modules/filterConfig/components/skill/index.d.ts +1 -4
- package/types/modules/filters/modules/filterConfig/components/supervisor/index.d.ts +1 -4
- package/types/modules/filters/modules/filterConfig/components/tags/index.d.ts +1 -4
- package/types/modules/filters/modules/filterConfig/components/team/index.d.ts +1 -4
- package/types/modules/filters/modules/filterConfig/components/user/index.d.ts +29 -0
- package/types/modules/filters/modules/filterConfig/components/user/user-filter-value-field.vue.d.ts +1 -1
- package/types/modules/filters/modules/filterConfig/composables/useFilterReadAccess.d.ts +19 -0
- package/types/modules/filters/scripts/canLoadPreviewRecords.d.ts +3 -0
- package/types/modules/filters/scripts/utils.d.ts +2 -1
- package/src/modules/filters/modules/filterConfig/components/agent/config.js +0 -3
- package/src/modules/filters/modules/filterConfig/components/case-author/config.js +0 -3
- package/src/modules/filters/modules/filterConfig/components/case-close-reason-groups/config.js +0 -8
- package/src/modules/filters/modules/filterConfig/components/case-impacted/config.js +0 -3
- package/src/modules/filters/modules/filterConfig/components/case-priority/config.js +0 -3
- package/src/modules/filters/modules/filterConfig/components/case-reporter/config.js +0 -3
- package/src/modules/filters/modules/filterConfig/components/case-service/config.js +0 -4
- package/src/modules/filters/modules/filterConfig/components/case-sla/config.js +0 -3
- package/src/modules/filters/modules/filterConfig/components/case-sla-condition/config.js +0 -4
- package/src/modules/filters/modules/filterConfig/components/case-source/config.js +0 -3
- package/src/modules/filters/modules/filterConfig/components/case-status/config.js +0 -8
- package/src/modules/filters/modules/filterConfig/components/contact/config.js +0 -3
- package/src/modules/filters/modules/filterConfig/components/gateway/config.js +0 -3
- package/src/modules/filters/modules/filterConfig/components/grantee/config.js +0 -3
- package/src/modules/filters/modules/filterConfig/components/rated-by/config.js +0 -3
- package/src/modules/filters/modules/filterConfig/components/user/config.js +0 -3
- package/types/modules/filters/modules/filterConfig/components/agent/config.d.ts +0 -7
- package/types/modules/filters/modules/filterConfig/components/case-author/config.d.ts +0 -7
- package/types/modules/filters/modules/filterConfig/components/case-close-reason-groups/config.d.ts +0 -16
- package/types/modules/filters/modules/filterConfig/components/case-impacted/config.d.ts +0 -7
- package/types/modules/filters/modules/filterConfig/components/case-priority/config.d.ts +0 -7
- package/types/modules/filters/modules/filterConfig/components/case-reporter/config.d.ts +0 -7
- package/types/modules/filters/modules/filterConfig/components/case-service/config.d.ts +0 -14
- package/types/modules/filters/modules/filterConfig/components/case-sla/config.d.ts +0 -7
- package/types/modules/filters/modules/filterConfig/components/case-sla-condition/config.d.ts +0 -16
- package/types/modules/filters/modules/filterConfig/components/case-source/config.d.ts +0 -7
- package/types/modules/filters/modules/filterConfig/components/case-status/config.d.ts +0 -17
- package/types/modules/filters/modules/filterConfig/components/contact/config.d.ts +0 -7
- package/types/modules/filters/modules/filterConfig/components/gateway/config.d.ts +0 -7
- package/types/modules/filters/modules/filterConfig/components/grantee/config.d.ts +0 -4
- package/types/modules/filters/modules/filterConfig/components/rated-by/config.d.ts +0 -7
- package/types/modules/filters/modules/filterConfig/components/user/config.d.ts +0 -7
package/package.json
CHANGED
|
@@ -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 &&
|
|
145
|
+
if (props.columnMode && isEmptyFilterValue(filterValue.value)) {
|
|
146
146
|
return !editMode || !filterName.value || !!props.filterConfig?.notDeletable;
|
|
147
147
|
}
|
|
148
148
|
|
package/src/modules/filters/components/config/static-view/__tests__/static-filter-field.spec.ts
CHANGED
|
@@ -23,7 +23,7 @@ const StubInput = {
|
|
|
23
23
|
};
|
|
24
24
|
|
|
25
25
|
const deletableConfig = createFilterConfig({
|
|
26
|
-
name: FilterOption.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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 (
|
|
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 {
|
|
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
|
-
:
|
|
47
|
+
: undefined;
|
|
46
48
|
|
|
47
|
-
|
|
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
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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"
|
package/src/modules/filters/modules/filterConfig/components/agent/agent-filter-value-field.vue
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<wt-multi-select
|
|
3
3
|
:label="labelValue"
|
|
4
|
-
:
|
|
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
|
-
|
|
19
|
-
import {
|
|
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
|
|
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);
|
package/src/modules/filters/modules/filterConfig/components/auditor/auditor-filter-value-field.vue
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<wt-multi-select
|
|
3
3
|
:label="labelValue"
|
|
4
|
-
:
|
|
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(
|
|
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) =>
|
package/src/modules/filters/modules/filterConfig/components/bucket/bucket-filter-value-field.vue
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<wt-multi-select
|
|
3
3
|
:label="labelValue"
|
|
4
|
-
:
|
|
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(
|
|
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
|
-
:
|
|
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
|
|
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
|
|
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
|
-
:
|
|
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 {
|
|
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);
|