@webitel/ui-sdk 26.8.75 → 26.8.77

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 (174) hide show
  1. package/dist/{clients-BmeOR90W.js → clients-B8-WDK4d.js} +66 -79
  2. package/dist/{components-C-ri6OSQ.js → components-fKLMXHe_.js} +11 -11
  3. package/dist/{enums-BvonmHq2.js → enums-B_9ZBu01.js} +2 -2
  4. package/dist/ui-sdk.css +1 -1
  5. package/dist/ui-sdk.js +3 -3
  6. package/dist/ui-sdk.umd.cjs +610 -612
  7. package/dist/{useValidation-0JwQGpLM.js → useValidation-CEed9cxY.js} +1 -1
  8. package/dist/{utils-CzBdLnFt.js → utils-BZHq8qMH.js} +1 -1
  9. package/dist/wt-action-bar-D74sgDCk.js +94 -0
  10. package/dist/{wt-button-D-nFhi1f.js → wt-button-BwPz__rU.js} +2 -2
  11. package/dist/{wt-chat-emoji-CLhgb02d.js → wt-chat-emoji-DcVCe4jW.js} +4 -4
  12. package/dist/{wt-datepicker-DCa23hYx.js → wt-datepicker-BgjjbOMX.js} +2 -2
  13. package/dist/{wt-display-chip-items-B7QLz9QM.js → wt-display-chip-items-D-v25BUi.js} +2 -2
  14. package/dist/{wt-dual-panel-D-LChluY.js → wt-dual-panel-Cs_Yzfxt.js} +1 -1
  15. package/dist/{wt-expansion-card-CToBA1fy.js → wt-expansion-card-BT586Mul.js} +1 -1
  16. package/dist/{wt-expansion-panel-af2t3VrM.js → wt-expansion-panel-kZmHSvPU.js} +1 -1
  17. package/dist/{wt-icon-action-DYBTs3Mf.js → wt-icon-action-DJzm0kEk.js} +1 -1
  18. package/dist/{wt-icon-btn-BfhuUt8-.js → wt-icon-btn-BzraLc-w.js} +1 -1
  19. package/dist/{wt-icon-WyFAGc4t.js → wt-icon-iRDqWkjp.js} +19 -19
  20. package/dist/{wt-notifications-bar-CvKwuTEg.js → wt-notifications-bar-ZIMKBDqL.js} +2 -2
  21. package/dist/{wt-player-B2etfN5v.js → wt-player-CFrKSilF.js} +3 -3
  22. package/dist/{wt-screen-recordings-action-CepB2pqh.js → wt-screen-recordings-action-CVHZAWjl.js} +1 -1
  23. package/dist/{wt-search-bar-B4YkhgIB.js → wt-search-bar-DosqJLXT.js} +1 -1
  24. package/dist/{wt-send-message-popup-BhZ7K_Vs.js → wt-send-message-popup-BpgjqxvU.js} +2 -2
  25. package/dist/{wt-status-select-ELI7j73g.js → wt-status-select-Dnv9tj7o.js} +1 -1
  26. package/dist/{wt-timepicker-C3v9Cp2e.js → wt-timepicker-B4MOaSEZ.js} +2 -2
  27. package/dist/{wt-toast-DxQBRGm2.js → wt-toast-BcgNZFCD.js} +2 -2
  28. package/dist/{wt-tree-table-C5sxm-Eb.js → wt-tree-table-xXbBeLUc.js} +1 -1
  29. package/dist/{wt-type-extension-value-input-gQGgxMcJ.js → wt-type-extension-value-input-D86gV8RI.js} +3 -3
  30. package/dist/{wt-vidstack-player-B37Mdf0u.js → wt-vidstack-player-BzyyVEji.js} +4 -4
  31. package/package.json +1 -1
  32. package/src/assets/icons/sprite/call--filled.svg +1 -1
  33. package/src/assets/icons/sprite/call-add-to--filled.svg +2 -2
  34. package/src/assets/icons/sprite/call-add-to.svg +2 -3
  35. package/src/assets/icons/sprite/call-disconnect--filled.svg +2 -2
  36. package/src/assets/icons/sprite/call-disconnect.svg +2 -2
  37. package/src/assets/icons/sprite/call-end--filled.svg +2 -1
  38. package/src/assets/icons/sprite/call-end.svg +2 -2
  39. package/src/assets/icons/sprite/call-inbound--filled.svg +2 -3
  40. package/src/assets/icons/sprite/call-inbound.svg +2 -2
  41. package/src/assets/icons/sprite/call-missed--filled.svg +2 -2
  42. package/src/assets/icons/sprite/call-missed.svg +2 -2
  43. package/src/assets/icons/sprite/call-outbound--filled.svg +2 -2
  44. package/src/assets/icons/sprite/call-outbound.svg +2 -2
  45. package/src/assets/icons/sprite/call-ringing--filled.svg +3 -4
  46. package/src/assets/icons/sprite/call-ringing.svg +3 -2
  47. package/src/assets/icons/sprite/call-transfer--filled.svg +2 -2
  48. package/src/assets/icons/sprite/call-transfer.svg +2 -2
  49. package/src/assets/icons/sprite/call.svg +1 -2
  50. package/src/components/transitions/__tests__/ExpandTransition.spec.js +15 -0
  51. package/src/components/transitions/__tests__/WtReplaceTransition.spec.js +66 -0
  52. package/src/components/transitions/__tests__/WtTransition.spec.js +35 -0
  53. package/src/components/wt-action-bar/WtActionBarActionsOrder.js +1 -1
  54. package/src/components/wt-action-bar/__tests__/WtActionBar.spec.js +121 -0
  55. package/src/components/wt-action-bar/wt-action-bar.vue +57 -33
  56. package/src/components/wt-app-header/__tests__/WtAppNavigator.spec.js +65 -4
  57. package/src/components/wt-app-header/__tests__/WtHeaderActions.spec.js +81 -2
  58. package/src/components/wt-avatar/__tests__/WtAvatar.spec.js +111 -0
  59. package/src/components/wt-badge/__tests__/WtBadge.spec.js +80 -0
  60. package/src/components/wt-badge-new/__tests__/WtBadge.spec.js +61 -0
  61. package/src/components/wt-breadcrumb/__tests__/WtBreadcrumb.spec.js +117 -0
  62. package/src/components/wt-button-select/__tests__/WtButtonSelect.spec.js +37 -5
  63. package/src/components/wt-call-media-metric/__tests__/WtCallMediaMetric.spec.js +84 -0
  64. package/src/components/wt-card/__tests__/WtCard.spec.js +20 -0
  65. package/src/components/wt-checkbox/__tests__/WtCheckbox.spec.js +63 -0
  66. package/src/components/wt-chip/__tests__/WtChip.spec.js +32 -0
  67. package/src/components/wt-confirm-dialog/__tests__/WtConfirmDialog.spec.js +92 -0
  68. package/src/components/wt-context-menu/__tests__/WtContextMenu.spec.js +146 -1
  69. package/src/components/wt-copy-action/__tests__/WtCopyAction.spec.js +57 -0
  70. package/src/components/wt-datepicker/__tests__/WtDatepicker.spec.js +53 -0
  71. package/src/components/wt-datetime-text/__tests__/WtDatetimeText.spec.js +49 -0
  72. package/src/components/wt-divider/__tests__/WtDivider.spec.js +30 -0
  73. package/src/components/wt-dual-panel/__tests__/WtDualPanel.spec.js +120 -0
  74. package/src/components/wt-dummy/__tests__/WtDummy.spec.js +63 -1
  75. package/src/components/wt-empty/__tests__/WtEmpty.spec.js +84 -0
  76. package/src/components/wt-error-page/__tests__/WtErrorPage.spec.js +60 -0
  77. package/src/components/wt-expansion-card/__tests__/WtExpansionCard.spec.js +63 -0
  78. package/src/components/wt-expansion-panel/__tests__/WtExpansionPanel.spec.js +48 -9
  79. package/src/components/wt-filters-panel-wrapper/__tests__/WtFiltersPanelWrapper.spec.js +81 -10
  80. package/src/components/wt-hint/__tests__/WtHint.spec.js +44 -1
  81. package/src/components/wt-icon/__tests__/WtIcon.spec.js +29 -0
  82. package/src/components/wt-icon-action/__tests__/WtIconAction.spec.js +79 -0
  83. package/src/components/wt-icon-action/wt-icon-action.vue +1 -1
  84. package/src/components/wt-icon-btn/__tests__/WtIconBtn.spec.js +46 -0
  85. package/src/components/wt-image/__tests__/WtImage.spec.js +83 -0
  86. package/src/components/wt-indicator/__tests__/WtIndicator.spec.js +23 -0
  87. package/src/components/wt-input-number/__tests__/WtInputNumber.spec.js +77 -0
  88. package/src/components/wt-input-text/__tests__/WtInputText.spec.js +85 -0
  89. package/src/components/wt-intersection-observer/__tests__/WtIntersectionObserver.spec.js +24 -3
  90. package/src/components/wt-item-link/__tests__/WtItemLink.spec.js +93 -1
  91. package/src/components/wt-label/__tests__/WtLabel.spec.js +49 -1
  92. package/src/components/wt-load-bar/__tests__/WtLoadBar.spec.js +49 -0
  93. package/src/components/wt-loader/__tests__/WtLoader.spec.js +26 -1
  94. package/src/components/wt-logo/__tests__/WtLogo.spec.js +55 -0
  95. package/src/components/wt-menubar/__tests__/WtMenubar.spec.js +30 -0
  96. package/src/components/wt-message/__tests__/WtMessage.spec.js +46 -0
  97. package/src/components/wt-multi-select/__tests__/WtMultiSelect.spec.js +106 -0
  98. package/src/components/wt-page-header/__tests__/WtPageHeader.spec.js +111 -0
  99. package/src/components/wt-password/__tests__/WtPassword.spec.js +107 -0
  100. package/src/components/wt-popover/__tests__/WtPopover.spec.js +73 -0
  101. package/src/components/wt-progress-bar/__tests__/WtProgressBar.spec.js +34 -0
  102. package/src/components/wt-radio/__tests__/WtRadio.spec.js +45 -0
  103. package/src/components/wt-rounded-action/__tests__/WtRoundedAction.spec.js +48 -0
  104. package/src/components/wt-search-bar/__tests__/WtSearchBar.spec.js +74 -13
  105. package/src/components/wt-single-select/__tests__/WtSingleSelect.spec.js +117 -0
  106. package/src/components/wt-slider/__tests__/WtSlider.spec.js +100 -0
  107. package/src/components/wt-stepper/__tests__/WtStepper.spec.js +105 -0
  108. package/src/components/wt-switcher/__tests__/WtSwitcher.spec.js +47 -0
  109. package/src/components/wt-table/__tests__/WtTable.spec.js +237 -0
  110. package/src/components/wt-table-actions/__tests__/WtTableActions.spec.js +153 -1
  111. package/src/components/wt-table-column-select/__tests__/WtTableColumnSelect.spec.js +147 -0
  112. package/src/components/wt-tabs/__tests__/WtTabs.spec.js +55 -0
  113. package/src/components/wt-textarea/__tests__/WtTextarea.spec.js +49 -0
  114. package/src/components/wt-time-input/__tests__/WtTimeInput.spec.js +29 -0
  115. package/src/components/wt-tree/__tests__/WtTree.spec.js +126 -2
  116. package/src/components/wt-tree-line/__tests__/WtTreeLine.spec.js +205 -0
  117. package/src/components/wt-tree-table/__tests__/WtTreeTable.spec.js +155 -0
  118. package/src/components/wt-tree-table-row/__tests__/WtTreeTableRow.spec.js +176 -0
  119. package/src/components/wt-vidstack-player/__tests__/WtVidstackPlayer.spec.js +82 -0
  120. package/src/enums/IconAction/{IconAction.enum.js → IconAction.ts} +4 -2
  121. package/src/enums/index.ts +1 -1
  122. package/src/modules/ObjectPermissions/components/_internal/permissions-tab-content.vue +1 -1
  123. package/types/.tsbuildinfo +1 -1
  124. package/types/components/wt-action-bar/wt-action-bar.vue.d.ts +349 -105
  125. package/types/components/wt-datetime-text/__tests__/WtDatetimeText.spec.d.ts +1 -0
  126. package/types/components/wt-divider/__tests__/WtDivider.spec.d.ts +1 -0
  127. package/types/components/wt-dual-panel/__tests__/WtDualPanel.spec.d.ts +1 -0
  128. package/types/components/wt-empty/__tests__/WtEmpty.spec.d.ts +1 -0
  129. package/types/components/wt-error-page/__tests__/WtErrorPage.spec.d.ts +1 -0
  130. package/types/components/wt-expansion-card/__tests__/WtExpansionCard.spec.d.ts +1 -0
  131. package/types/components/wt-image/__tests__/WtImage.spec.d.ts +1 -0
  132. package/types/components/wt-input-number/__tests__/WtInputNumber.spec.d.ts +1 -0
  133. package/types/components/wt-input-text/__tests__/WtInputText.spec.d.ts +1 -0
  134. package/types/components/wt-logo/__tests__/WtLogo.spec.d.ts +1 -0
  135. package/types/components/wt-menubar/__tests__/WtMenubar.spec.d.ts +1 -0
  136. package/types/components/wt-message/__tests__/WtMessage.spec.d.ts +1 -0
  137. package/types/components/wt-multi-select/__tests__/WtMultiSelect.spec.d.ts +1 -0
  138. package/types/components/wt-page-header/__tests__/WtPageHeader.spec.d.ts +1 -0
  139. package/types/components/wt-password/__tests__/WtPassword.spec.d.ts +1 -0
  140. package/types/components/wt-popover/__tests__/WtPopover.spec.d.ts +1 -0
  141. package/types/components/wt-single-select/__tests__/WtSingleSelect.spec.d.ts +1 -0
  142. package/types/components/wt-slider/__tests__/WtSlider.spec.d.ts +1 -0
  143. package/types/components/wt-stepper/__tests__/WtStepper.spec.d.ts +1 -0
  144. package/types/components/wt-table/__tests__/WtTable.spec.d.ts +1 -0
  145. package/types/components/wt-tree-line/__tests__/WtTreeLine.spec.d.ts +1 -0
  146. package/types/components/wt-tree-table/__tests__/WtTreeTable.spec.d.ts +1 -0
  147. package/types/components/wt-tree-table-row/__tests__/WtTreeTableRow.spec.d.ts +1 -0
  148. package/types/components/wt-vidstack-player/__tests__/WtVidstackPlayer.spec.d.ts +1 -0
  149. package/types/enums/IconAction/IconAction.d.ts +31 -0
  150. package/types/enums/index.d.ts +1 -1
  151. package/dist/wt-action-bar-D4wDtBqb.js +0 -87
  152. package/src/components/wt-action-bar/__tests__/wt-action-bar.spec.js +0 -10
  153. package/src/components/wt-avatar/__tests__/wt-avatar.spec.js +0 -10
  154. package/src/components/wt-badge/__tests__/wt-badge.spec.js +0 -10
  155. package/src/components/wt-breadcrumb/__tests__/wt-breadcrumb.spec.js +0 -14
  156. package/src/components/wt-dual-panel/__tests__/WtDualPanel.js +0 -62
  157. package/src/components/wt-empty/__tests__/wt-empty.spec.js +0 -10
  158. package/src/components/wt-error-page/__tests__/wt-error-page.spec.js +0 -30
  159. package/src/components/wt-image/__tests__/wt-image.spec.js +0 -10
  160. package/src/components/wt-logo/__tests__/wt-logo.spec.js +0 -10
  161. package/src/components/wt-page-header/__tests__/wt-page-header.spec.js +0 -10
  162. package/src/components/wt-stepper/__tests__/WtStepper.spec.vue.js +0 -19
  163. package/types/enums/IconAction/IconAction.enum.d.ts +0 -30
  164. /package/types/components/{wt-action-bar/__tests__/wt-action-bar.spec.d.ts → transitions/__tests__/WtReplaceTransition.spec.d.ts} +0 -0
  165. /package/types/components/{wt-avatar/__tests__/wt-avatar.spec.d.ts → transitions/__tests__/WtTransition.spec.d.ts} +0 -0
  166. /package/types/components/{wt-badge/__tests__/wt-badge.spec.d.ts → wt-action-bar/__tests__/WtActionBar.spec.d.ts} +0 -0
  167. /package/types/components/{wt-breadcrumb/__tests__/wt-breadcrumb.spec.d.ts → wt-avatar/__tests__/WtAvatar.spec.d.ts} +0 -0
  168. /package/types/components/{wt-empty/__tests__/wt-empty.spec.d.ts → wt-badge/__tests__/WtBadge.spec.d.ts} +0 -0
  169. /package/types/components/{wt-dual-panel/__tests__/WtDualPanel.d.ts → wt-badge-new/__tests__/WtBadge.spec.d.ts} +0 -0
  170. /package/types/components/{wt-error-page/__tests__/wt-error-page.spec.d.ts → wt-breadcrumb/__tests__/WtBreadcrumb.spec.d.ts} +0 -0
  171. /package/types/components/{wt-image/__tests__/wt-image.spec.d.ts → wt-call-media-metric/__tests__/WtCallMediaMetric.spec.d.ts} +0 -0
  172. /package/types/components/{wt-logo/__tests__/wt-logo.spec.d.ts → wt-card/__tests__/WtCard.spec.d.ts} +0 -0
  173. /package/types/components/{wt-page-header/__tests__/wt-page-header.spec.d.ts → wt-confirm-dialog/__tests__/WtConfirmDialog.spec.d.ts} +0 -0
  174. /package/types/components/{wt-stepper/__tests__/WtStepper.spec.vue.d.ts → wt-copy-action/__tests__/WtCopyAction.spec.d.ts} +0 -0
@@ -0,0 +1,92 @@
1
+ import { flushPromises, mount, shallowMount } from '@vue/test-utils';
2
+
3
+ import WtConfirmDialog from '../wt-confirm-dialog.vue';
4
+
5
+ describe('WtConfirmDialog', () => {
6
+ it('renders a component with the given title', () => {
7
+ const wrapper = mount(WtConfirmDialog, {
8
+ props: {
9
+ title: 'Delete item?',
10
+ callback: vi.fn(),
11
+ },
12
+ });
13
+ expect(wrapper.classes()).toContain('wt-confirm-dialog');
14
+ expect(wrapper.text()).toContain('Delete item?');
15
+ });
16
+
17
+ it('renders the custom delete message when provided', () => {
18
+ const wrapper = mount(WtConfirmDialog, {
19
+ props: {
20
+ title: 'Delete item?',
21
+ deleteMessage: 'Are you absolutely sure?',
22
+ callback: vi.fn(),
23
+ },
24
+ });
25
+ expect(wrapper.text()).toContain('Are you absolutely sure?');
26
+ });
27
+
28
+ it('emits close when the popup emits close', async () => {
29
+ const wrapper = shallowMount(WtConfirmDialog, {
30
+ props: {
31
+ title: 'Delete item?',
32
+ callback: vi.fn(),
33
+ },
34
+ });
35
+ await wrapper
36
+ .findComponent({
37
+ name: 'wt-popup',
38
+ })
39
+ .vm.$emit('close');
40
+ expect(wrapper.emitted().close).toBeTruthy();
41
+ });
42
+
43
+ it('emits close when cancel action button is clicked', async () => {
44
+ const wrapper = mount(WtConfirmDialog, {
45
+ props: {
46
+ title: 'Delete item?',
47
+ callback: vi.fn(),
48
+ },
49
+ });
50
+ const [cancelButton] = wrapper.findAllComponents({
51
+ name: 'wt-button',
52
+ });
53
+ await cancelButton.trigger('click');
54
+ expect(wrapper.emitted().close).toBeTruthy();
55
+ });
56
+
57
+ it('calls callback and emits close when confirm action button is clicked', async () => {
58
+ const callback = vi.fn().mockResolvedValue();
59
+ const wrapper = mount(WtConfirmDialog, {
60
+ props: {
61
+ title: 'Delete item?',
62
+ callback,
63
+ },
64
+ });
65
+ const [, confirmButton] = wrapper.findAllComponents({
66
+ name: 'wt-button',
67
+ });
68
+ await confirmButton.trigger('click');
69
+ await flushPromises();
70
+
71
+ expect(callback).toHaveBeenCalled();
72
+ expect(wrapper.emitted().close).toBeTruthy();
73
+ });
74
+
75
+ it('exposes isDeleting and confirm/close via the actions slot', () => {
76
+ const callback = vi.fn().mockResolvedValue();
77
+ const wrapper = mount(WtConfirmDialog, {
78
+ props: {
79
+ title: 'Delete item?',
80
+ callback,
81
+ },
82
+ slots: {
83
+ actions: `<template #actions="{ isDeleting, confirm, close }">
84
+ <span class="slot-check">{{ typeof isDeleting }}-{{ typeof confirm }}-{{ typeof close }}</span>
85
+ </template>`,
86
+ },
87
+ });
88
+ expect(wrapper.find('.slot-check').text()).toBe(
89
+ 'boolean-function-function',
90
+ );
91
+ });
92
+ });
@@ -1,7 +1,51 @@
1
- import { shallowMount } from '@vue/test-utils';
1
+ import { flushPromises, mount, shallowMount } from '@vue/test-utils';
2
2
 
3
+ import WtPopover from '../../wt-popover/wt-popover.vue';
3
4
  import WtContextMenu from '../wt-context-menu.vue';
4
5
 
6
+ global.ResizeObserver = vi.fn().mockImplementation(() => ({
7
+ observe: vi.fn(),
8
+ unobserve: vi.fn(),
9
+ disconnect: vi.fn(),
10
+ }));
11
+
12
+ /**
13
+ * wt-popover doesn't wire the `visible` prop through to PrimeVue's Popover — the
14
+ * panel only opens via the activator slot's imperative `show()`. Since the panel
15
+ * content is teleported to document.body, tests attach to the body and open it
16
+ * through a real activator before asserting on the option list.
17
+ */
18
+ const mountOpen = (props) => {
19
+ const TestHost = {
20
+ components: {
21
+ WtContextMenu,
22
+ },
23
+ props: [
24
+ 'options',
25
+ 'disabled',
26
+ ],
27
+ template: `
28
+ <WtContextMenu ref="contextMenu" :options="options" :disabled="disabled">
29
+ <template #activator="{ show }">
30
+ <button class="opener" @click="show">open</button>
31
+ </template>
32
+ </WtContextMenu>
33
+ `,
34
+ };
35
+ return mount(TestHost, {
36
+ props,
37
+ attachTo: document.body,
38
+ global: {
39
+ stubs: {
40
+ WtPopover: false,
41
+ },
42
+ components: {
43
+ WtPopover,
44
+ },
45
+ },
46
+ });
47
+ };
48
+
5
49
  describe('WtContextMenu', () => {
6
50
  it('renders a component', () => {
7
51
  const wrapper = shallowMount(WtContextMenu, {
@@ -11,4 +55,105 @@ describe('WtContextMenu', () => {
11
55
  });
12
56
  expect(wrapper.classes('wt-context-menu')).toBe(true);
13
57
  });
58
+
59
+ it('renders an option for each entry once opened', async () => {
60
+ const options = [
61
+ {
62
+ text: 'Option 1',
63
+ },
64
+ {
65
+ text: 'Option 2',
66
+ },
67
+ ];
68
+ const wrapper = mountOpen({
69
+ options,
70
+ });
71
+ await flushPromises();
72
+ await wrapper.find('.opener').trigger('click');
73
+ await flushPromises();
74
+
75
+ const items = document.body.querySelectorAll('.wt-context-menu__option');
76
+ expect(items.length).toBe(options.length);
77
+ expect(items[0].textContent.trim()).toBe('Option 1');
78
+ expect(items[1].textContent.trim()).toBe('Option 2');
79
+
80
+ wrapper.unmount();
81
+ });
82
+
83
+ it('renders plain string options via their string value', async () => {
84
+ const options = [
85
+ 'Foo',
86
+ 'Bar',
87
+ ];
88
+ const wrapper = mountOpen({
89
+ options,
90
+ });
91
+ await flushPromises();
92
+ await wrapper.find('.opener').trigger('click');
93
+ await flushPromises();
94
+
95
+ const items = document.body.querySelectorAll('.wt-context-menu__option');
96
+ expect(items[0].textContent.trim()).toBe('Foo');
97
+ expect(items[1].textContent.trim()).toBe('Bar');
98
+
99
+ wrapper.unmount();
100
+ });
101
+
102
+ it('emits click with the option and index when an option is clicked', async () => {
103
+ const options = [
104
+ {
105
+ text: 'Option 1',
106
+ },
107
+ {
108
+ text: 'Option 2',
109
+ },
110
+ ];
111
+ const wrapper = mountOpen({
112
+ options,
113
+ });
114
+ await flushPromises();
115
+ await wrapper.find('.opener').trigger('click');
116
+ await flushPromises();
117
+
118
+ document.body.querySelectorAll('.wt-context-menu__option')[1].click();
119
+ await flushPromises();
120
+
121
+ const contextMenu = wrapper.findComponent({
122
+ ref: 'contextMenu',
123
+ });
124
+ expect(contextMenu.emitted().click[0]).toEqual([
125
+ {
126
+ option: options[1],
127
+ index: 1,
128
+ },
129
+ ]);
130
+
131
+ wrapper.unmount();
132
+ });
133
+
134
+ it('applies the disabled modifier class to disabled options', async () => {
135
+ const options = [
136
+ {
137
+ text: 'Option 1',
138
+ disabled: true,
139
+ },
140
+ {
141
+ text: 'Option 2',
142
+ },
143
+ ];
144
+ const wrapper = mountOpen({
145
+ options,
146
+ });
147
+ await flushPromises();
148
+ await wrapper.find('.opener').trigger('click');
149
+ await flushPromises();
150
+
151
+ const items = document.body.querySelectorAll('.wt-context-menu__option');
152
+ expect(items[0].classList).toContain('wt-context-menu__option--disabled');
153
+ expect(items[1].classList).not.toContain(
154
+ 'wt-context-menu__option--disabled',
155
+ );
156
+
157
+ wrapper.unmount();
158
+ });
14
159
  });
@@ -0,0 +1,57 @@
1
+ import { flushPromises, shallowMount } from '@vue/test-utils';
2
+
3
+ vi.mock('clipboard-copy', () => ({
4
+ default: vi.fn().mockResolvedValue(),
5
+ }));
6
+
7
+ import copy from 'clipboard-copy';
8
+ import WtCopyAction from '../wt-copy-action.vue';
9
+
10
+ describe('WtCopyAction', () => {
11
+ beforeEach(() => {
12
+ vi.useFakeTimers();
13
+ copy.mockClear();
14
+ });
15
+
16
+ afterEach(() => {
17
+ vi.useRealTimers();
18
+ });
19
+
20
+ it('renders a component', () => {
21
+ const wrapper = shallowMount(WtCopyAction);
22
+ expect(wrapper.classes()).toContain('copy-action');
23
+ });
24
+
25
+ it('renders the copy icon by default', () => {
26
+ const wrapper = shallowMount(WtCopyAction);
27
+ expect(wrapper.attributes('icon')).toBe('copy');
28
+ });
29
+
30
+ it('copies the value prop when clicked', async () => {
31
+ const wrapper = shallowMount(WtCopyAction, {
32
+ props: {
33
+ value: 'hello world',
34
+ },
35
+ });
36
+ await wrapper.trigger('click');
37
+ await flushPromises();
38
+ expect(copy).toHaveBeenCalledWith('hello world');
39
+ });
40
+
41
+ it('shows the done icon after copying, then reverts after the timeout', async () => {
42
+ const wrapper = shallowMount(WtCopyAction, {
43
+ props: {
44
+ value: 'hello world',
45
+ },
46
+ });
47
+ await wrapper.trigger('click');
48
+ await flushPromises();
49
+
50
+ expect(wrapper.attributes('icon')).toBe('done');
51
+
52
+ vi.advanceTimersByTime(1500);
53
+ await wrapper.vm.$nextTick();
54
+
55
+ expect(wrapper.attributes('icon')).toBe('copy');
56
+ });
57
+ });
@@ -28,4 +28,57 @@ describe('WtDatepicker', () => {
28
28
  });
29
29
  expect(wrapper.find('.wt-label').text()).toBe(label);
30
30
  });
31
+
32
+ it('appends an asterisk to the label when required', () => {
33
+ const label = 'Hello there';
34
+ const wrapper = mount(WtDatepicker, {
35
+ stubs: {
36
+ WtLabel,
37
+ WtIcon,
38
+ },
39
+ props: {
40
+ label,
41
+ required: true,
42
+ },
43
+ });
44
+ expect(wrapper.find('.wt-label').text()).toBe(`${label}*`);
45
+ });
46
+
47
+ it('passes the disabled prop down to the underlying datepicker', () => {
48
+ const wrapper = shallowMount(WtDatepicker, {
49
+ stubs: {
50
+ WtLabel,
51
+ WtIcon,
52
+ },
53
+ props: {
54
+ disabled: true,
55
+ },
56
+ });
57
+ expect(
58
+ wrapper
59
+ .findComponent({
60
+ name: 'DatePicker',
61
+ })
62
+ .attributes('disabled'),
63
+ ).toBe('true');
64
+ });
65
+
66
+ it('uses a default placeholder based on showTime', () => {
67
+ const wrapper = shallowMount(WtDatepicker, {
68
+ stubs: {
69
+ WtLabel,
70
+ WtIcon,
71
+ },
72
+ props: {
73
+ showTime: true,
74
+ },
75
+ });
76
+ expect(
77
+ wrapper
78
+ .findComponent({
79
+ name: 'DatePicker',
80
+ })
81
+ .attributes('placeholder'),
82
+ ).toBe('dd/mm/yyyy hh:mm');
83
+ });
31
84
  });
@@ -0,0 +1,49 @@
1
+ import { mount } from '@vue/test-utils';
2
+
3
+ import { FormatDateMode } from '../../../enums';
4
+ import WtDatetimeText from '../wt-datetime-text.vue';
5
+
6
+ describe('WtDatetimeText', () => {
7
+ it('renders the datetime formatted in datetime mode by default', () => {
8
+ const wrapper = mount(WtDatetimeText, {
9
+ props: {
10
+ datetime: 1700000000000,
11
+ timezone: 'UTC',
12
+ },
13
+ });
14
+ expect(wrapper.text()).toBe('14.11.2023, 22:13:20');
15
+ });
16
+
17
+ it('renders using date mode', () => {
18
+ const wrapper = mount(WtDatetimeText, {
19
+ props: {
20
+ datetime: 1700000000000,
21
+ mode: FormatDateMode.DATE,
22
+ timezone: 'UTC',
23
+ },
24
+ });
25
+ expect(wrapper.text()).toBe('14.11.2023');
26
+ });
27
+
28
+ it('renders using time mode', () => {
29
+ const wrapper = mount(WtDatetimeText, {
30
+ props: {
31
+ datetime: 1700000000000,
32
+ mode: FormatDateMode.TIME,
33
+ timezone: 'UTC',
34
+ },
35
+ });
36
+ expect(wrapper.text()).toBe('22:13');
37
+ });
38
+
39
+ it('renders using a different timezone', () => {
40
+ const wrapper = mount(WtDatetimeText, {
41
+ props: {
42
+ datetime: 1700000000000,
43
+ mode: FormatDateMode.DATETIME_SHORT,
44
+ timezone: 'Europe/Kyiv',
45
+ },
46
+ });
47
+ expect(wrapper.text()).toBe('15.11.2023, 0:13');
48
+ });
49
+ });
@@ -0,0 +1,30 @@
1
+ import { shallowMount } from '@vue/test-utils';
2
+
3
+ import WtDivider from '../wt-divider.vue';
4
+
5
+ describe('WtDivider', () => {
6
+ it('renders a component', () => {
7
+ const wrapper = shallowMount(WtDivider);
8
+ expect(
9
+ wrapper
10
+ .findComponent({
11
+ name: 'Divider',
12
+ })
13
+ .exists(),
14
+ ).toBe(true);
15
+ });
16
+
17
+ it('defaults to horizontal layout', () => {
18
+ const wrapper = shallowMount(WtDivider);
19
+ expect(wrapper.attributes('layout')).toBe('horizontal');
20
+ });
21
+
22
+ it('passes a custom variant as the layout prop', () => {
23
+ const wrapper = shallowMount(WtDivider, {
24
+ props: {
25
+ variant: 'vertical',
26
+ },
27
+ });
28
+ expect(wrapper.attributes('layout')).toBe('vertical');
29
+ });
30
+ });
@@ -0,0 +1,120 @@
1
+ import { shallowMount } from '@vue/test-utils';
2
+
3
+ import { ComponentSize } from '../../../enums';
4
+ import WtDualPanel from '../wt-dual-panel.vue';
5
+
6
+ describe('WtDualPanel', () => {
7
+ it('renders a component', () => {
8
+ const wrapper = shallowMount(WtDualPanel);
9
+ expect(wrapper.classes('wt-dual-panel')).toBe(true);
10
+ });
11
+
12
+ it('renders dual panel header via header slot', () => {
13
+ const content = 'Dual Panel header';
14
+ const wrapper = shallowMount(WtDualPanel, {
15
+ slots: {
16
+ header: content,
17
+ },
18
+ });
19
+ expect(wrapper.find('.wt-dual-panel__header').text()).toBe(content);
20
+ });
21
+
22
+ it('does not render the header when hideHeader is true', () => {
23
+ const wrapper = shallowMount(WtDualPanel, {
24
+ props: {
25
+ hideHeader: true,
26
+ },
27
+ });
28
+ expect(wrapper.find('.wt-dual-panel__header').exists()).toBe(false);
29
+ });
30
+
31
+ it('renders dual panel actions panel via actions panel slot when actionsPanel prop is true', () => {
32
+ const content = 'Dual Panel actions panel content';
33
+ const wrapper = shallowMount(WtDualPanel, {
34
+ props: {
35
+ actionsPanel: true,
36
+ },
37
+ slots: {
38
+ 'actions-panel': content,
39
+ },
40
+ });
41
+ expect(wrapper.find('.wt-dual-panel__actions-panel').text()).toBe(content);
42
+ });
43
+
44
+ it('does not render actions panel when actionsPanel prop is false', () => {
45
+ const wrapper = shallowMount(WtDualPanel, {
46
+ props: {
47
+ actionsPanel: false,
48
+ },
49
+ });
50
+ expect(wrapper.find('.wt-dual-panel__actions-panel').exists()).toBe(false);
51
+ });
52
+
53
+ it('renders dual panel side panel via side-panel slot', () => {
54
+ const content = 'Dual Panel side panel';
55
+ const wrapper = shallowMount(WtDualPanel, {
56
+ slots: {
57
+ 'side-panel': content,
58
+ },
59
+ });
60
+ expect(wrapper.find('.wt-dual-panel__side-panel').text()).toBe(content);
61
+ });
62
+
63
+ it('renders dual panel main content via main slot', () => {
64
+ const content = 'Dual Panel main panel';
65
+ const wrapper = shallowMount(WtDualPanel, {
66
+ slots: {
67
+ main: content,
68
+ },
69
+ });
70
+ expect(wrapper.find('.wt-dual-panel__main').text()).toBe(content);
71
+ });
72
+
73
+ it('renders the resize icon action by default', () => {
74
+ const wrapper = shallowMount(WtDualPanel);
75
+ expect(
76
+ wrapper
77
+ .findComponent({
78
+ name: 'wt-icon-action',
79
+ })
80
+ .exists(),
81
+ ).toBe(true);
82
+ });
83
+
84
+ it('does not render the resize icon action when disableResize is true', () => {
85
+ const wrapper = shallowMount(WtDualPanel, {
86
+ props: {
87
+ disableResize: true,
88
+ },
89
+ });
90
+ expect(
91
+ wrapper
92
+ .findComponent({
93
+ name: 'wt-icon-action',
94
+ })
95
+ .exists(),
96
+ ).toBe(false);
97
+ });
98
+
99
+ it('collapses the side panel and emits the new size when the resize action is clicked', async () => {
100
+ const content = 'side content';
101
+ const wrapper = shallowMount(WtDualPanel, {
102
+ slots: {
103
+ 'side-panel': content,
104
+ },
105
+ });
106
+ expect(wrapper.find('.wt-dual-panel__side-panel--md').exists()).toBe(true);
107
+
108
+ await wrapper
109
+ .findComponent({
110
+ name: 'wt-icon-action',
111
+ })
112
+ .vm.$emit('click');
113
+
114
+ expect(wrapper.find('.wt-dual-panel__side-panel--sm').exists()).toBe(true);
115
+ expect(wrapper.text()).not.toContain(content);
116
+ expect(wrapper.emitted()['update:side-panel-size'][0]).toEqual([
117
+ ComponentSize.SM,
118
+ ]);
119
+ });
120
+ });
@@ -1,4 +1,4 @@
1
- import { shallowMount } from '@vue/test-utils';
1
+ import { mount, shallowMount } from '@vue/test-utils';
2
2
 
3
3
  import WtDummy from '../wt-dummy.vue';
4
4
 
@@ -7,4 +7,66 @@ describe('WtDummy', () => {
7
7
  const wrapper = shallowMount(WtDummy);
8
8
  expect(wrapper.isVisible()).toBe(true);
9
9
  });
10
+
11
+ it('renders default localized text when text prop is not passed', () => {
12
+ const wrapper = mount(WtDummy);
13
+ expect(wrapper.find('.wt-dummy__text').text()).toBe(
14
+ 'There are no records yet',
15
+ );
16
+ });
17
+
18
+ it('renders custom text when passed', () => {
19
+ const wrapper = mount(WtDummy, {
20
+ props: {
21
+ text: 'Custom empty message',
22
+ },
23
+ });
24
+ expect(wrapper.find('.wt-dummy__text').text()).toBe('Custom empty message');
25
+ });
26
+
27
+ it('hides text when hiddenText is true', () => {
28
+ const wrapper = mount(WtDummy, {
29
+ props: {
30
+ hiddenText: true,
31
+ },
32
+ });
33
+ expect(wrapper.find('.wt-dummy__text').exists()).toBe(false);
34
+ });
35
+
36
+ it('does not render an action button by default', () => {
37
+ const wrapper = shallowMount(WtDummy);
38
+ expect(
39
+ wrapper
40
+ .findComponent({
41
+ name: 'wt-button',
42
+ })
43
+ .exists(),
44
+ ).toBe(false);
45
+ });
46
+
47
+ it('renders an action button and emits create when clicked', async () => {
48
+ const wrapper = shallowMount(WtDummy, {
49
+ props: {
50
+ showAction: true,
51
+ },
52
+ });
53
+ const button = wrapper.findComponent({
54
+ name: 'wt-button',
55
+ });
56
+ expect(button.exists()).toBe(true);
57
+
58
+ await button.vm.$emit('click');
59
+ expect(wrapper.emitted().create).toBeTruthy();
60
+ });
61
+
62
+ it('uses the given size for the dummy image', () => {
63
+ const wrapper = mount(WtDummy, {
64
+ props: {
65
+ size: 100,
66
+ },
67
+ });
68
+ const img = wrapper.find('.wt-dummy__img img');
69
+ expect(img.attributes('width')).toBe('100');
70
+ expect(img.attributes('height')).toBe('100');
71
+ });
10
72
  });