@webitel/ui-sdk 24.12.29 → 24.12.34

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 (295) hide show
  1. package/CHANGELOG.md +271 -131
  2. package/README.md +6 -0
  3. package/dist/img/sprite/index.js +8 -2
  4. package/dist/img/sprite/tree-collapse.svg +4 -0
  5. package/dist/img/sprite/tree-cross.svg +5 -0
  6. package/dist/img/sprite/tree-line.svg +10 -0
  7. package/dist/ui-sdk.css +1 -1
  8. package/dist/ui-sdk.js +7736 -7442
  9. package/dist/ui-sdk.umd.cjs +17 -17
  10. package/package.json +13 -6
  11. package/src/api/axios/generateInstance.js +6 -2
  12. package/src/api/clients/agents/agentChats.js +18 -19
  13. package/src/api/clients/agents/agents.js +29 -7
  14. package/src/api/clients/buckets/buckets.js +16 -3
  15. package/src/api/clients/calendars/calendars.js +21 -3
  16. package/src/api/clients/catalog/catalog.js +1 -3
  17. package/src/api/clients/chatGateways/chatGateways.js +41 -12
  18. package/src/api/clients/communications/communications.js +25 -6
  19. package/src/api/clients/configurations/configurations.js +13 -3
  20. package/src/api/clients/flows/flow.js +20 -9
  21. package/src/api/clients/gateways/gateways.js +12 -3
  22. package/src/api/clients/lists/blacklists.js +16 -3
  23. package/src/api/clients/media/media.js +16 -3
  24. package/src/api/clients/queues/queues.js +16 -6
  25. package/src/api/clients/roles/roles.js +3 -1
  26. package/src/api/clients/skills/skills.js +16 -3
  27. package/src/api/clients/teams/teams.js +17 -7
  28. package/src/api/clients/users/__tests__/users.spec.js +3 -1
  29. package/src/api/clients/users/users.js +8 -2
  30. package/src/api/clients//321/201ontacts/contactChatMessagesHistory.js +21 -13
  31. package/src/api/clients//321/201ontacts/contacts.js +38 -15
  32. package/src/api/history/transcript/callTranscript.js +10 -2
  33. package/src/api/interceptors/request/updateToken.interceptor.js +2 -1
  34. package/src/api/transformers/applyTransform.js +5 -1
  35. package/src/api/transformers/camelToSnake/camelToSnake.transformer.js +2 -1
  36. package/src/api/transformers/snakeToCamel/snakeToCamel.transformer.js +2 -1
  37. package/src/assets/icons/sprite/index.js +8 -2
  38. package/src/assets/icons/sprite/tree-collapse.svg +4 -0
  39. package/src/assets/icons/sprite/tree-cross.svg +5 -0
  40. package/src/assets/icons/sprite/tree-line.svg +10 -0
  41. package/src/components/index.js +8 -12
  42. package/src/components/on-demand/wt-navigation-menu/components/_internals/nav-menu-lvl-1.vue +4 -2
  43. package/src/components/on-demand/wt-navigation-menu/components/_internals/nav-menu-lvl-2.vue +3 -4
  44. package/src/components/on-demand/wt-navigation-menu/components/wt-navigation-menu.vue +6 -6
  45. package/src/components/on-demand/wt-route-transition/wt-route-transition.vue +12 -12
  46. package/src/components/on-demand/wt-save-failed-popup/wt-save-failed-popup.vue +1 -3
  47. package/src/components/on-demand/wt-selection-popup/wt-selection-popup.vue +3 -3
  48. package/src/components/on-demand/wt-start-page/components/start-page-card.vue +4 -2
  49. package/src/components/on-demand/wt-start-page/components/start-page-logo.vue +1 -1
  50. package/src/components/on-demand/wt-start-page/components/wt-start-page.vue +2 -3
  51. package/src/components/on-demand/wt-table-transition/wt-table-transition.vue +7 -7
  52. package/src/components/wt-action-bar/wt-action-bar.vue +16 -12
  53. package/src/components/wt-app-header/__tests__/WtHeaderActions.spec.js +3 -1
  54. package/src/components/wt-app-header/_variables.scss +0 -1
  55. package/src/components/wt-app-header/wt-app-header.vue +4 -4
  56. package/src/components/wt-app-header/wt-app-navigator.vue +6 -7
  57. package/src/components/wt-app-header/wt-header-actions.vue +6 -8
  58. package/src/components/wt-avatar/wt-avatar.vue +4 -3
  59. package/src/components/wt-badge/wt-badge.vue +1 -2
  60. package/src/components/wt-button/wt-button.vue +3 -5
  61. package/src/components/wt-button-select/__tests__/WtButtonSelect.spec.js +6 -2
  62. package/src/components/wt-button-select/wt-button-select.vue +3 -4
  63. package/src/components/wt-checkbox/_variables.scss +1 -2
  64. package/src/components/wt-checkbox/wt-checkbox.vue +1 -2
  65. package/src/components/wt-chip/_variables.scss +0 -1
  66. package/src/components/wt-confirm-dialog/wt-confirm-dialog.vue +15 -5
  67. package/src/components/wt-context-menu/_variables.scss +3 -1
  68. package/src/components/wt-context-menu/wt-context-menu.vue +1 -3
  69. package/src/components/wt-copy-action/wt-copy-action.vue +1 -2
  70. package/src/components/wt-datepicker/_variables.scss +17 -5
  71. package/src/components/wt-datepicker/wt-datepicker.vue +2 -7
  72. package/src/components/wt-divider/_variables.scss +0 -1
  73. package/src/components/wt-divider/wt-divider.vue +5 -3
  74. package/src/components/wt-dual-panel/__tests__/WtDualPanel.js +2 -2
  75. package/src/components/wt-dual-panel/wt-dual-panel.vue +6 -5
  76. package/src/components/wt-dummy/_variables.scss +0 -1
  77. package/src/components/wt-dummy/wt-dummy.vue +1 -1
  78. package/src/components/wt-empty/wt-empty.vue +42 -34
  79. package/src/components/wt-error-page/_variables.scss +0 -1
  80. package/src/components/wt-error-page/wt-error-page.vue +2 -4
  81. package/src/components/wt-expansion-panel/_variables.scss +0 -1
  82. package/src/components/wt-expansion-panel/wt-expansion-panel.vue +3 -8
  83. package/src/components/wt-filters-panel-wrapper/__tests__/WtFiltersPanelWrapper.spec.js +12 -4
  84. package/src/components/wt-filters-panel-wrapper/wt-filters-panel-wrapper.vue +8 -7
  85. package/src/components/wt-headline/_variables.scss +0 -1
  86. package/src/components/wt-headline-nav/_variables.scss +0 -1
  87. package/src/components/wt-headline-nav/wt-headline-nav.vue +2 -1
  88. package/src/components/wt-hint/wt-hint.vue +1 -3
  89. package/src/components/wt-icon/_variables.scss +0 -1
  90. package/src/components/wt-icon-action/wt-icon-action.vue +13 -12
  91. package/src/components/wt-icon-btn/_variables.scss +0 -2
  92. package/src/components/wt-icon-btn/wt-icon-btn.vue +4 -6
  93. package/src/components/wt-image/wt-image.vue +14 -13
  94. package/src/components/wt-indicator/wt-indicator.vue +2 -7
  95. package/src/components/wt-input/_variables.scss +1 -2
  96. package/src/components/wt-input/wt-input.vue +13 -10
  97. package/src/components/wt-input-info/_variables.scss +0 -1
  98. package/src/components/wt-intersection-observer/__tests__/WtIntersectionObserver.spec.js +1 -1
  99. package/src/components/wt-intersection-observer/wt-intersection-observer.vue +9 -8
  100. package/src/components/wt-item-link/_variables.scss +0 -1
  101. package/src/components/wt-label/_variables.scss +0 -1
  102. package/src/components/wt-label/wt-label.vue +1 -4
  103. package/src/components/wt-load-bar/_variables.scss +0 -1
  104. package/src/components/wt-load-bar/wt-load-bar.vue +0 -1
  105. package/src/components/wt-loader/_variables.scss +0 -2
  106. package/src/components/wt-loader/wt-loader.vue +1 -3
  107. package/src/components/wt-logo/wt-logo.vue +1 -1
  108. package/src/components/wt-navigation-bar/__tests__/WtNavigationBar.spec.js +9 -3
  109. package/src/components/wt-navigation-bar/_variables.scss +9 -3
  110. package/src/components/wt-navigation-bar/wt-navigation-bar.vue +27 -11
  111. package/src/components/wt-notification/_variables.scss +0 -1
  112. package/src/components/wt-notifications-bar/__tests__/WtNotificationsBar.spec.js +1 -1
  113. package/src/components/wt-notifications-bar/_variables.scss +1 -2
  114. package/src/components/wt-notifications-bar/wt-notifications-bar.vue +4 -2
  115. package/src/components/wt-page-header/wt-page-header.vue +3 -2
  116. package/src/components/wt-page-wrapper/__tests__/WtPageWrapper.spec.js +3 -1
  117. package/src/components/wt-page-wrapper/_variables.scss +0 -1
  118. package/src/components/wt-page-wrapper/wt-page-wrapper.vue +0 -2
  119. package/src/components/wt-pagination/_variables.scss +1 -2
  120. package/src/components/wt-pagination/wt-pagination.vue +2 -1
  121. package/src/components/wt-player/_variables.scss +6 -2
  122. package/src/components/wt-player/wt-player.vue +52 -53
  123. package/src/components/wt-popup/_variables.scss +0 -1
  124. package/src/components/wt-popup/wt-popup.vue +2 -8
  125. package/src/components/wt-progress-bar/_variables.scss +0 -1
  126. package/src/components/wt-progress-bar/wt-progress-bar.vue +7 -6
  127. package/src/components/wt-radio/_variables.scss +1 -2
  128. package/src/components/wt-radio/wt-radio.vue +1 -2
  129. package/src/components/wt-rounded-action/_variables.scss +3 -1
  130. package/src/components/wt-search-bar/_variables.scss +4 -2
  131. package/src/components/wt-search-bar/wt-search-bar.vue +10 -4
  132. package/src/components/wt-select/_multiselect.scss +9 -15
  133. package/src/components/wt-select/_variables.scss +3 -2
  134. package/src/components/wt-select/mixins/multiselectMixin.js +2 -1
  135. package/src/components/wt-select/wt-select.vue +25 -26
  136. package/src/components/wt-slider/_variables.scss +0 -1
  137. package/src/components/wt-slider/wt-slider.vue +3 -3
  138. package/src/components/wt-status-select/_variables.scss +8 -4
  139. package/src/components/wt-stepper/_variables.scss +0 -1
  140. package/src/components/wt-stepper/wt-stepper.vue +5 -5
  141. package/src/components/wt-switcher/_variables.scss +0 -1
  142. package/src/components/wt-switcher/wt-switcher.vue +2 -3
  143. package/src/components/wt-table/__tests__/WtTable.spec.js +8 -2
  144. package/src/components/wt-table/_variables.scss +0 -1
  145. package/src/components/wt-table/types/table-header.ts +8 -0
  146. package/src/components/wt-table/wt-table.vue +111 -109
  147. package/src/components/wt-table-actions/_variables.scss +1 -2
  148. package/src/components/wt-table-actions/wt-table-actions.vue +1 -2
  149. package/src/components/wt-table-column-select/wt-table-column-select.vue +11 -8
  150. package/src/components/wt-tabs/_variables.scss +0 -1
  151. package/src/components/wt-tabs/wt-tabs.vue +6 -6
  152. package/src/components/wt-tags-input/__tests__/WtTagsInput.spec.js +6 -6
  153. package/src/components/wt-tags-input/mixin/taggableMixin.js +3 -1
  154. package/src/components/wt-tags-input/wt-tags-input.vue +8 -10
  155. package/src/components/wt-textarea/__tests__/WtTextarea.spec.js +6 -2
  156. package/src/components/wt-textarea/_variables.scss +0 -1
  157. package/src/components/wt-textarea/wt-textarea.vue +6 -7
  158. package/src/components/wt-time-input/wt-time-input.vue +1 -2
  159. package/src/components/wt-timepicker/_variables.scss +1 -2
  160. package/src/components/wt-timepicker/wt-timepicker.vue +10 -8
  161. package/src/components/wt-tooltip/_internals/useTooltipTriggerSubscriptions.js +6 -1
  162. package/src/components/wt-tooltip/_internals/wt-tooltip-floating.vue +1 -3
  163. package/src/components/wt-tooltip/_variables.scss +0 -1
  164. package/src/components/wt-tooltip/wt-tooltip.vue +13 -2
  165. package/src/components/wt-tree-table/_variables.scss +19 -0
  166. package/src/components/wt-tree-table/wt-tree-table.vue +323 -0
  167. package/src/components/wt-tree-table-row/wt-tree-table-row.vue +171 -0
  168. package/src/composables/useAccessControl/useAccessControl.js +12 -4
  169. package/src/composables/useCachedInterval/useCachedInterval.js +6 -2
  170. package/src/composables/useCachedItemInstanceName/useCachedItemInstanceName.js +4 -1
  171. package/src/composables/useCard/useCardComponent.js +10 -9
  172. package/src/composables/useCard/useCardTabs.js +6 -3
  173. package/src/composables/useRepresentableAgentPauseCause/__tests__/useRepresentableAgentPauseCause.spec.js +20 -10
  174. package/src/composables/useValidate/useValidate.js +1 -1
  175. package/src/composables/useWtTable/useWtTable.ts +25 -0
  176. package/src/css/main.scss +7 -1
  177. package/src/css/pages/table-page.scss +1 -2
  178. package/src/css/styleguide/border-radius/_border-radius.scss +1 -1
  179. package/src/css/styleguide/colors/_deprecated.scss +83 -24
  180. package/src/css/styleguide/colors/_palette.scss +1340 -251
  181. package/src/css/styleguide/colors/reusable/_text-field.scss +6 -2
  182. package/src/css/styleguide/fonts/_fonts.scss +36 -18
  183. package/src/css/styleguide/spacings/_spacings.scss +1 -1
  184. package/src/css/styleguide/transitions/_transitions.scss +1 -1
  185. package/src/css/styleguide/transitions/fade/_fade.scss +5 -4
  186. package/src/css/styleguide/viewport-breakpoints/_viewport-breakpoints.scss +0 -1
  187. package/src/enums/WebitelApplications/WebitelApplications.enum.js +7 -7
  188. package/src/enums/index.js +5 -10
  189. package/src/locale/en/en.js +5 -2
  190. package/src/locale/ru/ru.js +7 -3
  191. package/src/locale/ua/ua.js +7 -3
  192. package/src/mixins/dataFilterMixins/__tests__/apiFilterMixin.spec.js +2 -1
  193. package/src/mixins/dataFilterMixins/apiFilterMixin.js +3 -1
  194. package/src/mixins/dataFilterMixins/baseFilterMixin/baseFilterMixin.js +2 -1
  195. package/src/mixins/dataFilterMixins/enumFilterMixin.js +2 -1
  196. package/src/mixins/dataFilterMixins/paginationFilterMixin.js +4 -1
  197. package/src/mixins/dataFilterMixins/sortFilterMixin.js +2 -1
  198. package/src/mixins/validationMixin/useValidation.js +17 -7
  199. package/src/mixins/validationMixin/validationMixin.js +16 -8
  200. package/src/modules/AgentStatusSelect/api/pause-cause.js +4 -1
  201. package/src/modules/AgentStatusSelect/components/__tests__/wt-cc-agent-status-select.spec.js +18 -6
  202. package/src/modules/AgentStatusSelect/components/_internals/wt-cc-pause-cause-popup.vue +3 -2
  203. package/src/modules/AgentStatusSelect/components/wt-cc-agent-status-select.vue +5 -2
  204. package/src/modules/Appearance/components/__tests__/wt-dark-mode-switcher.spec.js +6 -2
  205. package/src/modules/AuditForm/components/__tests__/audit-form-question-write-wrapper.spec.js +12 -4
  206. package/src/modules/AuditForm/components/__tests__/audit-form.spec.js +18 -5
  207. package/src/modules/AuditForm/components/audit-form-question-read-wrapper.vue +4 -2
  208. package/src/modules/AuditForm/components/audit-form-question-write-wrapper.vue +15 -5
  209. package/src/modules/AuditForm/components/audit-form-question.vue +10 -4
  210. package/src/modules/AuditForm/components/audit-form.vue +24 -7
  211. package/src/modules/AuditForm/components/questions/options/__tests__/audit-form-question-options.spec.js +6 -2
  212. package/src/modules/AuditForm/components/questions/options/audit-form-question-options.vue +5 -5
  213. package/src/modules/AuditForm/components/questions/score/audit-form-question-score.vue +9 -4
  214. package/src/modules/CSVExport/CSVExport.js +5 -2
  215. package/src/modules/CSVExport/XLSExport.js +7 -7
  216. package/src/modules/CSVExport/__tests__/CSVExport.spec.js +4 -1
  217. package/src/modules/CSVExport/mixins/exportCSVMixin.js +3 -1
  218. package/src/modules/CSVExport/mixins/exportXLSMixin.js +3 -1
  219. package/src/modules/CardStoreModule/composables/useCardStore.js +6 -2
  220. package/src/modules/DeleteConfirmationPopup/__tests__/delete-confirmation-popup.spec.js +3 -3
  221. package/src/modules/DeleteConfirmationPopup/components/delete-confirmation-popup.vue +6 -3
  222. package/src/modules/FilesExport/__tests__/FilesExport.spec.js +6 -2
  223. package/src/modules/FilesExport/mixins/exportFilesMixin.js +6 -2
  224. package/src/modules/FilesExport/scripts/generateMediaURL.js +2 -1
  225. package/src/modules/Filters/classes/BaseFilterSchema.js +15 -6
  226. package/src/modules/Filters/components/filter-datetime.vue +7 -5
  227. package/src/modules/Filters/components/filter-pagination.vue +7 -5
  228. package/src/modules/Filters/components/filter-search.vue +4 -4
  229. package/src/modules/Filters/components/filter-select.vue +33 -24
  230. package/src/modules/Filters/components/filter-table-fields.vue +1 -3
  231. package/src/modules/Filters/composables/useTableFilters.js +3 -1
  232. package/src/modules/Filters/scripts/getters/localStorageGetter.js +6 -2
  233. package/src/modules/Filters/scripts/getters/queryGetter.js +2 -1
  234. package/src/modules/Filters/scripts/setters/localStorageSetter.js +6 -2
  235. package/src/modules/Filters/scripts/setters/querySetter.js +2 -1
  236. package/src/modules/Filters/scripts/utils/changeRouteQuery.js +2 -1
  237. package/src/modules/Filters/store/FiltersStoreModule.js +3 -3
  238. package/src/modules/Notifications/store/NotificationsStoreModule.js +14 -5
  239. package/src/modules/Notifications/store/__tests__/NotificationsStoreModule.actions.spec.js +10 -3
  240. package/src/modules/ObjectPermissions/_internals/components/permissions-role-row.vue +1 -3
  241. package/src/modules/ObjectPermissions/_internals/components/permissions-role-select.vue +1 -3
  242. package/src/modules/ObjectPermissions/_internals/components/permissions-tab-role-popup.vue +8 -5
  243. package/src/modules/ObjectPermissions/_internals/modules/filters/store/filters.store.js +3 -4
  244. package/src/modules/ObjectPermissions/_internals/store/helpers/createObjectPermissionsStoreModule.js +1 -2
  245. package/src/modules/ObjectPermissions/_internals/store/modules/objectPermissionsStoreModule.js +10 -14
  246. package/src/modules/ObjectPermissions/components/permissions-tab.vue +12 -12
  247. package/src/modules/ObjectPermissions/store/index.js +2 -6
  248. package/src/modules/QueryFilters/components/__tests__/filter-datetime.spec.js +3 -1
  249. package/src/modules/QueryFilters/components/__tests__/filter-from-to.spec.js +6 -2
  250. package/src/modules/QueryFilters/components/__tests__/filter-search.spec.js +7 -2
  251. package/src/modules/QueryFilters/components/abstract-api-filter.vue +15 -5
  252. package/src/modules/QueryFilters/components/abstract-enum-filter.vue +15 -5
  253. package/src/modules/QueryFilters/components/filter-datetime.vue +1 -3
  254. package/src/modules/QueryFilters/components/filter-from-to.vue +1 -1
  255. package/src/modules/QueryFilters/components/filter-search.vue +1 -3
  256. package/src/modules/QueryFilters/components/filter-table-fields.vue +1 -3
  257. package/src/modules/QueryFilters/mixins/__tests__/enumFilterMixin.spec.js +4 -1
  258. package/src/modules/QueryFilters/mixins/baseFilterMixin/baseFilterMixin.js +9 -3
  259. package/src/modules/QueryFilters/mixins/enumFilterMixin.js +10 -3
  260. package/src/modules/QueryFilters/mixins/paginationFilterMixin.js +4 -2
  261. package/src/modules/QueryFilters/mixins/sortFilterMixin.js +2 -1
  262. package/src/modules/QueryFilters/store/QueryFiltersStoreModule.js +2 -1
  263. package/src/modules/QueryFilters/store/__tests__/QueryFiltersStoreModule.spec.js +10 -3
  264. package/src/modules/TableComponentModule/composables/useTableEmpty.js +13 -4
  265. package/src/modules/TableStoreModule/composables/useTableStore.js +18 -6
  266. package/src/modules/TableStoreModule/store/TableStoreModule.js +36 -21
  267. package/src/modules/TableStoreModule/store/__tests__/TableStoreModule.spec.js +7 -2
  268. package/src/modules/Userinfo/api/userinfo.js +4 -1
  269. package/src/modules/Userinfo/classes/ApplicationsAccess.js +3 -1
  270. package/src/modules/Userinfo/store/UserinfoStoreModule.js +25 -9
  271. package/src/plugins/breakpoint/breakpoint.plugin.js +2 -1
  272. package/src/scripts/__tests__/caseConverters.spec.js +4 -1
  273. package/src/scripts/__tests__/updateObject.spec.js +6 -2
  274. package/src/scripts/caseConverters.js +37 -29
  275. package/src/scripts/compareSize.ts +9 -6
  276. package/src/scripts/debounce.js +2 -1
  277. package/src/scripts/index.js +2 -8
  278. package/src/scripts/logger.js +4 -4
  279. package/src/scripts/preventHiddenPageCallsDecorator.js +6 -2
  280. package/src/scripts/saveAsJSON.js +3 -1
  281. package/src/scripts/sortQueryAdapters.js +11 -0
  282. package/src/store/BaseStoreModules/ApiStoreModule.js +26 -7
  283. package/src/store/BaseStoreModules/BaseStoreModule.js +2 -1
  284. package/src/store/BaseStoreModules/__tests__/BaseStoreModule.spec.js +28 -7
  285. package/src/store/helpers/getNamespacedState.js +3 -1
  286. package/src/store/new/modules/apiStoreModule/apiStoreModule.js +19 -14
  287. package/src/store/new/modules/cardStoreModule/useCardStore.js +6 -2
  288. package/src/store/new/modules/tableStoreModule/__tests__/tableStoreModule.spec.js +6 -8
  289. package/src/store/new/modules/tableStoreModule/tableStoreModule.js +31 -28
  290. package/src/store/new/modules/tableStoreModule/useTableStore.js +18 -6
  291. package/src/validators/variableSearchValidator/__tests__/variableSearchValidator.spec.js +2 -1
  292. package/src/validators/websocketValidator/__tests__/websocketValidator.spec.js +3 -1
  293. package/src/components/wt-table/_internals/getSortOrder.js +0 -12
  294. /package/dist/img/sprite/{plus.svg → tree-expand.svg} +0 -0
  295. /package/src/assets/icons/sprite/{plus.svg → tree-expand.svg} +0 -0
@@ -28,7 +28,14 @@
28
28
  </template>
29
29
 
30
30
  <script setup>
31
- import { autoPlacement, autoUpdate, flip, offset, shift, useFloating } from '@floating-ui/vue';
31
+ import {
32
+ autoPlacement,
33
+ autoUpdate,
34
+ flip,
35
+ offset,
36
+ shift,
37
+ useFloating,
38
+ } from '@floating-ui/vue';
32
39
  import { onBeforeUnmount, onMounted, ref, watch } from 'vue';
33
40
  import debounce from '../../scripts/debounce.js';
34
41
  import { useTooltipTriggerSubscriptions } from './_internals/useTooltipTriggerSubscriptions.js';
@@ -103,7 +110,11 @@ const { floatingStyles } = useFloating(activator, floating, {
103
110
  TOGGLE BECAUSE OF PERFORMANCE ISSUES, RELATED TO USAGE OF AUTO_UPDATE OF POSITIONS
104
111
  */
105
112
  whileElementsMounted: autoUpdate, // https://floating-ui.com/docs/vue#anchoring
106
- middleware: [shift(), offset(4), props.placement === 'auto' ? autoPlacement() : flip()],
113
+ middleware: [
114
+ shift(),
115
+ offset(4),
116
+ props.placement === 'auto' ? autoPlacement() : flip(),
117
+ ],
107
118
  });
108
119
 
109
120
  useTooltipTriggerSubscriptions({
@@ -0,0 +1,19 @@
1
+ :root {
2
+ --wt-tree-table-col-min-witdh: var(--table-col-min-width);
3
+
4
+ --wt-tree-table-head-sort-arrow-margin: var(--table-head-sort-arrow-margin);
5
+ --wt-tree-table-head-border: var(--table-head-border);
6
+
7
+ --wt-tree-table-min-height: var(--table-min-height);
8
+ --wt-tree-table-column-gap: var(--table-column-gap);
9
+ --wt-tree-table-row-padding: var(--table-row-padding);
10
+
11
+ --wt-tree-table-head-border-color: var(--wt-table-head-border-color);
12
+ --wt-tree-table-head-background-color: var(--wt-table-head-background-color);
13
+ --wt-tree-table-primary-color: var(--wt-table-primary-color);
14
+ --wt-tree-table-zebra-color: var(--wt-table-zebra-color);
15
+ }
16
+
17
+ :root.theme--dark {
18
+ --wt-tree-table-head-border-color: var(--wt-table-head-border-color);
19
+ }
@@ -0,0 +1,323 @@
1
+ <template>
2
+ <div class="wt-tree-table">
3
+ <table class="wt-tree-table-wrapper">
4
+ <thead class="wt-tree-table-head">
5
+ <tr class="wt-tree-table-tr wt-tree-table-tr-head">
6
+ <th
7
+ v-for="(col, key) of dataHeaders"
8
+ :key="key"
9
+ :class="[
10
+ {
11
+ 'wt-tree-table-th--sortable': isColSortable(col),
12
+ },
13
+ `wt-tree-table-th--sort-${col.sort}`,
14
+ ]"
15
+ :style="col.width ? `min-width:${col.width}` : ''"
16
+ class="wt-tree-table-th"
17
+ @click="sort(col)"
18
+ >
19
+ <div class="wt-tree-table-th__content">
20
+ <div v-if="key === 0 && selectable">
21
+ <wt-checkbox :selected="isAllSelected" @change="selectAll" />
22
+ </div>
23
+ <div class="wt-tree-table-th__text">
24
+ {{ col.text }}
25
+ </div>
26
+ <wt-icon
27
+ v-if="sortable"
28
+ class="wt-tree-table-th-sort-arrow wt-tree-table-th-sort-arrow--asc"
29
+ icon="sort-arrow-up"
30
+ size="sm"
31
+ />
32
+ <wt-icon
33
+ v-if="sortable"
34
+ class="wt-tree-table-th-sort-arrow wt-tree-table-th-sort-arrow--desc"
35
+ icon="sort-arrow-down"
36
+ size="sm"
37
+ />
38
+ </div>
39
+ </th>
40
+ <th v-if="gridActions" class="wt-tree-table-th__actions">
41
+ <div class="wt-tree-table-th__content">
42
+ <slot name="actions-header" />
43
+ </div>
44
+ </th>
45
+ </tr>
46
+ </thead>
47
+
48
+ <tbody class="wt-tree-table-body">
49
+ <wt-tree-table-row
50
+ v-for="(row, dataKey) of data"
51
+ :key="dataKey"
52
+ :row-position="dataKey"
53
+ :data-headers="dataHeaders"
54
+ :data="row"
55
+ :selectable="selectable"
56
+ :children-prop="childrenProp"
57
+ :selected-elements="selectedElements"
58
+ @update:selected="handleSelection($event.data, $event.select)"
59
+ >
60
+ <template #actions="{ item }">
61
+ <slot name="actions" :item="item" />
62
+ </template>
63
+ <template
64
+ v-for="(col, headerKey) of dataHeaders"
65
+ :key="headerKey"
66
+ #[col.value]="{ item }"
67
+ >
68
+ <slot :index="dataKey" :item="item" :name="col.value">
69
+ {{ item[col.value] }}
70
+ </slot>
71
+ </template>
72
+ </wt-tree-table-row>
73
+ </tbody>
74
+ </table>
75
+ </div>
76
+ </template>
77
+
78
+ <script setup lang="ts">
79
+ import { computed, withDefaults } from "vue";
80
+ import { useWtTable } from "../../composables/useWtTable/useWtTable.ts";
81
+ import { getNextSortOrder } from "../../scripts/sortQueryAdapters";
82
+ import type { TableHeader } from "../wt-table/types/table-header.js";
83
+ import WtTreeTableRow from "../wt-tree-table-row/wt-tree-table-row.vue";
84
+
85
+ const props = withDefaults(
86
+ defineProps<{
87
+ /**
88
+ * 'Accepts list of header objects. Draws text depending on "text" property, looks for data values through "value", "show" boolean controls visibility of a column (if undefined, all visible by default). ' Column width is calculated by "width" param. By default, sets minmax(150px, 1fr). '
89
+ */
90
+ headers: TableHeader[];
91
+ /**
92
+ * 'List of data, represented by table. '
93
+ */
94
+ data: Record<string, any>[];
95
+ /**
96
+ * 'If true, draws sorting arrows and sends sorting events at header click. Draws a sorting arrow by "sort": "asc"/"desc" header value. '
97
+ */
98
+ sortable?: boolean;
99
+ /**
100
+ * 'If true, draws row selection checkboxes. Checkbox toggles data object _isSelected property. It's IMPORTANT to set this property before sending data to table. '
101
+ */
102
+ selectable?: boolean;
103
+ selected: any[];
104
+ /**
105
+ * 'If true, reserves space for 3 icon actions in the last column. Accessible by "actions" slot. '
106
+ */
107
+ gridActions?: boolean;
108
+ /**
109
+ * 'It's a key in data object, which contains children array. '
110
+ */
111
+ childrenProp: string;
112
+ }>(),
113
+ {
114
+ sortable: false,
115
+ selectable: true,
116
+ gridActions: true,
117
+ },
118
+ );
119
+
120
+ const emit = defineEmits(["sort", "update:selected"]);
121
+
122
+ const checkHasChildItems = (item: Record<string, any>) => {
123
+ return item[props.childrenProp] && Array.isArray(item[props.childrenProp]);
124
+ };
125
+
126
+ const getSelectedValue = (items: Record<string, any>[]) => {
127
+ const selected = [];
128
+
129
+ const pushSelectedElement = (item: Record<string, any>) => {
130
+ if (item._isSelected) {
131
+ return [item];
132
+ }
133
+
134
+ if (checkHasChildItems(item)) {
135
+ item[props.childrenProp].forEach(pushSelectedElement);
136
+ }
137
+ };
138
+
139
+ items.forEach(pushSelectedElement);
140
+
141
+ return selected;
142
+ };
143
+
144
+ const getAllNestedElements = (item: Record<string, any>) => {
145
+ const nested = [];
146
+
147
+ const pushElement = (item: Record<string, any>) => {
148
+ nested.push(item);
149
+
150
+ if (checkHasChildItems(item)) {
151
+ item[props.childrenProp].forEach(pushElement);
152
+ }
153
+ };
154
+
155
+ item.forEach(pushElement);
156
+
157
+ return nested;
158
+ };
159
+
160
+ const selectedElements = computed<Record<string, any>[]>(() => {
161
+ // _isSelected for backwards compatibility
162
+ return props.selected || getSelectedValue(props.data);
163
+ });
164
+
165
+ const isAllSelected = computed(() => {
166
+ return (
167
+ selectedElements.value.length === getAllNestedElements(props.data).length &&
168
+ getAllNestedElements(props.data).length > 0
169
+ );
170
+ });
171
+
172
+ const { tableHeaders: dataHeaders } = useWtTable({
173
+ headers: props.headers,
174
+ });
175
+
176
+ const isColSortable = ({ sort }: TableHeader) => {
177
+ /* --sortable = sortable && col.sort === undefined cause there may be some columns we don't want to sort
178
+ strict check for === undefined is used because col.sort = null is sort order too (actualu, without sort)
179
+ so we need to check if this property is present
180
+ */
181
+ return props.sortable && sort !== undefined;
182
+ };
183
+
184
+ const sort = (col: TableHeader) => {
185
+ if (!isColSortable(col)) return;
186
+ const nextSort = getNextSortOrder(col.sort);
187
+ emit("sort", col, nextSort);
188
+ };
189
+
190
+ const changeSelectItem = (items: Record<string, any>[], selected: boolean) => {
191
+ items.forEach((item) => {
192
+ item._isSelected = selected;
193
+
194
+ if (checkHasChildItems(item)) {
195
+ // Change selected for all nested elements
196
+ changeSelectItem(item[props.childrenProp], selected);
197
+ }
198
+ });
199
+ };
200
+
201
+ const selectAll = () => {
202
+ if (props.selected) {
203
+ emit("update:selected", isAllSelected.value ? [] : [...getAllNestedElements(props.data)]);
204
+ } else {
205
+ // for backwards compatibility
206
+
207
+ // https://webitel.atlassian.net/browse/WTEL-4634
208
+ // Value for _isSelected must be assigned explicitly.
209
+ // Because allSelected recomputes after each change
210
+
211
+ if (isAllSelected.value) {
212
+ changeSelectItem(props.data, false);
213
+ } else {
214
+ changeSelectItem(props.data, true);
215
+ }
216
+ }
217
+ };
218
+
219
+ const handleSelection = (row, select) => {
220
+ if (props.selected) {
221
+ if (select) {
222
+ emit("update:selected", [...selectedElements.value, row]);
223
+ } else {
224
+ emit(
225
+ "update:selected",
226
+ selectedElements.value.filter((item) => item !== row),
227
+ );
228
+ }
229
+ } else {
230
+ // for backwards compatibility
231
+ row._isSelected = !row._isSelected;
232
+ }
233
+ };
234
+ </script>
235
+
236
+ <style lang="scss">
237
+ @import "./variables.scss";
238
+ </style>
239
+
240
+ <style lang="scss" scoped>
241
+ @import "../../../src/css/main.scss";
242
+
243
+ .wt-tree-table {
244
+ @extend %wt-scrollbar;
245
+ overflow: auto;
246
+
247
+ &-head {
248
+ border: var(--wt-tree-table-head-border);
249
+ border-color: var(--wt-tree-table-head-border-color);
250
+ border-radius: var(--border-radius);
251
+ background: var(--wt-tree-table-head-background-color);
252
+ }
253
+ }
254
+
255
+ .wt-tree-table-wrapper {
256
+ width: 100%;
257
+ border-collapse: collapse;
258
+
259
+ .wt-tree-table-tr-wrapper {
260
+ background: var(--wt-tree-table-primary-color);
261
+
262
+ &:nth-child(2n) {
263
+ background: var(--wt-tree-table-zebra-color);
264
+ }
265
+ }
266
+ }
267
+
268
+ .wt-tree-table-th,
269
+ .wt-tree-table-td {
270
+ @extend %typo-body-1;
271
+ height: fit-content;
272
+ min-height: var(--wt-tree-table-min-height);
273
+ padding: var(--spacing-xs);
274
+ word-break: break-all;
275
+ overflow-wrap: break-word;
276
+
277
+ &__actions {
278
+ display: flex;
279
+ align-items: flex-start;
280
+ justify-content: flex-end;
281
+ gap: var(--spacing-xs);
282
+ }
283
+
284
+ &__content {
285
+ display: flex;
286
+ align-items: center;
287
+ }
288
+
289
+ &__text {
290
+ text-wrap: nowrap;
291
+ }
292
+ }
293
+
294
+ .wt-tree-table-th {
295
+ font-weight: normal;
296
+
297
+ &--sortable {
298
+ cursor: pointer;
299
+
300
+ &:hover :deep .wt-icon__icon {
301
+ fill: var(--icon-active-color);
302
+ }
303
+ }
304
+
305
+ .wt-tree-table-th-sort-arrow {
306
+ display: none;
307
+ margin-left: var(--wt-tree-table-head-sort-arrow-margin);
308
+ }
309
+
310
+ &--sort-asc .wt-tree-table-th-sort-arrow--asc {
311
+ display: block;
312
+ }
313
+
314
+ &--sort-desc .wt-tree-table-th-sort-arrow--desc {
315
+ display: block;
316
+ }
317
+ }
318
+
319
+ .wt-tree-table-foot {
320
+ border-color: var(--wt-tree-table-head-border-color);
321
+ border-top: var(--wt-tree-table-head-border-color);
322
+ }
323
+ </style>
@@ -0,0 +1,171 @@
1
+ <template>
2
+ <tr class="wt-tree-table-row" :class="[{ 'wt-tree-table-row--alternate': rowPosition % 2 }]">
3
+ <td v-for="(col, headerKey) of dataHeaders" :key="headerKey" class="wt-tree-table-td">
4
+ <div class="wt-tree-table-td__content">
5
+ <div v-if="!headerKey" class="wt-tree-table-td__icon-wrapper">
6
+ <div
7
+ v-for="treeLine in lineCount"
8
+ :key="treeLine"
9
+ class="wt-tree-table-row__tree-space"
10
+ ></div>
11
+ <!-- This two empty icons need to create space for nested elements -->
12
+ <wt-icon-btn
13
+ v-if="!data[childrenProp] && nestingLevel"
14
+ :class="{ hidden: !data[childrenProp] }"
15
+ :icon="collapsed ? 'tree-expand' : 'tree-collapse'"
16
+ @click="collapsed = !collapsed"
17
+ />
18
+ <wt-checkbox
19
+ v-if="selectable"
20
+ :selected="isSelectedRow"
21
+ @change="
22
+ $emit('update:selected', {
23
+ data,
24
+ select: $event,
25
+ })
26
+ "
27
+ />
28
+ <wt-icon-btn
29
+ v-if="data[childrenProp]"
30
+ :icon="collapsed ? 'tree-expand' : 'tree-collapse'"
31
+ @click="collapsed = !collapsed"
32
+ />
33
+ </div>
34
+ <slot :index="rowPosition" :item="data" :name="col.value">
35
+ {{ data[col.value] }}
36
+ </slot>
37
+ </div>
38
+ </td>
39
+
40
+ <td v-if="gridActions" class="wt-tree-table-td__actions">
41
+ <div class="wt-tree-table-td__content">
42
+ <slot :index="rowPosition" :item="data" name="actions" />
43
+ </div>
44
+ </td>
45
+ </tr>
46
+
47
+ <template v-if="!collapsed">
48
+ <wt-tree-table-row
49
+ v-for="(child, index) in data[childrenProp]"
50
+ :key="index"
51
+ :row-position="rowPosition"
52
+ :data-headers="dataHeaders"
53
+ :data="child"
54
+ :selectable="selectable"
55
+ :selected-elements="selectedElements"
56
+ :children-prop="childrenProp"
57
+ :nesting-level="childLevel"
58
+ @update:selected="
59
+ $emit('update:selected', {
60
+ data: $event.data,
61
+ select: $event.select,
62
+ })
63
+ "
64
+ >
65
+ <template v-for="(col, headerKey) of dataHeaders" :key="headerKey" #[col.value]="{ item }">
66
+ <slot :index="rowPosition" :item="item" :name="col.value">
67
+ <div>{{ item[col.value] }}</div>
68
+ </slot>
69
+ </template>
70
+ <template #actions="{ item }">
71
+ <slot :index="rowPosition" :item="item" name="actions" />
72
+ </template>
73
+ </wt-tree-table-row>
74
+ </template>
75
+ </template>
76
+
77
+ <script setup lang="ts">
78
+ import { computed, ref } from "vue";
79
+ import WtCheckbox from "../wt-checkbox/wt-checkbox.vue";
80
+ import WtIconBtn from "../wt-icon-btn/wt-icon-btn.vue";
81
+ import type { TableHeader } from "../wt-table/types/table-header.ts";
82
+
83
+ const props = withDefaults(
84
+ defineProps<{
85
+ /**
86
+ * 'It's a data what pass to display row.
87
+ */
88
+ data: Record<string, unknown>;
89
+ /**
90
+ * 'It's a number of position row in table.
91
+ */
92
+ rowPosition: number;
93
+ /**
94
+ * 'It's a key in data object, which contains children array. '
95
+ */
96
+ childrenProp: string;
97
+ selectable?: boolean;
98
+ selectedElements: Record<string, any>[];
99
+ dataHeaders: TableHeader[];
100
+ gridActions?: boolean;
101
+ /**
102
+ * 'It's a nesting level of row. 0 - root row, 1 - first level of nesting, etc.'
103
+ */
104
+ nestingLevel?: number;
105
+ }>(),
106
+ {
107
+ selectable: false,
108
+ gridActions: true,
109
+ nestingLevel: 0,
110
+ },
111
+ );
112
+
113
+ defineEmits(["update:selected"]);
114
+
115
+ const collapsed = ref(true);
116
+ const lineCount = computed(() => {
117
+ return props.nestingLevel;
118
+ });
119
+ const childLevel = computed(() => {
120
+ return props.nestingLevel + 1;
121
+ });
122
+
123
+ const isSelectedRow = computed(() => {
124
+ return props.selectedElements.includes(props.data);
125
+ });
126
+ </script>
127
+
128
+ <style lang="scss" scoped>
129
+ @import "../../../src/css/main.scss";
130
+
131
+ .wt-tree-table-td {
132
+ @extend %typo-body-1;
133
+ height: fit-content;
134
+ min-height: var(--wt-tree-table-min-height);
135
+ padding: var(--spacing-xs);
136
+ word-break: break-all;
137
+ overflow-wrap: break-word;
138
+
139
+ &__actions {
140
+ display: flex;
141
+ align-items: flex-start;
142
+ justify-content: flex-end;
143
+ gap: var(--spacing-xs);
144
+ }
145
+
146
+ &__icon-wrapper {
147
+ display: flex;
148
+ margin-right: var(--spacing-xs);
149
+ align-items: flex-start;
150
+ }
151
+
152
+ &__content {
153
+ display: flex;
154
+ align-items: flex-start;
155
+ text-wrap: nowrap;
156
+ }
157
+ }
158
+
159
+ .wt-tree-table-row {
160
+ background: var(--wt-tree-table-primary-color);
161
+
162
+ &__tree-space {
163
+ width: var(--icon-md-size);
164
+ height: var(--icon-md-size);
165
+ }
166
+
167
+ &--alternate {
168
+ background: var(--wt-tree-table-zebra-color);
169
+ }
170
+ }
171
+ </style>
@@ -6,10 +6,18 @@ export const useAccessControl = () => {
6
6
  const store = useStore();
7
7
  const route = useRoute();
8
8
 
9
- const hasReadAccess = computed(() => store.getters['userinfo/HAS_READ_ACCESS']({ route }));
10
- const hasCreateAccess = computed(() => store.getters['userinfo/HAS_CREATE_ACCESS']({ route }));
11
- const hasEditAccess = computed(() => store.getters['userinfo/HAS_EDIT_ACCESS']({ route }));
12
- const hasDeleteAccess = computed(() => store.getters['userinfo/HAS_DELETE_ACCESS']({ route }));
9
+ const hasReadAccess = computed(() =>
10
+ store.getters['userinfo/HAS_READ_ACCESS']({ route }),
11
+ );
12
+ const hasCreateAccess = computed(() =>
13
+ store.getters['userinfo/HAS_CREATE_ACCESS']({ route }),
14
+ );
15
+ const hasEditAccess = computed(() =>
16
+ store.getters['userinfo/HAS_EDIT_ACCESS']({ route }),
17
+ );
18
+ const hasDeleteAccess = computed(() =>
19
+ store.getters['userinfo/HAS_DELETE_ACCESS']({ route }),
20
+ );
13
21
 
14
22
  const hasSaveActionAccess = computed(() => {
15
23
  if (route.params.id === 'new') return hasEditAccess.value;
@@ -2,14 +2,18 @@ import { onBeforeUnmount } from 'vue';
2
2
  import preventHiddenPageCallsDecorator from '../../scripts/preventHiddenPageCallsDecorator.js';
3
3
 
4
4
  // eslint-disable-next-line import/prefer-default-export
5
- export const useCachedInterval = ({ timeout, localStorageKey = 'auto-refresh' }) => {
5
+ export const useCachedInterval = ({
6
+ timeout,
7
+ localStorageKey = 'auto-refresh',
8
+ }) => {
6
9
  let interval = null;
7
10
 
8
11
  onBeforeUnmount(() => {
9
12
  if (interval) clearInterval(interval);
10
13
  });
11
14
  const subscribe = (callback) => {
12
- const _timeout = timeout || +localStorage.getItem(localStorageKey) || 5 * 60 * 1000;
15
+ const _timeout =
16
+ timeout || +localStorage.getItem(localStorageKey) || 5 * 60 * 1000;
13
17
  callback();
14
18
  interval = setInterval(preventHiddenPageCallsDecorator(callback), _timeout);
15
19
  };
@@ -1,7 +1,10 @@
1
1
  import get from 'lodash/get.js';
2
2
  import { onMounted, ref, watch } from 'vue';
3
3
 
4
- export const useCachedItemInstanceName = (itemInstance, { namePath = 'name' } = {}) => {
4
+ export const useCachedItemInstanceName = (
5
+ itemInstance,
6
+ { namePath = 'name' } = {},
7
+ ) => {
5
8
  const name = ref('');
6
9
 
7
10
  const updateName = () => {
@@ -5,7 +5,8 @@ import { useRoute, useRouter } from 'vue-router';
5
5
  import { useCachedItemInstanceName } from '../useCachedItemInstanceName/useCachedItemInstanceName.js';
6
6
 
7
7
  export const useCardComponent = (params) => {
8
- const { id,
8
+ const {
9
+ id,
9
10
  itemInstance,
10
11
  invalid,
11
12
 
@@ -13,7 +14,8 @@ export const useCardComponent = (params) => {
13
14
  addItem,
14
15
  updateItem,
15
16
  setId,
16
- resetState } = params;
17
+ resetState,
18
+ } = params;
17
19
 
18
20
  const router = useRouter();
19
21
  const route = useRoute();
@@ -27,7 +29,9 @@ export const useCardComponent = (params) => {
27
29
  });
28
30
 
29
31
  const saveText = computed(() => {
30
- return isNew.value || itemInstance.value._dirty ? t('reusable.save') : t('reusable.saved');
32
+ return isNew.value || itemInstance.value._dirty
33
+ ? t('reusable.save')
34
+ : t('reusable.saved');
31
35
  });
32
36
 
33
37
  const redirectToEdit = () => {
@@ -61,7 +65,7 @@ export const useCardComponent = (params) => {
61
65
  }
62
66
  }
63
67
 
64
- function initialize(){
68
+ function initialize() {
65
69
  onMounted(() => {
66
70
  initializeCard();
67
71
  });
@@ -71,7 +75,6 @@ export const useCardComponent = (params) => {
71
75
  });
72
76
  }
73
77
 
74
-
75
78
  return {
76
79
  id,
77
80
  itemInstance,
@@ -83,7 +86,5 @@ export const useCardComponent = (params) => {
83
86
  save,
84
87
  initializeCard,
85
88
  initialize,
86
- }
87
- }
88
-
89
-
89
+ };
90
+ };
@@ -6,7 +6,10 @@ export const useCardTabs = (tabs) => {
6
6
  const route = useRoute();
7
7
 
8
8
  const currentTab = computed(() => {
9
- return tabs?.value.find(({ pathName }) => route.name === pathName) || tabs?.value[0];
9
+ return (
10
+ tabs?.value.find(({ pathName }) => route.name === pathName) ||
11
+ tabs?.value[0]
12
+ );
10
13
  });
11
14
 
12
15
  function changeTab(tab) {
@@ -24,5 +27,5 @@ export const useCardTabs = (tabs) => {
24
27
  currentTab,
25
28
 
26
29
  changeTab,
27
- }
28
- }
30
+ };
31
+ };