@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
@@ -1,12 +1,97 @@
1
+ import AdminSections from '../../enums/WebitelApplications/AdminSections.enum';
2
+ import SupervisorSections from '../../enums/WebitelApplications/SupervisorSections.enum';
3
+ import WebitelApplications from '../../enums/WebitelApplications/WebitelApplications.enum';
4
+
1
5
  export default {
6
+ // describes reusable buttons, actions, default titles, and other ui elements
2
7
  reusable: {
8
+ total: 'Всего',
9
+ ok: 'Ок',
10
+ save: 'Сохранить',
11
+ close: 'Закрыть',
3
12
  add: 'Добавить',
4
13
  cancel: 'Отменить',
14
+ import: 'Импорт',
15
+ export: 'Экспорт',
16
+ true: 'Да',
17
+ delete: 'Удалить',
18
+ search: 'Поиск',
19
+ open: 'Открыть',
20
+ name: 'Имя',
21
+ lang: {
22
+ en: 'English',
23
+ ru: 'Русский',
24
+ ua: 'Українська',
25
+ },
26
+ },
27
+ // date-related texts
28
+ date: {
29
+ sec: 'Сек',
30
+ },
31
+ // describes Webitel system entities
32
+ objects: {
33
+ team: 'Команда | Команды',
34
+ supervisor: 'Супервизор | Супервизоры',
35
+ auditor: 'Аудитор | Аудиторы',
36
+ region: 'Регион | Регионы',
37
+ },
38
+ // describes Webitel FRONTEND applications + their navs
39
+ WebitelApplications: {
40
+ [WebitelApplications.AGENT]: { name: 'Agent Workspace' },
41
+ [WebitelApplications.AUDIT]: { name: 'Audit' },
42
+ [WebitelApplications.HISTORY]: { name: 'Call History' },
43
+ [WebitelApplications.ANALYTICS]: { name: 'Data Visualisation Tool' },
44
+ [WebitelApplications.SUPERVISOR]: {
45
+ name: 'Supervisor Workspace',
46
+ sections: {
47
+ [SupervisorSections.QUEUES]: 'Очереди',
48
+ [SupervisorSections.AGENTS]: 'Агенты',
49
+ [SupervisorSections.ACTIVE_CALLS]: 'Активные звонки',
50
+ },
51
+ },
52
+ [WebitelApplications.ADMIN]: {
53
+ name: 'Admin',
54
+ sections: {
55
+ [AdminSections.USERS]: 'Пользователи',
56
+ [AdminSections.LICENSE]: 'Лицензии',
57
+ [AdminSections.DEVICES]: 'Устройства',
58
+ [AdminSections.FLOW]: 'Схемы звонка',
59
+ [AdminSections.DIALPLAN]: 'Исходящая маршрутизация',
60
+ [AdminSections.GATEWAYS]: 'Шлюзы',
61
+ [AdminSections.CHAT_GATEWAYS]: 'Текстовые шлюзы',
62
+ [AdminSections.SKILLS]: 'Навыки оператора',
63
+ [AdminSections.BUCKETS]: 'Корзины',
64
+ [AdminSections.MEDIA]: 'Медиафайлы',
65
+ [AdminSections.BLACKLIST]: 'Cписки обзвона',
66
+ [AdminSections.CALENDARS]: 'Календари',
67
+ [AdminSections.COMMUNICATIONS]: 'Типы связи',
68
+ [AdminSections.REGIONS]: 'Площадки',
69
+ [AdminSections.PAUSE_CAUSE]: 'Статусы оператора',
70
+ [AdminSections.AGENTS]: 'Операторы',
71
+ [AdminSections.TEAMS]: 'Команды',
72
+ [AdminSections.RESOURCES]: 'Ресурсы',
73
+ [AdminSections.RESOURCE_GROUPS]: 'Группы ресурсов',
74
+ [AdminSections.QUEUES]: 'Очереди',
75
+ [AdminSections.STORAGE]: 'Хранилища',
76
+ [AdminSections.ROLES]: 'Роли',
77
+ [AdminSections.OBJECTS]: 'Разделы',
78
+ },
79
+ },
5
80
  },
6
81
  validation: {
7
82
  required: 'Обязательное поле',
8
- numeric: 'Should be numeric',
9
- email: 'Should look like email',
83
+ numeric: 'Необходимо ввести цифровое значение',
84
+ email: 'Необходимо ввести адрес электронной почты',
85
+ gatewayHostValidator: 'Необходимо ввести IPv4 или FQDN',
86
+ sipAccountValidator: 'Необходимо ввести SIP-аккаунт',
87
+ ipValidator: 'Необходимо ввести IPv4',
88
+ macValidator: 'Необходимо ввести MAC-адрес',
89
+ minValue: 'Значение должно быть не меньше',
90
+ maxValue: 'Значение должно быть не больше',
91
+ sameAs: 'Неверный пароль',
92
+ requiredArrayValue: 'Поле не должно быть пустым',
93
+ minLength: 'Количество символов не должно быть меньше, чем',
94
+ url: 'Необходимо ввести корректный url-адрес',
10
95
  },
11
96
  webitelUI: {
12
97
  timepicker: {
@@ -23,5 +108,53 @@ export default {
23
108
  prev: 'Назад',
24
109
  next: 'Вперед',
25
110
  },
111
+ appNavigator: {
112
+ title: 'Приложения Webitel',
113
+ admin: 'Admin',
114
+ agent: 'Agent Workspace',
115
+ supervisor: 'Supervisor Workspace',
116
+ audit: 'Audit',
117
+ history: 'Call History',
118
+ grafana: 'Grafana',
119
+ },
120
+ headerActions: {
121
+ account: 'Аккаунт',
122
+ docs: 'Документация',
123
+ settings: 'Настройки',
124
+ logout: 'Выйти',
125
+ buildVersion: 'Версия сборки',
126
+ },
127
+ tableActions: {
128
+ filterReset: 'Сбросить фильтры',
129
+ columnSelect: 'Добавить колонки',
130
+ refreshTable: 'Обновить',
131
+ expandFilters: 'Раскрыть фильтры',
132
+ },
133
+ tableColumnSelect: {
134
+ title: 'Выберите отображаемые колонки',
135
+ },
136
+ statusSelect: {
137
+ online: 'Онлайн',
138
+ pause: 'Пауза',
139
+ offline: 'Оффлайн',
140
+ breakOut: 'Принудительный перерыв',
141
+ },
142
+ table: {
143
+ tableCells: {
144
+ deleteActionHint: 'Удалить',
145
+ editActionHint: 'Редактировать',
146
+ },
147
+ },
148
+ errorPages: {
149
+ goBack: 'Вернуться назад',
150
+ page403: {
151
+ title: 'Нет доступа',
152
+ text: 'Извините, у вас недостаточно прав доступа для просмотра этой страницы.',
153
+ },
154
+ page404: {
155
+ title: 'Похоже, вы потерялись',
156
+ text: 'Извините, мы не можем найти то, что вы ищете',
157
+ },
158
+ },
26
159
  },
27
160
  };
@@ -0,0 +1,160 @@
1
+ import AdminSections from '../../enums/WebitelApplications/AdminSections.enum';
2
+ import SupervisorSections from '../../enums/WebitelApplications/SupervisorSections.enum';
3
+ import WebitelApplications from '../../enums/WebitelApplications/WebitelApplications.enum';
4
+
5
+ export default {
6
+ // describes reusable buttons, actions, default titles, and other ui elements
7
+ reusable: {
8
+ total: 'Всього',
9
+ ok: 'Ок',
10
+ save: 'Зберегти',
11
+ close: 'Закрити',
12
+ add: 'Додати',
13
+ cancel: 'Відмінити',
14
+ import: 'Імпорт',
15
+ export: 'Експорт',
16
+ true: 'Так',
17
+ delete: 'Видалити',
18
+ search: 'Пошук',
19
+ open: 'Відкрити',
20
+ name: 'Ім\'я',
21
+ lang: {
22
+ en: 'English',
23
+ ru: 'Русский',
24
+ ua: 'Українська',
25
+ },
26
+ },
27
+ // date-related texts
28
+ date: {
29
+ sec: 'Сек',
30
+ },
31
+ // describes Webitel system entities
32
+ objects: {
33
+ team: 'Команда | Команди',
34
+ supervisor: 'Супервізор | Супервізори',
35
+ auditor: 'Аудитор | Аудитори',
36
+ region: 'Регіон | Регіони',
37
+ },
38
+ // describes Webitel FRONTEND applications + their navs
39
+ WebitelApplications: {
40
+ [WebitelApplications.AGENT]: { name: 'Agent Workspace' },
41
+ [WebitelApplications.AUDIT]: { name: 'Audit' },
42
+ [WebitelApplications.HISTORY]: { name: 'Call History' },
43
+ [WebitelApplications.ANALYTICS]: { name: 'Data Visualisation Tool' },
44
+ [WebitelApplications.SUPERVISOR]: {
45
+ name: 'Supervisor Workspace',
46
+ sections: {
47
+ [SupervisorSections.QUEUES]: 'Черги',
48
+ [SupervisorSections.AGENTS]: 'Агенти',
49
+ [SupervisorSections.ACTIVE_CALLS]: 'Активні дзвінки',
50
+ },
51
+ },
52
+ [WebitelApplications.ADMIN]: {
53
+ name: 'Admin',
54
+ sections: {
55
+ [AdminSections.USERS]: 'Користувачі',
56
+ [AdminSections.LICENSE]: 'Ліцензії',
57
+ [AdminSections.DEVICES]: 'Пристрої',
58
+ [AdminSections.FLOW]: 'Схеми дзвінка',
59
+ [AdminSections.DIALPLAN]: 'Правила вихідного набору',
60
+ [AdminSections.GATEWAYS]: 'Шлюзи',
61
+ [AdminSections.CHAT_GATEWAYS]: 'Текстові шлюзи',
62
+ [AdminSections.SKILLS]: 'Навички оператора',
63
+ [AdminSections.BUCKETS]: 'Кошики',
64
+ [AdminSections.MEDIA]: 'Медіафайли',
65
+ [AdminSections.BLACKLIST]: 'Cписки обдзвону',
66
+ [AdminSections.CALENDARS]: 'Календарі',
67
+ [AdminSections.REGIONS]: 'Розташування',
68
+ [AdminSections.COMMUNICATIONS]: 'Типи зв\'язку',
69
+ [AdminSections.PAUSE_CAUSE]: 'Статуси оператора',
70
+ [AdminSections.AGENTS]: 'Оператори',
71
+ [AdminSections.TEAMS]: 'Команди',
72
+ [AdminSections.RESOURCES]: 'Ресурси',
73
+ [AdminSections.RESOURCE_GROUPS]: 'Групи ресурсів',
74
+ [AdminSections.QUEUES]: 'Черги',
75
+ [AdminSections.STORAGE]: 'Сховища',
76
+ [AdminSections.ROLES]: 'Ролі',
77
+ [AdminSections.OBJECTS]: 'Розділи',
78
+ },
79
+ },
80
+ },
81
+ validation: {
82
+ required: 'Обов\'язкове поле',
83
+ numeric: 'Необхідно ввести цифрові значення',
84
+ email: 'Необхідно ввести адресу електронної пошти',
85
+ gatewayHostValidator: 'Необхідно ввести IPv4 або FQDN',
86
+ sipAccountValidator: 'Необхідно ввести SIP-аккаунт',
87
+ ipValidator: 'Необхідно ввести IPv4',
88
+ macValidator: 'Необхідно ввести MAC-адрес',
89
+ minValue: 'Значення повинно бути не менше',
90
+ maxValue: 'Значення повинно бути не більше',
91
+ sameAs: 'Неправильний пароль',
92
+ requiredArrayValue: 'Поле не повинно бути пустим',
93
+ minLength: 'Кількість символів повинна бути не меншою, ніж',
94
+ url: 'Необхідно ввести правильну url-адресу',
95
+ },
96
+ webitelUI: {
97
+ timepicker: {
98
+ hour: 'Год:',
99
+ min: 'Хв:',
100
+ sec: 'Сек:',
101
+ },
102
+ datetimepicker: {
103
+ lastHour: 'Остання година',
104
+ lastDay: 'Останній день',
105
+ },
106
+ pagination: {
107
+ sizeText: 'Записів на сторінці:',
108
+ prev: 'Назад',
109
+ next: 'Вперед',
110
+ },
111
+ appNavigator: {
112
+ title: 'Застосунки Webitel',
113
+ admin: 'Admin',
114
+ agent: 'Agent Workspace',
115
+ supervisor: 'Supervisor Workspace',
116
+ audit: 'Audit',
117
+ history: 'Call History',
118
+ grafana: 'Grafana',
119
+ },
120
+ headerActions: {
121
+ account: 'Аккаунт',
122
+ docs: 'Документація',
123
+ settings: 'Налаштування',
124
+ logout: 'Вийти',
125
+ buildVersion: 'Версія збірки',
126
+ },
127
+ tableActions: {
128
+ filterReset: 'Скинути фільтри',
129
+ columnSelect: 'Додати колонки',
130
+ refreshTable: 'Оновити',
131
+ expandFilters: 'Розкрити фільтри',
132
+ },
133
+ tableColumnSelect: {
134
+ title: 'Виберіть відображені колонки',
135
+ },
136
+ statusSelect: {
137
+ online: 'Онлайн',
138
+ pause: 'Пауза',
139
+ offline: 'Оффлайн',
140
+ breakOut: 'Примусова перерва',
141
+ },
142
+ table: {
143
+ tableCells: {
144
+ deleteActionHint: 'Видалити',
145
+ editActionHint: 'Редагувати',
146
+ },
147
+ },
148
+ errorPages: {
149
+ goBack: 'Повернутись назад',
150
+ page403: {
151
+ title: 'Немає доступу',
152
+ text: 'Вибачте, у Вас недостатньо прав доступу для перегляду цієї сторінки',
153
+ },
154
+ page404: {
155
+ title: 'Здається, Ви загубились',
156
+ text: 'Вибачте, ми не можемо знайти те, що Ви шукаєте',
157
+ },
158
+ },
159
+ },
160
+ };
@@ -0,0 +1,57 @@
1
+ import { createLocalVue, shallowMount } from '@vue/test-utils';
2
+ import VueRouter from 'vue-router';
3
+ import apiFilterMixin from '../apiFilterMixin';
4
+
5
+ const localVue = createLocalVue();
6
+ localVue.use(VueRouter);
7
+ const router = new VueRouter();
8
+ const team = ['1', '2'];
9
+
10
+ describe('API filter mixin', () => {
11
+ let wrapper;
12
+ const Component = {
13
+ render() {},
14
+ mixins: [apiFilterMixin],
15
+ data: () => ({
16
+ filterQuery: 'team',
17
+ }),
18
+ };
19
+
20
+ beforeEach(() => {
21
+ if (Object.keys(router.currentRoute.query).length) router.replace({ query: null });
22
+ });
23
+
24
+ it('Correctly sets value from $route query', async () => {
25
+ await router.replace({ query: { team } });
26
+ wrapper = shallowMount(Component, {
27
+ localVue,
28
+ router,
29
+ });
30
+ await wrapper.vm.$nextTick();
31
+ expect(wrapper.vm.value).toEqual(team);
32
+ });
33
+
34
+ it('Sets empty array value if $route query is empty', async () => {
35
+ wrapper = shallowMount(Component, {
36
+ localVue,
37
+ router,
38
+ data: () => ({
39
+ filterQuery: 'queue',
40
+ }),
41
+ });
42
+ expect(wrapper.vm.value).toEqual([]);
43
+ });
44
+
45
+ it('Resets value after $route query reset', async () => {
46
+ await router.replace({ query: { team } });
47
+ wrapper = shallowMount(Component, {
48
+ localVue,
49
+ router,
50
+ });
51
+ await wrapper.vm.$nextTick();
52
+ expect(wrapper.vm.value).toEqual(team);
53
+ await wrapper.vm.$router.replace({ query: null });
54
+ await wrapper.vm.$nextTick();
55
+ expect(wrapper.vm.value).toEqual([]);
56
+ });
57
+ });
@@ -0,0 +1,66 @@
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
+ let wrapper;
20
+ const Component = {
21
+ render() {
22
+ },
23
+ mixins: [enumFilterMixin],
24
+ data: () => ({
25
+ filterQuery: 'type',
26
+ options,
27
+ }),
28
+ };
29
+
30
+ beforeEach(() => {
31
+ if (Object.keys(router.currentRoute.query).length) router.replace({ query: null });
32
+ });
33
+
34
+ it('Correctly sets value from $route query', async () => {
35
+ await router.replace({ query: { type: [options[0].value] } });
36
+ wrapper = shallowMount(Component, {
37
+ localVue,
38
+ router,
39
+ });
40
+ await wrapper.vm.$nextTick();
41
+ expect(wrapper.vm.value).toEqual([options[0]]);
42
+ });
43
+
44
+ it('Correctly sets single value from $route query', async () => {
45
+ await router.replace({ query: { type: options[0].value } });
46
+ wrapper = shallowMount(Component, {
47
+ localVue,
48
+ router,
49
+ });
50
+ await wrapper.vm.$nextTick();
51
+ expect(wrapper.vm.value).toEqual(options[0]);
52
+ });
53
+
54
+ it('Resets value after $route query reset', async () => {
55
+ await router.replace({ query: { type: [options[0].value] } });
56
+ wrapper = shallowMount(Component, {
57
+ localVue,
58
+ router,
59
+ });
60
+ await wrapper.vm.$nextTick();
61
+ expect(wrapper.vm.value).toEqual([options[0]]);
62
+ await wrapper.vm.$router.replace({ query: null });
63
+ await wrapper.vm.$nextTick();
64
+ expect(wrapper.vm.value).toEqual([]);
65
+ });
66
+ });
@@ -0,0 +1,93 @@
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
+ let wrapper;
13
+ const Component = {
14
+ render() {},
15
+ mixins: [paginationFilterMixin],
16
+ };
17
+
18
+ beforeEach(() => {
19
+ if (Object.keys(router.currentRoute.query).length) router.replace({ query: null });
20
+ });
21
+
22
+ it('Correctly sets value from $route query', async () => {
23
+ await router.replace({ query: { page, size } });
24
+ wrapper = shallowMount(Component, {
25
+ localVue,
26
+ router,
27
+ });
28
+ await wrapper.vm.$nextTick();
29
+ expect(wrapper.vm.page).toEqual(page);
30
+ expect(wrapper.vm.size).toEqual(size);
31
+ });
32
+
33
+ it('Sets initial value if $route query is empty', async () => {
34
+ wrapper = shallowMount(Component, {
35
+ localVue,
36
+ router,
37
+ data: () => ({
38
+ filterQuery: 'queue',
39
+ }),
40
+ });
41
+ expect(wrapper.vm.page).toEqual('1');
42
+ expect(wrapper.vm.size).toEqual('10');
43
+ });
44
+
45
+ it('Resets value after $route query reset', async () => {
46
+ await router.replace({ query: { page, size } });
47
+ wrapper = shallowMount(Component, {
48
+ localVue,
49
+ router,
50
+ });
51
+ await wrapper.vm.$router.replace({ query: null });
52
+ await wrapper.vm.$nextTick();
53
+ expect(wrapper.vm.page).toEqual('1');
54
+ expect(wrapper.vm.size).toEqual('10');
55
+ });
56
+
57
+ it('At "prev" page, changes query and emits event', async () => {
58
+ await router.replace({ query: { page, size } });
59
+ wrapper = shallowMount(Component, {
60
+ localVue,
61
+ router,
62
+ });
63
+ wrapper._emitted.input = []; // reset emitted events
64
+ wrapper.vm.prev();
65
+ expect(wrapper.emitted().input).toBeTruthy();
66
+ expect(wrapper.vm.$route.query.page).toBe(`${page - 1}`);
67
+ });
68
+
69
+ it('At "next" page, changes query and emits event', async () => {
70
+ await router.replace({ query: { page, size } });
71
+ wrapper = shallowMount(Component, {
72
+ localVue,
73
+ router,
74
+ });
75
+ wrapper._emitted.input = []; // reset emitted events
76
+ wrapper.vm.next();
77
+ expect(wrapper.emitted().input).toBeTruthy();
78
+ expect(wrapper.vm.$route.query.page).toBe(`${+page + 1}`);
79
+ });
80
+
81
+ it('At "sizeChange", changes query and emits event', async () => {
82
+ const newSize = '40';
83
+ await router.replace({ query: { page, size } });
84
+ wrapper = shallowMount(Component, {
85
+ localVue,
86
+ router,
87
+ });
88
+ wrapper._emitted.input = []; // reset emitted events
89
+ wrapper.vm.sizeChange(newSize);
90
+ expect(wrapper.emitted().input).toBeTruthy();
91
+ expect(wrapper.vm.$route.query.size).toBe(newSize);
92
+ });
93
+ });
@@ -0,0 +1,60 @@
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 $t = () => {};
22
+
23
+ describe('Sort filter mixin', () => {
24
+ let wrapper;
25
+ const Component = {
26
+ render() {},
27
+ mixins: [sortFilterMixin],
28
+ data: () => ({ headers }),
29
+ };
30
+
31
+ beforeEach(() => {
32
+ router.replace('/');
33
+ wrapper = shallowMount(Component, {
34
+ localVue,
35
+ router,
36
+ mocks: { $t },
37
+ });
38
+ });
39
+
40
+ it('Correctly sets value from $route query', async () => {
41
+ await router.replace({ path: '/', query: { sort: '+queue' } });
42
+ const queue = wrapper.vm.headers.find((header) => header.value === 'queue');
43
+ expect(queue.sort).toEqual('asc');
44
+ });
45
+
46
+ it('After "sort" trigger, header column sort value changes properly', () => {
47
+ let queue;
48
+ queue = wrapper.vm.headers.find((header) => header.value === 'queue');
49
+ wrapper.vm.sort(queue);
50
+ queue = wrapper.vm.headers.find((header) => header.value === 'queue');
51
+ expect(queue.sort).toEqual('asc');
52
+ });
53
+
54
+ it('After "sort" trigger, url query changes properly', async () => {
55
+ await router.replace({ path: '/', query: { sort: '+queue' } });
56
+ const queue = wrapper.vm.headers.find((header) => header.value === 'queue');
57
+ wrapper.vm.sort(queue);
58
+ expect(wrapper.vm.$route.query.sort).toEqual('-queue');
59
+ });
60
+ });
@@ -0,0 +1,48 @@
1
+ import { shallowMount, createLocalVue } from '@vue/test-utils';
2
+ import VueRouter from 'vue-router';
3
+ import _urlControllerMixin from '../_urlControllerMixin/_urlControllerMixin';
4
+
5
+ const localVue = createLocalVue();
6
+ localVue.use(VueRouter);
7
+ const router = new VueRouter();
8
+
9
+ const $t = () => {};
10
+ const filterQuery = 'team';
11
+
12
+ describe('URL Controller mixin Set and Get operations', () => {
13
+ let wrapper;
14
+ const Component = {
15
+ render() {},
16
+ mixins: [_urlControllerMixin],
17
+ };
18
+
19
+ beforeEach(() => {
20
+ router.replace('/');
21
+ wrapper = shallowMount(Component, {
22
+ localVue,
23
+ router,
24
+ mocks: { $t },
25
+ });
26
+ });
27
+
28
+ it('Array of objects', async () => {
29
+ const value = [{ name: 'team 1', id: '1' }, { name: 'team 2', id: '2' }];
30
+ wrapper.vm.setValueToQuery({ filterQuery, value });
31
+ const queryValue = wrapper.vm.getValueFromQuery({ filterQuery });
32
+ expect(queryValue).toEqual(['1', '2']);
33
+ });
34
+
35
+ it('Array of values', async () => {
36
+ const value = ['hello', '1'];
37
+ wrapper.vm.setValueToQuery({ filterQuery, value });
38
+ const queryValue = wrapper.vm.getValueFromQuery({ filterQuery });
39
+ expect(queryValue).toEqual(value);
40
+ });
41
+
42
+ it('String value', async () => {
43
+ const value = 'hello there';
44
+ wrapper.vm.setValueToQuery({ filterQuery, value });
45
+ const queryValue = wrapper.vm.getValueFromQuery({ filterQuery });
46
+ expect(queryValue).toEqual(value);
47
+ });
48
+ });
@@ -0,0 +1,37 @@
1
+ import deepEqual from 'deep-equal';
2
+
3
+ export default {
4
+ methods: {
5
+ changeRouteQuery({ filterQuery, value }) {
6
+ const query = { ...this.$route.query };
7
+ query[filterQuery] = value;
8
+ return this.$router.replace({
9
+ name: this.$router.currentRoute.name,
10
+ query,
11
+ });
12
+ },
13
+
14
+ setValueToQuery({ filterQuery, value, storedProp = 'id' }) {
15
+ let newValue = '';
16
+ if (Array.isArray(value)) {
17
+ if (value.length && typeof value[0] !== 'object') {
18
+ newValue = value;
19
+ } else {
20
+ newValue = value.map((item) => item[storedProp]);
21
+ }
22
+ } else {
23
+ newValue = value;
24
+ }
25
+ if (!deepEqual(this.$route.query[filterQuery], newValue)) {
26
+ this.changeRouteQuery({
27
+ value: newValue,
28
+ filterQuery,
29
+ });
30
+ }
31
+ },
32
+
33
+ getValueFromQuery({ filterQuery }) {
34
+ return this.$route.query[filterQuery];
35
+ },
36
+ },
37
+ };