From 19dc57be8ba6dc99182175fc2add7d640c0143a0 Mon Sep 17 00:00:00 2001 From: git-mahade Date: Thu, 23 Nov 2023 20:38:09 +0600 Subject: [PATCH 01/14] text-input --- src/App.vue | 15 ++++++++--- src/components/DInput.vue | 38 ---------------------------- src/components/DTextInput.vue | 47 +++++++++++++++++++++++++++++++++++ src/index.ts | 4 +-- 4 files changed, 61 insertions(+), 43 deletions(-) delete mode 100644 src/components/DInput.vue create mode 100644 src/components/DTextInput.vue diff --git a/src/App.vue b/src/App.vue index a0d7a19..f7ac324 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,5 +1,14 @@ + + diff --git a/src/components/DInput.vue b/src/components/DInput.vue deleted file mode 100644 index 0c3601b..0000000 --- a/src/components/DInput.vue +++ /dev/null @@ -1,38 +0,0 @@ - - - - - diff --git a/src/components/DTextInput.vue b/src/components/DTextInput.vue new file mode 100644 index 0000000..5eb394f --- /dev/null +++ b/src/components/DTextInput.vue @@ -0,0 +1,47 @@ + + + diff --git a/src/index.ts b/src/index.ts index ee2ff8d..4d80d0f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,4 @@ import DButton from "./components/DButton.vue" -import DInput from "./components/DInput.vue" +import DTextInput from './components/DTextInput.vue' -export default {DButton, DInput} \ No newline at end of file +export default { DButton, DTextInput } \ No newline at end of file From 29646504e83c3145a0e01fd6ca2a8197f3742a5a Mon Sep 17 00:00:00 2001 From: git-mahade Date: Thu, 23 Nov 2023 21:31:34 +0600 Subject: [PATCH 02/14] text-input --- src/App.vue | 16 +++++++++++- src/components/DTextInput.vue | 47 ++++++++++++++++++++++------------- 2 files changed, 45 insertions(+), 18 deletions(-) diff --git a/src/App.vue b/src/App.vue index f7ac324..046b14c 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,6 +1,19 @@ From 9b07341b653c092e351e7243cc5db8f5ea8168cb Mon Sep 17 00:00:00 2001 From: git-mahade Date: Fri, 24 Nov 2023 16:52:51 +0600 Subject: [PATCH 04/14] text-input --- src/App.vue | 9 ++ src/components/DTextInput.vue | 19 +++- src/components/__tests__/DInput.spec.ts | 138 ++++++++++++++---------- 3 files changed, 107 insertions(+), 59 deletions(-) diff --git a/src/App.vue b/src/App.vue index ef16a8e..d1feac1 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,3 +1,12 @@ + + diff --git a/src/components/DTextInput.vue b/src/components/DTextInput.vue index 194ed6c..a6d64d0 100644 --- a/src/components/DTextInput.vue +++ b/src/components/DTextInput.vue @@ -7,28 +7,38 @@ v-model="inputValue" :type="type" :placeholder="placeholder" + :hint="hint" :disabled="disabled" :readonly="readonly" :autofocus="autofocus" :required="required" :clearable="clearable" - class="w-full border" + class="w-full border px-2 py-1 rounded" @focus="$emit('focus')" @blur="$emit('blur')" @change="$emit('change')" @keyup.enter="$emit('enter')" @input="$emit('update:modelValue', inputValue)" /> - +
- + - +
+

{{ hint }}

@@ -44,6 +54,7 @@ const props = defineProps({ default: 'text' }, placeholder: String, + hint: String, disabled: Boolean, readonly: Boolean, autofocus: Boolean, diff --git a/src/components/__tests__/DInput.spec.ts b/src/components/__tests__/DInput.spec.ts index 186be4f..f5d5c4b 100644 --- a/src/components/__tests__/DInput.spec.ts +++ b/src/components/__tests__/DInput.spec.ts @@ -1,76 +1,104 @@ -import { describe, it, expect } from 'vitest'; -import { mount } from '@vue/test-utils'; -import Input from '../DInput.vue'; +import { describe, it, expect } from 'vitest' +import { mount } from '@vue/test-utils' +import DTextInput from '../DTextInput.vue' -describe('DInput.vue', () => { - it('renders input element', () => { - const wrapper = mount(Input, { +describe('DTextInput.vue', () => { + it('renders input element with label, placeholder, and hint text', () => { + const wrapper = mount(DTextInput, { props: { label: 'Username', modelValue: '', - }, - }); + placeholder: 'Enter your username', + hint: 'Hint text' + } + }) - // Assert the presence of a label - const label = wrapper.find('label'); - expect(label.exists()).toBe(true); - expect(label.text()).toBe('Username'); + const label = wrapper.find('label') + expect(label.exists()).toBe(true) - // Assert the presence of an input - const input = wrapper.find('input'); - expect(input.exists()).toBe(true); - }); + const input = wrapper.find('input') + expect(input.exists()).toBe(true) + expect(input.attributes('placeholder')).toBe('Enter your username') + + const hint = wrapper.find('p') + expect(hint.exists()).toBe(true) + expect(hint.text()).toBe('Hint text') + }) it('binds input value to modelValue prop', () => { - const wrapper = mount(Input, { + const wrapper = mount(DTextInput, { props: { - modelValue: 'test', - }, - }); + modelValue: 'test' + } + }) - const inputElement = wrapper.find('input').element as HTMLInputElement; - expect(inputElement.value).toBe('test'); - }); + const inputElement = wrapper.find('input').element as HTMLInputElement + expect(inputElement.value).toBe('test') + }) it('updates modelValue on input', async () => { - const wrapper = mount(Input, { + const wrapper = mount(DTextInput, { props: { - modelValue: '', - }, - }); + modelValue: '' + } + }) + + const inputElement = wrapper.find('input') + await inputElement.setValue('new value') + + const updateEvents = wrapper.emitted('update:modelValue') + expect(updateEvents).toBeTruthy() + + const firstEventPayload = updateEvents ? updateEvents[0] : [] + expect(firstEventPayload).toEqual(['new value']) + }) - const inputElement = wrapper.find('input'); - await inputElement.setValue('new value'); + it('emits focus event when input is focused', async () => { + const wrapper = mount(DTextInput, { + props: { + modelValue: '' + } + }) + + await wrapper.find('input').trigger('focus') + expect(wrapper.emitted('focus')).toBeTruthy() + }) - // Check that the "update:modelValue" event has been emitted - const updateEvents = wrapper.emitted('update:modelValue'); - expect(updateEvents).toBeTruthy(); + it('emits blur event when input is blurred', async () => { + const wrapper = mount(DTextInput, { + props: { + modelValue: '' + } + }) - // Now we can safely assert the first emitted event's payload - const firstEventPayload = updateEvents ? updateEvents[0] : []; - expect(firstEventPayload).toEqual(['new value']); - }); + await wrapper.find('input').trigger('blur') + expect(wrapper.emitted('blur')).toBeTruthy() + }) - it('displays placeholder text', () => { - const placeholderText = 'Enter your username'; - const wrapper = mount(Input, { + it('emits enter event when Enter key is pressed', async () => { + const wrapper = mount(DTextInput, { props: { - placeholder: placeholderText, - }, - }); + modelValue: '' + } + }) - const inputElement = wrapper.find('input').element as HTMLInputElement; - expect(inputElement.placeholder).toBe(placeholderText); - }); + await wrapper.find('input').trigger('keyup.enter') + expect(wrapper.emitted('enter')).toBeTruthy() + }) - it('is disabled when disabled prop is true', () => { - const wrapper = mount(Input, { + it('clears input value when clearable and close button is clicked', async () => { + const wrapper = mount(DTextInput, { props: { - disabled: true, - }, - }); - - const inputElement = wrapper.find('input').element as HTMLInputElement; - expect(inputElement.disabled).toBe(true); - }); -}); + modelValue: 'test', + clearable: true + } + }) + + const closeButton = wrapper.find('.inline') + expect(closeButton.exists()).toBe(true) + + await closeButton.trigger('click') + const inputElement = wrapper.find('input').element as HTMLInputElement + expect(inputElement.value).toBe('test') + }) +}) From 42145da4dcb15abd4eac260c3b6f47b62a2572e1 Mon Sep 17 00:00:00 2001 From: git-mahade Date: Fri, 24 Nov 2023 16:58:14 +0600 Subject: [PATCH 05/14] text-input --- src/App.vue | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/App.vue b/src/App.vue index d1feac1..ef16a8e 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,12 +1,3 @@ - - From 8f0cf0cfbd8bb7463f482a00474def77f0446215 Mon Sep 17 00:00:00 2001 From: git-mahade Date: Fri, 24 Nov 2023 18:36:04 +0600 Subject: [PATCH 06/14] text-input --- src/App.vue | 13 +++++++++++++ src/components/DTextInput.vue | 1 + src/components/__tests__/DInput.spec.ts | 2 +- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/App.vue b/src/App.vue index ef16a8e..41fe86e 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,3 +1,16 @@ + + diff --git a/src/components/DTextInput.vue b/src/components/DTextInput.vue index a6d64d0..a4094d5 100644 --- a/src/components/DTextInput.vue +++ b/src/components/DTextInput.vue @@ -23,6 +23,7 @@
{ await closeButton.trigger('click') const inputElement = wrapper.find('input').element as HTMLInputElement - expect(inputElement.value).toBe('test') + expect(inputElement.value).toBe('') }) }) From 85bc984c2bc8cfb20b5caa7bec541e9b8b459e74 Mon Sep 17 00:00:00 2001 From: git-mahade Date: Tue, 28 Nov 2023 11:28:57 +0600 Subject: [PATCH 07/14] text-input --- src/App.vue | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/App.vue b/src/App.vue index 41fe86e..ef16a8e 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,16 +1,3 @@
- - - -
{{ file?.size }}
-
- - From bc59c40fecbbc749a299f4e998e33fdf8b5a45da Mon Sep 17 00:00:00 2001 From: git-mahade Date: Wed, 29 Nov 2023 11:45:59 +0600 Subject: [PATCH 08/14] text-input --- src/App.vue | 9 +++++++++ src/components/DTextInput.vue | 7 +++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/App.vue b/src/App.vue index ef16a8e..ad6e60e 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,3 +1,12 @@ + + diff --git a/src/components/DTextInput.vue b/src/components/DTextInput.vue index a4094d5..d934fee 100644 --- a/src/components/DTextInput.vue +++ b/src/components/DTextInput.vue @@ -21,7 +21,7 @@ @input="$emit('update:modelValue', inputValue)" />
@@ -47,7 +47,10 @@ import { ref, watch } from 'vue' const props = defineProps({ - modelValue: String, + modelValue: { + type: String, + default: '' + }, label: String, id: String, type: { From d649d21754606480bdd507d999ce6ae2bca5fbb1 Mon Sep 17 00:00:00 2001 From: git-mahade Date: Wed, 29 Nov 2023 12:21:18 +0600 Subject: [PATCH 09/14] text-input --- src/App.vue | 9 --------- src/components/DTextInput.vue | 5 +---- 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/src/App.vue b/src/App.vue index ad6e60e..ef16a8e 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,12 +1,3 @@ - - diff --git a/src/components/DTextInput.vue b/src/components/DTextInput.vue index d934fee..c8559e8 100644 --- a/src/components/DTextInput.vue +++ b/src/components/DTextInput.vue @@ -47,10 +47,7 @@ import { ref, watch } from 'vue' const props = defineProps({ - modelValue: { - type: String, - default: '' - }, + modelValue: String, label: String, id: String, type: { From b838f0a212ecdf966d3acaafa8030a080cd003d8 Mon Sep 17 00:00:00 2001 From: git-mahade Date: Wed, 29 Nov 2023 12:27:37 +0600 Subject: [PATCH 10/14] textarea --- src/components/__tests__/{DInput.spec.ts => DTextInput.spec.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/components/__tests__/{DInput.spec.ts => DTextInput.spec.ts} (100%) diff --git a/src/components/__tests__/DInput.spec.ts b/src/components/__tests__/DTextInput.spec.ts similarity index 100% rename from src/components/__tests__/DInput.spec.ts rename to src/components/__tests__/DTextInput.spec.ts From 1228c4745a64a9873428b4596a22bb64a23fefec Mon Sep 17 00:00:00 2001 From: git-mahade Date: Wed, 13 Dec 2023 17:00:16 +0600 Subject: [PATCH 11/14] text --- .../{DTextInput.vue => DxhTextInput.vue} | 54 +++++++++++-------- ...TextInput.spec.ts => DxhTextInput.spec.ts} | 40 +++++++------- src/index.ts | 4 +- 3 files changed, 54 insertions(+), 44 deletions(-) rename src/components/{DTextInput.vue => DxhTextInput.vue} (63%) rename src/components/__tests__/{DTextInput.spec.ts => DxhTextInput.spec.ts} (61%) diff --git a/src/components/DTextInput.vue b/src/components/DxhTextInput.vue similarity index 63% rename from src/components/DTextInput.vue rename to src/components/DxhTextInput.vue index c8559e8..c6d3a60 100644 --- a/src/components/DTextInput.vue +++ b/src/components/DxhTextInput.vue @@ -1,6 +1,6 @@ + + diff --git a/src/components/DxhTextInput.vue b/src/components/DxhTextInput.vue index 08c9f60..9751c1d 100644 --- a/src/components/DxhTextInput.vue +++ b/src/components/DxhTextInput.vue @@ -1,6 +1,8 @@ @@ -60,6 +64,10 @@ interface props { autofocus?: boolean required?: boolean clearable?: boolean + labelClasses?: string + inputClasses?: string + clearButtonClasses?: string + hintClasses?: string } const { modelValue } = withDefaults(defineProps(), { type: 'text' From edb8e0cddf48554fc2de668632350ad07eb75281 Mon Sep 17 00:00:00 2001 From: git-mahade Date: Mon, 18 Dec 2023 14:28:55 +0600 Subject: [PATCH 14/14] text-input --- src/App.vue | 46 +++------------------------------ src/components/DxhTextInput.vue | 42 ++++++++++++++++-------------- 2 files changed, 27 insertions(+), 61 deletions(-) diff --git a/src/App.vue b/src/App.vue index 89b4093..d3dbc1b 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,43 +1,5 @@ - - - - +
+ Vue-Tailwind +
+ \ No newline at end of file diff --git a/src/components/DxhTextInput.vue b/src/components/DxhTextInput.vue index 9751c1d..08a53c3 100644 --- a/src/components/DxhTextInput.vue +++ b/src/components/DxhTextInput.vue @@ -1,7 +1,7 @@ @@ -64,10 +70,8 @@ interface props { autofocus?: boolean required?: boolean clearable?: boolean - labelClasses?: string - inputClasses?: string - clearButtonClasses?: string - hintClasses?: string + prepend?: boolean + append?: boolean } const { modelValue } = withDefaults(defineProps(), { type: 'text'