@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.
- package/CHANGELOG.md +271 -131
- package/README.md +6 -0
- package/dist/img/sprite/index.js +8 -2
- package/dist/img/sprite/tree-collapse.svg +4 -0
- package/dist/img/sprite/tree-cross.svg +5 -0
- package/dist/img/sprite/tree-line.svg +10 -0
- package/dist/ui-sdk.css +1 -1
- package/dist/ui-sdk.js +7736 -7442
- package/dist/ui-sdk.umd.cjs +17 -17
- package/package.json +13 -6
- package/src/api/axios/generateInstance.js +6 -2
- package/src/api/clients/agents/agentChats.js +18 -19
- package/src/api/clients/agents/agents.js +29 -7
- package/src/api/clients/buckets/buckets.js +16 -3
- package/src/api/clients/calendars/calendars.js +21 -3
- package/src/api/clients/catalog/catalog.js +1 -3
- package/src/api/clients/chatGateways/chatGateways.js +41 -12
- package/src/api/clients/communications/communications.js +25 -6
- package/src/api/clients/configurations/configurations.js +13 -3
- package/src/api/clients/flows/flow.js +20 -9
- package/src/api/clients/gateways/gateways.js +12 -3
- package/src/api/clients/lists/blacklists.js +16 -3
- package/src/api/clients/media/media.js +16 -3
- package/src/api/clients/queues/queues.js +16 -6
- package/src/api/clients/roles/roles.js +3 -1
- package/src/api/clients/skills/skills.js +16 -3
- package/src/api/clients/teams/teams.js +17 -7
- package/src/api/clients/users/__tests__/users.spec.js +3 -1
- package/src/api/clients/users/users.js +8 -2
- package/src/api/clients//321/201ontacts/contactChatMessagesHistory.js +21 -13
- package/src/api/clients//321/201ontacts/contacts.js +38 -15
- package/src/api/history/transcript/callTranscript.js +10 -2
- package/src/api/interceptors/request/updateToken.interceptor.js +2 -1
- package/src/api/transformers/applyTransform.js +5 -1
- package/src/api/transformers/camelToSnake/camelToSnake.transformer.js +2 -1
- package/src/api/transformers/snakeToCamel/snakeToCamel.transformer.js +2 -1
- package/src/assets/icons/sprite/index.js +8 -2
- package/src/assets/icons/sprite/tree-collapse.svg +4 -0
- package/src/assets/icons/sprite/tree-cross.svg +5 -0
- package/src/assets/icons/sprite/tree-line.svg +10 -0
- package/src/components/index.js +8 -12
- package/src/components/on-demand/wt-navigation-menu/components/_internals/nav-menu-lvl-1.vue +4 -2
- package/src/components/on-demand/wt-navigation-menu/components/_internals/nav-menu-lvl-2.vue +3 -4
- package/src/components/on-demand/wt-navigation-menu/components/wt-navigation-menu.vue +6 -6
- package/src/components/on-demand/wt-route-transition/wt-route-transition.vue +12 -12
- package/src/components/on-demand/wt-save-failed-popup/wt-save-failed-popup.vue +1 -3
- package/src/components/on-demand/wt-selection-popup/wt-selection-popup.vue +3 -3
- package/src/components/on-demand/wt-start-page/components/start-page-card.vue +4 -2
- package/src/components/on-demand/wt-start-page/components/start-page-logo.vue +1 -1
- package/src/components/on-demand/wt-start-page/components/wt-start-page.vue +2 -3
- package/src/components/on-demand/wt-table-transition/wt-table-transition.vue +7 -7
- package/src/components/wt-action-bar/wt-action-bar.vue +16 -12
- package/src/components/wt-app-header/__tests__/WtHeaderActions.spec.js +3 -1
- package/src/components/wt-app-header/_variables.scss +0 -1
- package/src/components/wt-app-header/wt-app-header.vue +4 -4
- package/src/components/wt-app-header/wt-app-navigator.vue +6 -7
- package/src/components/wt-app-header/wt-header-actions.vue +6 -8
- package/src/components/wt-avatar/wt-avatar.vue +4 -3
- package/src/components/wt-badge/wt-badge.vue +1 -2
- package/src/components/wt-button/wt-button.vue +3 -5
- package/src/components/wt-button-select/__tests__/WtButtonSelect.spec.js +6 -2
- package/src/components/wt-button-select/wt-button-select.vue +3 -4
- package/src/components/wt-checkbox/_variables.scss +1 -2
- package/src/components/wt-checkbox/wt-checkbox.vue +1 -2
- package/src/components/wt-chip/_variables.scss +0 -1
- package/src/components/wt-confirm-dialog/wt-confirm-dialog.vue +15 -5
- package/src/components/wt-context-menu/_variables.scss +3 -1
- package/src/components/wt-context-menu/wt-context-menu.vue +1 -3
- package/src/components/wt-copy-action/wt-copy-action.vue +1 -2
- package/src/components/wt-datepicker/_variables.scss +17 -5
- package/src/components/wt-datepicker/wt-datepicker.vue +2 -7
- package/src/components/wt-divider/_variables.scss +0 -1
- package/src/components/wt-divider/wt-divider.vue +5 -3
- package/src/components/wt-dual-panel/__tests__/WtDualPanel.js +2 -2
- package/src/components/wt-dual-panel/wt-dual-panel.vue +6 -5
- package/src/components/wt-dummy/_variables.scss +0 -1
- package/src/components/wt-dummy/wt-dummy.vue +1 -1
- package/src/components/wt-empty/wt-empty.vue +42 -34
- package/src/components/wt-error-page/_variables.scss +0 -1
- package/src/components/wt-error-page/wt-error-page.vue +2 -4
- package/src/components/wt-expansion-panel/_variables.scss +0 -1
- package/src/components/wt-expansion-panel/wt-expansion-panel.vue +3 -8
- package/src/components/wt-filters-panel-wrapper/__tests__/WtFiltersPanelWrapper.spec.js +12 -4
- package/src/components/wt-filters-panel-wrapper/wt-filters-panel-wrapper.vue +8 -7
- package/src/components/wt-headline/_variables.scss +0 -1
- package/src/components/wt-headline-nav/_variables.scss +0 -1
- package/src/components/wt-headline-nav/wt-headline-nav.vue +2 -1
- package/src/components/wt-hint/wt-hint.vue +1 -3
- package/src/components/wt-icon/_variables.scss +0 -1
- package/src/components/wt-icon-action/wt-icon-action.vue +13 -12
- package/src/components/wt-icon-btn/_variables.scss +0 -2
- package/src/components/wt-icon-btn/wt-icon-btn.vue +4 -6
- package/src/components/wt-image/wt-image.vue +14 -13
- package/src/components/wt-indicator/wt-indicator.vue +2 -7
- package/src/components/wt-input/_variables.scss +1 -2
- package/src/components/wt-input/wt-input.vue +13 -10
- package/src/components/wt-input-info/_variables.scss +0 -1
- package/src/components/wt-intersection-observer/__tests__/WtIntersectionObserver.spec.js +1 -1
- package/src/components/wt-intersection-observer/wt-intersection-observer.vue +9 -8
- package/src/components/wt-item-link/_variables.scss +0 -1
- package/src/components/wt-label/_variables.scss +0 -1
- package/src/components/wt-label/wt-label.vue +1 -4
- package/src/components/wt-load-bar/_variables.scss +0 -1
- package/src/components/wt-load-bar/wt-load-bar.vue +0 -1
- package/src/components/wt-loader/_variables.scss +0 -2
- package/src/components/wt-loader/wt-loader.vue +1 -3
- package/src/components/wt-logo/wt-logo.vue +1 -1
- package/src/components/wt-navigation-bar/__tests__/WtNavigationBar.spec.js +9 -3
- package/src/components/wt-navigation-bar/_variables.scss +9 -3
- package/src/components/wt-navigation-bar/wt-navigation-bar.vue +27 -11
- package/src/components/wt-notification/_variables.scss +0 -1
- package/src/components/wt-notifications-bar/__tests__/WtNotificationsBar.spec.js +1 -1
- package/src/components/wt-notifications-bar/_variables.scss +1 -2
- package/src/components/wt-notifications-bar/wt-notifications-bar.vue +4 -2
- package/src/components/wt-page-header/wt-page-header.vue +3 -2
- package/src/components/wt-page-wrapper/__tests__/WtPageWrapper.spec.js +3 -1
- package/src/components/wt-page-wrapper/_variables.scss +0 -1
- package/src/components/wt-page-wrapper/wt-page-wrapper.vue +0 -2
- package/src/components/wt-pagination/_variables.scss +1 -2
- package/src/components/wt-pagination/wt-pagination.vue +2 -1
- package/src/components/wt-player/_variables.scss +6 -2
- package/src/components/wt-player/wt-player.vue +52 -53
- package/src/components/wt-popup/_variables.scss +0 -1
- package/src/components/wt-popup/wt-popup.vue +2 -8
- package/src/components/wt-progress-bar/_variables.scss +0 -1
- package/src/components/wt-progress-bar/wt-progress-bar.vue +7 -6
- package/src/components/wt-radio/_variables.scss +1 -2
- package/src/components/wt-radio/wt-radio.vue +1 -2
- package/src/components/wt-rounded-action/_variables.scss +3 -1
- package/src/components/wt-search-bar/_variables.scss +4 -2
- package/src/components/wt-search-bar/wt-search-bar.vue +10 -4
- package/src/components/wt-select/_multiselect.scss +9 -15
- package/src/components/wt-select/_variables.scss +3 -2
- package/src/components/wt-select/mixins/multiselectMixin.js +2 -1
- package/src/components/wt-select/wt-select.vue +25 -26
- package/src/components/wt-slider/_variables.scss +0 -1
- package/src/components/wt-slider/wt-slider.vue +3 -3
- package/src/components/wt-status-select/_variables.scss +8 -4
- package/src/components/wt-stepper/_variables.scss +0 -1
- package/src/components/wt-stepper/wt-stepper.vue +5 -5
- package/src/components/wt-switcher/_variables.scss +0 -1
- package/src/components/wt-switcher/wt-switcher.vue +2 -3
- package/src/components/wt-table/__tests__/WtTable.spec.js +8 -2
- package/src/components/wt-table/_variables.scss +0 -1
- package/src/components/wt-table/types/table-header.ts +8 -0
- package/src/components/wt-table/wt-table.vue +111 -109
- package/src/components/wt-table-actions/_variables.scss +1 -2
- package/src/components/wt-table-actions/wt-table-actions.vue +1 -2
- package/src/components/wt-table-column-select/wt-table-column-select.vue +11 -8
- package/src/components/wt-tabs/_variables.scss +0 -1
- package/src/components/wt-tabs/wt-tabs.vue +6 -6
- package/src/components/wt-tags-input/__tests__/WtTagsInput.spec.js +6 -6
- package/src/components/wt-tags-input/mixin/taggableMixin.js +3 -1
- package/src/components/wt-tags-input/wt-tags-input.vue +8 -10
- package/src/components/wt-textarea/__tests__/WtTextarea.spec.js +6 -2
- package/src/components/wt-textarea/_variables.scss +0 -1
- package/src/components/wt-textarea/wt-textarea.vue +6 -7
- package/src/components/wt-time-input/wt-time-input.vue +1 -2
- package/src/components/wt-timepicker/_variables.scss +1 -2
- package/src/components/wt-timepicker/wt-timepicker.vue +10 -8
- package/src/components/wt-tooltip/_internals/useTooltipTriggerSubscriptions.js +6 -1
- package/src/components/wt-tooltip/_internals/wt-tooltip-floating.vue +1 -3
- package/src/components/wt-tooltip/_variables.scss +0 -1
- package/src/components/wt-tooltip/wt-tooltip.vue +13 -2
- package/src/components/wt-tree-table/_variables.scss +19 -0
- package/src/components/wt-tree-table/wt-tree-table.vue +323 -0
- package/src/components/wt-tree-table-row/wt-tree-table-row.vue +171 -0
- package/src/composables/useAccessControl/useAccessControl.js +12 -4
- package/src/composables/useCachedInterval/useCachedInterval.js +6 -2
- package/src/composables/useCachedItemInstanceName/useCachedItemInstanceName.js +4 -1
- package/src/composables/useCard/useCardComponent.js +10 -9
- package/src/composables/useCard/useCardTabs.js +6 -3
- package/src/composables/useRepresentableAgentPauseCause/__tests__/useRepresentableAgentPauseCause.spec.js +20 -10
- package/src/composables/useValidate/useValidate.js +1 -1
- package/src/composables/useWtTable/useWtTable.ts +25 -0
- package/src/css/main.scss +7 -1
- package/src/css/pages/table-page.scss +1 -2
- package/src/css/styleguide/border-radius/_border-radius.scss +1 -1
- package/src/css/styleguide/colors/_deprecated.scss +83 -24
- package/src/css/styleguide/colors/_palette.scss +1340 -251
- package/src/css/styleguide/colors/reusable/_text-field.scss +6 -2
- package/src/css/styleguide/fonts/_fonts.scss +36 -18
- package/src/css/styleguide/spacings/_spacings.scss +1 -1
- package/src/css/styleguide/transitions/_transitions.scss +1 -1
- package/src/css/styleguide/transitions/fade/_fade.scss +5 -4
- package/src/css/styleguide/viewport-breakpoints/_viewport-breakpoints.scss +0 -1
- package/src/enums/WebitelApplications/WebitelApplications.enum.js +7 -7
- package/src/enums/index.js +5 -10
- package/src/locale/en/en.js +5 -2
- package/src/locale/ru/ru.js +7 -3
- package/src/locale/ua/ua.js +7 -3
- package/src/mixins/dataFilterMixins/__tests__/apiFilterMixin.spec.js +2 -1
- package/src/mixins/dataFilterMixins/apiFilterMixin.js +3 -1
- package/src/mixins/dataFilterMixins/baseFilterMixin/baseFilterMixin.js +2 -1
- package/src/mixins/dataFilterMixins/enumFilterMixin.js +2 -1
- package/src/mixins/dataFilterMixins/paginationFilterMixin.js +4 -1
- package/src/mixins/dataFilterMixins/sortFilterMixin.js +2 -1
- package/src/mixins/validationMixin/useValidation.js +17 -7
- package/src/mixins/validationMixin/validationMixin.js +16 -8
- package/src/modules/AgentStatusSelect/api/pause-cause.js +4 -1
- package/src/modules/AgentStatusSelect/components/__tests__/wt-cc-agent-status-select.spec.js +18 -6
- package/src/modules/AgentStatusSelect/components/_internals/wt-cc-pause-cause-popup.vue +3 -2
- package/src/modules/AgentStatusSelect/components/wt-cc-agent-status-select.vue +5 -2
- package/src/modules/Appearance/components/__tests__/wt-dark-mode-switcher.spec.js +6 -2
- package/src/modules/AuditForm/components/__tests__/audit-form-question-write-wrapper.spec.js +12 -4
- package/src/modules/AuditForm/components/__tests__/audit-form.spec.js +18 -5
- package/src/modules/AuditForm/components/audit-form-question-read-wrapper.vue +4 -2
- package/src/modules/AuditForm/components/audit-form-question-write-wrapper.vue +15 -5
- package/src/modules/AuditForm/components/audit-form-question.vue +10 -4
- package/src/modules/AuditForm/components/audit-form.vue +24 -7
- package/src/modules/AuditForm/components/questions/options/__tests__/audit-form-question-options.spec.js +6 -2
- package/src/modules/AuditForm/components/questions/options/audit-form-question-options.vue +5 -5
- package/src/modules/AuditForm/components/questions/score/audit-form-question-score.vue +9 -4
- package/src/modules/CSVExport/CSVExport.js +5 -2
- package/src/modules/CSVExport/XLSExport.js +7 -7
- package/src/modules/CSVExport/__tests__/CSVExport.spec.js +4 -1
- package/src/modules/CSVExport/mixins/exportCSVMixin.js +3 -1
- package/src/modules/CSVExport/mixins/exportXLSMixin.js +3 -1
- package/src/modules/CardStoreModule/composables/useCardStore.js +6 -2
- package/src/modules/DeleteConfirmationPopup/__tests__/delete-confirmation-popup.spec.js +3 -3
- package/src/modules/DeleteConfirmationPopup/components/delete-confirmation-popup.vue +6 -3
- package/src/modules/FilesExport/__tests__/FilesExport.spec.js +6 -2
- package/src/modules/FilesExport/mixins/exportFilesMixin.js +6 -2
- package/src/modules/FilesExport/scripts/generateMediaURL.js +2 -1
- package/src/modules/Filters/classes/BaseFilterSchema.js +15 -6
- package/src/modules/Filters/components/filter-datetime.vue +7 -5
- package/src/modules/Filters/components/filter-pagination.vue +7 -5
- package/src/modules/Filters/components/filter-search.vue +4 -4
- package/src/modules/Filters/components/filter-select.vue +33 -24
- package/src/modules/Filters/components/filter-table-fields.vue +1 -3
- package/src/modules/Filters/composables/useTableFilters.js +3 -1
- package/src/modules/Filters/scripts/getters/localStorageGetter.js +6 -2
- package/src/modules/Filters/scripts/getters/queryGetter.js +2 -1
- package/src/modules/Filters/scripts/setters/localStorageSetter.js +6 -2
- package/src/modules/Filters/scripts/setters/querySetter.js +2 -1
- package/src/modules/Filters/scripts/utils/changeRouteQuery.js +2 -1
- package/src/modules/Filters/store/FiltersStoreModule.js +3 -3
- package/src/modules/Notifications/store/NotificationsStoreModule.js +14 -5
- package/src/modules/Notifications/store/__tests__/NotificationsStoreModule.actions.spec.js +10 -3
- package/src/modules/ObjectPermissions/_internals/components/permissions-role-row.vue +1 -3
- package/src/modules/ObjectPermissions/_internals/components/permissions-role-select.vue +1 -3
- package/src/modules/ObjectPermissions/_internals/components/permissions-tab-role-popup.vue +8 -5
- package/src/modules/ObjectPermissions/_internals/modules/filters/store/filters.store.js +3 -4
- package/src/modules/ObjectPermissions/_internals/store/helpers/createObjectPermissionsStoreModule.js +1 -2
- package/src/modules/ObjectPermissions/_internals/store/modules/objectPermissionsStoreModule.js +10 -14
- package/src/modules/ObjectPermissions/components/permissions-tab.vue +12 -12
- package/src/modules/ObjectPermissions/store/index.js +2 -6
- package/src/modules/QueryFilters/components/__tests__/filter-datetime.spec.js +3 -1
- package/src/modules/QueryFilters/components/__tests__/filter-from-to.spec.js +6 -2
- package/src/modules/QueryFilters/components/__tests__/filter-search.spec.js +7 -2
- package/src/modules/QueryFilters/components/abstract-api-filter.vue +15 -5
- package/src/modules/QueryFilters/components/abstract-enum-filter.vue +15 -5
- package/src/modules/QueryFilters/components/filter-datetime.vue +1 -3
- package/src/modules/QueryFilters/components/filter-from-to.vue +1 -1
- package/src/modules/QueryFilters/components/filter-search.vue +1 -3
- package/src/modules/QueryFilters/components/filter-table-fields.vue +1 -3
- package/src/modules/QueryFilters/mixins/__tests__/enumFilterMixin.spec.js +4 -1
- package/src/modules/QueryFilters/mixins/baseFilterMixin/baseFilterMixin.js +9 -3
- package/src/modules/QueryFilters/mixins/enumFilterMixin.js +10 -3
- package/src/modules/QueryFilters/mixins/paginationFilterMixin.js +4 -2
- package/src/modules/QueryFilters/mixins/sortFilterMixin.js +2 -1
- package/src/modules/QueryFilters/store/QueryFiltersStoreModule.js +2 -1
- package/src/modules/QueryFilters/store/__tests__/QueryFiltersStoreModule.spec.js +10 -3
- package/src/modules/TableComponentModule/composables/useTableEmpty.js +13 -4
- package/src/modules/TableStoreModule/composables/useTableStore.js +18 -6
- package/src/modules/TableStoreModule/store/TableStoreModule.js +36 -21
- package/src/modules/TableStoreModule/store/__tests__/TableStoreModule.spec.js +7 -2
- package/src/modules/Userinfo/api/userinfo.js +4 -1
- package/src/modules/Userinfo/classes/ApplicationsAccess.js +3 -1
- package/src/modules/Userinfo/store/UserinfoStoreModule.js +25 -9
- package/src/plugins/breakpoint/breakpoint.plugin.js +2 -1
- package/src/scripts/__tests__/caseConverters.spec.js +4 -1
- package/src/scripts/__tests__/updateObject.spec.js +6 -2
- package/src/scripts/caseConverters.js +37 -29
- package/src/scripts/compareSize.ts +9 -6
- package/src/scripts/debounce.js +2 -1
- package/src/scripts/index.js +2 -8
- package/src/scripts/logger.js +4 -4
- package/src/scripts/preventHiddenPageCallsDecorator.js +6 -2
- package/src/scripts/saveAsJSON.js +3 -1
- package/src/scripts/sortQueryAdapters.js +11 -0
- package/src/store/BaseStoreModules/ApiStoreModule.js +26 -7
- package/src/store/BaseStoreModules/BaseStoreModule.js +2 -1
- package/src/store/BaseStoreModules/__tests__/BaseStoreModule.spec.js +28 -7
- package/src/store/helpers/getNamespacedState.js +3 -1
- package/src/store/new/modules/apiStoreModule/apiStoreModule.js +19 -14
- package/src/store/new/modules/cardStoreModule/useCardStore.js +6 -2
- package/src/store/new/modules/tableStoreModule/__tests__/tableStoreModule.spec.js +6 -8
- package/src/store/new/modules/tableStoreModule/tableStoreModule.js +31 -28
- package/src/store/new/modules/tableStoreModule/useTableStore.js +18 -6
- package/src/validators/variableSearchValidator/__tests__/variableSearchValidator.spec.js +2 -1
- package/src/validators/websocketValidator/__tests__/websocketValidator.spec.js +3 -1
- package/src/components/wt-table/_internals/getSortOrder.js +0 -12
- /package/dist/img/sprite/{plus.svg → tree-expand.svg} +0 -0
- /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 {
|
|
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: [
|
|
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(() =>
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const
|
|
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 = ({
|
|
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 =
|
|
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 = (
|
|
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 {
|
|
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
|
|
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
|
|
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
|
|
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
|
+
};
|