Skip to content

Commit 095b932

Browse files
authored
Merge pull request #17 from kevinkosterr/field-textarea
Add Textarea field
2 parents f7f39b2 + 78fb6f9 commit 095b932

File tree

4 files changed

+100
-2
lines changed

4 files changed

+100
-2
lines changed
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import { generateSchemaSingleField, generatePropsSingleField, mountFormGenerator } from '@test/_resources/utils.js'
2+
import { mount, config } from '@vue/test-utils'
3+
import { describe, it, expect } from 'vitest'
4+
5+
import FieldTextarea from '@/fields/input/FieldTextarea.vue'
6+
7+
const form = generateSchemaSingleField(
8+
'textTest',
9+
'textModel',
10+
'textarea',
11+
null,
12+
'A test for text',
13+
'',
14+
{
15+
placeholder: 'test placeholder'
16+
}
17+
)
18+
19+
const props = generatePropsSingleField(form)
20+
21+
describe('Test FieldTextarea', () => {
22+
23+
it('Should render correctly', () => {
24+
const wrapper = mount(FieldTextarea, { props })
25+
const textAreaEl = wrapper.find('textarea')
26+
expect(textAreaEl.exists()).toBe(true)
27+
expect(textAreaEl.attributes().placeholder).toBe('test placeholder')
28+
})
29+
30+
it('Should render correctly inside form generator', async () => {
31+
config.global.components = { FieldTextarea }
32+
33+
const formWrapper = mountFormGenerator(form.schema, form.model)
34+
expect(formWrapper.findComponent(FieldTextarea).exists()).toBeTruthy()
35+
36+
const textAreaEl = formWrapper.find('textarea')
37+
expect(textAreaEl.exists()).toBeTruthy()
38+
expect(textAreaEl.attributes().placeholder).toBe('test placeholder')
39+
})
40+
41+
it('Should emit onInput event', async () => {
42+
const wrapper = mount(FieldTextarea, { props })
43+
await wrapper.find('textarea').trigger('input')
44+
expect(wrapper.emitted()).toHaveProperty('onInput')
45+
})
46+
47+
it('Should update model value', async () => {
48+
config.global.components = { FieldTextarea }
49+
50+
const formWrapper = mountFormGenerator(form.schema, form.model)
51+
52+
const textAreaField = formWrapper.findComponent(FieldTextarea)
53+
expect(textAreaField.exists()).toBeTruthy()
54+
await textAreaField.find('textarea').setValue('I have the high ground')
55+
expect(formWrapper.vm.model.textModel).toBe('I have the high ground')
56+
})
57+
58+
})

src/fields/index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import FieldRadio from '@/fields/input/FieldRadio.vue'
77
import FieldColor from '@/fields/input/FieldColor.vue'
88
import FieldNumber from '@/fields/input/FieldNumber.vue'
99
import FieldSwitch from '@/fields/input/FieldSwitch.vue'
10+
import FieldTextarea from '@/fields/input/FieldTextarea.vue'
1011

1112
import FieldSubmit from '@/fields/buttons/FieldSubmit.vue'
1213
import FieldReset from '@/fields/buttons/FieldReset.vue'
@@ -15,7 +16,7 @@ import FieldButton from '@/fields/buttons/FieldButton.vue'
1516

1617
const fieldComponents = [
1718
FieldText, FieldCheckBox, FieldPassword, FieldSelect, FieldSelectNative, FieldRadio, FieldColor, FieldNumber,
18-
FieldSubmit, FieldReset, FieldButton, FieldSwitch
19+
FieldSubmit, FieldReset, FieldButton, FieldSwitch, FieldTextarea
1920
]
2021

2122
export default {

src/fields/input/FieldTextarea.vue

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<template>
2+
<textarea
3+
:id="id"
4+
:style="field.resizable ? '' : 'resize: none;'"
5+
class="field-textarea"
6+
:name="field.name"
7+
:required="isRequired"
8+
:readonly="isReadOnly"
9+
:disabled="isDisabled"
10+
:maxlength="field.maxLength"
11+
:placeholder="field.placeholder"
12+
:value="currentModelValue"
13+
@input="onFieldValueChanged"
14+
@blur="onBlur"
15+
/>
16+
</template>
17+
18+
<script>
19+
import { abstractField } from '@/mixins'
20+
21+
export default {
22+
name: 'FieldTextarea',
23+
mixins: [ abstractField ]
24+
}
25+
</script>

src/scss/themes/basic.scss

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,13 @@ $input-padding: .3rem .4rem;
88

99
.vue-form-generator {
1010

11-
input:not([type='checkbox'],[type='submit'],[type='radio'],[type='color'],[type='reset']) {
11+
input:not(
12+
[type='checkbox'],
13+
[type='submit'],
14+
[type='radio'],
15+
[type='color'],
16+
[type='reset']),
17+
textarea {
1218
width: 100%;
1319
padding: $input-padding;
1420
border-radius: 3px;
@@ -100,6 +106,14 @@ $input-padding: .3rem .4rem;
100106
}
101107
}
102108

109+
/** Textarea field */
110+
.field-textarea {
111+
&:focus {
112+
border: none;
113+
outline: none;
114+
}
115+
}
116+
103117
.field-reset {
104118
border-radius: 3px;
105119
}

0 commit comments

Comments
 (0)