diff --git a/src/App.vue b/src/App.vue index a0d7a19..dc48eaa 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,5 +1,45 @@ - - Vue-Tailwind - + + + + + cl + + + + + + diff --git a/src/assets/icons/LoadingSpinner.vue b/src/assets/icons/LoadingSpinner.vue new file mode 100644 index 0000000..3bd29c8 --- /dev/null +++ b/src/assets/icons/LoadingSpinner.vue @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/components/DxhSelect.vue b/src/components/DxhSelect.vue new file mode 100644 index 0000000..61f943a --- /dev/null +++ b/src/components/DxhSelect.vue @@ -0,0 +1,207 @@ + + + {{ label }} + + + + + + + + + + + + {{ placeholder }} + + + + {{ option.label }} + × + + + + + + + + + + + + + + + + + + + + + {{ option.label }} + + + + + + {{ hint }} + + + + + + diff --git a/src/components/__tests__/DxhSelect.spec.ts b/src/components/__tests__/DxhSelect.spec.ts new file mode 100644 index 0000000..821149f --- /dev/null +++ b/src/components/__tests__/DxhSelect.spec.ts @@ -0,0 +1,51 @@ +import { describe, it, expect, beforeEach, afterEach } from 'vitest' +import { mount } from '@vue/test-utils' +import DxhSelect from '../DxhSelect.vue' + +describe('DxhSelect.vue', () => { + let wrapper:any + + beforeEach(() => { + wrapper = mount(DxhSelect, { + props: { + modelValue: [], + label: 'Your Label', + options: [ + { id: 1, label: 'Option 1' }, + { id: 2, label: 'Option 2' }, + { id: 3, label: 'Option 3' } + ], + multiple: true, + chips: true, + clearable: true, + placeholder: 'Select an option', + hint: 'Your Hint' + } + }) + }) + + afterEach(() => { + wrapper.unmount() + }) + + it('renders with correct initial state', () => { + expect(wrapper.find('label').exists()).toBe(true) + expect(wrapper.find('label').text()).toBe('Your Label') + expect(wrapper.find('.text-gray-500').text()).toBe('Select an option') + expect(wrapper.find('p').text()).toBe('Your Hint') + expect(wrapper.find('[data-test="clear-icon"]').exists()).toBe(false) + expect(wrapper.vm.isDropdownOpen).toBe(false) + }) + + it('opens dropdown, selects an option, and closes dropdown', async () => { + await wrapper.find('[data-test="dropdown-toggle"]').trigger('click') + expect(wrapper.vm.isDropdownOpen).toBe(true) + + await wrapper.find('[data-test="dropdown-option-1"]').trigger('click') + expect(wrapper.vm.selectedOptions).toEqual([{ id: 1, label: 'Option 1' }]) + expect(wrapper.vm.isDropdownOpen).toBe(true) + + expect(wrapper.emitted('update:modelValue')).toBeTruthy() + expect(wrapper.emitted('update:modelValue')[0][0]).toEqual([1]) + }) +}) diff --git a/src/index.ts b/src/index.ts index ee2ff8d..c853db8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,5 @@ -import DButton from "./components/DButton.vue" -import DInput from "./components/DInput.vue" +import DButton from './components/DButton.vue' +import DInput from './components/DInput.vue' +import DSelect from './components/DSelect.vue' -export default {DButton, DInput} \ No newline at end of file +export default { DButton, DInput, DSelect } \ No newline at end of file
{{ hint }}