From 05df10befc37d8f4416fdd4fdb1319a0dc411869 Mon Sep 17 00:00:00 2001 From: git-mahade Date: Mon, 4 Dec 2023 18:19:36 +0600 Subject: [PATCH 1/6] select --- src/components/DSelect.vue | 204 ++++++++++++++++++ src/components/__tests__/DSelect.spec copy.ts | 51 +++++ src/index.ts | 7 +- 3 files changed, 259 insertions(+), 3 deletions(-) create mode 100644 src/components/DSelect.vue create mode 100644 src/components/__tests__/DSelect.spec copy.ts diff --git a/src/components/DSelect.vue b/src/components/DSelect.vue new file mode 100644 index 0000000..a19bd49 --- /dev/null +++ b/src/components/DSelect.vue @@ -0,0 +1,204 @@ + + + + + diff --git a/src/components/__tests__/DSelect.spec copy.ts b/src/components/__tests__/DSelect.spec copy.ts new file mode 100644 index 0000000..b2dafd6 --- /dev/null +++ b/src/components/__tests__/DSelect.spec copy.ts @@ -0,0 +1,51 @@ +import { describe, it, expect, beforeEach, afterEach } from 'vitest' +import { mount } from '@vue/test-utils' +import DSelect from '../DSelect.vue' + +describe('DSelect.vue', () => { + let wrapper: any + + beforeEach(() => { + wrapper = mount(DSelect, { + props: { + modelValue: [], + label: 'Dropdown 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: 'Dropdown Hint' + } + }) + }) + + afterEach(() => { + wrapper.unmount() + }) + + it('renders with correct initial state', () => { + expect(wrapper.find('label').exists()).toBe(true) + expect(wrapper.find('label').text()).toBe('Dropdown Label') + expect(wrapper.find('.text-gray-500').text()).toBe('Select an option') + expect(wrapper.find('p').text()).toBe('Dropdown Hint') + expect(wrapper.find('[data-test="clear-icon"]').exists()).toBe(true) + 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(false) + + 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 From 346bc4dc132d7252770778cd4630f0957f07ab2f Mon Sep 17 00:00:00 2001 From: git-mahade Date: Mon, 4 Dec 2023 19:40:28 +0600 Subject: [PATCH 2/6] select --- src/components/DSelect.vue | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/DSelect.vue b/src/components/DSelect.vue index a19bd49..a94c598 100644 --- a/src/components/DSelect.vue +++ b/src/components/DSelect.vue @@ -3,7 +3,7 @@
{{ option.label }}
Date: Wed, 6 Dec 2023 18:30:50 +0600 Subject: [PATCH 3/6] select --- src/App.vue | 64 ++++- src/assets/icons/LoadingSpinner.vue | 58 +++++ src/components/DSelect.vue | 204 ---------------- src/components/DxhSelect.vue | 227 ++++++++++++++++++ ...DSelect.spec copy.ts => DxhSelect.spec.ts} | 20 +- 5 files changed, 356 insertions(+), 217 deletions(-) create mode 100644 src/assets/icons/LoadingSpinner.vue delete mode 100644 src/components/DSelect.vue create mode 100644 src/components/DxhSelect.vue rename src/components/__tests__/{DSelect.spec copy.ts => DxhSelect.spec.ts} (78%) diff --git a/src/App.vue b/src/App.vue index a0d7a19..f00af1b 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,5 +1,63 @@ + + + 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/DSelect.vue b/src/components/DSelect.vue deleted file mode 100644 index a94c598..0000000 --- a/src/components/DSelect.vue +++ /dev/null @@ -1,204 +0,0 @@ - - - - - diff --git a/src/components/DxhSelect.vue b/src/components/DxhSelect.vue new file mode 100644 index 0000000..86d1d8e --- /dev/null +++ b/src/components/DxhSelect.vue @@ -0,0 +1,227 @@ + + + + + diff --git a/src/components/__tests__/DSelect.spec copy.ts b/src/components/__tests__/DxhSelect.spec.ts similarity index 78% rename from src/components/__tests__/DSelect.spec copy.ts rename to src/components/__tests__/DxhSelect.spec.ts index b2dafd6..821149f 100644 --- a/src/components/__tests__/DSelect.spec copy.ts +++ b/src/components/__tests__/DxhSelect.spec.ts @@ -1,15 +1,15 @@ import { describe, it, expect, beforeEach, afterEach } from 'vitest' import { mount } from '@vue/test-utils' -import DSelect from '../DSelect.vue' +import DxhSelect from '../DxhSelect.vue' -describe('DSelect.vue', () => { - let wrapper: any +describe('DxhSelect.vue', () => { + let wrapper:any beforeEach(() => { - wrapper = mount(DSelect, { + wrapper = mount(DxhSelect, { props: { modelValue: [], - label: 'Dropdown Label', + label: 'Your Label', options: [ { id: 1, label: 'Option 1' }, { id: 2, label: 'Option 2' }, @@ -19,7 +19,7 @@ describe('DSelect.vue', () => { chips: true, clearable: true, placeholder: 'Select an option', - hint: 'Dropdown Hint' + hint: 'Your Hint' } }) }) @@ -30,10 +30,10 @@ describe('DSelect.vue', () => { it('renders with correct initial state', () => { expect(wrapper.find('label').exists()).toBe(true) - expect(wrapper.find('label').text()).toBe('Dropdown Label') + 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('Dropdown Hint') - expect(wrapper.find('[data-test="clear-icon"]').exists()).toBe(true) + expect(wrapper.find('p').text()).toBe('Your Hint') + expect(wrapper.find('[data-test="clear-icon"]').exists()).toBe(false) expect(wrapper.vm.isDropdownOpen).toBe(false) }) @@ -43,7 +43,7 @@ describe('DSelect.vue', () => { 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(false) + expect(wrapper.vm.isDropdownOpen).toBe(true) expect(wrapper.emitted('update:modelValue')).toBeTruthy() expect(wrapper.emitted('update:modelValue')[0][0]).toEqual([1]) From fa7202c5250c5c1112cf055997791b33fd68c63d Mon Sep 17 00:00:00 2001 From: git-mahade Date: Wed, 6 Dec 2023 18:37:02 +0600 Subject: [PATCH 4/6] select --- src/components/DxhSelect.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/DxhSelect.vue b/src/components/DxhSelect.vue index 86d1d8e..1484a59 100644 --- a/src/components/DxhSelect.vue +++ b/src/components/DxhSelect.vue @@ -111,12 +111,12 @@ interface Option { } const props = defineProps({ - modelValue: [Array, String, Object], + modelValue: [Array, String, Object, Number], label: { type: String, required: false }, - options: [Array, String, Object], + options: [Array, String, Object, Number], multiple: { type: Boolean, required: false From af3e3928c501a058f4c30dd99a4c9cd4b8b4c3df Mon Sep 17 00:00:00 2001 From: git-mahade Date: Wed, 6 Dec 2023 18:38:08 +0600 Subject: [PATCH 5/6] select --- src/App.vue | 64 +++-------------------------------------------------- 1 file changed, 3 insertions(+), 61 deletions(-) diff --git a/src/App.vue b/src/App.vue index f00af1b..a0d7a19 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,63 +1,5 @@ - - - From a46a48682d0e2fb97f155fc7bc5a93a35614938c Mon Sep 17 00:00:00 2001 From: git-mahade Date: Wed, 13 Dec 2023 15:20:06 +0600 Subject: [PATCH 6/6] select --- src/App.vue | 46 +++++++++++++++++++-- src/components/DxhSelect.vue | 78 ++++++++++++++---------------------- 2 files changed, 72 insertions(+), 52 deletions(-) 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 @@ + + diff --git a/src/components/DxhSelect.vue b/src/components/DxhSelect.vue index 1484a59..61f943a 100644 --- a/src/components/DxhSelect.vue +++ b/src/components/DxhSelect.vue @@ -10,15 +10,15 @@
- +
- +
-
+
- - - + {{ option.label }}
@@ -110,38 +109,17 @@ interface Option { label: string } -const props = defineProps({ - modelValue: [Array, String, Object, Number], - label: { - type: String, - required: false - }, - options: [Array, String, Object, Number], - multiple: { - type: Boolean, - required: false - }, - loading: { - type: Boolean, - required: false - }, - chips: { - type: Boolean, - required: false - }, - clearable: { - type: Boolean, - required: false - }, - placeholder: { - type: String, - required: false - }, - hint: { - type: String, - required: false - } -}) +const props = defineProps<{ + modelValue: any + label?: string + options: any + multiple?: boolean + loading?: boolean + chips?: boolean + clearable?: boolean + placeholder?: string + hint?: string +}>() const emit = defineEmits(['update:modelValue', 'select']) @@ -156,11 +134,15 @@ const isClickOutside = (event: MouseEvent) => { } } +const clearInput = () => { + emit('update:modelValue', (selectedOptions.value = [])) +} + const toggleDropdown = () => { isDropdownOpen.value = !isDropdownOpen.value } -const toggleOption = (option: Option) => { +const toggleOption = (option: any) => { if (isSelected(option)) { removeOption(option) } else { @@ -184,14 +166,12 @@ const addOption = (option: Option) => { emit('update:modelValue', getSelectedValues()) } -const removeOption = (option: Option) => { - selectedOptions.value = selectedOptions.value.filter( - (o: { id: string | number }) => o.id !== option.id - ) +const removeOption = (option: any) => { + selectedOptions.value = selectedOptions.value.filter((o: { id: number }) => o.id !== option.id) emit('update:modelValue', getSelectedValues()) } -const isSelected = (option: Option): boolean => { +const isSelected = (option: any): boolean => { return selectedOptions.value.some((o: { id: string | number }) => o.id === option.id) }