@weni/unnnic-system 3.9.4-alpha.4 → 3.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (254) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/components/Accordion/Accordion.vue.d.ts +1 -1
  3. package/dist/components/Alert/Alert.vue.d.ts +116 -17
  4. package/dist/components/Alert/Alert.vue.d.ts.map +1 -1
  5. package/dist/components/Alert/Version1dot1.vue.d.ts +38 -2
  6. package/dist/components/Alert/Version1dot1.vue.d.ts.map +1 -1
  7. package/dist/components/AudioRecorder/AudioHandler.vue.d.ts +2 -2
  8. package/dist/components/AudioRecorder/AudioPlayer.vue.d.ts +1 -1
  9. package/dist/components/AudioRecorder/AudioRecorder.vue.d.ts +5 -5
  10. package/dist/components/AvatarIcon/AvatarIcon.vue.d.ts +3 -3
  11. package/dist/components/Banner/Banner.vue.d.ts +1 -1
  12. package/dist/components/Banner/InfoBanner.vue.d.ts +1 -1
  13. package/dist/components/Breadcrumb/Breadcrumb.vue.d.ts +1 -1
  14. package/dist/components/Button/Button.vue.d.ts +1 -1
  15. package/dist/components/Button/Button.vue.d.ts.map +1 -1
  16. package/dist/components/Button/ButtonIcon.vue.d.ts +1 -1
  17. package/dist/components/Button/types.d.ts +1 -1
  18. package/dist/components/Button/types.d.ts.map +1 -1
  19. package/dist/components/Card/AccountCard.vue.d.ts +5 -5
  20. package/dist/components/Card/BlankCard.vue.d.ts +1 -1
  21. package/dist/components/Card/Card.vue.d.ts +27 -27
  22. package/dist/components/Card/CardCompany.vue.d.ts +414 -11
  23. package/dist/components/Card/CardData.vue.d.ts +1 -1
  24. package/dist/components/Card/CardStatusesContainer.vue.d.ts +5 -5
  25. package/dist/components/Card/ContentCard.vue.d.ts +3 -3
  26. package/dist/components/Card/DashCard.vue.d.ts +5 -5
  27. package/dist/components/Card/DefaultCard.vue.d.ts +1 -1
  28. package/dist/components/Card/MarketplaceCard.vue.d.ts +2 -2
  29. package/dist/components/Card/SimpleCard.vue.d.ts +3 -3
  30. package/dist/components/Card/StatusCard.vue.d.ts +2 -2
  31. package/dist/components/Card/TitleCard.vue.d.ts +3 -3
  32. package/dist/components/CardImage/CardImage.vue.d.ts +31 -24
  33. package/dist/components/CardInformation/CardInformation.vue.d.ts +5 -5
  34. package/dist/components/CardProject/CardProject.vue.d.ts +3 -3
  35. package/dist/components/Carousel/Carousel.vue.d.ts +416 -13
  36. package/dist/components/Carousel/TagCarousel.vue.d.ts +415 -12
  37. package/dist/components/ChartBar/ChartBar.vue.d.ts +5 -5
  38. package/dist/components/ChartLine/ChartLine.vue.d.ts +1 -1
  39. package/dist/components/ChatText/ChatText.vue.d.ts +2 -2
  40. package/dist/components/ChatsContact/ChatsContact.vue.d.ts +446 -21
  41. package/dist/components/ChatsDashboardTagLive/ChatsDashboardTagLive.vue.d.ts +1 -1
  42. package/dist/components/ChatsHeader/ChatsHeader.vue.d.ts +1 -1
  43. package/dist/components/ChatsHeader/ChatsHeader.vue.d.ts.map +1 -1
  44. package/dist/components/ChatsMessage/ChatsMessage.vue.d.ts +5 -5
  45. package/dist/components/ChatsMessage/ChatsMessageStatusBackdrop.vue.d.ts +2 -2
  46. package/dist/components/ChatsNavbar/ChatsNavbar.vue.d.ts +1 -1
  47. package/dist/components/ChatsUserAvatar/ChatsUserAvatar.vue.d.ts +2 -2
  48. package/dist/components/Checkbox/Checkbox.vue.d.ts +26 -19
  49. package/dist/components/Checkbox/Checkbox.vue.d.ts.map +1 -1
  50. package/dist/components/Comment/Comment.vue.d.ts +1 -1
  51. package/dist/components/DataArea/DataArea.vue.d.ts +2 -2
  52. package/dist/components/DataTable/index.vue.d.ts +1 -1
  53. package/dist/components/DataTable/index.vue.d.ts.map +1 -1
  54. package/dist/components/DateFilter/DateFilter.vue.d.ts +41 -251
  55. package/dist/components/DatePicker/DatePicker.vue.d.ts +4 -4
  56. package/dist/components/Drawer/Drawer.vue.d.ts +4 -4
  57. package/dist/components/Dropdown/Dropdown.vue.d.ts +1 -1
  58. package/dist/components/Dropdown/LanguageSelect.vue.d.ts +3 -3
  59. package/dist/components/Flag.vue.d.ts +2 -2
  60. package/dist/components/FormElement/FormElement.vue.d.ts +28 -51
  61. package/dist/components/FormElement/FormElement.vue.d.ts.map +1 -1
  62. package/dist/components/Icon.vue.d.ts +1 -1
  63. package/dist/components/Icon.vue.d.ts.map +1 -1
  64. package/dist/components/IconLoading/IconLoading.vue.d.ts +1 -1
  65. package/dist/components/ImportCard/ImportCard.vue.d.ts +4 -4
  66. package/dist/components/Input/BaseInput.vue.d.ts +2 -33
  67. package/dist/components/Input/BaseInput.vue.d.ts.map +1 -1
  68. package/dist/components/Input/Input.vue.d.ts +41 -251
  69. package/dist/components/Input/Input.vue.d.ts.map +1 -1
  70. package/dist/components/Input/TextInput.vue.d.ts +25 -85
  71. package/dist/components/Input/TextInput.vue.d.ts.map +1 -1
  72. package/dist/components/InputDatePicker/InputDatePicker.vue.d.ts +46 -256
  73. package/dist/components/InputNext/InputNext.vue.d.ts +5 -5
  74. package/dist/components/Label/Label.vue.d.ts +15 -9
  75. package/dist/components/Label/Label.vue.d.ts.map +1 -1
  76. package/dist/components/Modal/Modal.vue.d.ts +2 -2
  77. package/dist/components/ModalDialog/ModalDialog.vue.d.ts +6 -6
  78. package/dist/components/ModalNext/ModalNext.vue.d.ts +46 -256
  79. package/dist/components/ModalUpload/ModalUpload.vue.d.ts +9 -9
  80. package/dist/components/MoodRating/MoodRating.vue.d.ts +1 -1
  81. package/dist/components/MultiSelect/MultiSelect.vue.d.ts +14 -26
  82. package/dist/components/Pagination/Pagination.vue.d.ts +3 -3
  83. package/dist/components/ProgressBar/ProgressBar.vue.d.ts +1 -1
  84. package/dist/components/Radio/Radio.vue.d.ts +6 -10
  85. package/dist/components/Radio/Radio.vue.d.ts.map +1 -1
  86. package/dist/components/SelectSmart/SelectSmart.vue.d.ts +470 -120
  87. package/dist/components/SelectSmart/SelectSmartMultipleHeader.vue.d.ts +414 -11
  88. package/dist/components/SelectSmart/SelectSmartOption.vue.d.ts +28 -21
  89. package/dist/components/SelectSmart/SelectSmartOption.vue.d.ts.map +1 -1
  90. package/dist/components/SelectTime/index.vue.d.ts +25 -85
  91. package/dist/components/SkeletonLoading/skeletonTheme.vue.d.ts +1 -1
  92. package/dist/components/Slider/Slider.vue.d.ts +2 -2
  93. package/dist/components/StarRating/StarRating.vue.d.ts +1 -1
  94. package/dist/components/Switch/Switch.vue.d.ts +21 -55
  95. package/dist/components/Switch/Switch.vue.d.ts.map +1 -1
  96. package/dist/components/Tab/Tab.vue.d.ts +2 -13
  97. package/dist/components/TableNext/TableBodyCell.vue.d.ts +2 -2
  98. package/dist/components/TableNext/TablePagination.vue.d.ts +3 -3
  99. package/dist/components/TabsExpanded/TabsExpanded.vue.d.ts +1 -1
  100. package/dist/components/Tag/BrandTag.vue.d.ts +51 -0
  101. package/dist/components/Tag/BrandTag.vue.d.ts.map +1 -0
  102. package/dist/components/Tag/DefaultTag.vue.d.ts +83 -4
  103. package/dist/components/Tag/DefaultTag.vue.d.ts.map +1 -1
  104. package/dist/components/Tag/IndicatorTag.vue.d.ts +151 -0
  105. package/dist/components/Tag/IndicatorTag.vue.d.ts.map +1 -0
  106. package/dist/components/Tag/Tag.vue.d.ts +414 -12
  107. package/dist/components/Tag/Tag.vue.d.ts.map +1 -1
  108. package/dist/components/Tag/TagNext.vue.d.ts +24 -0
  109. package/dist/components/Tag/TagNext.vue.d.ts.map +1 -0
  110. package/dist/components/TextArea/TextArea.vue.d.ts +33 -78
  111. package/dist/components/TextArea/TextArea.vue.d.ts.map +1 -1
  112. package/dist/components/ToolTip/ToolTip.vue.d.ts +1 -1
  113. package/dist/components/Tour/Tour.vue.d.ts +3 -3
  114. package/dist/components/Tour/TourPopover.vue.d.ts +3 -3
  115. package/dist/components/UploadArea/UploadArea.vue.d.ts +4 -4
  116. package/dist/components/index.d.ts +7677 -6315
  117. package/dist/components/index.d.ts.map +1 -1
  118. package/dist/components/ui/popover/PopoverContent.vue.d.ts +1 -1
  119. package/dist/components/ui/popover/PopoverContent.vue.d.ts.map +1 -1
  120. package/dist/{es-bdfb773f.mjs → es-4b899f97.mjs} +1 -1
  121. package/dist/{index-8ce04c5b.mjs → index-23489897.mjs} +8813 -9354
  122. package/dist/locales/en.json.d.ts +1 -2
  123. package/dist/locales/es.json.d.ts +1 -2
  124. package/dist/locales/pt_br.json.d.ts +1 -2
  125. package/dist/{pt-br-4befdd13.mjs → pt-br-5a914a63.mjs} +1 -1
  126. package/dist/style.css +1 -1
  127. package/dist/unnnic.mjs +173 -181
  128. package/dist/unnnic.umd.js +36 -35
  129. package/dist/utils/call.d.ts +1 -2
  130. package/dist/utils/call.d.ts.map +1 -1
  131. package/package.json +2 -2
  132. package/src/assets/scss/scheme-colors.scss +223 -309
  133. package/src/components/Alert/Alert.vue +135 -26
  134. package/src/components/Alert/AlertBanner.vue +182 -0
  135. package/src/components/Alert/AlertCaller.vue +49 -0
  136. package/src/components/Alert/Version1dot1.vue +36 -0
  137. package/src/components/Alert/__tests__/Alert.spec.js +45 -2
  138. package/src/components/Alert/__tests__/AlertBanner.spec.js +89 -0
  139. package/src/components/Alert/__tests__/AlertCaller.spec.js +98 -0
  140. package/src/components/Alert/__tests__/Version1dot1.spec.js +21 -0
  141. package/src/components/Alert/__tests__/__snapshots__/Alert.spec.js.snap +7 -11
  142. package/src/components/Alert/__tests__/__snapshots__/AlertBanner.spec.js.snap +2 -2
  143. package/src/components/Alert/__tests__/__snapshots__/Version1dot1.spec.js.snap +1 -1
  144. package/src/components/Button/Button.vue +117 -67
  145. package/src/components/Button/types.ts +1 -0
  146. package/src/components/ChatsContact/ChatsContact.vue +6 -10
  147. package/src/components/Checkbox/Checkbox.vue +65 -117
  148. package/src/components/Checkbox/__tests__/Checkbox.spec.js +21 -6
  149. package/src/components/FormElement/FormElement.vue +93 -63
  150. package/src/components/Icon.vue +0 -2
  151. package/src/components/Input/BaseInput.vue +14 -33
  152. package/src/components/Input/Input.scss +22 -22
  153. package/src/components/Input/Input.vue +56 -79
  154. package/src/components/Input/TextInput.vue +65 -81
  155. package/src/components/Input/__test__/Input.spec.js +33 -13
  156. package/src/components/Input/__test__/TextInput.spec.js +8 -6
  157. package/src/components/Input/__test__/__snapshots__/Input.spec.js.snap +4 -17
  158. package/src/components/Input/__test__/__snapshots__/TextInput.spec.js.snap +1 -7
  159. package/src/components/Label/Label.vue +21 -52
  160. package/src/components/Label/__tests__/Label.spec.js +1 -1
  161. package/src/components/Label/__tests__/__snapshots__/Label.spec.js.snap +1 -1
  162. package/src/components/Radio/Radio.vue +66 -118
  163. package/src/components/Radio/__test__/Radio.spec.js +20 -14
  164. package/src/components/Radio/__test__/__snapshots__/Radio.spec.js.snap +3 -4
  165. package/src/components/SelectSmart/SelectSmart.vue +3 -4
  166. package/src/components/Switch/Switch.vue +91 -132
  167. package/src/components/Switch/__tests__/Switch.spec.js +75 -8
  168. package/src/components/Switch/__tests__/__snapshots__/Switch.spec.js.snap +6 -5
  169. package/src/components/Tab/Tab.vue +23 -37
  170. package/src/components/Tab/__test__/__snapshots__/Tab.spec.js.snap +1 -1
  171. package/src/components/TableNext/__test__/__snapshots__/TableNext.spec.js.snap +2 -2
  172. package/src/components/TableNext/__test__/__snapshots__/TablePagination.spec.js.snap +2 -2
  173. package/src/components/Tag/BrandTag.vue +96 -0
  174. package/src/components/Tag/DefaultTag.vue +107 -51
  175. package/src/components/Tag/IndicatorTag.vue +107 -0
  176. package/src/components/Tag/Tag.vue +79 -32
  177. package/src/components/Tag/TagNext.vue +60 -0
  178. package/src/components/TextArea/TextArea.vue +12 -41
  179. package/src/components/TextArea/__test__/__snapshots__/TextArea.spec.js.snap +3 -11
  180. package/src/components/index.ts +17 -33
  181. package/src/locales/en.json +1 -2
  182. package/src/locales/es.json +1 -2
  183. package/src/locales/pt_br.json +1 -2
  184. package/src/stories/Alert.stories.js +67 -6
  185. package/src/stories/Button.stories.js +39 -29
  186. package/src/stories/Checkbox.stories.js +4 -11
  187. package/src/stories/Input.stories.js +76 -71
  188. package/src/stories/Label.stories.js +0 -7
  189. package/src/stories/Radio.stories.js +1 -28
  190. package/src/stories/Switch.stories.js +5 -10
  191. package/src/stories/Tab.stories.js +4 -11
  192. package/src/stories/Tag.stories.js +43 -24
  193. package/src/stories/TextArea.stories.js +2 -14
  194. package/src/types/scheme-colors.d.ts +0 -1
  195. package/src/utils/call.js +18 -46
  196. package/dist/assets/tokens/colors.json.d.ts +0 -376
  197. package/dist/components/CheckboxGroup/CheckboxGroup.vue.d.ts +0 -28
  198. package/dist/components/CheckboxGroup/CheckboxGroup.vue.d.ts.map +0 -1
  199. package/dist/components/PageHeader/PageHeader.vue.d.ts +0 -28
  200. package/dist/components/PageHeader/PageHeader.vue.d.ts.map +0 -1
  201. package/dist/components/PageHeader/index.d.ts +0 -3
  202. package/dist/components/PageHeader/index.d.ts.map +0 -1
  203. package/dist/components/PageHeader/types.d.ts +0 -9
  204. package/dist/components/PageHeader/types.d.ts.map +0 -1
  205. package/dist/components/Tag/types.d.ts +0 -18
  206. package/dist/components/Tag/types.d.ts.map +0 -1
  207. package/dist/components/Toast/Toast.vue.d.ts +0 -16
  208. package/dist/components/Toast/Toast.vue.d.ts.map +0 -1
  209. package/dist/components/Toast/ToastManager.d.ts +0 -14
  210. package/dist/components/Toast/ToastManager.d.ts.map +0 -1
  211. package/dist/components/Toast/types.d.ts +0 -35
  212. package/dist/components/Toast/types.d.ts.map +0 -1
  213. package/src/assets/icons/checkbox-checked-disabled.svg +0 -3
  214. package/src/assets/icons/checkbox-checked.svg +0 -3
  215. package/src/assets/icons/checkbox-less-disabled.svg +0 -3
  216. package/src/assets/icons/checkbox-less.svg +0 -3
  217. package/src/assets/icons/radio-checked.svg +0 -3
  218. package/src/assets/icons/switch-checked-disabled.svg +0 -3
  219. package/src/assets/icons/switch-checked.svg +0 -3
  220. package/src/components/CheckboxGroup/CheckboxGroup.vue +0 -96
  221. package/src/components/MultiSelectV2/MultSelectOption.vue +0 -67
  222. package/src/components/MultiSelectV2/__tests__/MultiSelect.spec.js +0 -556
  223. package/src/components/MultiSelectV2/__tests__/MultiSelectOption.spec.js +0 -229
  224. package/src/components/MultiSelectV2/__tests__/__snapshots__/MultiSelect.spec.js.snap +0 -121
  225. package/src/components/MultiSelectV2/__tests__/__snapshots__/MultiSelectOption.spec.js.snap +0 -51
  226. package/src/components/MultiSelectV2/index.vue +0 -221
  227. package/src/components/PageHeader/PageHeader.vue +0 -148
  228. package/src/components/PageHeader/index.ts +0 -2
  229. package/src/components/PageHeader/types.ts +0 -10
  230. package/src/components/Popover/__tests__/Popover.spec.js +0 -147
  231. package/src/components/Popover/__tests__/__snapshots__/Popover.spec.js.snap +0 -8
  232. package/src/components/Popover/index.vue +0 -146
  233. package/src/components/RadioGroup/RadioGroup.vue +0 -142
  234. package/src/components/Select/SelectOption.vue +0 -65
  235. package/src/components/Select/__tests__/Select.spec.js +0 -412
  236. package/src/components/Select/__tests__/SelectItem.spec.js +0 -330
  237. package/src/components/Select/__tests__/SelectOption.spec.js +0 -174
  238. package/src/components/Select/__tests__/__snapshots__/Select.spec.js.snap +0 -97
  239. package/src/components/Select/__tests__/__snapshots__/SelectItem.spec.js.snap +0 -15
  240. package/src/components/Select/__tests__/__snapshots__/SelectOption.spec.js.snap +0 -25
  241. package/src/components/Select/index.vue +0 -249
  242. package/src/components/Tag/types.ts +0 -19
  243. package/src/components/Toast/Toast.vue +0 -246
  244. package/src/components/Toast/ToastManager.ts +0 -110
  245. package/src/components/Toast/__tests__/Toast.spec.js +0 -291
  246. package/src/components/Toast/__tests__/ToastManager.spec.js +0 -294
  247. package/src/components/Toast/types.ts +0 -57
  248. package/src/stories/CheckboxGroup.stories.js +0 -105
  249. package/src/stories/MultiSelectV2.stories.js +0 -158
  250. package/src/stories/PageHeader.stories.js +0 -330
  251. package/src/stories/RadioGroup.stories.js +0 -144
  252. package/src/stories/Select.stories.js +0 -158
  253. package/src/stories/Toast.mdx +0 -123
  254. package/src/stories/Toast.stories.js +0 -126
@@ -1,556 +0,0 @@
1
- import { mount } from '@vue/test-utils';
2
- import { beforeEach, describe, expect, afterEach, test, vi } from 'vitest';
3
- import UnnnicMultiSelect from '../index.vue';
4
-
5
- vi.mock('../../mixins/i18n', () => ({
6
- default: {
7
- methods: {
8
- $t: (key) => key,
9
- },
10
- },
11
- }));
12
-
13
- describe('UnnnicMultiSelect.vue', () => {
14
- let wrapper;
15
-
16
- const defaultProps = {
17
- options: [
18
- { label: 'Option 1', value: 'option1' },
19
- { label: 'Option 2', value: 'option2' },
20
- { label: 'Option 3', value: 'option3' },
21
- ],
22
- modelValue: [],
23
- };
24
-
25
- const mountWrapper = (props = {}, slots = {}) => {
26
- return mount(UnnnicMultiSelect, {
27
- props: {
28
- ...defaultProps,
29
- ...props,
30
- },
31
- global: {
32
- mocks: {
33
- $t: (key) => key,
34
- },
35
- },
36
- slots,
37
- });
38
- };
39
-
40
- beforeEach(() => {
41
- wrapper = mountWrapper();
42
- });
43
-
44
- afterEach(() => {
45
- wrapper?.unmount();
46
- });
47
-
48
- describe('rendering', () => {
49
- test('renders correctly', () => {
50
- expect(wrapper.exists()).toBe(true);
51
- expect(wrapper.find('.unnnic-multi-select').exists()).toBe(true);
52
- });
53
-
54
- test('renders input component', () => {
55
- const input = wrapper.findComponent({ name: 'UnnnicInput' });
56
- expect(input.exists()).toBe(true);
57
- });
58
-
59
- test('renders popover component', () => {
60
- const popover = wrapper.findComponent({ name: 'UnnnicPopover' });
61
- expect(popover.exists()).toBe(true);
62
- });
63
-
64
- test('renders select options when popover is open', async () => {
65
- wrapper.vm.openPopover = true;
66
- await wrapper.vm.$nextTick();
67
- const options = wrapper.findAllComponents({
68
- name: 'UnnnicMultiSelectOption',
69
- });
70
- expect(options.length).toBe(3);
71
- });
72
- });
73
-
74
- describe('props validation', () => {
75
- test('validates required options prop', () => {
76
- const { options } = wrapper.vm.$options.props;
77
- expect(options.required).toBe(true);
78
- });
79
-
80
- test('validates required modelValue prop', () => {
81
- const { modelValue } = wrapper.vm.$options.props;
82
- expect(modelValue.required).toBe(true);
83
- });
84
-
85
- test('applies default values correctly', () => {
86
- expect(wrapper.vm.size).toBe('md');
87
- expect(wrapper.vm.type).toBe('normal');
88
- expect(wrapper.vm.placeholder).toBe('');
89
- expect(wrapper.vm.optionsLines).toBe(5);
90
- expect(wrapper.vm.returnObject).toBe(false);
91
- expect(wrapper.vm.itemLabel).toBe('label');
92
- expect(wrapper.vm.itemValue).toBe('value');
93
- expect(wrapper.vm.locale).toBe('en');
94
- expect(wrapper.vm.enableSearch).toBe(false);
95
- expect(wrapper.vm.disabled).toBe(false);
96
- });
97
- });
98
-
99
- describe('input display', () => {
100
- test('displays placeholder when no option is selected', () => {
101
- const input = wrapper.findComponent({ name: 'UnnnicInput' });
102
- expect(input.props('placeholder')).toBe('');
103
- });
104
-
105
- test('displays selected option labels', async () => {
106
- await wrapper.setProps({ modelValue: ['option1'] });
107
- const input = wrapper.findComponent({ name: 'UnnnicInput' });
108
- expect(input.props('modelValue')).toBe('Option 1');
109
- });
110
-
111
- test('displays multiple selected option labels separated by comma', async () => {
112
- await wrapper.setProps({ modelValue: ['option1', 'option2'] });
113
- const input = wrapper.findComponent({ name: 'UnnnicInput' });
114
- expect(input.props('modelValue')).toBe('Option 1, Option 2');
115
- });
116
-
117
- test('displays custom placeholder', async () => {
118
- await wrapper.setProps({ placeholder: 'Select an option' });
119
- const input = wrapper.findComponent({ name: 'UnnnicInput' });
120
- expect(input.props('placeholder')).toBe('Select an option');
121
- });
122
-
123
- test('input is readonly', () => {
124
- const input = wrapper.findComponent({ name: 'UnnnicInput' });
125
- expect(input.props('readonly')).toBe(true);
126
- });
127
-
128
- test('input shows correct icon based on popover state', async () => {
129
- const input = wrapper.findComponent({ name: 'UnnnicInput' });
130
-
131
- expect(input.props('iconRight')).toBe('keyboard_arrow_down');
132
-
133
- wrapper.vm.openPopover = true;
134
- await wrapper.vm.$nextTick();
135
- expect(input.props('iconRight')).toBe('keyboard_arrow_up');
136
- });
137
- });
138
-
139
- describe('option selection', () => {
140
- test('emits update:modelValue with array when option is selected', async () => {
141
- wrapper.vm.openPopover = true;
142
- await wrapper.vm.$nextTick();
143
- const options = wrapper.findAllComponents({
144
- name: 'UnnnicMultiSelectOption',
145
- });
146
-
147
- await options[0].vm.$emit('update:model-value', true);
148
-
149
- expect(wrapper.emitted('update:modelValue')).toBeTruthy();
150
- expect(wrapper.emitted('update:modelValue')[0]).toEqual([['option1']]);
151
- });
152
-
153
- test('adds option to existing selection', async () => {
154
- await wrapper.setProps({ modelValue: ['option1'] });
155
- wrapper.vm.openPopover = true;
156
- await wrapper.vm.$nextTick();
157
- const options = wrapper.findAllComponents({
158
- name: 'UnnnicMultiSelectOption',
159
- });
160
-
161
- await options[1].vm.$emit('update:model-value', true);
162
-
163
- expect(wrapper.emitted('update:modelValue')).toBeTruthy();
164
- expect(wrapper.emitted('update:modelValue')[0]).toEqual([
165
- ['option1', 'option2'],
166
- ]);
167
- });
168
-
169
- test('removes option from selection when unselected', async () => {
170
- await wrapper.setProps({ modelValue: ['option1', 'option2'] });
171
- wrapper.vm.openPopover = true;
172
- await wrapper.vm.$nextTick();
173
- const options = wrapper.findAllComponents({
174
- name: 'UnnnicMultiSelectOption',
175
- });
176
-
177
- await options[0].vm.$emit('update:model-value', false);
178
-
179
- expect(wrapper.emitted('update:modelValue')).toBeTruthy();
180
- expect(wrapper.emitted('update:modelValue')[0]).toEqual([['option2']]);
181
- });
182
-
183
- test('emits object array when returnObject is true', async () => {
184
- await wrapper.setProps({ returnObject: true, modelValue: [] });
185
- wrapper.vm.openPopover = true;
186
- await wrapper.vm.$nextTick();
187
- const options = wrapper.findAllComponents({
188
- name: 'UnnnicMultiSelectOption',
189
- });
190
-
191
- await options[0].vm.$emit('update:model-value', true);
192
-
193
- expect(wrapper.emitted('update:modelValue')[0]).toEqual([
194
- [{ label: 'Option 1', value: 'option1' }],
195
- ]);
196
- });
197
-
198
- test('removes object from selection when returnObject is true', async () => {
199
- await wrapper.setProps({
200
- returnObject: true,
201
- modelValue: [{ label: 'Option 1', value: 'option1' }],
202
- });
203
- wrapper.vm.openPopover = true;
204
- await wrapper.vm.$nextTick();
205
- const options = wrapper.findAllComponents({
206
- name: 'UnnnicMultiSelectOption',
207
- });
208
-
209
- await options[0].vm.$emit('update:model-value', false);
210
-
211
- expect(wrapper.emitted('update:modelValue')).toBeTruthy();
212
- expect(wrapper.emitted('update:modelValue')[0]).toEqual([[]]);
213
- });
214
-
215
- test('does not emit when disabled option is clicked', async () => {
216
- const disabledOptions = [
217
- { label: 'Option 1', value: 'option1' },
218
- { label: 'Disabled Option', value: 'disabled', disabled: true },
219
- ];
220
-
221
- await wrapper.setProps({ options: disabledOptions });
222
- wrapper.vm.openPopover = true;
223
- await wrapper.vm.$nextTick();
224
- const options = wrapper.findAllComponents({
225
- name: 'UnnnicMultiSelectOption',
226
- });
227
-
228
- expect(options[1].props('disabled')).toBe(true);
229
- });
230
- });
231
-
232
- describe('search functionality', () => {
233
- test('renders search input when enableSearch is true', async () => {
234
- await wrapper.setProps({ enableSearch: true });
235
- wrapper.vm.openPopover = true;
236
- await wrapper.vm.$nextTick();
237
- const searchInputs = wrapper.findAllComponents({ name: 'UnnnicInput' });
238
- expect(searchInputs.length).toBe(2);
239
- });
240
-
241
- test('does not render search input when enableSearch is false', async () => {
242
- await wrapper.setProps({ enableSearch: false });
243
- const searchInputs = wrapper.findAllComponents({ name: 'UnnnicInput' });
244
- expect(searchInputs.length).toBe(1);
245
- });
246
-
247
- test('emits update:search when search input changes', async () => {
248
- await wrapper.setProps({ enableSearch: true });
249
- wrapper.vm.openPopover = true;
250
- await wrapper.vm.$nextTick();
251
- const searchInput = wrapper.findAllComponents({ name: 'UnnnicInput' })[1];
252
-
253
- await searchInput.vm.$emit('update:modelValue', 'test search');
254
-
255
- expect(wrapper.emitted('update:search')).toBeTruthy();
256
- expect(wrapper.emitted('update:search')[0]).toEqual(['test search']);
257
- });
258
-
259
- test('filters options based on search term', async () => {
260
- await wrapper.setProps({ enableSearch: true, search: 'Option 1' });
261
-
262
- const filteredOptions = wrapper.vm.filteredOptions;
263
- expect(filteredOptions.length).toBe(1);
264
- expect(filteredOptions[0].label).toBe('Option 1');
265
- });
266
-
267
- test('filters options by both label and value', async () => {
268
- await wrapper.setProps({ enableSearch: true, search: 'option1' });
269
-
270
- const filteredOptions = wrapper.vm.filteredOptions;
271
- expect(filteredOptions.length).toBe(1);
272
- expect(filteredOptions[0].value).toBe('option1');
273
- });
274
-
275
- test('shows all options when search is empty', async () => {
276
- await wrapper.setProps({ enableSearch: true, search: '' });
277
-
278
- const filteredOptions = wrapper.vm.filteredOptions;
279
- expect(filteredOptions.length).toBe(3);
280
- });
281
- });
282
-
283
- describe('computed properties', () => {
284
- test('calculatedMaxHeight returns correct value', () => {
285
- const maxHeight = wrapper.vm.calculatedMaxHeight;
286
- expect(maxHeight).toBe('228px');
287
- });
288
-
289
- test('calculatedMaxHeight includes search height when enabled', async () => {
290
- await wrapper.setProps({ enableSearch: true });
291
- const maxHeight = wrapper.vm.calculatedMaxHeight;
292
- expect(maxHeight).toBe('295px');
293
- });
294
-
295
- test('calculatedMaxHeight returns unset when no options', async () => {
296
- await wrapper.setProps({ options: [] });
297
- const maxHeight = wrapper.vm.calculatedMaxHeight;
298
- expect(maxHeight).toBe('unset');
299
- });
300
-
301
- test('selectedItems returns correct items for returnObject false', async () => {
302
- await wrapper.setProps({ modelValue: ['option2'] });
303
- const selectedItems = wrapper.vm.selectedItems;
304
- expect(selectedItems.length).toBe(1);
305
- expect(selectedItems[0].label).toBe('Option 2');
306
- expect(selectedItems[0].value).toBe('option2');
307
- });
308
-
309
- test('selectedItems returns multiple items', async () => {
310
- await wrapper.setProps({ modelValue: ['option1', 'option2'] });
311
- const selectedItems = wrapper.vm.selectedItems;
312
- expect(selectedItems.length).toBe(2);
313
- expect(selectedItems[0].label).toBe('Option 1');
314
- expect(selectedItems[1].label).toBe('Option 2');
315
- });
316
-
317
- test('selectedItems returns modelValue for returnObject true', async () => {
318
- const selectedOptions = [
319
- { label: 'Option 2', value: 'option2' },
320
- { label: 'Option 3', value: 'option3' },
321
- ];
322
- await wrapper.setProps({
323
- returnObject: true,
324
- modelValue: selectedOptions,
325
- });
326
- const selectedItems = wrapper.vm.selectedItems;
327
- expect(selectedItems).toStrictEqual(selectedOptions);
328
- });
329
-
330
- test('selectedItems handles returnObject false with array of values', async () => {
331
- await wrapper.setProps({
332
- returnObject: false,
333
- modelValue: ['option1', 'option2'],
334
- });
335
- const selectedItems = wrapper.vm.selectedItems;
336
- expect(selectedItems.length).toBe(2);
337
- expect(selectedItems[0].value).toBe('option1');
338
- expect(selectedItems[1].value).toBe('option2');
339
- });
340
-
341
- test('selectedItems with returnObject true and array of objects in modelValue', async () => {
342
- const modelValueObjects = [
343
- { label: 'Option 1', value: 'option1' },
344
- { label: 'Option 2', value: 'option2' },
345
- ];
346
- await wrapper.setProps({
347
- returnObject: true,
348
- modelValue: modelValueObjects,
349
- });
350
- const selectedItems = wrapper.vm.selectedItems;
351
-
352
- expect(selectedItems).toStrictEqual(modelValueObjects);
353
- });
354
-
355
- test('selectedItems handles modelValue as array of objects when returnObject is false', async () => {
356
- const optionsWithCustomKeys = [
357
- { name: 'Custom 1', id: 'custom1' },
358
- { name: 'Custom 2', id: 'custom2' },
359
- ];
360
- await wrapper.setProps({
361
- returnObject: false,
362
- options: optionsWithCustomKeys,
363
- itemLabel: 'name',
364
- itemValue: 'id',
365
- modelValue: ['custom1'],
366
- });
367
- const selectedItems = wrapper.vm.selectedItems;
368
-
369
- expect(selectedItems.length).toBe(1);
370
- expect(selectedItems[0].id).toBe('custom1');
371
- expect(selectedItems[0].name).toBe('Custom 1');
372
- });
373
-
374
- test('inputValue returns correct labels separated by comma', async () => {
375
- await wrapper.setProps({ modelValue: ['option3'] });
376
- const inputValue = wrapper.vm.inputValue;
377
- expect(inputValue).toBe('Option 3');
378
- });
379
-
380
- test('inputValue returns multiple labels separated by comma', async () => {
381
- await wrapper.setProps({ modelValue: ['option1', 'option2', 'option3'] });
382
- const inputValue = wrapper.vm.inputValue;
383
- expect(inputValue).toBe('Option 1, Option 2, Option 3');
384
- });
385
-
386
- test('inputValue returns empty string when no selection', () => {
387
- const inputValue = wrapper.vm.inputValue;
388
- expect(inputValue).toBe('');
389
- });
390
- });
391
-
392
- describe('disabled state', () => {
393
- test('passes disabled prop to input', async () => {
394
- await wrapper.setProps({ disabled: true });
395
- const input = wrapper.findComponent({ name: 'UnnnicInput' });
396
- expect(input.props('disabled')).toBe(true);
397
- });
398
-
399
- test('input is not disabled by default', () => {
400
- const input = wrapper.findComponent({ name: 'UnnnicInput' });
401
- expect(input.props('disabled')).toBe(false);
402
- });
403
- });
404
-
405
- describe('size prop', () => {
406
- test('passes size prop to input', async () => {
407
- await wrapper.setProps({ size: 'sm' });
408
- const input = wrapper.findComponent({ name: 'UnnnicInput' });
409
- expect(input.props('size')).toBe('sm');
410
- });
411
-
412
- test('defaults to md size', () => {
413
- const input = wrapper.findComponent({ name: 'UnnnicInput' });
414
- expect(input.props('size')).toBe('md');
415
- });
416
- });
417
-
418
- describe('label and message props', () => {
419
- test('passes label prop to input', async () => {
420
- await wrapper.setProps({ label: 'Select Label' });
421
- const input = wrapper.findComponent({ name: 'UnnnicInput' });
422
- expect(input.props('label')).toBe('Select Label');
423
- });
424
-
425
- test('passes message prop to input', async () => {
426
- await wrapper.setProps({ message: 'Select Message' });
427
- const input = wrapper.findComponent({ name: 'UnnnicInput' });
428
- expect(input.props('message')).toBe('Select Message');
429
- });
430
-
431
- test('passes errors prop to input', async () => {
432
- await wrapper.setProps({ errors: 'Error message' });
433
- const input = wrapper.findComponent({ name: 'UnnnicInput' });
434
- expect(input.props('errors')).toBe('Error message');
435
- });
436
- });
437
-
438
- describe('custom item keys', () => {
439
- test('uses custom itemLabel and itemValue', async () => {
440
- const customOptions = [
441
- { name: 'Custom 1', id: 'custom1' },
442
- { name: 'Custom 2', id: 'custom2' },
443
- ];
444
-
445
- await wrapper.setProps({
446
- options: customOptions,
447
- itemLabel: 'name',
448
- itemValue: 'id',
449
- modelValue: 'custom1',
450
- });
451
-
452
- const inputValue = wrapper.vm.inputValue;
453
- expect(inputValue).toBe('Custom 1');
454
- });
455
- });
456
-
457
- describe('edge cases', () => {
458
- test('handles empty options array', async () => {
459
- await wrapper.setProps({ options: [] });
460
- expect(wrapper.vm.filteredOptions).toEqual([]);
461
- expect(wrapper.vm.calculatedMaxHeight).toBe('unset');
462
- });
463
-
464
- test('handles empty modelValue array', async () => {
465
- await wrapper.setProps({ modelValue: [] });
466
- expect(wrapper.vm.inputValue).toBe('');
467
- expect(wrapper.vm.selectedItems).toEqual([]);
468
- });
469
-
470
- test('handles case insensitive search', async () => {
471
- await wrapper.setProps({ enableSearch: true, search: 'OPTION 1' });
472
- const filteredOptions = wrapper.vm.filteredOptions;
473
- expect(filteredOptions.length).toBe(1);
474
- expect(filteredOptions[0].label).toBe('Option 1');
475
- });
476
-
477
- test('handles partial search matches', async () => {
478
- await wrapper.setProps({ enableSearch: true, search: 'tion' });
479
- const filteredOptions = wrapper.vm.filteredOptions;
480
- expect(filteredOptions.length).toBe(3);
481
- });
482
- });
483
-
484
- describe('component structure', () => {
485
- test('has correct component name', () => {
486
- expect(wrapper.vm.$options.name).toBe('UnnnicMultiSelect');
487
- });
488
- });
489
-
490
- describe('clear functionality', () => {
491
- test('emits empty array when clear button is clicked', async () => {
492
- await wrapper.setProps({ modelValue: ['option1', 'option2'] });
493
- const input = wrapper.findComponent({ name: 'UnnnicInput' });
494
-
495
- await input.vm.$emit('clear');
496
-
497
- expect(wrapper.emitted('update:modelValue')).toBeTruthy();
498
- expect(wrapper.emitted('update:modelValue')[0]).toEqual([[]]);
499
- });
500
- });
501
-
502
- describe('getActivatedOptionStatus', () => {
503
- test('returns true when option is in modelValue array', async () => {
504
- await wrapper.setProps({ modelValue: ['option1'] });
505
- wrapper.vm.openPopover = true;
506
- await wrapper.vm.$nextTick();
507
- const options = wrapper.findAllComponents({
508
- name: 'UnnnicMultiSelectOption',
509
- });
510
-
511
- expect(options[0].props('active')).toBe(true);
512
- expect(options[1].props('active')).toBe(false);
513
- });
514
-
515
- test('returns true when option object is in modelValue array with returnObject true', async () => {
516
- await wrapper.setProps({
517
- returnObject: true,
518
- modelValue: [{ label: 'Option 1', value: 'option1' }],
519
- });
520
- wrapper.vm.openPopover = true;
521
- await wrapper.vm.$nextTick();
522
- const options = wrapper.findAllComponents({
523
- name: 'UnnnicMultiSelectOption',
524
- });
525
-
526
- expect(options[0].props('active')).toBeTruthy();
527
- expect(options[1].props('active')).toBeFalsy();
528
- });
529
- });
530
-
531
- describe('snapshot testing', () => {
532
- test('matches snapshot with default props', () => {
533
- expect(wrapper.html()).toMatchSnapshot();
534
- });
535
-
536
- test('matches snapshot with selected values', async () => {
537
- await wrapper.setProps({ modelValue: ['option1'] });
538
- expect(wrapper.html()).toMatchSnapshot();
539
- });
540
-
541
- test('matches snapshot with multiple selected values', async () => {
542
- await wrapper.setProps({ modelValue: ['option1', 'option2'] });
543
- expect(wrapper.html()).toMatchSnapshot();
544
- });
545
-
546
- test('matches snapshot with search enabled', async () => {
547
- await wrapper.setProps({ enableSearch: true });
548
- expect(wrapper.html()).toMatchSnapshot();
549
- });
550
-
551
- test('matches snapshot with disabled state', async () => {
552
- await wrapper.setProps({ disabled: true });
553
- expect(wrapper.html()).toMatchSnapshot();
554
- });
555
- });
556
- });