@weni/unnnic-system 3.12.3-alpha.5 → 3.12.3
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 +10 -0
- package/dist/components/Alert/Alert.vue.d.ts +3 -3
- package/dist/components/Alert/Version1dot1.vue.d.ts +1 -1
- package/dist/components/AudioRecorder/AudioHandler.vue.d.ts +18 -92
- package/dist/components/AudioRecorder/AudioRecorder.vue.d.ts +36 -184
- package/dist/components/AvatarIcon/AvatarIcon.vue.d.ts +1 -1
- package/dist/components/Button/Button.vue.d.ts +2 -2
- package/dist/components/Card/AccountCard.vue.d.ts +2 -2
- package/dist/components/Card/Card.vue.d.ts +29 -103
- package/dist/components/Card/CardCompany.vue.d.ts +2 -2
- package/dist/components/Card/CardStatusesContainer.vue.d.ts +19 -93
- package/dist/components/Card/ContentCard.vue.d.ts +1 -1
- package/dist/components/Card/DashCard.vue.d.ts +2 -2
- package/dist/components/Card/DefaultCard.vue.d.ts +1 -1
- package/dist/components/Card/MarketplaceCard.vue.d.ts +1 -1
- package/dist/components/Card/SimpleCard.vue.d.ts +18 -92
- package/dist/components/Card/StatusCard.vue.d.ts +1 -1
- package/dist/components/Card/TitleCard.vue.d.ts +18 -92
- package/dist/components/CardImage/CardImage.vue.d.ts +5 -5
- package/dist/components/CardInformation/CardInformation.vue.d.ts +19 -93
- package/dist/components/CardProject/CardProject.vue.d.ts +2 -2
- package/dist/components/Carousel/Carousel.vue.d.ts +2 -2
- package/dist/components/Carousel/TagCarousel.vue.d.ts +2 -2
- package/dist/components/ChartBar/ChartBar.vue.d.ts +24 -98
- package/dist/components/ChartLine/ChartLine.vue.d.ts +18 -92
- package/dist/components/ChatText/ChatText.vue.d.ts +18 -92
- package/dist/components/ChatsContact/ChatsContact.vue.d.ts +6 -6
- package/dist/components/ChatsMessage/ChatsMessage.vue.d.ts +18 -92
- package/dist/components/ChatsUserAvatar/ChatsUserAvatar.vue.d.ts +1 -1
- package/dist/components/Checkbox/Checkbox.vue.d.ts +3 -3
- package/dist/components/DataArea/DataArea.vue.d.ts +18 -92
- package/dist/components/DataTable/index.vue.d.ts +1 -1
- package/dist/components/DataTable/index.vue.d.ts.map +1 -1
- package/dist/components/DateFilter/DateFilter.vue.d.ts +16 -122
- package/dist/components/Disclaimer/Disclaimer.vue.d.ts +3 -6
- package/dist/components/Disclaimer/Disclaimer.vue.d.ts.map +1 -1
- package/dist/components/Disclaimer/DisclaimerV2.vue.d.ts +8 -0
- package/dist/components/Disclaimer/DisclaimerV2.vue.d.ts.map +1 -0
- package/dist/components/Disclaimer/types-v2.d.ts +7 -0
- package/dist/components/Disclaimer/types-v2.d.ts.map +1 -0
- package/dist/components/Disclaimer/types.d.ts +3 -6
- package/dist/components/Disclaimer/types.d.ts.map +1 -1
- package/dist/components/Drawer/Drawer.vue.d.ts +207 -37
- package/dist/components/Drawer/Drawer.vue.d.ts.map +1 -1
- package/dist/components/Dropdown/Dropdown.vue.d.ts +1 -1
- package/dist/components/FormElement/FormElement.vue.d.ts +6 -6
- package/dist/components/ImportCard/ImportCard.vue.d.ts +6 -6
- package/dist/components/Input/BaseInput.vue.d.ts +0 -31
- package/dist/components/Input/BaseInput.vue.d.ts.map +1 -1
- package/dist/components/Input/Input.vue.d.ts +15 -121
- package/dist/components/Input/Input.vue.d.ts.map +1 -1
- package/dist/components/Input/TextInput.vue.d.ts +4 -73
- package/dist/components/Input/TextInput.vue.d.ts.map +1 -1
- package/dist/components/InputNext/InputNext.vue.d.ts +4 -4
- package/dist/components/Label/Label.vue.d.ts +1 -1
- package/dist/components/Label/Label.vue.d.ts.map +1 -1
- package/dist/components/Modal/Modal.vue.d.ts +1 -1
- package/dist/components/ModalDialog/ModalDialog.vue.d.ts +35 -209
- package/dist/components/ModalDialog/ModalDialog.vue.d.ts.map +1 -1
- package/dist/components/ModalNext/ModalNext.vue.d.ts +21 -127
- package/dist/components/ModalUpload/ModalUpload.vue.d.ts +12 -12
- package/dist/components/MoodRating/MoodRating.vue.d.ts +18 -92
- package/dist/components/MultiSelect/MultiSelect.vue.d.ts +163 -0
- package/dist/components/MultiSelect/MultiSelect.vue.d.ts.map +1 -0
- package/dist/components/Pagination/Pagination.vue.d.ts +6 -6
- package/dist/components/Radio/Radio.vue.d.ts +6 -6
- package/dist/components/SelectSmart/SelectSmart.vue.d.ts +13 -82
- package/dist/components/SelectSmart/SelectSmartMultipleHeader.vue.d.ts +2 -2
- package/dist/components/SelectSmart/SelectSmartOption.vue.d.ts +5 -5
- package/dist/components/SelectTime/index.vue.d.ts +5 -74
- package/dist/components/Slider/Slider.vue.d.ts +18 -92
- package/dist/components/Switch/Switch.vue.d.ts +3 -3
- package/dist/components/Tab/Tab.vue.d.ts +18 -92
- package/dist/components/TableNext/TableBodyCell.vue.d.ts +2 -2
- package/dist/components/TableNext/TablePagination.vue.d.ts +6 -6
- package/dist/components/Tag/DefaultTag.vue.d.ts +1 -1
- package/dist/components/Tag/Tag.vue.d.ts +2 -2
- package/dist/components/TextArea/TextArea.vue.d.ts +8 -8
- package/dist/components/Toast/Toast.vue.d.ts +1 -1
- package/dist/components/Toast/Toast.vue.d.ts.map +1 -1
- package/dist/components/ToolTip/ToolTip.vue.d.ts +18 -92
- package/dist/components/ToolTip/ToolTip.vue.d.ts.map +1 -1
- package/dist/components/Tour/Tour.vue.d.ts +6 -6
- package/dist/components/Tour/TourPopover.vue.d.ts +6 -6
- package/dist/components/UploadArea/UploadArea.vue.d.ts +6 -6
- package/dist/components/ui/popover/PopoverContent.vue.d.ts +2 -2
- package/dist/components/ui/popover/PopoverContent.vue.d.ts.map +1 -1
- package/dist/components/ui/popover/PopoverOption.vue.d.ts +1 -1
- package/dist/components/ui/popover/PopoverOption.vue.d.ts.map +1 -1
- package/dist/components/ui/popover/PopoverTrigger.vue.d.ts.map +1 -1
- package/dist/{es-a9e51a05.mjs → es-c19444c0.mjs} +1 -1
- package/dist/{index-ade761d4.mjs → index-93b45359.mjs} +51889 -54741
- package/dist/locales/en.json.d.ts +1 -3
- package/dist/locales/es.json.d.ts +1 -3
- package/dist/locales/pt_br.json.d.ts +1 -3
- package/dist/{pt-br-5395459d.mjs → pt-br-23dc9ca6.mjs} +1 -1
- package/dist/style.css +1 -1
- package/dist/unnnic.mjs +206 -234
- package/dist/unnnic.umd.js +44 -48
- package/package.json +2 -3
- package/src/assets/scss/scheme-colors.scss +223 -223
- package/src/assets/scss/tailwind.scss +0 -8
- package/src/components/Alert/__tests__/__snapshots__/Alert.spec.js.snap +1 -1
- package/src/components/Checkbox/Checkbox.vue +1 -1
- package/src/components/Disclaimer/Disclaimer.vue +42 -136
- package/src/components/Disclaimer/DisclaimerV2.vue +171 -0
- package/src/components/Disclaimer/__tests__/Disclaimer.spec.js +45 -70
- package/src/components/Disclaimer/__tests__/DisclaimerV2.spec.js +68 -0
- package/src/components/Disclaimer/types-v2.ts +12 -0
- package/src/components/Disclaimer/types.ts +3 -12
- package/src/components/Drawer/Drawer.vue +269 -190
- package/src/components/Drawer/__tests__/Drawer.spec.js +46 -37
- package/src/components/Drawer/__tests__/__snapshots__/Drawer.spec.js.snap +19 -18
- package/src/components/Input/BaseInput.vue +5 -25
- package/src/components/Input/Input.scss +3 -2
- package/src/components/Input/Input.vue +1 -24
- package/src/components/Input/TextInput.vue +25 -64
- package/src/components/Input/__test__/TextInput.spec.js +1 -1
- package/src/components/Input/__test__/__snapshots__/Input.spec.js.snap +1 -5
- package/src/components/Input/__test__/__snapshots__/TextInput.spec.js.snap +1 -7
- package/src/components/ModalDialog/ModalDialog.vue +148 -64
- package/src/components/ModalDialog/__tests__/ModalDialog.spec.js +221 -11
- package/src/components/ModalDialog/__tests__/__snapshots__/ModalDialog.spec.js.snap +22 -1
- package/src/components/MultiSelect/MultiSelect.vue +297 -0
- package/src/components/Tab/__test__/__snapshots__/Tab.spec.js.snap +1 -3
- package/src/components/Toast/Toast.vue +9 -16
- package/src/components/ToolTip/ToolTip.vue +177 -25
- package/src/components/ToolTip/__tests__/ToolTip.spec.js +61 -339
- package/src/components/index.ts +11 -63
- package/src/components/ui/popover/PopoverContent.vue +2 -19
- package/src/components/ui/popover/PopoverOption.vue +0 -4
- package/src/components/ui/popover/PopoverTrigger.vue +1 -5
- package/src/locales/en.json +1 -3
- package/src/locales/es.json +1 -3
- package/src/locales/pt_br.json +1 -3
- package/src/stories/Disclaimer.stories.js +12 -53
- package/src/stories/DisclaimerV2.stories.js +51 -0
- package/src/stories/Drawer.stories.js +1 -1
- package/src/stories/Input.mdx +0 -3
- package/src/stories/ModalDialog.mdx +0 -3
- package/src/stories/ModalDialog.stories.js +1 -1
- package/src/stories/MultiSelect.stories.js +46 -142
- package/dist/components/MultiSelect/MultSelectOption.vue.d.ts +0 -17
- package/dist/components/MultiSelect/MultSelectOption.vue.d.ts.map +0 -1
- package/dist/components/MultiSelect/index.vue.d.ts +0 -44
- package/dist/components/MultiSelect/index.vue.d.ts.map +0 -1
- package/dist/components/Select/index.vue.d.ts +0 -44
- package/dist/components/Select/index.vue.d.ts.map +0 -1
- package/dist/components/index.d.ts +0 -23912
- package/dist/components/index.d.ts.map +0 -1
- package/dist/components/ui/dialog/Dialog.vue.d.ts +0 -23
- package/dist/components/ui/dialog/Dialog.vue.d.ts.map +0 -1
- package/dist/components/ui/dialog/DialogClose.vue.d.ts +0 -21
- package/dist/components/ui/dialog/DialogClose.vue.d.ts.map +0 -1
- package/dist/components/ui/dialog/DialogContent.vue.d.ts +0 -43
- package/dist/components/ui/dialog/DialogContent.vue.d.ts.map +0 -1
- package/dist/components/ui/dialog/DialogFooter.vue.d.ts +0 -25
- package/dist/components/ui/dialog/DialogFooter.vue.d.ts.map +0 -1
- package/dist/components/ui/dialog/DialogHeader.vue.d.ts +0 -29
- package/dist/components/ui/dialog/DialogHeader.vue.d.ts.map +0 -1
- package/dist/components/ui/dialog/DialogTitle.vue.d.ts +0 -23
- package/dist/components/ui/dialog/DialogTitle.vue.d.ts.map +0 -1
- package/dist/components/ui/dialog/DialogTrigger.vue.d.ts +0 -19
- package/dist/components/ui/dialog/DialogTrigger.vue.d.ts.map +0 -1
- package/dist/components/ui/dialog/index.d.ts +0 -8
- package/dist/components/ui/dialog/index.d.ts.map +0 -1
- package/dist/components/ui/drawer/Drawer.vue.d.ts +0 -35
- package/dist/components/ui/drawer/Drawer.vue.d.ts.map +0 -1
- package/dist/components/ui/drawer/DrawerClose.vue.d.ts +0 -21
- package/dist/components/ui/drawer/DrawerClose.vue.d.ts.map +0 -1
- package/dist/components/ui/drawer/DrawerContent.vue.d.ts +0 -43
- package/dist/components/ui/drawer/DrawerContent.vue.d.ts.map +0 -1
- package/dist/components/ui/drawer/DrawerDescription.vue.d.ts +0 -23
- package/dist/components/ui/drawer/DrawerDescription.vue.d.ts.map +0 -1
- package/dist/components/ui/drawer/DrawerFooter.vue.d.ts +0 -22
- package/dist/components/ui/drawer/DrawerFooter.vue.d.ts.map +0 -1
- package/dist/components/ui/drawer/DrawerHeader.vue.d.ts +0 -25
- package/dist/components/ui/drawer/DrawerHeader.vue.d.ts.map +0 -1
- package/dist/components/ui/drawer/DrawerOverlay.vue.d.ts +0 -8
- package/dist/components/ui/drawer/DrawerOverlay.vue.d.ts.map +0 -1
- package/dist/components/ui/drawer/DrawerTitle.vue.d.ts +0 -23
- package/dist/components/ui/drawer/DrawerTitle.vue.d.ts.map +0 -1
- package/dist/components/ui/drawer/DrawerTrigger.vue.d.ts +0 -19
- package/dist/components/ui/drawer/DrawerTrigger.vue.d.ts.map +0 -1
- package/dist/components/ui/drawer/index.d.ts +0 -11
- package/dist/components/ui/drawer/index.d.ts.map +0 -1
- package/dist/components/ui/tooltip/Tooltip.vue.d.ts +0 -23
- package/dist/components/ui/tooltip/Tooltip.vue.d.ts.map +0 -1
- package/dist/components/ui/tooltip/TooltipContent.vue.d.ts +0 -31
- package/dist/components/ui/tooltip/TooltipContent.vue.d.ts.map +0 -1
- package/dist/components/ui/tooltip/TooltipTrigger.vue.d.ts +0 -19
- package/dist/components/ui/tooltip/TooltipTrigger.vue.d.ts.map +0 -1
- package/dist/components/ui/tooltip/index.d.ts +0 -4
- package/dist/components/ui/tooltip/index.d.ts.map +0 -1
- package/dist/lib/layer-manager.d.ts +0 -16
- package/dist/lib/layer-manager.d.ts.map +0 -1
- package/src/components/MultiSelect/MultSelectOption.vue +0 -49
- package/src/components/MultiSelect/__tests__/MultiSelect.spec.js +0 -556
- package/src/components/MultiSelect/__tests__/MultiSelectOption.spec.js +0 -229
- package/src/components/MultiSelect/__tests__/__snapshots__/MultiSelect.spec.js.snap +0 -87
- package/src/components/MultiSelect/__tests__/__snapshots__/MultiSelectOption.spec.js.snap +0 -51
- package/src/components/MultiSelect/index.vue +0 -225
- package/src/components/Select/__tests__/Select.spec.js +0 -422
- package/src/components/Select/__tests__/SelectItem.spec.js +0 -330
- package/src/components/Select/__tests__/__snapshots__/Popover.spec.js.snap +0 -8
- package/src/components/Select/__tests__/__snapshots__/Select.spec.js.snap +0 -71
- package/src/components/Select/__tests__/__snapshots__/SelectItem.spec.js.snap +0 -15
- package/src/components/Select/__tests__/__snapshots__/SelectOption.spec.js.snap +0 -25
- package/src/components/Select/__tests__/__snapshots__/SelectPopover.spec.js.snap +0 -8
- package/src/components/Select/index.vue +0 -298
- package/src/components/ui/dialog/Dialog.vue +0 -19
- package/src/components/ui/dialog/DialogClose.vue +0 -29
- package/src/components/ui/dialog/DialogContent.vue +0 -140
- package/src/components/ui/dialog/DialogFooter.vue +0 -50
- package/src/components/ui/dialog/DialogHeader.vue +0 -83
- package/src/components/ui/dialog/DialogTitle.vue +0 -38
- package/src/components/ui/dialog/DialogTrigger.vue +0 -16
- package/src/components/ui/dialog/index.ts +0 -7
- package/src/components/ui/drawer/Drawer.vue +0 -27
- package/src/components/ui/drawer/DrawerClose.vue +0 -31
- package/src/components/ui/drawer/DrawerContent.vue +0 -111
- package/src/components/ui/drawer/DrawerDescription.vue +0 -40
- package/src/components/ui/drawer/DrawerFooter.vue +0 -38
- package/src/components/ui/drawer/DrawerHeader.vue +0 -57
- package/src/components/ui/drawer/DrawerOverlay.vue +0 -33
- package/src/components/ui/drawer/DrawerTitle.vue +0 -37
- package/src/components/ui/drawer/DrawerTrigger.vue +0 -31
- package/src/components/ui/drawer/index.ts +0 -10
- package/src/components/ui/tooltip/Tooltip.vue +0 -21
- package/src/components/ui/tooltip/TooltipContent.vue +0 -74
- package/src/components/ui/tooltip/TooltipTrigger.vue +0 -26
- package/src/components/ui/tooltip/index.ts +0 -3
- package/src/lib/layer-manager.ts +0 -92
- package/src/stories/Dialog.stories.js +0 -832
- package/src/stories/DrawerNext.stories.js +0 -611
- package/src/stories/LayerManager.docs.mdx +0 -40
- package/src/stories/LayerManager.stories.js +0 -364
- package/src/stories/Select.stories.js +0 -158
|
@@ -1,422 +0,0 @@
|
|
|
1
|
-
import { mount } from '@vue/test-utils';
|
|
2
|
-
import { beforeEach, describe, expect, afterEach, test, vi } from 'vitest';
|
|
3
|
-
import UnnnicSelect from '../index.vue';
|
|
4
|
-
|
|
5
|
-
vi.mock('../../mixins/i18n', () => ({
|
|
6
|
-
default: {
|
|
7
|
-
methods: {
|
|
8
|
-
$t: (key) => key,
|
|
9
|
-
},
|
|
10
|
-
},
|
|
11
|
-
}));
|
|
12
|
-
|
|
13
|
-
describe('UnnnicSelect.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: null,
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
const mountWrapper = (props = {}, slots = {}) => {
|
|
26
|
-
return mount(UnnnicSelect, {
|
|
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-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
|
-
'[data-testid="select-option"]',
|
|
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 label', 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 custom placeholder', async () => {
|
|
112
|
-
await wrapper.setProps({ placeholder: 'Select an option' });
|
|
113
|
-
const input = wrapper.findComponent({ name: 'UnnnicInput' });
|
|
114
|
-
expect(input.props('placeholder')).toBe('Select an option');
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
test('input is readonly', () => {
|
|
118
|
-
const input = wrapper.findComponent({ name: 'UnnnicInput' });
|
|
119
|
-
expect(input.props('readonly')).toBe(true);
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
test('input shows correct icon based on popover state', async () => {
|
|
123
|
-
const input = wrapper.findComponent({ name: 'UnnnicInput' });
|
|
124
|
-
|
|
125
|
-
// Initially closed
|
|
126
|
-
expect(input.props('iconRight')).toBe('keyboard_arrow_down');
|
|
127
|
-
|
|
128
|
-
// When popover is open
|
|
129
|
-
wrapper.vm.openPopover = true;
|
|
130
|
-
await wrapper.vm.$nextTick();
|
|
131
|
-
expect(input.props('iconRight')).toBe('keyboard_arrow_up');
|
|
132
|
-
});
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
describe('option selection', () => {
|
|
136
|
-
test('emits update:modelValue when option is selected', async () => {
|
|
137
|
-
wrapper.vm.openPopover = true;
|
|
138
|
-
await wrapper.vm.$nextTick();
|
|
139
|
-
const options = wrapper.findAllComponents(
|
|
140
|
-
'[data-testid="select-option"]',
|
|
141
|
-
);
|
|
142
|
-
|
|
143
|
-
await options[0].vm.$emit('click');
|
|
144
|
-
|
|
145
|
-
expect(wrapper.emitted('update:modelValue')).toBeTruthy();
|
|
146
|
-
expect(wrapper.emitted('update:modelValue')[0]).toEqual(['option1']);
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
test('emits object when returnObject is true', async () => {
|
|
150
|
-
await wrapper.setProps({ returnObject: true });
|
|
151
|
-
wrapper.vm.openPopover = true;
|
|
152
|
-
await wrapper.vm.$nextTick();
|
|
153
|
-
const options = wrapper.findAllComponents(
|
|
154
|
-
'[data-testid="select-option"]',
|
|
155
|
-
);
|
|
156
|
-
|
|
157
|
-
await options[0].vm.$emit('click');
|
|
158
|
-
|
|
159
|
-
expect(wrapper.emitted('update:modelValue')[0]).toEqual([
|
|
160
|
-
{ label: 'Option 1', value: 'option1' },
|
|
161
|
-
]);
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
test('does not emit when same option is selected', async () => {
|
|
165
|
-
await wrapper.setProps({ modelValue: 'option1' });
|
|
166
|
-
wrapper.vm.openPopover = true;
|
|
167
|
-
await wrapper.vm.$nextTick();
|
|
168
|
-
const options = wrapper.findAllComponents(
|
|
169
|
-
'[data-testid="select-option"]',
|
|
170
|
-
);
|
|
171
|
-
|
|
172
|
-
await options[0].vm.$emit('click');
|
|
173
|
-
|
|
174
|
-
expect(wrapper.emitted('update:modelValue')).toBeFalsy();
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
test('does not emit when disabled option is clicked', async () => {
|
|
178
|
-
const disabledOptions = [
|
|
179
|
-
{ label: 'Option 1', value: 'option1' },
|
|
180
|
-
{ label: 'Disabled Option', value: 'disabled', disabled: true },
|
|
181
|
-
];
|
|
182
|
-
|
|
183
|
-
await wrapper.setProps({ options: disabledOptions });
|
|
184
|
-
wrapper.vm.openPopover = true;
|
|
185
|
-
await wrapper.vm.$nextTick();
|
|
186
|
-
const options = wrapper.findAllComponents(
|
|
187
|
-
'[data-testid="select-option"]',
|
|
188
|
-
);
|
|
189
|
-
|
|
190
|
-
await options[1].vm.$emit('click');
|
|
191
|
-
|
|
192
|
-
expect(wrapper.emitted('update:modelValue')).toBeFalsy();
|
|
193
|
-
});
|
|
194
|
-
});
|
|
195
|
-
|
|
196
|
-
describe('search functionality', () => {
|
|
197
|
-
test('renders search input when enableSearch is true', async () => {
|
|
198
|
-
await wrapper.setProps({ enableSearch: true });
|
|
199
|
-
wrapper.vm.openPopover = true;
|
|
200
|
-
await wrapper.vm.$nextTick();
|
|
201
|
-
const searchInputs = wrapper.findAllComponents({ name: 'UnnnicInput' });
|
|
202
|
-
expect(searchInputs.length).toBe(2); // Main input + search input
|
|
203
|
-
});
|
|
204
|
-
|
|
205
|
-
test('does not render search input when enableSearch is false', async () => {
|
|
206
|
-
await wrapper.setProps({ enableSearch: false, modelValue: true });
|
|
207
|
-
const searchInputs = wrapper.findAllComponents({ name: 'UnnnicInput' });
|
|
208
|
-
expect(searchInputs.length).toBe(1); // Only main input
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
test('emits update:search when search input changes', async () => {
|
|
212
|
-
await wrapper.setProps({ enableSearch: true });
|
|
213
|
-
wrapper.vm.openPopover = true;
|
|
214
|
-
await wrapper.vm.$nextTick();
|
|
215
|
-
const searchInput = wrapper.findAllComponents({ name: 'UnnnicInput' })[1];
|
|
216
|
-
|
|
217
|
-
await searchInput.vm.$emit('update:modelValue', 'test search');
|
|
218
|
-
|
|
219
|
-
expect(wrapper.emitted('update:search')).toBeTruthy();
|
|
220
|
-
expect(wrapper.emitted('update:search')[0]).toEqual(['test search']);
|
|
221
|
-
});
|
|
222
|
-
|
|
223
|
-
test('filters options based on search term', async () => {
|
|
224
|
-
await wrapper.setProps({ enableSearch: true, search: 'Option 1' });
|
|
225
|
-
|
|
226
|
-
const filteredOptions = wrapper.vm.filteredOptions;
|
|
227
|
-
expect(filteredOptions.length).toBe(1);
|
|
228
|
-
expect(filteredOptions[0].label).toBe('Option 1');
|
|
229
|
-
});
|
|
230
|
-
|
|
231
|
-
test('filters options by both label and value', async () => {
|
|
232
|
-
await wrapper.setProps({ enableSearch: true, search: 'option1' });
|
|
233
|
-
|
|
234
|
-
const filteredOptions = wrapper.vm.filteredOptions;
|
|
235
|
-
expect(filteredOptions.length).toBe(1);
|
|
236
|
-
expect(filteredOptions[0].value).toBe('option1');
|
|
237
|
-
});
|
|
238
|
-
|
|
239
|
-
test('shows all options when search is empty', async () => {
|
|
240
|
-
await wrapper.setProps({ enableSearch: true, search: '' });
|
|
241
|
-
|
|
242
|
-
const filteredOptions = wrapper.vm.filteredOptions;
|
|
243
|
-
expect(filteredOptions.length).toBe(3);
|
|
244
|
-
});
|
|
245
|
-
});
|
|
246
|
-
|
|
247
|
-
describe('computed properties', () => {
|
|
248
|
-
test('calculatedPopoverHeight returns correct value', () => {
|
|
249
|
-
const maxHeight = wrapper.vm.calculatedPopoverHeight;
|
|
250
|
-
expect(maxHeight).toBe('235px');
|
|
251
|
-
});
|
|
252
|
-
|
|
253
|
-
test('calculatedPopoverHeight includes search height when enabled', async () => {
|
|
254
|
-
await wrapper.setProps({ enableSearch: true });
|
|
255
|
-
const maxHeight = wrapper.vm.calculatedPopoverHeight;
|
|
256
|
-
expect(maxHeight).toBe('282px');
|
|
257
|
-
});
|
|
258
|
-
|
|
259
|
-
test('calculatedPopoverHeight returns unset when no options', async () => {
|
|
260
|
-
await wrapper.setProps({ options: [] });
|
|
261
|
-
const maxHeight = wrapper.vm.calculatedPopoverHeight;
|
|
262
|
-
expect(maxHeight).toBe('unset');
|
|
263
|
-
});
|
|
264
|
-
|
|
265
|
-
test('selectedItem returns correct item for returnObject false', async () => {
|
|
266
|
-
await wrapper.setProps({ modelValue: 'option2' });
|
|
267
|
-
const selectedItem = wrapper.vm.selectedItem;
|
|
268
|
-
expect(selectedItem.label).toBe('Option 2');
|
|
269
|
-
expect(selectedItem.value).toBe('option2');
|
|
270
|
-
});
|
|
271
|
-
|
|
272
|
-
test('selectedItem returns modelValue for returnObject true', async () => {
|
|
273
|
-
const selectedOption = { label: 'Option 2', value: 'option2' };
|
|
274
|
-
await wrapper.setProps({
|
|
275
|
-
returnObject: true,
|
|
276
|
-
modelValue: selectedOption,
|
|
277
|
-
});
|
|
278
|
-
const selectedItem = wrapper.vm.selectedItem;
|
|
279
|
-
expect(selectedItem).toStrictEqual(selectedOption);
|
|
280
|
-
});
|
|
281
|
-
|
|
282
|
-
test('inputValue returns correct label', async () => {
|
|
283
|
-
await wrapper.setProps({ modelValue: 'option3' });
|
|
284
|
-
const inputValue = wrapper.vm.inputValue;
|
|
285
|
-
expect(inputValue).toBe('Option 3');
|
|
286
|
-
});
|
|
287
|
-
|
|
288
|
-
test('inputValue returns undefined when no selection', () => {
|
|
289
|
-
const inputValue = wrapper.vm.inputValue;
|
|
290
|
-
expect(inputValue).toBeUndefined();
|
|
291
|
-
});
|
|
292
|
-
});
|
|
293
|
-
|
|
294
|
-
describe('disabled state', () => {
|
|
295
|
-
test('passes disabled prop to input', async () => {
|
|
296
|
-
await wrapper.setProps({ disabled: true });
|
|
297
|
-
const input = wrapper.findComponent({ name: 'UnnnicInput' });
|
|
298
|
-
expect(input.props('disabled')).toBe(true);
|
|
299
|
-
});
|
|
300
|
-
|
|
301
|
-
test('input is not disabled by default', () => {
|
|
302
|
-
const input = wrapper.findComponent({ name: 'UnnnicInput' });
|
|
303
|
-
expect(input.props('disabled')).toBe(false);
|
|
304
|
-
});
|
|
305
|
-
});
|
|
306
|
-
|
|
307
|
-
describe('size prop', () => {
|
|
308
|
-
test('passes size prop to input', async () => {
|
|
309
|
-
await wrapper.setProps({ size: 'sm' });
|
|
310
|
-
const input = wrapper.findComponent({ name: 'UnnnicInput' });
|
|
311
|
-
expect(input.props('size')).toBe('sm');
|
|
312
|
-
});
|
|
313
|
-
|
|
314
|
-
test('defaults to md size', () => {
|
|
315
|
-
const input = wrapper.findComponent({ name: 'UnnnicInput' });
|
|
316
|
-
expect(input.props('size')).toBe('md');
|
|
317
|
-
});
|
|
318
|
-
});
|
|
319
|
-
|
|
320
|
-
describe('label and message props', () => {
|
|
321
|
-
test('passes label prop to input', async () => {
|
|
322
|
-
await wrapper.setProps({ label: 'Select Label' });
|
|
323
|
-
const input = wrapper.findComponent({ name: 'UnnnicInput' });
|
|
324
|
-
expect(input.props('label')).toBe('Select Label');
|
|
325
|
-
});
|
|
326
|
-
|
|
327
|
-
test('passes message prop to input', async () => {
|
|
328
|
-
await wrapper.setProps({ message: 'Select Message' });
|
|
329
|
-
const input = wrapper.findComponent({ name: 'UnnnicInput' });
|
|
330
|
-
expect(input.props('message')).toBe('Select Message');
|
|
331
|
-
});
|
|
332
|
-
|
|
333
|
-
test('passes errors prop to input', async () => {
|
|
334
|
-
await wrapper.setProps({ errors: 'Error message' });
|
|
335
|
-
const input = wrapper.findComponent({ name: 'UnnnicInput' });
|
|
336
|
-
expect(input.props('errors')).toBe('Error message');
|
|
337
|
-
});
|
|
338
|
-
});
|
|
339
|
-
|
|
340
|
-
describe('custom item keys', () => {
|
|
341
|
-
test('uses custom itemLabel and itemValue', async () => {
|
|
342
|
-
const customOptions = [
|
|
343
|
-
{ name: 'Custom 1', id: 'custom1' },
|
|
344
|
-
{ name: 'Custom 2', id: 'custom2' },
|
|
345
|
-
];
|
|
346
|
-
|
|
347
|
-
await wrapper.setProps({
|
|
348
|
-
options: customOptions,
|
|
349
|
-
itemLabel: 'name',
|
|
350
|
-
itemValue: 'id',
|
|
351
|
-
modelValue: 'custom1',
|
|
352
|
-
});
|
|
353
|
-
|
|
354
|
-
const inputValue = wrapper.vm.inputValue;
|
|
355
|
-
expect(inputValue).toBe('Custom 1');
|
|
356
|
-
});
|
|
357
|
-
});
|
|
358
|
-
|
|
359
|
-
describe('edge cases', () => {
|
|
360
|
-
test('handles empty options array', async () => {
|
|
361
|
-
await wrapper.setProps({ options: [] });
|
|
362
|
-
expect(wrapper.vm.filteredOptions).toEqual([]);
|
|
363
|
-
expect(wrapper.vm.calculatedPopoverHeight).toBe('unset');
|
|
364
|
-
});
|
|
365
|
-
|
|
366
|
-
test('handles null modelValue', async () => {
|
|
367
|
-
await wrapper.setProps({ modelValue: null });
|
|
368
|
-
expect(wrapper.vm.inputValue).toBeUndefined();
|
|
369
|
-
expect(wrapper.vm.selectedItem).toBeUndefined();
|
|
370
|
-
});
|
|
371
|
-
|
|
372
|
-
test('handles undefined modelValue', async () => {
|
|
373
|
-
await wrapper.setProps({ modelValue: undefined });
|
|
374
|
-
expect(wrapper.vm.inputValue).toBeUndefined();
|
|
375
|
-
expect(wrapper.vm.selectedItem).toBeUndefined();
|
|
376
|
-
});
|
|
377
|
-
|
|
378
|
-
test('handles case insensitive search', async () => {
|
|
379
|
-
await wrapper.setProps({ enableSearch: true, search: 'OPTION 1' });
|
|
380
|
-
const filteredOptions = wrapper.vm.filteredOptions;
|
|
381
|
-
expect(filteredOptions.length).toBe(1);
|
|
382
|
-
expect(filteredOptions[0].label).toBe('Option 1');
|
|
383
|
-
});
|
|
384
|
-
|
|
385
|
-
test('handles partial search matches', async () => {
|
|
386
|
-
await wrapper.setProps({ enableSearch: true, search: 'tion' });
|
|
387
|
-
const filteredOptions = wrapper.vm.filteredOptions;
|
|
388
|
-
expect(filteredOptions.length).toBe(3); // All options contain 'tion'
|
|
389
|
-
});
|
|
390
|
-
});
|
|
391
|
-
|
|
392
|
-
describe('component structure', () => {
|
|
393
|
-
test('has correct component name', () => {
|
|
394
|
-
expect(wrapper.vm.$options.name).toBe('UnnnicSelect');
|
|
395
|
-
});
|
|
396
|
-
|
|
397
|
-
test('includes i18n mixin', () => {
|
|
398
|
-
expect(wrapper.vm.$options.mixins).toBeDefined();
|
|
399
|
-
});
|
|
400
|
-
});
|
|
401
|
-
|
|
402
|
-
describe('snapshot testing', () => {
|
|
403
|
-
test('matches snapshot with default props', () => {
|
|
404
|
-
expect(wrapper.html()).toMatchSnapshot();
|
|
405
|
-
});
|
|
406
|
-
|
|
407
|
-
test('matches snapshot with selected value', async () => {
|
|
408
|
-
await wrapper.setProps({ modelValue: 'option1' });
|
|
409
|
-
expect(wrapper.html()).toMatchSnapshot();
|
|
410
|
-
});
|
|
411
|
-
|
|
412
|
-
test('matches snapshot with search enabled', async () => {
|
|
413
|
-
await wrapper.setProps({ enableSearch: true, modelValue: true });
|
|
414
|
-
expect(wrapper.html()).toMatchSnapshot();
|
|
415
|
-
});
|
|
416
|
-
|
|
417
|
-
test('matches snapshot with disabled state', async () => {
|
|
418
|
-
await wrapper.setProps({ disabled: true });
|
|
419
|
-
expect(wrapper.html()).toMatchSnapshot();
|
|
420
|
-
});
|
|
421
|
-
});
|
|
422
|
-
});
|