@webitel/ui-sdk 0.1.11 → 0.1.112

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 (254) hide show
  1. package/README.md +29 -29
  2. package/dist/img/plyr.svg +70 -0
  3. package/dist/img/svg-sprites/attach.svg +4 -0
  4. package/dist/img/svg-sprites/index.js +1 -0
  5. package/dist/img/svg-sprites/wt-icon.svg +880 -0
  6. package/dist/ui-sdk.common.js +8287 -4335
  7. package/dist/ui-sdk.common.js.map +1 -1
  8. package/dist/ui-sdk.css +1 -1
  9. package/dist/ui-sdk.umd.js +8287 -4335
  10. package/dist/ui-sdk.umd.js.map +1 -1
  11. package/dist/ui-sdk.umd.min.js +3 -1
  12. package/dist/ui-sdk.umd.min.js.map +1 -1
  13. package/package.json +62 -41
  14. package/src/components/atoms/wt-badge/__tests__/WtBadge.spec.js +19 -0
  15. package/src/components/atoms/wt-badge/wt-badge.vue +23 -0
  16. package/src/components/atoms/wt-button/__tests__/WtButton.spec.js +29 -0
  17. package/src/components/atoms/wt-button/wt-button.vue +212 -0
  18. package/src/components/atoms/wt-divider/__tests__/WtDivider.spec.js +9 -0
  19. package/src/components/atoms/wt-divider/wt-divider.vue +25 -0
  20. package/src/components/atoms/wt-icon/__tests__/WtIcon.spec.js +24 -0
  21. package/src/components/atoms/wt-icon/wt-icon.vue +138 -0
  22. package/src/components/atoms/wt-indicator/__tests__/WtIndicator.spec.js +29 -0
  23. package/src/components/atoms/wt-indicator/wt-indicator.vue +81 -0
  24. package/src/components/atoms/wt-input-info/__tests__/WtInputInfo.spec.js +9 -0
  25. package/src/components/atoms/wt-input-info/wt-input-info.vue +35 -0
  26. package/src/components/atoms/wt-loader/__tests__/WtLoader.spec.js +9 -0
  27. package/src/components/atoms/wt-loader/_internals/wt-loader--md.vue +83 -0
  28. package/src/components/atoms/wt-loader/_internals/wt-loader--sm.vue +189 -0
  29. package/src/components/atoms/wt-loader/wt-loader.vue +34 -0
  30. package/src/components/atoms/wt-rounded-action/__tests__/WtRoundedAction.spec.js +20 -0
  31. package/src/components/atoms/wt-rounded-action/wt-rounded-action.vue +227 -0
  32. package/src/components/atoms/wt-tooltip/__tests__/WtTooltip.spec.js +29 -0
  33. package/src/components/atoms/wt-tooltip/wt-tooltip.vue +54 -0
  34. package/src/components/index.js +98 -0
  35. package/src/components/molecules/wt-checkbox/__tests__/WtCheckbox.spec.js +41 -0
  36. package/src/components/molecules/wt-checkbox/wt-checkbox.vue +175 -0
  37. package/src/components/molecules/wt-datepicker/__tests__/WtDatepicker.spec.js +28 -0
  38. package/src/components/molecules/wt-datepicker/wt-datepicker.vue +209 -0
  39. package/src/components/molecules/wt-datetimepicker/__tests__/WtDatetimepicker.spec.js +67 -0
  40. package/src/components/molecules/wt-datetimepicker/wt-datetimepicker.vue +314 -0
  41. package/src/components/molecules/wt-icon-btn/__tests__/WtIconBtn.spec.js +31 -0
  42. package/src/components/molecules/wt-icon-btn/wt-icon-btn.vue +113 -0
  43. package/src/components/molecules/wt-input/__tests__/WtInput.spec.js +25 -0
  44. package/src/components/molecules/wt-input/wt-input.vue +316 -0
  45. package/src/components/molecules/wt-label/__tests__/WtLabel.spec.js +9 -0
  46. package/src/components/molecules/wt-label/wt-label.vue +87 -0
  47. package/src/components/molecules/wt-notification/__tests__/WtNotification.spec.js +21 -0
  48. package/src/components/molecules/wt-notification/wt-notification.vue +74 -0
  49. package/src/components/molecules/wt-popup/__tests__/WtPopup.spec.js +47 -0
  50. package/src/components/molecules/wt-popup/wt-popup.vue +130 -0
  51. package/src/components/molecules/wt-progress-bar/__tests__/WtProgressBar.spec.js +17 -0
  52. package/src/components/molecules/wt-progress-bar/wt-progress-bar.vue +80 -0
  53. package/src/components/molecules/wt-radio/__tests__/WtRadio.spec.js +42 -0
  54. package/src/components/molecules/wt-radio/wt-radio.vue +168 -0
  55. package/src/components/molecules/wt-search-bar/__tests__/WtSearchBar.spec.js +36 -0
  56. package/src/components/molecules/wt-search-bar/wt-search-bar.vue +203 -0
  57. package/src/components/molecules/wt-select/__tests__/WtSelect.spec.js +53 -0
  58. package/src/components/molecules/wt-select/wt-select.vue +492 -0
  59. package/src/components/molecules/wt-slider/__tests__/WtSlider.spec.js +9 -0
  60. package/src/components/molecules/wt-slider/wt-slider.vue +175 -0
  61. package/src/components/molecules/wt-switcher/__tests__/WtSwitcher.spec.js +31 -0
  62. package/src/components/molecules/wt-switcher/wt-switcher.vue +177 -0
  63. package/src/components/molecules/wt-tabs/__tests__/WtTabs.spec.js +36 -0
  64. package/src/components/molecules/wt-tabs/wt-tabs.vue +127 -0
  65. package/src/components/molecules/wt-tags-input/__tests__/WtTagsInput.spec.js +45 -0
  66. package/src/components/molecules/wt-tags-input/wt-tags-input.vue +295 -0
  67. package/src/components/molecules/wt-textarea/__tests__/WtTextarea.spec.js +46 -0
  68. package/src/components/molecules/wt-textarea/wt-textarea.vue +185 -0
  69. package/src/components/molecules/wt-time-input/__tests__/WtTimeInput.spec.js +25 -0
  70. package/src/components/molecules/wt-time-input/wt-time-input.vue +192 -0
  71. package/src/components/molecules/wt-timepicker/__tests__/WtTimepicker.spec.js +60 -0
  72. package/src/components/molecules/wt-timepicker/wt-timepicker.vue +176 -0
  73. package/src/components/organisms/wt-app-header/__tests__/WtAppHeader.spec.js +19 -0
  74. package/src/components/organisms/wt-app-header/__tests__/WtAppNavigator.spec.js +23 -0
  75. package/src/components/organisms/wt-app-header/__tests__/WtHeaderActions.spec.js +21 -0
  76. package/src/components/organisms/wt-app-header/wt-app-header.vue +23 -0
  77. package/src/components/organisms/wt-app-header/wt-app-navigator.vue +245 -0
  78. package/src/components/organisms/wt-app-header/wt-header-actions.vue +177 -0
  79. package/src/components/organisms/wt-error-page/__tests__/wt-error-page.spec.js +17 -0
  80. package/src/components/organisms/wt-error-page/wt-error-page.vue +104 -0
  81. package/src/components/organisms/wt-filters-panel-wrapper/__tests__/wt-filters-panel-wrapper.spec.js +24 -0
  82. package/src/components/organisms/wt-filters-panel-wrapper/wt-filters-panel-wrapper.vue +146 -0
  83. package/src/components/organisms/wt-headline/__tests__/WtHeadline.spec.js +47 -0
  84. package/src/components/organisms/wt-headline/wt-headline.vue +46 -0
  85. package/src/components/organisms/wt-navigation-bar/__tests__/WtNavigationBar.spec.js +64 -0
  86. package/src/components/organisms/wt-navigation-bar/wt-navigation-bar.vue +249 -0
  87. package/src/components/organisms/wt-notifications-bar/__tests__/WtNotificationsBar.spec.js +50 -0
  88. package/src/components/organisms/wt-notifications-bar/wt-notifications-bar.vue +71 -0
  89. package/src/components/organisms/wt-page-wrapper/__tests__/WtPageWrapper.spec.js +33 -0
  90. package/src/components/organisms/wt-page-wrapper/wt-page-wrapper.vue +60 -0
  91. package/src/components/organisms/wt-pagination/__tests__/WtPagination.spec.js +38 -0
  92. package/src/components/organisms/wt-pagination/wt-pagination.vue +134 -0
  93. package/src/components/organisms/wt-player/__tests__/WtPlayer.spec.js +9 -0
  94. package/src/components/organisms/wt-player/wt-player.vue +116 -0
  95. package/src/components/organisms/wt-status-select/__tests__/WtStatusSelect.spec.js +25 -0
  96. package/src/components/organisms/wt-status-select/_internals/StatusOptions.lookup.js +24 -0
  97. package/src/components/organisms/wt-status-select/wt-status-select.vue +110 -0
  98. package/src/components/organisms/wt-table/__tests__/WtTable.spec.js +133 -0
  99. package/src/components/organisms/wt-table/__tests__/WtTableDeleteAction.spec.js +9 -0
  100. package/src/components/organisms/wt-table/__tests__/WtTableEditAction.spec.js +9 -0
  101. package/src/components/organisms/wt-table/_internals/getSortOrder.js +12 -0
  102. package/src/components/organisms/wt-table/table-cells/wt-table-delete-action.vue +18 -0
  103. package/src/components/organisms/wt-table/table-cells/wt-table-edit-action.vue +19 -0
  104. package/src/components/organisms/wt-table/wt-table.vue +241 -0
  105. package/src/components/organisms/wt-table-actions/__tests__/WtTableActions.spec.js +9 -0
  106. package/src/components/organisms/wt-table-actions/wt-table-actions.vue +90 -0
  107. package/src/components/organisms/wt-table-column-select/__tests__/WtTableColumnSelect.spec.js +31 -0
  108. package/src/components/organisms/wt-table-column-select/wt-table-column-select.vue +113 -0
  109. package/src/components/transitions/__tests__/ExpandTransition.spec.js +9 -0
  110. package/src/components/transitions/expand-transition.vue +70 -0
  111. package/src/css/colors/_colors.scss +151 -67
  112. package/src/css/components/_components.scss +38 -25
  113. package/src/css/components/atoms/wt-badge/_variables.scss +6 -5
  114. package/src/css/components/atoms/wt-badge/wt-badge.scss +36 -8
  115. package/src/css/components/atoms/wt-button/_variables.scss +46 -46
  116. package/src/css/components/atoms/wt-divider/_variables.scss +4 -4
  117. package/src/css/components/atoms/wt-icon/_variables.scss +7 -28
  118. package/src/css/components/atoms/wt-indicator/_variables.scss +18 -0
  119. package/src/css/components/atoms/wt-input-info/_variables.scss +6 -5
  120. package/src/css/components/atoms/wt-label/_variables.scss +4 -4
  121. package/src/css/components/atoms/wt-loader/_variables.scss +7 -7
  122. package/src/css/components/atoms/wt-rounded-action/_variables.scss +30 -0
  123. package/src/css/components/atoms/wt-tooltip/_variables.scss +9 -9
  124. package/src/css/components/molecules/wt-checkbox/_variables.scss +3 -3
  125. package/src/css/components/molecules/wt-datepicker/_variables.scss +19 -19
  126. package/src/css/components/molecules/wt-datepicker/datepicker-calendar.scss +100 -100
  127. package/src/css/components/molecules/wt-datetimepicker/_variables.scss +11 -11
  128. package/src/css/components/molecules/wt-icon-btn/_variables.scss +2 -2
  129. package/src/css/components/molecules/wt-input/_variables.scss +5 -5
  130. package/src/css/components/molecules/wt-notification/_variables.scss +9 -9
  131. package/src/css/components/molecules/wt-popup/_variables.scss +11 -10
  132. package/src/css/components/molecules/wt-progress-bar/_variables.scss +11 -0
  133. package/src/css/components/molecules/wt-radio/_variables.scss +6 -6
  134. package/src/css/components/molecules/wt-search-bar/_variables.scss +3 -3
  135. package/src/css/components/molecules/wt-select/_variables.scss +24 -22
  136. package/src/css/components/molecules/wt-slider/_variables.scss +15 -0
  137. package/src/css/components/molecules/wt-switcher/_variables.scss +17 -14
  138. package/src/css/components/molecules/wt-tabs/_variables.scss +13 -13
  139. package/src/css/components/molecules/wt-tags-input/_variables.scss +25 -0
  140. package/src/css/components/molecules/wt-textarea/_variables.scss +4 -4
  141. package/src/css/components/molecules/wt-timepicker/_variables.scss +4 -3
  142. package/src/css/components/organisms/wt-app-header/_variables.scss +20 -0
  143. package/src/css/components/organisms/wt-headline/_variables.scss +7 -0
  144. package/src/css/components/organisms/wt-navigation-bar/_variables.scss +14 -0
  145. package/src/css/components/organisms/wt-notifications-bar/_variables.scss +7 -0
  146. package/src/css/components/organisms/wt-page-wrapper/_variables.scss +5 -0
  147. package/src/css/components/organisms/wt-pagination/_variables.scss +6 -6
  148. package/src/css/components/organisms/wt-status-select/_variables.scss +6 -0
  149. package/src/css/components/organisms/wt-table/_variables.scss +16 -0
  150. package/src/css/components/organisms/wt-table-actions/_variables.scss +4 -0
  151. package/src/css/display-helpers/_display-helpers.scss +21 -0
  152. package/src/css/fonts/_fonts.scss +9 -0
  153. package/src/css/main.scss +68 -65
  154. package/src/css/shadows/_shadows.scss +7 -0
  155. package/src/css/sizes/_sizes.scss +2 -0
  156. package/src/css/sizes/_spacing.scss +17 -0
  157. package/src/css/sizes/_viewport-breakpoints.scss +20 -0
  158. package/src/css/styleguide/{styleguide.scss → _styleguide.scss} +4 -3
  159. package/src/css/styleguide/scroll.scss +43 -40
  160. package/src/css/transitions/_transitions.scss +1 -0
  161. package/src/css/transitions/fade/_fade.scss +8 -0
  162. package/src/css/typography/_typography.scss +72 -72
  163. package/src/enums/AgentStatus/AgentStatus.enum.js +6 -0
  164. package/src/enums/WebitelApplications/AdminSections.enum.js +41 -0
  165. package/src/enums/WebitelApplications/SupervisorSections.enum.js +7 -0
  166. package/src/enums/WebitelApplications/WebitelApplications.enum.js +10 -0
  167. package/src/locale/en/en.js +135 -0
  168. package/src/locale/i18n.js +2 -0
  169. package/src/locale/ru/ru.js +135 -2
  170. package/src/locale/ua/ua.js +160 -0
  171. package/src/mixins/dataFilterMixins/__tests__/apiFilterMixin.spec.js +57 -0
  172. package/src/mixins/dataFilterMixins/__tests__/enumFilterMixin.spec.js +66 -0
  173. package/src/mixins/dataFilterMixins/__tests__/paginationFilterMixin.spec.js +93 -0
  174. package/src/mixins/dataFilterMixins/__tests__/sortFilterMixin.spec.js +60 -0
  175. package/src/mixins/dataFilterMixins/__tests__/urlControllerMixin.spec.js +48 -0
  176. package/src/mixins/dataFilterMixins/_urlControllerMixin/_urlControllerMixin.js +37 -0
  177. package/src/mixins/dataFilterMixins/apiFilterMixin.js +23 -0
  178. package/src/mixins/dataFilterMixins/baseFilterMixin/baseFilterMixin.js +29 -0
  179. package/src/mixins/dataFilterMixins/enumFilterMixin.js +30 -0
  180. package/src/mixins/dataFilterMixins/paginationFilterMixin.js +79 -0
  181. package/src/mixins/dataFilterMixins/sortFilterMixin.js +75 -0
  182. package/src/mixins/validationMixin/__tests__/validationMixin.spec.js +47 -0
  183. package/src/mixins/validationMixin/validationMixin.js +40 -0
  184. package/src/modules/CSVExport/CSVExport.js +88 -0
  185. package/src/modules/CSVExport/__tests__/CSVExport.spec.js +63 -0
  186. package/src/modules/CSVExport/mixins/exportCSVMixin.js +46 -0
  187. package/src/modules/FilesExport/FilesExport.js +110 -0
  188. package/src/modules/FilesExport/__tests__/FilesExport.spec.js +66 -0
  189. package/src/modules/FilesExport/mixins/exportFilesMixin.js +46 -0
  190. package/src/modules/FilesExport/scripts/generateMediaURL.js +7 -0
  191. package/src/modules/QueryFilters/api/__tests__/defaults.spec.js +18 -0
  192. package/src/modules/QueryFilters/api/defaults.js +16 -0
  193. package/src/modules/QueryFilters/classes/ApiFilterSchema.js +32 -0
  194. package/src/modules/QueryFilters/classes/BaseFilterSchema.js +6 -0
  195. package/src/modules/QueryFilters/classes/EnumFilterSchema.js +23 -0
  196. package/src/modules/QueryFilters/classes/__tests__/ApiFilterSchema.spec.js +25 -0
  197. package/src/modules/QueryFilters/components/__tests__/abstract-api-filter.spec.js +54 -0
  198. package/src/modules/QueryFilters/components/__tests__/abstract-enum-filter.spec.js +40 -0
  199. package/src/modules/QueryFilters/components/__tests__/filter-search.spec.js +49 -0
  200. package/src/modules/QueryFilters/components/abstract-api-filter.vue +42 -0
  201. package/src/modules/QueryFilters/components/abstract-enum-filter.vue +32 -0
  202. package/src/modules/QueryFilters/components/filter-search.vue +33 -0
  203. package/src/modules/QueryFilters/mixins/__tests__/apiFilterMixin.spec.js +48 -0
  204. package/src/modules/QueryFilters/mixins/__tests__/enumFilterMixin.spec.js +54 -0
  205. package/src/modules/QueryFilters/mixins/__tests__/paginationFilterMixin.spec.js +74 -0
  206. package/src/modules/QueryFilters/mixins/__tests__/sortFilterMixin.spec.js +58 -0
  207. package/src/modules/QueryFilters/mixins/__tests__/urlControllerMixin.spec.js +48 -0
  208. package/src/modules/QueryFilters/mixins/_urlControllerMixin/_urlControllerMixin.js +39 -0
  209. package/src/modules/QueryFilters/mixins/apiFilterMixin.js +36 -0
  210. package/src/modules/QueryFilters/mixins/baseFilterMixin/baseFilterMixin.js +34 -0
  211. package/src/modules/QueryFilters/mixins/enumFilterMixin.js +36 -0
  212. package/src/modules/QueryFilters/mixins/paginationFilterMixin.js +66 -0
  213. package/src/modules/QueryFilters/mixins/sortFilterMixin.js +56 -0
  214. package/src/modules/QueryFilters/store/QueryFiltersStoreModule.js +50 -0
  215. package/src/modules/QueryFilters/store/__tests__/QueryFiltersStoreModule.spec.js +83 -0
  216. package/src/modules/QueryFilters/store/queryFilters.js +6 -0
  217. package/src/modules/Userinfo/api/BaseAPIService.js +7 -0
  218. package/src/modules/Userinfo/api/auth.js +29 -0
  219. package/src/modules/Userinfo/api/userinfo.js +32 -0
  220. package/src/modules/Userinfo/classes/ApplicationsAccess.js +170 -0
  221. package/src/modules/Userinfo/components/__tests__/auth.spec.js +57 -0
  222. package/src/modules/Userinfo/components/the-auth.vue +75 -0
  223. package/src/modules/Userinfo/store/UserinfoStoreModule.js +112 -0
  224. package/src/scripts/__tests__/caseConverters.spec.js +65 -0
  225. package/src/scripts/__tests__/convertDuration.spec.js +21 -0
  226. package/src/scripts/__tests__/debounce.spec.js +15 -0
  227. package/src/scripts/__tests__/editProxy.spec.js +9 -0
  228. package/src/scripts/__tests__/isEmpty.spec.js +16 -0
  229. package/src/scripts/__tests__/prettifyFileSize.spec.js +18 -0
  230. package/src/scripts/__tests__/prettifyTime.spec.js +18 -0
  231. package/src/scripts/__tests__/preventHiddenPageCallsDecorator.spec.js +16 -0
  232. package/src/scripts/__tests__/sortQueryAdapters.spec.js +12 -0
  233. package/src/scripts/caseConverters.js +78 -0
  234. package/src/scripts/convertDuration.js +15 -0
  235. package/src/scripts/editProxy.js +9 -0
  236. package/src/scripts/eventBus.js +4 -0
  237. package/src/scripts/isEmpty.js +9 -0
  238. package/src/scripts/prettifyFileSize.js +11 -0
  239. package/src/scripts/prettifyTime.js +9 -0
  240. package/src/scripts/preventHiddenPageCallsDecorator.js +6 -0
  241. package/src/scripts/sortQueryAdapters.js +21 -0
  242. package/src/store/BaseStoreModules/BaseStoreModule.js +49 -0
  243. package/src/store/BaseStoreModules/__tests__/BaseStoreModule.spec.js +104 -0
  244. package/src/store/helpers/__tests__/getNamespacedState.spec.js +11 -0
  245. package/src/store/helpers/getNamespacedState.js +5 -0
  246. package/dist/img/arrow-down--active--md.7b60f2fb6090366652124f77c543a516.svg +0 -3
  247. package/dist/img/arrow-down--disabled--md.f58424cd673258365e78863edd1e92cc.svg +0 -3
  248. package/dist/img/arrow-down--md.1843b60e1c244e066a650e8d19ea83c9.svg +0 -3
  249. package/dist/img/calendar--active--md.7fd3d949ec7234a4940ea452d95b4165.svg +0 -6
  250. package/dist/img/calendar--disabled--md.8e7a1e18f93ae8af270060400e6f881c.svg +0 -3
  251. package/dist/img/calendar--md.9c265581c3a405ff0f0e46e8092f36b8.svg +0 -6
  252. package/src/css/fonts/Montserrat/Montserrat-Regular.ttf +0 -0
  253. package/src/css/fonts/Montserrat/Montserrat-SemiBold.ttf +0 -0
  254. package/src/css/fonts.scss +0 -9
@@ -0,0 +1,46 @@
1
+ import FilesExport from '../FilesExport';
2
+
3
+ export default {
4
+ data: () => ({
5
+ FilesExport: null,
6
+ }),
7
+
8
+ computed: {
9
+ isFilesLoading() {
10
+ return this.FilesExport?.isLoading;
11
+ },
12
+
13
+ filesDownloadProgress() {
14
+ return this.FilesExport ? this.FilesExport.downloadProgress.count : 0;
15
+ },
16
+
17
+ filesZippingProgress() {
18
+ return this.FilesExport ? Math.floor(this.FilesExport.zippingProgress.percent) : 0;
19
+ },
20
+ },
21
+
22
+ methods: {
23
+ initFilesExport(options) {
24
+ this.FilesExport = new FilesExport(options);
25
+ },
26
+
27
+ getSelectedFiles() {
28
+ let files = null;
29
+ if (this.selectedItems?.length) {
30
+ files = this.selectedItems.reduce((filesAccumulator, next) => (
31
+ next.files ? [...filesAccumulator, ...next.files] : filesAccumulator), []);
32
+ }
33
+ return files;
34
+ },
35
+
36
+ async exportFiles(files, reqParams = {}) {
37
+ if (!this.FilesExport) throw new Error('FilesExport is not initialized');
38
+ const exportFiles = files || this.getSelectedFiles();
39
+ try {
40
+ await this.FilesExport.exportFiles(exportFiles, { reqParams });
41
+ } catch (err) {
42
+ throw err;
43
+ }
44
+ },
45
+ },
46
+ };
@@ -0,0 +1,7 @@
1
+ const generateMediaURL = (id) => {
2
+ const token = localStorage.getItem('access-token');
3
+ const BASE_URL = process.env.VUE_APP_API_URL;
4
+ return `${BASE_URL}/storage/recordings/${id}/stream?access_token=${token}`;
5
+ };
6
+
7
+ export default generateMediaURL;
@@ -0,0 +1,18 @@
1
+ import { listResponseHandler } from '../defaults';
2
+
3
+ describe('filter api Defaults', () => {
4
+ it('listResponseHandler returns only lookups from response', () => {
5
+ const response = {
6
+ items: [
7
+ { name: 'jest1', id: 1, myField: '1' },
8
+ { name: 'jest2', id: 2, obj: [] },
9
+ ],
10
+ next: true,
11
+ };
12
+ const expectedResult = [
13
+ { name: 'jest1', id: 1 },
14
+ { name: 'jest2', id: 2 },
15
+ ];
16
+ expect(listResponseHandler(response)).toEqual(expectedResult);
17
+ });
18
+ });
@@ -0,0 +1,16 @@
1
+ const PAGE = 1;
2
+ const SIZE = 20;
3
+ const FIELDS = ['id', 'name'];
4
+
5
+ export const defaultParams = {
6
+ page: PAGE,
7
+ size: SIZE,
8
+ fields: FIELDS,
9
+ };
10
+
11
+ export const listResponseHandler = (response) => (
12
+ response.items.map((item) => ({
13
+ name: item.name,
14
+ id: item.id,
15
+ }))
16
+ );
@@ -0,0 +1,32 @@
1
+ import BaseFilterSchema from './BaseFilterSchema';
2
+
3
+ export default class ApiFilterSchema extends BaseFilterSchema {
4
+ constructor(params = {}) {
5
+ const {
6
+ value = [],
7
+ defaultValue = [],
8
+ } = params;
9
+ super({ value, defaultValue });
10
+ const {
11
+ locale = { label: 'filter' },
12
+ storedProp = 'id',
13
+ multiple = true,
14
+ closeOnSelect = false,
15
+ API,
16
+ } = params;
17
+ this.locale = locale;
18
+ this.storedProp = storedProp;
19
+ this.multiple = multiple;
20
+ this.closeOnSelect = closeOnSelect;
21
+ this.API = API;
22
+ }
23
+
24
+ search(params) {
25
+ return this.API(params);
26
+ }
27
+
28
+ fetchSelected(idsList) {
29
+ const params = { size: idsList.length, ids: idsList };
30
+ return this.API(params);
31
+ }
32
+ }
@@ -0,0 +1,6 @@
1
+ export default class BaseFilterSchema {
2
+ constructor({ value = '', defaultValue = '' } = {}) {
3
+ this.value = value;
4
+ this.defaultValue = defaultValue;
5
+ }
6
+ }
@@ -0,0 +1,23 @@
1
+ import BaseFilterSchema from './BaseFilterSchema';
2
+
3
+ export default class EnumFilterSchema extends BaseFilterSchema {
4
+ constructor(params = {}) {
5
+ const {
6
+ value = [],
7
+ defaultValue = [],
8
+ } = params;
9
+ super({ value, defaultValue });
10
+ const {
11
+ locale = { label: 'filter' },
12
+ storedProp = 'value',
13
+ multiple = true,
14
+ closeOnSelect = false,
15
+ options = [],
16
+ } = params;
17
+ this.locale = locale;
18
+ this.storedProp = storedProp;
19
+ this.multiple = multiple;
20
+ this.closeOnSelect = closeOnSelect;
21
+ this.options = options;
22
+ }
23
+ }
@@ -0,0 +1,25 @@
1
+ import ApiFilterSchema from '../ApiFilterSchema';
2
+
3
+ describe('Api Filter Schema', () => {
4
+ const APIMock = jest.fn();
5
+ beforeEach(() => {
6
+ APIMock.mockClear();
7
+ });
8
+ it('creates default class without passed params', () => {
9
+ const filter = new ApiFilterSchema();
10
+ expect(filter).toBeTruthy();
11
+ });
12
+ it('calls API getList() method at search()', () => {
13
+ const params = { page: 1 };
14
+ const filter = new ApiFilterSchema({ API: APIMock });
15
+ filter.search(params);
16
+ expect(APIMock).toHaveBeenCalledWith(params);
17
+ });
18
+ it('calls API getList() method at fetchSelected()', () => {
19
+ const idsList = [1];
20
+ const expectedParams = { size: 1, ids: [1] };
21
+ const filter = new ApiFilterSchema({ API: APIMock });
22
+ filter.fetchSelected(idsList);
23
+ expect(APIMock).toHaveBeenCalledWith(expectedParams);
24
+ });
25
+ });
@@ -0,0 +1,54 @@
1
+ import { shallowMount, createLocalVue } from '@vue/test-utils';
2
+ import Vuex from 'vuex';
3
+ import VueRouter from 'vue-router';
4
+ import AbstractApiFilter from '../abstract-api-filter.vue';
5
+ import ApiFilterSchema from '../../classes/ApiFilterSchema';
6
+
7
+ const localVue = createLocalVue();
8
+ localVue.use(Vuex);
9
+ localVue.use(VueRouter);
10
+ const router = new VueRouter();
11
+
12
+ describe('Abstract Api Filter', () => {
13
+ const namespace = 'jest';
14
+ const filterQuery = 'jest';
15
+ const filterSchema = new ApiFilterSchema({ locale: {} });
16
+ const searchMock = jest.fn();
17
+ const fetchSelectedMock = jest.fn();
18
+ jest.spyOn(filterSchema, 'search').mockImplementation(searchMock);
19
+ jest.spyOn(filterSchema, 'fetchSelected').mockImplementation(fetchSelectedMock);
20
+ const store = new Vuex.Store({
21
+ modules: {
22
+ [namespace]: {
23
+ namespaced: true,
24
+ state: {
25
+ [filterQuery]: filterSchema,
26
+ },
27
+ },
28
+ },
29
+ });
30
+
31
+ const mountOptions = {
32
+ localVue,
33
+ store,
34
+ router,
35
+ propsData: {
36
+ namespace,
37
+ filterQuery,
38
+ },
39
+ };
40
+ it('renders a component', () => {
41
+ const wrapper = shallowMount(AbstractApiFilter, mountOptions);
42
+ expect(wrapper.exists()).toBe(true);
43
+ });
44
+ it('calls filter schema API search()', () => {
45
+ const wrapper = shallowMount(AbstractApiFilter, mountOptions);
46
+ wrapper.vm.search();
47
+ expect(searchMock).toHaveBeenCalled();
48
+ });
49
+ it(' filter schema API fetchSelected()', () => {
50
+ const wrapper = shallowMount(AbstractApiFilter, mountOptions);
51
+ wrapper.vm.fetchSelected();
52
+ expect(fetchSelectedMock).toHaveBeenCalled();
53
+ });
54
+ });
@@ -0,0 +1,40 @@
1
+ import { shallowMount, createLocalVue } from '@vue/test-utils';
2
+ import Vuex from 'vuex';
3
+ import VueRouter from 'vue-router';
4
+ import AbstractEnumFilter from '../abstract-enum-filter.vue';
5
+ import EnumFilterSchema from '../../classes/EnumFilterSchema';
6
+
7
+ const localVue = createLocalVue();
8
+ localVue.use(Vuex);
9
+ localVue.use(VueRouter);
10
+ const router = new VueRouter();
11
+
12
+ describe('Abstract Enum Filter', () => {
13
+ const namespace = 'jest';
14
+ const filterQuery = 'jest';
15
+ const filterSchema = new EnumFilterSchema({ locale: {} });
16
+ const store = new Vuex.Store({
17
+ modules: {
18
+ [namespace]: {
19
+ namespaced: true,
20
+ state: {
21
+ [filterQuery]: filterSchema,
22
+ },
23
+ },
24
+ },
25
+ });
26
+
27
+ const mountOptions = {
28
+ localVue,
29
+ store,
30
+ router,
31
+ propsData: {
32
+ namespace,
33
+ filterQuery,
34
+ },
35
+ };
36
+ it('renders a component', () => {
37
+ const wrapper = shallowMount(AbstractEnumFilter, mountOptions);
38
+ expect(wrapper.exists()).toBe(true);
39
+ });
40
+ });
@@ -0,0 +1,49 @@
1
+ import { shallowMount, createLocalVue } from '@vue/test-utils';
2
+ import Vuex from 'vuex';
3
+ import VueRouter from 'vue-router';
4
+ import SearchFilter from '../filter-search.vue';
5
+ import BaseFilterSchema from '../../classes/BaseFilterSchema';
6
+ import baseFilterMixin from '../../mixins/baseFilterMixin/baseFilterMixin';
7
+
8
+ const localVue = createLocalVue();
9
+ localVue.use(Vuex);
10
+ localVue.use(VueRouter);
11
+ const router = new VueRouter();
12
+
13
+ describe('Search Filter', () => {
14
+ const namespace = 'jest';
15
+ const filterQuery = 'jest';
16
+ const filterSchema = new BaseFilterSchema();
17
+ const store = new Vuex.Store({
18
+ modules: {
19
+ [namespace]: {
20
+ namespaced: true,
21
+ state: {
22
+ [filterQuery]: filterSchema,
23
+ },
24
+ },
25
+ },
26
+ });
27
+
28
+ const mountOptions = {
29
+ localVue,
30
+ store,
31
+ router,
32
+ propsData: {
33
+ namespace,
34
+ filterQuery,
35
+ },
36
+ };
37
+ it('renders a component', () => {
38
+ const wrapper = shallowMount(SearchFilter, mountOptions);
39
+ expect(wrapper.exists()).toBe(true);
40
+ });
41
+ it('initial restoreValue() triggers setValue() method', async () => {
42
+ const search = 'jest';
43
+ await router.replace({ query: { [filterQuery]: search } });
44
+ const setValueMock = jest.fn();
45
+ jest.spyOn(baseFilterMixin.methods, 'setValue').mockImplementationOnce(setValueMock);
46
+ shallowMount(SearchFilter, mountOptions);
47
+ expect(setValueMock).toHaveBeenCalledWith({ filterQuery, value: search });
48
+ });
49
+ });
@@ -0,0 +1,42 @@
1
+ <template>
2
+ <wt-select
3
+ :value="filterSchema.value"
4
+ :label="$t(filterSchema.locale.label)"
5
+ :track-by="filterSchema.storedProp"
6
+ :multiple="filterSchema.multiple"
7
+ :search="search"
8
+ :internal-search="false"
9
+ :close-on-select="filterSchema.closeOnSelect"
10
+ v-bind="$attrs"
11
+ @input="setValue({ filter: filterQuery, value: $event })"
12
+ @reset="setValueToQuery({ value, filterQuery, storedProp: filterSchema.storedProp })"
13
+ @closed="setValueToQuery({ value, filterQuery, storedProp: filterSchema.storedProp })"
14
+ ></wt-select>
15
+ </template>
16
+
17
+ <script>
18
+ import apiFilterMixin from '../mixins/apiFilterMixin';
19
+
20
+ export default {
21
+ name: 'abstract-api-filter',
22
+ mixins: [apiFilterMixin],
23
+ props: {
24
+ filterQuery: {
25
+ type: String,
26
+ required: true,
27
+ },
28
+ },
29
+ methods: {
30
+ search(search) {
31
+ return this.filterSchema.search({ search });
32
+ },
33
+ fetchSelected(...args) {
34
+ return this.filterSchema.fetchSelected(...args);
35
+ },
36
+ },
37
+ };
38
+ </script>
39
+
40
+ <style scoped>
41
+
42
+ </style>
@@ -0,0 +1,32 @@
1
+ <template>
2
+ <wt-select
3
+ :value="filterSchema.value"
4
+ :options="filterSchema.options"
5
+ :label="$t(filterSchema.locale.label)"
6
+ :track-by="filterSchema.storedProp"
7
+ :multiple="filterSchema.multiple"
8
+ v-bind="$attrs"
9
+ @input="setValue({ filter: filterQuery, value: $event })"
10
+ @reset="setValueToQuery({ value, filterQuery, storedProp: filterSchema.storedProp })"
11
+ @closed="setValueToQuery({ value, filterQuery, storedProp: filterSchema.storedProp })"
12
+ ></wt-select>
13
+ </template>
14
+
15
+ <script>
16
+ import enumFilterMixin from '../mixins/enumFilterMixin';
17
+
18
+ export default {
19
+ name: 'abstract-enum-filter',
20
+ mixins: [enumFilterMixin],
21
+ props: {
22
+ filterQuery: {
23
+ type: String,
24
+ required: true,
25
+ },
26
+ },
27
+ };
28
+ </script>
29
+
30
+ <style scoped>
31
+
32
+ </style>
@@ -0,0 +1,33 @@
1
+ <template>
2
+ <wt-search-bar
3
+ :value="filterSchema.value"
4
+ debounce
5
+ @input="setValue({ filter: filterQuery, value: $event })"
6
+ @search="setValueToQuery({ filter: filterQuery, value: $event })"
7
+ :placeholder="$t('reusable.search')"
8
+ />
9
+ </template>
10
+
11
+ <script>
12
+ import baseFilterMixin from '../mixins/baseFilterMixin/baseFilterMixin';
13
+
14
+ export default {
15
+ name: 'filter-search',
16
+ mixins: [baseFilterMixin],
17
+ props: {
18
+ filterQuery: {
19
+ type: String,
20
+ default: 'search',
21
+ },
22
+ },
23
+ methods: {
24
+ restoreValue(value) {
25
+ this.setValue({ filterQuery: this.filterQuery, value });
26
+ },
27
+ },
28
+ };
29
+ </script>
30
+
31
+ <style scoped>
32
+
33
+ </style>
@@ -0,0 +1,48 @@
1
+ import { createLocalVue, shallowMount } from '@vue/test-utils';
2
+ import VueRouter from 'vue-router';
3
+ import ApiFilterSchema from '../../classes/ApiFilterSchema';
4
+ import apiFilterMixin from '../apiFilterMixin';
5
+
6
+ const localVue = createLocalVue();
7
+ localVue.use(VueRouter);
8
+ const router = new VueRouter();
9
+ const team = ['1', '2'];
10
+ const filterSchema = new ApiFilterSchema();
11
+
12
+ describe('API filter mixin', () => {
13
+ const setValue = jest.fn();
14
+ const Component = {
15
+ render() {},
16
+ mixins: [apiFilterMixin],
17
+ data: () => ({
18
+ filterQuery: 'team',
19
+ }),
20
+ computed: {
21
+ filterSchema() { return filterSchema; },
22
+ },
23
+ methods: { setValue },
24
+ };
25
+
26
+ beforeEach(() => {
27
+ setValue.mockClear();
28
+ if (Object.keys(router.currentRoute.query).length) router.replace({ query: null });
29
+ });
30
+
31
+ it('Correctly sets value from $route query', async () => {
32
+ await router.replace({ query: { team } });
33
+ const wrapper = shallowMount(Component, {
34
+ localVue,
35
+ router,
36
+ });
37
+ expect(setValue).toHaveBeenCalledWith({ filter: 'team', value: [{ id: team[0] }, { id: team[1] }] });
38
+ });
39
+
40
+ it('Sets empty array value if $route query is empty', async () => {
41
+ const wrapper = shallowMount(Component, {
42
+ localVue,
43
+ router,
44
+ data: () => ({ filterQuery: 'queue' }),
45
+ });
46
+ expect(setValue).not.toHaveBeenCalled();
47
+ });
48
+ });
@@ -0,0 +1,54 @@
1
+ import { createLocalVue, shallowMount } from '@vue/test-utils';
2
+ import VueRouter from 'vue-router';
3
+ import enumFilterMixin from '../enumFilterMixin';
4
+
5
+ const options = [{
6
+ name: 'Inbound',
7
+ value: 'inbound',
8
+ },
9
+ {
10
+ name: 'Outbound',
11
+ value: 'outbound',
12
+ }];
13
+
14
+ const localVue = createLocalVue();
15
+ localVue.use(VueRouter);
16
+ const router = new VueRouter();
17
+
18
+ describe('Enum filter mixin', () => {
19
+ const setValue = jest.fn();
20
+ const Component = {
21
+ render() {
22
+ },
23
+ mixins: [enumFilterMixin],
24
+ data: () => ({
25
+ filterQuery: 'direction',
26
+ storedProp: 'value',
27
+ options,
28
+ }),
29
+ methods: { setValue },
30
+ };
31
+
32
+ beforeEach(() => {
33
+ setValue.mockClear();
34
+ if (Object.keys(router.currentRoute.query).length) router.replace({ query: null });
35
+ });
36
+
37
+ it('Correctly sets value from $route query', async () => {
38
+ await router.replace({ query: { direction: options[0].value } });
39
+ const wrapper = shallowMount(Component, {
40
+ localVue,
41
+ router,
42
+ });
43
+ await wrapper.vm.$nextTick();
44
+ expect(setValue).toHaveBeenCalledWith({ filter: 'direction', value: options[0] });
45
+ });
46
+
47
+ it('Sets empty array value if $route query is empty', async () => {
48
+ const wrapper = shallowMount(Component, {
49
+ localVue,
50
+ router,
51
+ });
52
+ expect(setValue).not.toHaveBeenCalled();
53
+ });
54
+ });
@@ -0,0 +1,74 @@
1
+ import { createLocalVue, shallowMount } from '@vue/test-utils';
2
+ import VueRouter from 'vue-router';
3
+ import paginationFilterMixin from '../paginationFilterMixin';
4
+
5
+ const localVue = createLocalVue();
6
+ localVue.use(VueRouter);
7
+ const router = new VueRouter();
8
+ const page = 2;
9
+ const size = 20;
10
+
11
+ describe('Pagination filter mixin', () => {
12
+ const setPage = jest.fn();
13
+ const setSize = jest.fn();
14
+ let wrapper;
15
+ const Component = {
16
+ render() {},
17
+ mixins: [paginationFilterMixin],
18
+ data: () => ({ page, size }),
19
+ methods: { setPage, setSize },
20
+ };
21
+
22
+ beforeEach(() => {
23
+ setPage.mockClear();
24
+ setSize.mockClear();
25
+ if (Object.keys(router.currentRoute.query).length) router.replace({ query: null });
26
+ });
27
+
28
+ it('Correctly sets value from $route query', async () => {
29
+ await router.replace({ query: { page, size } });
30
+ wrapper = shallowMount(Component, {
31
+ localVue,
32
+ router,
33
+ });
34
+ expect(setPage).toHaveBeenCalledWith(page);
35
+ expect(setSize).toHaveBeenCalledWith(size);
36
+ });
37
+
38
+ it('At "prev" page, changes query and emits event', async () => {
39
+ await router.replace({ query: { page, size } });
40
+ wrapper = shallowMount(Component, {
41
+ localVue,
42
+ router,
43
+ });
44
+ wrapper._emitted.input = []; // reset emitted events
45
+ wrapper.vm.prev();
46
+ expect(wrapper.emitted().input).toBeTruthy();
47
+ expect(wrapper.vm.$route.query.page).toBe(`${page - 1}`);
48
+ });
49
+
50
+ it('At "next" page, changes query and emits event', async () => {
51
+ await router.replace({ query: { page, size } });
52
+ wrapper = shallowMount(Component, {
53
+ localVue,
54
+ router,
55
+ });
56
+ wrapper._emitted.input = []; // reset emitted events
57
+ wrapper.vm.next();
58
+ expect(wrapper.emitted().input).toBeTruthy();
59
+ expect(wrapper.vm.$route.query.page).toBe(`${page + 1}`);
60
+ });
61
+
62
+ it('At "sizeChange", changes query and emits event', async () => {
63
+ const newSize = 40;
64
+ await router.replace({ query: { page, size } });
65
+ wrapper = shallowMount(Component, {
66
+ localVue,
67
+ router,
68
+ });
69
+ wrapper._emitted.input = []; // reset emitted events
70
+ wrapper.vm.sizeChange(newSize);
71
+ expect(wrapper.emitted().input).toBeTruthy();
72
+ expect(wrapper.vm.$route.query.size).toBe(`${newSize}`);
73
+ });
74
+ });
@@ -0,0 +1,58 @@
1
+ import { shallowMount, createLocalVue } from '@vue/test-utils';
2
+ import VueRouter from 'vue-router';
3
+ import sortFilterMixin from '../sortFilterMixin';
4
+
5
+ const localVue = createLocalVue();
6
+ localVue.use(VueRouter);
7
+ const router = new VueRouter();
8
+
9
+ const headers = [{
10
+ value: 'queue',
11
+ show: true,
12
+ sort: null,
13
+ field: 'queue',
14
+ }, {
15
+ value: 'agents',
16
+ show: true,
17
+ sort: null,
18
+ field: 'online',
19
+ }];
20
+
21
+ const sortedHeaders = [{
22
+ value: 'queue',
23
+ show: true,
24
+ sort: 'asc',
25
+ field: 'queue',
26
+ }, {
27
+ value: 'agents',
28
+ show: true,
29
+ sort: null,
30
+ field: 'online',
31
+ }];
32
+
33
+ describe('Sort filter mixin', () => {
34
+ const setHeaders = jest.fn();
35
+ const Component = {
36
+ render() {},
37
+ mixins: [sortFilterMixin],
38
+ data: () => ({ headers }),
39
+ methods: { setHeaders },
40
+ };
41
+
42
+ beforeEach(() => {
43
+ router.replace('/');
44
+ });
45
+
46
+ it('Correctly sets value from $route query', async () => {
47
+ await router.replace({ path: '/', query: { sort: '+queue' } });
48
+ const wrapper = shallowMount(Component, { localVue, router });
49
+ expect(setHeaders).toHaveBeenCalledWith(sortedHeaders);
50
+ });
51
+
52
+ it('After "sort" trigger, header column sort value changes properly', () => {
53
+ const wrapper = shallowMount(Component, { localVue, router });
54
+ const queue = wrapper.vm.headers.find((header) => header.value === 'queue');
55
+ wrapper.vm.sort(queue);
56
+ expect(setHeaders).toHaveBeenCalledWith(sortedHeaders);
57
+ });
58
+ });