@webitel/ui-sdk 24.10.3 → 24.10.5

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 (202) hide show
  1. package/dist/ui-sdk.css +1 -1
  2. package/dist/ui-sdk.js +111 -114
  3. package/dist/ui-sdk.umd.cjs +8 -8
  4. package/package.json +6 -4
  5. package/src/api/axios/generateInstance.js +1 -4
  6. package/src/api/clients/agents/agents.js +31 -78
  7. package/src/api/clients/buckets/buckets.js +17 -57
  8. package/src/api/clients/calendars/calendars.js +18 -71
  9. package/src/api/clients/chatGateways/chatGateways.js +23 -61
  10. package/src/api/clients/chatGateways/defaults/webChatGateway.js +6 -8
  11. package/src/api/clients/chatGateways/enums/WebchatAlternativeChannel.enum.js +3 -3
  12. package/src/api/clients/communications/communications.js +20 -62
  13. package/src/api/clients/configurations/configurations.js +18 -3
  14. package/src/api/clients/flows/flow.js +17 -60
  15. package/src/api/clients/gateways/gateways.js +20 -59
  16. package/src/api/clients/index.js +1 -1
  17. package/src/api/clients/lists/blacklists.js +18 -60
  18. package/src/api/clients/media/media.js +13 -43
  19. package/src/api/clients/queues/defaults/processing.js +10 -6
  20. package/src/api/clients/queues/queues.js +21 -69
  21. package/src/api/clients/roles/roles.js +15 -33
  22. package/src/api/clients/users/__tests__/users.spec.js +43 -26
  23. package/src/api/clients/users/users.js +21 -56
  24. package/src/api/crm/contactChatMessagesHistory.js +8 -23
  25. package/src/api/crm/contacts.js +235 -0
  26. package/src/api/crm/enums/ContactsSearchMode.js +9 -0
  27. package/src/api/crm/index.js +2 -3
  28. package/src/api/defaults/getDefaultGetParams/getDefaultGetParams.js +1 -4
  29. package/src/api/defaults/getDefaultInstance/getDefaultInstance.js +10 -11
  30. package/src/api/defaults/getDefaultOpenAPIConfig/getDefaultOpenAPIConfig.js +6 -5
  31. package/src/api/defaults/index.js +2 -4
  32. package/src/api/history/index.js +1 -3
  33. package/src/api/history/transcript/callTranscript.js +10 -30
  34. package/src/api/interceptors/request/updateToken.interceptor.js +1 -2
  35. package/src/api/transformers/merge/merge.transformer.js +4 -1
  36. package/src/api/transformers/mergeEach/mergeEach.transformer.js +4 -4
  37. package/src/api/transformers/notify/notify.transformer.js +9 -6
  38. package/src/api/transformers/starToSearch/starToSearch.transformer.js +8 -6
  39. package/src/components/index.js +3 -6
  40. package/src/components/on-demand/wt-cc-agent-status-timers/__tests__/wt-cc-agent-status-timers.spec.js +2 -4
  41. package/src/components/transitions/wt-expand-transition.vue +2 -3
  42. package/src/components/wt-app-header/__tests__/WtAppNavigator.spec.js +1 -2
  43. package/src/components/wt-app-header/__tests__/WtHeaderActions.spec.js +1 -2
  44. package/src/components/wt-app-header/wt-app-navigator.vue +15 -9
  45. package/src/components/wt-avatar/wt-avatar.vue +8 -3
  46. package/src/components/wt-button/wt-button.vue +0 -1
  47. package/src/components/wt-button-select/__tests__/WtButtonSelect.spec.js +4 -5
  48. package/src/components/wt-button-select/wt-button-select.vue +0 -1
  49. package/src/components/wt-context-menu/wt-context-menu.vue +32 -35
  50. package/src/components/wt-dummy/wt-dummy.vue +2 -5
  51. package/src/components/wt-expansion-panel/wt-expansion-panel.vue +10 -7
  52. package/src/components/wt-filters-panel-wrapper/__tests__/WtFiltersPanelWrapper.spec.js +4 -8
  53. package/src/components/wt-icon/wt-icon.vue +0 -1
  54. package/src/components/wt-indicator/__tests__/WtIndicator.spec.js +3 -2
  55. package/src/components/wt-indicator/wt-indicator.vue +10 -1
  56. package/src/components/wt-input/wt-input.vue +7 -10
  57. package/src/components/wt-item-link/wt-item-link.vue +7 -4
  58. package/src/components/wt-navigation-bar/__tests__/WtNavigationBar.spec.js +7 -15
  59. package/src/components/wt-navigation-bar/wt-navigation-bar.vue +7 -7
  60. package/src/components/wt-notification/wt-notification.vue +1 -2
  61. package/src/components/wt-notifications-bar/__tests__/WtNotificationsBar.spec.js +6 -3
  62. package/src/components/wt-notifications-bar/wt-notifications-bar.vue +4 -1
  63. package/src/components/wt-page-wrapper/__tests__/WtPageWrapper.spec.js +1 -2
  64. package/src/components/wt-pagination/wt-pagination.vue +1 -3
  65. package/src/components/wt-player/scripts/__tests__/createPlyrURL.spec.js +4 -8
  66. package/src/components/wt-player/wt-player.vue +13 -4
  67. package/src/components/wt-popup/wt-popup.vue +2 -1
  68. package/src/components/wt-search-bar/wt-search-bar.vue +1 -1
  69. package/src/components/wt-select/mixins/multiselectMixin.js +2 -5
  70. package/src/components/wt-select/wt-select.vue +12 -11
  71. package/src/components/wt-slider/wt-slider.vue +4 -2
  72. package/src/components/wt-status-select/wt-status-select.vue +10 -6
  73. package/src/components/wt-stepper/wt-stepper.vue +6 -4
  74. package/src/components/wt-switcher/wt-switcher.vue +1 -3
  75. package/src/components/wt-table/__tests__/WtTable.spec.js +2 -5
  76. package/src/components/wt-table/wt-table.vue +18 -16
  77. package/src/components/wt-table-column-select/wt-table-column-select.vue +9 -8
  78. package/src/components/wt-tabs/wt-tabs.vue +1 -3
  79. package/src/components/wt-tags-input/mixin/taggableMixin.js +7 -7
  80. package/src/components/wt-textarea/__tests__/WtTextarea.spec.js +2 -4
  81. package/src/components/wt-textarea/wt-textarea.vue +3 -2
  82. package/src/components/wt-timepicker/wt-timepicker.vue +1 -3
  83. package/src/components/wt-tooltip/_internals/useTooltipTriggerSubscriptions.js +1 -3
  84. package/src/components/wt-tooltip/_internals/wt-tooltip-floating.vue +8 -12
  85. package/src/components/wt-tooltip/wt-tooltip.vue +13 -13
  86. package/src/composables/useCachedInterval/__tests__/useCachedInterval.spec.js +6 -4
  87. package/src/composables/useCachedInterval/useCachedInterval.js +3 -8
  88. package/src/composables/useRepresentableAgentPauseCause/__tests__/useRepresentableAgentPauseCause.spec.js +11 -33
  89. package/src/composables/useRepresentableAgentPauseCause/useRepresentableAgentPauseCause.js +11 -9
  90. package/src/enums/WebitelApplications/AdminSections.enum.js +28 -28
  91. package/src/enums/WebitelApplications/CrmSections.enum.js +1 -1
  92. package/src/locale/en/en.js +12 -15
  93. package/src/locale/es/es.js +4 -8
  94. package/src/locale/kz/kz.js +5 -7
  95. package/src/locale/ru/ru.js +7 -11
  96. package/src/locale/ua/ua.js +13 -17
  97. package/src/mixins/dataFilterMixins/__tests__/enumFilterMixin.spec.js +1 -2
  98. package/src/mixins/dataFilterMixins/__tests__/sortFilterMixin.spec.js +4 -2
  99. package/src/mixins/dataFilterMixins/__tests__/urlControllerMixin.spec.js +4 -1
  100. package/src/mixins/dataFilterMixins/_urlControllerMixin/_urlControllerMixin.js +1 -1
  101. package/src/mixins/dataFilterMixins/apiFilterMixin.js +1 -2
  102. package/src/mixins/dataFilterMixins/baseFilterMixin/baseFilterMixin.js +1 -2
  103. package/src/mixins/dataFilterMixins/enumFilterMixin.js +5 -6
  104. package/src/mixins/dataFilterMixins/paginationFilterMixin.js +1 -2
  105. package/src/mixins/dataFilterMixins/sortFilterMixin.js +1 -4
  106. package/src/mixins/validationMixin/__tests__/validationMixin.spec.js +1 -2
  107. package/src/mixins/validationMixin/useValidation.js +25 -19
  108. package/src/mixins/validationMixin/validationMixin.js +22 -10
  109. package/src/modules/AgentStatusSelect/api/pause-cause.js +3 -11
  110. package/src/modules/AgentStatusSelect/components/__tests__/wt-cc-agent-status-select.spec.js +16 -18
  111. package/src/modules/AgentStatusSelect/components/__tests__/wt-cc-pause-cause-popup.spec.js +1 -2
  112. package/src/modules/AgentStatusSelect/components/_internals/wt-cc-pause-cause-popup.vue +12 -12
  113. package/src/modules/AgentStatusSelect/components/_internals/wt-cc-status-select-error-popup.vue +0 -1
  114. package/src/modules/AgentStatusSelect/components/wt-cc-agent-status-select.vue +20 -7
  115. package/src/modules/Appearance/components/__tests__/wt-dark-mode-switcher.spec.js +2 -4
  116. package/src/modules/Appearance/components/wt-dark-mode-switcher.vue +0 -1
  117. package/src/modules/AuditForm/components/__tests__/audit-form-question-read-wrapper.spec.js +1 -2
  118. package/src/modules/AuditForm/components/__tests__/audit-form-question-write-wrapper.spec.js +15 -25
  119. package/src/modules/AuditForm/components/__tests__/audit-form.spec.js +11 -20
  120. package/src/modules/AuditForm/components/audit-form-question-read-wrapper.vue +1 -4
  121. package/src/modules/AuditForm/components/audit-form-question-write-wrapper.vue +4 -7
  122. package/src/modules/AuditForm/components/audit-form-question.vue +18 -17
  123. package/src/modules/AuditForm/components/audit-form.vue +12 -14
  124. package/src/modules/AuditForm/components/questions/options/__tests__/audit-form-question-options-write-row.spec.js +1 -2
  125. package/src/modules/AuditForm/components/questions/options/__tests__/audit-form-question-options.spec.js +1 -3
  126. package/src/modules/AuditForm/components/questions/options/audit-form-question-options-write-row.vue +11 -15
  127. package/src/modules/AuditForm/components/questions/options/audit-form-question-options.vue +1 -4
  128. package/src/modules/AuditForm/components/questions/score/audit-form-question-score.vue +16 -20
  129. package/src/modules/AuditForm/schemas/AuditFormQuestionOptionsSchema.js +1 -3
  130. package/src/modules/CSVExport/CSVExport.js +3 -7
  131. package/src/modules/CSVExport/XLSExport.js +6 -7
  132. package/src/modules/CSVExport/__tests__/CSVExport.spec.js +1 -2
  133. package/src/modules/CSVExport/mixins/exportCSVMixin.js +2 -5
  134. package/src/modules/CSVExport/mixins/exportXLSMixin.js +2 -4
  135. package/src/modules/CardStoreModule/store/CardStoreModule.js +2 -6
  136. package/src/modules/DeleteConfirmationPopup/__tests__/delete-confirmation-popup.spec.js +13 -10
  137. package/src/modules/DeleteConfirmationPopup/components/delete-confirmation-popup.vue +5 -14
  138. package/src/modules/FilesExport/FilesExport.js +4 -3
  139. package/src/modules/FilesExport/__tests__/FilesExport.spec.js +12 -12
  140. package/src/modules/FilesExport/mixins/exportFilesMixin.js +6 -7
  141. package/src/modules/FilesExport/scripts/generateMediaURL.js +1 -2
  142. package/src/modules/Filters/classes/BaseFilterSchema.js +21 -25
  143. package/src/modules/Filters/components/filter-pagination.vue +7 -3
  144. package/src/modules/Filters/components/filter-search.vue +21 -12
  145. package/src/modules/Filters/components/filter-table-fields.vue +1 -3
  146. package/src/modules/Filters/scripts/getters/index.js +1 -5
  147. package/src/modules/Filters/scripts/getters/queryGetter.js +2 -3
  148. package/src/modules/Filters/scripts/restores/index.js +1 -4
  149. package/src/modules/Filters/scripts/setters/index.js +1 -5
  150. package/src/modules/Filters/scripts/setters/querySetter.js +24 -22
  151. package/src/modules/Filters/scripts/utils/changeRouteQuery.js +16 -15
  152. package/src/modules/Filters/store/FiltersStoreModule.js +51 -45
  153. package/src/modules/Filters/store/__tests__/FiltersStoreModule.spec.js +51 -45
  154. package/src/modules/Notifications/store/NotificationsStoreModule.js +41 -38
  155. package/src/modules/Notifications/store/__tests__/NotificationsStoreModule.actions.spec.js +6 -6
  156. package/src/modules/QueryFilters/api/defaults.js +2 -3
  157. package/src/modules/QueryFilters/classes/ApiFilterSchema.js +1 -4
  158. package/src/modules/QueryFilters/classes/EnumFilterSchema.js +1 -4
  159. package/src/modules/QueryFilters/components/__tests__/filter-datetime.spec.js +1 -2
  160. package/src/modules/QueryFilters/components/__tests__/filter-from-to.spec.js +2 -4
  161. package/src/modules/QueryFilters/components/__tests__/filter-search.spec.js +2 -4
  162. package/src/modules/QueryFilters/components/filter-table-fields.vue +1 -5
  163. package/src/modules/QueryFilters/mixins/__tests__/apiFilterMixin.spec.js +4 -3
  164. package/src/modules/QueryFilters/mixins/__tests__/enumFilterMixin.spec.js +2 -4
  165. package/src/modules/QueryFilters/mixins/__tests__/sortFilterMixin.spec.js +4 -2
  166. package/src/modules/QueryFilters/mixins/__tests__/urlControllerMixin.spec.js +4 -1
  167. package/src/modules/QueryFilters/mixins/_urlControllerMixin/_urlControllerMixin.js +1 -1
  168. package/src/modules/QueryFilters/mixins/apiFilterMixin.js +1 -1
  169. package/src/modules/QueryFilters/mixins/baseFilterMixin/baseFilterMixin.js +4 -2
  170. package/src/modules/QueryFilters/mixins/enumFilterMixin.js +9 -11
  171. package/src/modules/QueryFilters/mixins/paginationFilterMixin.js +2 -4
  172. package/src/modules/QueryFilters/mixins/sortFilterMixin.js +2 -5
  173. package/src/modules/QueryFilters/store/QueryFiltersStoreModule.js +13 -17
  174. package/src/modules/QueryFilters/store/__tests__/QueryFiltersStoreModule.spec.js +15 -16
  175. package/src/modules/TableStoreModule/store/TableStoreModule.js +14 -33
  176. package/src/modules/TableStoreModule/store/__tests__/TableStoreModule.spec.js +69 -83
  177. package/src/modules/Userinfo/api/userinfo.js +6 -19
  178. package/src/modules/Userinfo/classes/ApplicationsAccess.js +5 -12
  179. package/src/modules/Userinfo/store/UserinfoStoreModule.js +38 -41
  180. package/src/plugins/breakpoint/breakpoint.plugin.js +11 -16
  181. package/src/scripts/__tests__/caseConverters.spec.js +1 -4
  182. package/src/scripts/__tests__/debounce.spec.js +3 -1
  183. package/src/scripts/__tests__/prettifyFileSize.spec.js +2 -2
  184. package/src/scripts/__tests__/preventHiddenPageCallsDecorator.spec.js +7 -4
  185. package/src/scripts/__tests__/updateObject.spec.js +3 -5
  186. package/src/scripts/caseConverters.js +22 -38
  187. package/src/scripts/debounce.js +1 -5
  188. package/src/scripts/editProxy.js +8 -7
  189. package/src/scripts/prettifyFileSize.js +1 -1
  190. package/src/scripts/preventHiddenPageCallsDecorator.js +3 -6
  191. package/src/store/BaseStoreModules/ApiStoreModule.js +7 -33
  192. package/src/store/BaseStoreModules/BaseStoreModule.js +14 -23
  193. package/src/store/BaseStoreModules/__tests__/BaseStoreModule.spec.js +7 -28
  194. package/src/store/helpers/getNamespacedState.js +2 -4
  195. package/src/store/new/modules/apiStoreModule/apiStoreModule.js +7 -27
  196. package/src/store/new/modules/cardStoreModule/cardStoreModule.js +0 -1
  197. package/src/store/new/modules/tableStoreModule/__tests__/tableStoreModule.spec.js +64 -77
  198. package/src/store/new/modules/tableStoreModule/tableStoreModule.js +12 -29
  199. package/src/tests/mocks/axiosMock.js +25 -19
  200. package/src/validators/decimalValidator.js +5 -4
  201. package/src/validators/websocketValidator/__tests__/websocketValidator.spec.js +1 -2
  202. package/src/validators/websocketValidator/websocketValidator.js +1 -1
@@ -1,14 +1,10 @@
1
+ import { ContactsChatCatalogApiFactory } from 'webitel-sdk';
1
2
  import {
3
+ getDefaultGetListResponse,
2
4
  getDefaultInstance,
3
5
  getDefaultOpenAPIConfig,
4
- getDefaultGetListResponse,
5
6
  } from '../defaults/index.js';
6
- import applyTransform, {
7
- notify,
8
- snakeToCamel,
9
- merge,
10
- } from '../transformers/index.js';
11
- import { ContactsChatCatalogApiFactory } from 'webitel-sdk';
7
+ import applyTransform, { notify, snakeToCamel, merge } from '../transformers/index.js';
12
8
 
13
9
  const instance = getDefaultInstance();
14
10
  const configuration = getDefaultOpenAPIConfig();
@@ -27,18 +23,12 @@ const getChat = async ({ contactId, chatId }) => {
27
23
 
28
24
  try {
29
25
  const response = await contactChatService.getContactChatHistory(contactId, chatId);
30
- const { messages, peers } = applyTransform(response.data, [
31
- snakeToCamel(),
32
- ]);
26
+ const { messages, peers } = applyTransform(response.data, [snakeToCamel()]);
33
27
  return {
34
- items: applyTransform({ messages, peers }, [
35
- mergeChatMessagesData,
36
- ]).reverse(),
28
+ items: applyTransform({ messages, peers }, [mergeChatMessagesData]).reverse(),
37
29
  };
38
30
  } catch (err) {
39
- throw applyTransform(err, [
40
- notify,
41
- ]);
31
+ throw applyTransform(err, [notify]);
42
32
  }
43
33
  };
44
34
 
@@ -61,17 +51,12 @@ const getAllMessages = async ({ id }) => {
61
51
  merge(getDefaultGetListResponse()),
62
52
  ]);
63
53
  return {
64
- items: applyTransform({ messages, peers, chats }, [
65
- mergeMessagesData,
66
- ]).reverse(),
54
+ items: applyTransform({ messages, peers, chats }, [mergeMessagesData]).reverse(),
67
55
  next,
68
56
  };
69
57
  } catch (err) {
70
- throw applyTransform(err, [
71
- notify,
72
- ]);
58
+ throw applyTransform(err, [notify]);
73
59
  }
74
-
75
60
  };
76
61
 
77
62
  export default {
@@ -0,0 +1,235 @@
1
+ import { ContactsApiFactory } from 'webitel-sdk';
2
+ import {
3
+ getDefaultGetListResponse,
4
+ getDefaultGetParams,
5
+ getDefaultInstance,
6
+ getDefaultOpenAPIConfig,
7
+ } from '../defaults/index.js';
8
+ import applyTransform, {
9
+ camelToSnake,
10
+ merge,
11
+ notify,
12
+ sanitize,
13
+ snakeToCamel,
14
+ } from '../transformers/index.js';
15
+ import ContactsSearchMode from './enums/ContactsSearchMode.js';
16
+
17
+ const instance = getDefaultInstance();
18
+ const configuration = getDefaultOpenAPIConfig();
19
+
20
+ const contactService = new ContactsApiFactory(configuration, '', instance);
21
+
22
+ const formatAccessMode = (item) => ({
23
+ ...item,
24
+ access: {
25
+ edit: item.mode.includes('w'),
26
+ delete: item.mode.includes('d'),
27
+ },
28
+ });
29
+
30
+ const getList = async (params) => {
31
+ const fieldsToSend = ['page', 'size', 'q', 'sort', 'fields', 'id', 'qin'];
32
+
33
+ if (!params.fields) {
34
+ params.fields = [
35
+ 'id',
36
+ 'etag',
37
+ 'name',
38
+ 'managers',
39
+ 'labels',
40
+ 'about',
41
+ 'variables',
42
+ 'timezones',
43
+ 'phones',
44
+ 'emails',
45
+ 'imclients',
46
+ ];
47
+ }
48
+
49
+ const listResponseHandler = (items) =>
50
+ items?.map((item) => ({
51
+ ...item,
52
+ name: item.name.commonName,
53
+ managers: item.managers ? [...item.managers.data] : [],
54
+ labels: item.labels ? [...item.labels.data] : [],
55
+ variables: item.variables ? [...item.variables.data] : [],
56
+ timezones: item.timezones ? [...item.timezones.data] : [],
57
+ phones: item.phones ? [...item.phones.data] : [],
58
+ emails: item.emails ? [...item.emails.data] : [],
59
+ }));
60
+
61
+ let changedParams;
62
+
63
+ if(params?.search) {
64
+ changedParams = { ...params, q: params.search };
65
+ } else if (params?.q && params?.qin) {
66
+ changedParams = { ...params };
67
+ } else {
68
+ let searchValue = '';
69
+ let searchKey = '';
70
+
71
+ if (params[ContactsSearchMode.NAME]) {
72
+ searchValue = params[ContactsSearchMode.NAME];
73
+ searchKey = ContactsSearchMode.NAME;
74
+ } else if (params[ContactsSearchMode.LABELS]) {
75
+ searchValue = params[ContactsSearchMode.LABELS];
76
+ searchKey = ContactsSearchMode.LABELS;
77
+ } else if (params[ContactsSearchMode.ABOUT]) {
78
+ searchValue = params[ContactsSearchMode.ABOUT];
79
+ searchKey = ContactsSearchMode.ABOUT;
80
+ } else if (params[ContactsSearchMode.VARIABLES]) {
81
+ searchValue = params[ContactsSearchMode.VARIABLES];
82
+ searchKey = ContactsSearchMode.VARIABLES;
83
+ } else if (params[ContactsSearchMode.DESTINATION]) {
84
+ searchValue = params[ContactsSearchMode.DESTINATION];
85
+ searchKey = 'emails,phones';
86
+ }
87
+
88
+ // This code needed for adding starToSearch method to applyTransform while searchKey !== SearchMode.VARIABLES because '*' in variables search mode brokes backend logic.
89
+ // if (searchKey !== ContactsSearchMode.VARIABLES) {
90
+ // transformations.push(starToSearch('q')); WTEL-4265
91
+ // }
92
+
93
+ changedParams = {
94
+ ...params,
95
+ q: searchValue || '',
96
+ qin: searchKey || '',
97
+ };
98
+ }
99
+
100
+ const transformations = [sanitize(fieldsToSend), merge(getDefaultGetParams()), camelToSnake()];
101
+
102
+ const { page, size, q, sort, fields, id, qin } = applyTransform(changedParams, transformations);
103
+
104
+ try {
105
+ const response = await contactService.searchContacts(
106
+ page,
107
+ size,
108
+ q,
109
+ sort || '+name',
110
+ ['mode', ...fields],
111
+ id,
112
+ qin,
113
+ );
114
+ const { data, next } = applyTransform(response.data, [
115
+ snakeToCamel(),
116
+ merge(getDefaultGetListResponse()),
117
+ ]);
118
+ return {
119
+ items: applyTransform(data, [(items) => items?.map((item) => formatAccessMode(item)), listResponseHandler]),
120
+ next,
121
+ };
122
+ } catch (err) {
123
+ throw applyTransform(err, [notify]);
124
+ }
125
+ };
126
+
127
+ const get = async ({ itemId: id }) => {
128
+ const fields = [
129
+ 'name',
130
+ 'about',
131
+ 'labels',
132
+ 'etag',
133
+ 'mode',
134
+ 'managers',
135
+ 'timezones',
136
+ 'variables',
137
+ 'phones',
138
+ 'emails',
139
+ 'imclients',
140
+ ];
141
+
142
+ const defaultObject = {};
143
+ const itemResponseHandler = (item) => {
144
+ return {
145
+ ...item,
146
+ labels: item.labels ? [...item.labels.data] : [],
147
+ managers: item.managers ? [...item.managers.data] : [],
148
+ timezones: item.timezones ? [...item.timezones.data] : [],
149
+ variables: item.variables ? [...item.variables.data] : [],
150
+ phones: item.phones ? [...item.phones.data] : [],
151
+ emails: item.emails ? [...item.emails.data] : [],
152
+ };
153
+ };
154
+ try {
155
+ const response = await contactService.locateContact(id, fields);
156
+ return applyTransform(response.data, [
157
+ snakeToCamel(),
158
+ merge(defaultObject),
159
+ itemResponseHandler,
160
+ formatAccessMode,
161
+ ]);
162
+ } catch (err) {
163
+ throw applyTransform(err, [notify]);
164
+ }
165
+ };
166
+
167
+ const fieldsToSend = ['name', 'labels', 'about', 'managers', 'timezones'];
168
+
169
+ const sanitizeManagers = (itemInstance) => {
170
+ // handle many managers and even no managers field cases
171
+ const managers = (itemInstance.managers || []).filter(({ user } = {}) => user.id);
172
+ return { ...itemInstance, managers };
173
+ };
174
+
175
+ const sanitizeTimezones = (itemInstance) => {
176
+ // handle many timezones and even no timezones field cases
177
+ const timezones = (itemInstance.timezones || []).filter(({ timezone } = {}) => timezone.id);
178
+ return { ...itemInstance, timezones };
179
+ };
180
+
181
+ const add = async ({ itemInstance }) => {
182
+ const item = applyTransform(itemInstance, [
183
+ sanitizeManagers,
184
+ sanitizeTimezones,
185
+ sanitize(fieldsToSend),
186
+ camelToSnake(),
187
+ ]);
188
+ try {
189
+ const response = await contactService.createContact(item);
190
+ return applyTransform(response.data, [snakeToCamel()]);
191
+ } catch (err) {
192
+ throw applyTransform(err, [notify]);
193
+ }
194
+ };
195
+
196
+ const update = async ({ itemInstance }) => {
197
+ const { etag } = itemInstance;
198
+ const item = applyTransform(itemInstance, [
199
+ sanitizeManagers,
200
+ sanitizeTimezones,
201
+ sanitize(fieldsToSend),
202
+ camelToSnake(),
203
+ ]);
204
+ try {
205
+ const response = await contactService.updateContact(etag, item);
206
+ return applyTransform(response.data, [snakeToCamel()]);
207
+ } catch (err) {
208
+ throw applyTransform(err, [notify]);
209
+ }
210
+ };
211
+
212
+ const deleteContact = async ({ id }) => {
213
+ try {
214
+ const response = await contactService.deleteContact(id);
215
+ return applyTransform(response.data, []);
216
+ } catch (err) {
217
+ throw applyTransform(err, [notify]);
218
+ }
219
+ };
220
+
221
+ const getContactsLookup = (params) => getList({
222
+ ...params,
223
+ fields: params.fields || ['id', 'name'],
224
+ });
225
+
226
+ const ContactsAPI = {
227
+ getList,
228
+ get,
229
+ add,
230
+ update,
231
+ delete: deleteContact,
232
+ getLookup: getContactsLookup,
233
+ };
234
+
235
+ export default ContactsAPI;
@@ -0,0 +1,9 @@
1
+ const ContactsSearchMode = Object.freeze({
2
+ NAME: 'name',
3
+ LABELS: 'labels',
4
+ ABOUT: 'about',
5
+ VARIABLES: 'variables',
6
+ DESTINATION: 'destination',
7
+ });
8
+
9
+ export default ContactsSearchMode;
@@ -1,5 +1,4 @@
1
+ import contacts from './contacts.js';
1
2
  import contactChatMessagesHistoryHistory from './contactChatMessagesHistory.js';
2
3
 
3
- export {
4
- contactChatMessagesHistoryHistory,
5
- }
4
+ export { contacts, contactChatMessagesHistoryHistory };
@@ -1,7 +1,4 @@
1
- const getDefaultGetParams = ({
2
- page = 1,
3
- size = 10,
4
- } = {}) => ({
1
+ const getDefaultGetParams = ({ page = 1, size = 10 } = {}) => ({
5
2
  page,
6
3
  size,
7
4
  });
@@ -1,15 +1,14 @@
1
1
  import generateInstance from '../../axios/generateInstance.js';
2
- import updateTokenInterceptor
3
- from '../../interceptors/request/updateToken.interceptor.js';
4
- import handleUnauthorizedInterceptor
5
- from '../../interceptors/response/handleUnauthorized.interceptor.js';
2
+ import updateTokenInterceptor from '../../interceptors/request/updateToken.interceptor.js';
3
+ import handleUnauthorizedInterceptor from '../../interceptors/response/handleUnauthorized.interceptor.js';
6
4
 
7
- const getDefaultInstance = () => generateInstance({
8
- interceptors: {
9
- request: [updateTokenInterceptor],
10
- response: [handleUnauthorizedInterceptor],
11
- },
12
- baseURL: import.meta.env.VITE_API_URL,
13
- });
5
+ const getDefaultInstance = () =>
6
+ generateInstance({
7
+ interceptors: {
8
+ request: [updateTokenInterceptor],
9
+ response: [handleUnauthorizedInterceptor],
10
+ },
11
+ baseURL: import.meta.env.VITE_API_URL,
12
+ });
14
13
 
15
14
  export default getDefaultInstance;
@@ -1,9 +1,10 @@
1
1
  import { Configuration } from 'webitel-sdk';
2
2
 
3
- const getDefaultOpenAPIConfig = () => new Configuration({
4
- basePath: import.meta.env.VITE_API_URL,
5
- apiKey: localStorage.getItem('access-key') || '',
6
- accessToken: localStorage.getItem('access-key') || '',
7
- });
3
+ const getDefaultOpenAPIConfig = () =>
4
+ new Configuration({
5
+ basePath: import.meta.env.VITE_API_URL,
6
+ apiKey: localStorage.getItem('access-key') || '',
7
+ accessToken: localStorage.getItem('access-key') || '',
8
+ });
8
9
 
9
10
  export default getDefaultOpenAPIConfig;
@@ -1,9 +1,7 @@
1
- import getDefaultGetListResponse
2
- from './getDefaultGetListResponse/getDefaultGetListResponse.js';
1
+ import getDefaultGetListResponse from './getDefaultGetListResponse/getDefaultGetListResponse.js';
3
2
  import getDefaultGetParams from './getDefaultGetParams/getDefaultGetParams.js';
4
3
  import getDefaultInstance from './getDefaultInstance/getDefaultInstance.js';
5
- import getDefaultOpenAPIConfig
6
- from './getDefaultOpenAPIConfig/getDefaultOpenAPIConfig.js';
4
+ import getDefaultOpenAPIConfig from './getDefaultOpenAPIConfig/getDefaultOpenAPIConfig.js';
7
5
 
8
6
  export {
9
7
  getDefaultGetParams,
@@ -1,5 +1,3 @@
1
1
  import callTranscript from './transcript/callTranscript.js';
2
2
 
3
- export {
4
- callTranscript,
5
- }
3
+ export { callTranscript };
@@ -16,11 +16,7 @@ const configuration = getDefaultOpenAPIConfig();
16
16
 
17
17
  const transcriptService = new FileTranscriptServiceApiFactory(configuration, '', instance);
18
18
 
19
- const getTranscript = async ({
20
- id,
21
- page = 1,
22
- size = 10000,
23
- }) => {
19
+ const getTranscript = async ({ id, page = 1, size = 10000 }) => {
24
20
  try {
25
21
  const response = await transcriptService.getFileTranscriptPhrases(id, page, size);
26
22
  const { items } = applyTransform(response.data, [
@@ -29,32 +25,22 @@ const getTranscript = async ({
29
25
  ]);
30
26
  return items;
31
27
  } catch (err) {
32
- throw applyTransform(err, [
33
- notify,
34
- ]);
28
+ throw applyTransform(err, [notify]);
35
29
  }
36
30
  };
37
31
 
38
-
39
32
  const createTranscript = async ({ callId }) => {
40
33
  const preRequestHandler = (callId) => {
41
34
  return Array.isArray(callId) ? callId : [callId];
42
- }
35
+ };
43
36
 
44
- const uuid = applyTransform(callId, [
45
- preRequestHandler,
46
- camelToSnake(),
47
- ]);
37
+ const uuid = applyTransform(callId, [preRequestHandler, camelToSnake()]);
48
38
 
49
39
  try {
50
40
  const response = await transcriptService.createFileTranscript({ uuid });
51
- return applyTransform(response.data, [
52
- snakeToCamel(),
53
- ]);
41
+ return applyTransform(response.data, [snakeToCamel()]);
54
42
  } catch (err) {
55
- throw applyTransform(err, [
56
- notify,
57
- ]);
43
+ throw applyTransform(err, [notify]);
58
44
  }
59
45
  };
60
46
 
@@ -62,23 +48,17 @@ const deleteTranscript = async (item) => {
62
48
  const preRequestHandler = ({ fileId, callId }) => {
63
49
  if (fileId) {
64
50
  return { id: Array.isArray(fileId) ? fileId : [fileId] };
65
- } else {
66
- return { uuid: Array.isArray(callId) ? callId : [callId] };
67
51
  }
68
- }
52
+ return { uuid: Array.isArray(callId) ? callId : [callId] };
53
+ };
69
54
 
70
- const body = applyTransform(item, [
71
- preRequestHandler,
72
- camelToSnake(),
73
- ]);
55
+ const body = applyTransform(item, [preRequestHandler, camelToSnake()]);
74
56
 
75
57
  try {
76
58
  const response = await transcriptService.deleteFileTranscript(body);
77
59
  return applyTransform(response.data, []);
78
60
  } catch (err) {
79
- throw applyTransform(err, [
80
- notify,
81
- ]);
61
+ throw applyTransform(err, [notify]);
82
62
  }
83
63
  };
84
64
 
@@ -1,7 +1,6 @@
1
1
  const updateTokenInterceptor = [
2
2
  (config) => {
3
- config.headers['X-Webitel-Access'] = localStorage.getItem('access-token')
4
- || '';
3
+ config.headers['X-Webitel-Access'] = localStorage.getItem('access-token') || '';
5
4
  return config;
6
5
  },
7
6
  (error) => Promise.reject(error),
@@ -1,5 +1,8 @@
1
1
  import merge from 'deepmerge';
2
2
 
3
- const mergeTransformer = (...args) => (main) => merge.all([...args, main]);
3
+ const mergeTransformer =
4
+ (...args) =>
5
+ (main) =>
6
+ merge.all([...args, main]);
4
7
 
5
8
  export default mergeTransformer;
@@ -1,8 +1,8 @@
1
1
  import merge from 'deepmerge';
2
2
 
3
- const mergeEachTransformer = (...args) => (main) => main.map((item) => merge.all([
4
- ...args,
5
- item,
6
- ]));
3
+ const mergeEachTransformer =
4
+ (...args) =>
5
+ (main) =>
6
+ main.map((item) => merge.all([...args, item]));
7
7
 
8
8
  export default mergeEachTransformer;
@@ -9,10 +9,11 @@ const notifyTransformer = (notificationObject) => {
9
9
  /*
10
10
  so, create a callback which will send notification with params, passed to it
11
11
  */
12
- const callback = ({ type, text }) => eventBus.$emit('notification', {
13
- type,
14
- text,
15
- });
12
+ const callback = ({ type, text }) =>
13
+ eventBus.$emit('notification', {
14
+ type,
15
+ text,
16
+ });
16
17
 
17
18
  /*
18
19
  and, then, return a function, which will be called in main applyTransform flow,
@@ -26,8 +27,10 @@ const notifyTransformer = (notificationObject) => {
26
27
  if (notificationObject instanceof Error) {
27
28
  eventBus.$emit('notification', {
28
29
  type: 'error',
29
- text: notificationObject.response?.data?.detail ||
30
- notificationObject.response?.data?.message || notificationObject,
30
+ text:
31
+ notificationObject.response?.data?.detail ||
32
+ notificationObject.response?.data?.message ||
33
+ notificationObject,
31
34
  });
32
35
  }
33
36
  return notificationObject;
@@ -2,11 +2,13 @@ import deepcopy from 'deep-copy';
2
2
  import get from 'lodash/get.js';
3
3
  import updateObject from '../../../scripts/updateObject.js';
4
4
 
5
- const starToSearchTransformer = (path = 'search') => (params) => {
6
- const copy = deepcopy(params);
7
- const value = get(copy, path);
8
- if (!value || value.slice(-1) === '*') return copy;
9
- return updateObject({ obj: copy, path, value: `${value}*` });
10
- };
5
+ const starToSearchTransformer =
6
+ (path = 'search') =>
7
+ (params) => {
8
+ const copy = deepcopy(params);
9
+ const value = get(copy, path);
10
+ if (!value || value.slice(-1) === '*') return copy;
11
+ return updateObject({ obj: copy, path, value: `${value}*` });
12
+ };
11
13
 
12
14
  export default starToSearchTransformer;
@@ -14,8 +14,7 @@ import WtDivider from './wt-divider/wt-divider.vue';
14
14
  import WtDummy from './wt-dummy/wt-dummy.vue';
15
15
  import WtErrorPage from './wt-error-page/wt-error-page.vue';
16
16
  import WtExpansionPanel from './wt-expansion-panel/wt-expansion-panel.vue';
17
- import WtFiltersPanelWrapper
18
- from './wt-filters-panel-wrapper/wt-filters-panel-wrapper.vue';
17
+ import WtFiltersPanelWrapper from './wt-filters-panel-wrapper/wt-filters-panel-wrapper.vue';
19
18
  import WtHeadlineNav from './wt-headline-nav/wt-headline-nav.vue';
20
19
  import WtHeadline from './wt-headline/wt-headline.vue';
21
20
  import WtHint from './wt-hint/wt-hint.vue';
@@ -32,8 +31,7 @@ import WtLoader from './wt-loader/wt-loader.vue';
32
31
  import WtLogo from './wt-logo/wt-logo.vue';
33
32
  import WtNavigationBar from './wt-navigation-bar/wt-navigation-bar.vue';
34
33
  import WtNotification from './wt-notification/wt-notification.vue';
35
- import WtNotificationsBar
36
- from './wt-notifications-bar/wt-notifications-bar.vue';
34
+ import WtNotificationsBar from './wt-notifications-bar/wt-notifications-bar.vue';
37
35
  import WtPageHeader from './wt-page-header/wt-page-header.vue';
38
36
  import WtPageWrapper from './wt-page-wrapper/wt-page-wrapper.vue';
39
37
  import WtPagination from './wt-pagination/wt-pagination.vue';
@@ -49,8 +47,7 @@ import WtStatusSelect from './wt-status-select/wt-status-select.vue';
49
47
  import WtStepper from './wt-stepper/wt-stepper.vue';
50
48
  import WtSwitcher from './wt-switcher/wt-switcher.vue';
51
49
  import WtTableActions from './wt-table-actions/wt-table-actions.vue';
52
- import WtTableColumnSelect
53
- from './wt-table-column-select/wt-table-column-select.vue';
50
+ import WtTableColumnSelect from './wt-table-column-select/wt-table-column-select.vue';
54
51
  import WtTable from './wt-table/wt-table.vue';
55
52
  import WtTabs from './wt-tabs/wt-tabs.vue';
56
53
  import WtTagsInput from './wt-tags-input/wt-tags-input.vue';
@@ -12,14 +12,12 @@ describe('WtCcAgentStatusTimers', () => {
12
12
  },
13
13
  },
14
14
  });
15
- expect(wrapper.exists())
16
- .toBe(true);
15
+ expect(wrapper.exists()).toBe(true);
17
16
  });
18
17
  it('renders component with empty status prop', () => {
19
18
  const wrapper = shallowMount(WtCcAgentStatusTimers, {
20
19
  props: { status: {} },
21
20
  });
22
- expect(wrapper.exists())
23
- .toBe(true);
21
+ expect(wrapper.exists()).toBe(true);
24
22
  });
25
23
  });
@@ -10,7 +10,6 @@
10
10
  </template>
11
11
 
12
12
  <script>
13
-
14
13
  // https://markus.oberlehner.net/blog/transition-to-height-auto-with-vue/
15
14
  export default {
16
15
  name: 'WtExpandTransition',
@@ -36,7 +35,7 @@ export default {
36
35
 
37
36
  getComputedStyle(element).height;
38
37
 
39
- requestAnimationFrame(() => element.style.height = height);
38
+ requestAnimationFrame(() => (element.style.height = height));
40
39
  },
41
40
  leave(element) {
42
41
  const { height } = getComputedStyle(element);
@@ -44,7 +43,7 @@ export default {
44
43
 
45
44
  getComputedStyle(element).height;
46
45
 
47
- requestAnimationFrame(() => element.style.height = 0);
46
+ requestAnimationFrame(() => (element.style.height = 0));
48
47
  },
49
48
  },
50
49
  };
@@ -1,6 +1,5 @@
1
1
  import { shallowMount } from '@vue/test-utils';
2
- import WebitelApplications
3
- from '../../../enums/WebitelApplications/WebitelApplications.enum.js';
2
+ import WebitelApplications from '../../../enums/WebitelApplications/WebitelApplications.enum.js';
4
3
  import WtAppNavigator from '../wt-app-navigator.vue';
5
4
 
6
5
  const apps = [
@@ -16,7 +16,6 @@ describe('WtHeaderActions', () => {
16
16
  props: { user },
17
17
  });
18
18
  expect(wrapper.find('.wt-header-actions__name').text()).toBe(user.name);
19
- expect(wrapper.find('.wt-header-actions__account').text())
20
- .toBe(user.account);
19
+ expect(wrapper.find('.wt-header-actions__account').text()).toBe(user.account);
21
20
  });
22
21
  });