Skip to content
This repository was archived by the owner on Jun 27, 2023. It is now read-only.

Commit 5512210

Browse files
committed
feature(next): added form controls
1 parent 2896c04 commit 5512210

35 files changed

+318
-394
lines changed

.eslintrc.js

Lines changed: 33 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,38 @@
11
module.exports = {
2-
root: true,
3-
env: {
4-
browser: true,
5-
node: true,
6-
},
7-
extends: [
8-
'plugin:vue/essential',
9-
'plugin:prettier/recommended',
10-
'prettier',
11-
'prettier/vue',
2+
root: true,
3+
env: {
4+
node: true,
5+
},
6+
extends: [
7+
/* 'plugin:vue/vue3-essential', */
8+
'eslint:recommended',
9+
'@vue/typescript/recommended',
10+
'@vue/prettier',
11+
'@vue/prettier/@typescript-eslint',
12+
],
13+
parserOptions: {
14+
ecmaVersion: 2020,
15+
},
16+
rules: {
17+
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
18+
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
19+
'@typescript-eslint/no-this-alias': [
20+
'error',
21+
{
22+
allowDestructuring: true, // Allow `const { props, state } = this`; false by default
23+
allowedNames: ['self'], // Allow `const self = this`; `[]` by default
24+
},
1225
],
13-
plugins: ['prettier'],
14-
rules: {
15-
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
16-
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
17-
'prettier/prettier': [
18-
'error',
19-
{
20-
htmlWhitespaceSensitivity: 'ignore',
21-
singleQuote: true,
22-
semi: true,
23-
trailingComma: 'all',
24-
},
26+
},
27+
overrides: [
28+
{
29+
files: [
30+
'**/__tests__/*.{j,t}s?(x)',
31+
'**/tests/unit/**/*.spec.{j,t}s?(x)',
2532
],
26-
},
27-
parserOptions: {
28-
parser: 'babel-eslint',
29-
},
30-
settings: {
31-
'import/resolver': {
32-
alias: [['@', './src']],
33+
env: {
34+
jest: true,
3335
},
3436
},
35-
}
37+
],
38+
};

dev/vue/App.vue

Lines changed: 37 additions & 235 deletions
Original file line numberDiff line numberDiff line change
@@ -1,244 +1,46 @@
11
<template>
22
<div id="app">
3-
<div class="container">
4-
<h1 class="title text-center">Dynamic Forms Example</h1>
5-
<div class="row mt-5">
6-
<div class="col-6">
7-
<dynamic-form
8-
:id="testForm.id"
9-
:fields="testForm.fields"
10-
:options="testForm.options"
11-
@change="valuesChanged"
12-
>
13-
<template
14-
slot="custom-field-1"
15-
slot-scope="{ control, valueChange, onFocus, onBlur }"
16-
>
17-
<div class="avocado-field">
18-
<input
19-
v-if="control"
20-
class="form-control"
21-
v-model="control.value"
22-
:type="control.type"
23-
:name="control.name"
24-
@change="valueChange()"
25-
@focus="onFocus()"
26-
@blur="onBlur()"
27-
/>
28-
<i>🥑</i>
29-
</div>
30-
</template>
31-
<template slot="third-party" slot-scope="props">
32-
<div class="third-party">
33-
<v-select
34-
v-model="props.control.value"
35-
:options="props.control.options"
36-
:name="props.control.name"
37-
@input="props.valueChange()"
38-
@search:focus="props.onFocus()"
39-
@search:blur="props.onBlur()"
40-
></v-select>
41-
</div>
42-
</template>
43-
</dynamic-form>
44-
<div class="row d-flex justify-content-end p-4">
45-
<button submit="true" :form="testForm.id" class="btn btn-primary">
46-
Submit
47-
</button>
48-
</div>
49-
</div>
50-
<div class="col-6">
51-
<pre>{{ formData }}</pre>
52-
<pre>{{ testForm }}</pre>
53-
</div>
54-
</div>
55-
</div>
3+
<dynamic-form :form="form" />
4+
<pre>{{ form }}</pre>
565
</div>
576
</template>
587

59-
<script>
60-
import {
61-
FormField,
62-
FormValidation,
63-
required,
64-
email,
65-
pattern,
66-
maxLength,
67-
url,
68-
/* } from '../dist/as-dynamic-forms.common'; */
69-
} from '@/index';
8+
<script lang="ts">
9+
import { defineComponent, reactive } from 'vue';
10+
import { TextInput, SelectInput, DynamicForm } from '../../src/index';
7011
71-
const data = () => ({
72-
formData: {},
73-
testForm: {
74-
id: 'test-form',
75-
fields: [
76-
new FormField({
77-
type: 'text',
78-
label: 'Name',
79-
name: 'name',
80-
customClass: 'col-12',
81-
}),
82-
new FormField({
83-
type: 'email',
84-
label: 'Email',
85-
name: 'email',
86-
customClass: 'col-12',
87-
validations: [
88-
new FormValidation(required, 'This field is required'),
89-
new FormValidation(email, 'Format of email is incorrect'),
90-
],
91-
}),
92-
new FormField({
93-
type: 'password',
94-
label: 'Password',
95-
name: 'password',
96-
customClass: 'col-12',
97-
validations: [
98-
new FormValidation(required, 'This field is required'),
99-
new FormValidation(
100-
pattern(
101-
'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[#$^+=!*()@%&]).{8,10}$',
102-
),
103-
'Password must contain at least 1 Uppercase, 1 Lowercase, 1 number, 1 special character and min 8 characters max 10',
104-
),
105-
],
106-
107-
value: 'sdsdsd',
108-
}),
109-
new FormField({
110-
type: 'textarea',
111-
label: 'Bio',
112-
name: 'bio',
113-
cols: 30,
114-
rows: 10,
115-
customClass: 'col-12',
116-
value:
117-
'Prism whatever occupy, stumptown polaroid butcher activated charcoal seitan cornhole direct trade coloring book offal sriracha. 8-bit pitchfork kitsch crucifix chartreuse, tumblr adaptogen brunch stumptown. Drinking vinegar yuccie echo park lo-fi, poutine unicorn raclette adaptogen kale chips chia. Deep v austin fam organic kickstarter hexagon hell of wolf pour-over YOLO. 8-bit glossier lyft authentic, selfies aesthetic kinfolk prism tattooed irony quinoa distillery pug slow-carb post-ironic.',
118-
validations: [
119-
new FormValidation(
120-
maxLength(100),
121-
`This field should be less than 100 characters`,
122-
),
123-
],
124-
}),
125-
new FormField({
126-
type: 'url',
127-
label: 'Website',
128-
name: 'website',
129-
customClass: 'col-12',
130-
helper: 'Pstt... psst, this is a hint',
131-
validations: [new FormValidation(url, `Format of Url is incorrect`)],
132-
}),
133-
new FormField({
134-
type: 'select',
135-
label: 'Category',
136-
name: 'category',
137-
customClass: 'col-12',
138-
options: [
139-
{ value: null, text: 'Please select an option' },
140-
{ value: 'arduino', text: 'Arduino' },
141-
{ value: 'transistors', text: 'Transistors' },
142-
{ value: 'resistors', text: 'Resistors', disabled: true },
143-
],
144-
}),
145-
new FormField({
146-
type: 'checkbox',
147-
label: 'Read the conditions',
148-
name: 'conditions',
149-
inline: false,
150-
customClass: 'col-12',
151-
}),
152-
new FormField({
153-
type: 'checkbox',
154-
label: 'Disabled',
155-
name: 'disabled',
156-
value: true,
157-
disabled: true,
158-
customClass: 'col-12',
159-
}),
160-
new FormField({
161-
type: 'radio',
162-
label: 'Prefered Animal',
163-
name: 'animal',
164-
inline: true,
165-
customClass: 'col-12',
166-
options: [
167-
{ text: 'Dogs', value: 'dogs' },
168-
{ text: 'Cats', value: 'cats' },
169-
{ text: 'Others', value: 'others' },
170-
],
171-
}),
172-
new FormField({
173-
type: 'custom-field',
174-
label: 'Custom Field 1',
175-
name: 'custom-field-1',
176-
customClass: 'col-12',
177-
}),
178-
new FormField({
179-
id: 'number-custom-id',
180-
type: 'number',
181-
label: 'Number',
182-
name: 'number',
183-
value: 0,
184-
customClass: 'col-12 col-md-6',
185-
}),
186-
new FormField({
187-
type: 'number',
188-
label: 'Number 2',
189-
name: 'number2',
190-
value: 50,
191-
customClass: 'col-12 col-md-6',
192-
}),
193-
new FormField({
194-
type: 'custom-field',
195-
label: 'V-Select',
196-
name: 'third-party',
197-
customClass: 'col-6',
198-
options: ['Arduino', 'Pinguino'],
199-
}),
200-
],
201-
options: {
202-
autoValidate: true,
203-
customClass: 'row',
204-
netlify: true,
205-
},
206-
},
207-
});
208-
209-
const methods = {
210-
valuesChanged(values) {
211-
this.$forceUpdate(); // this is only to refresh the fields on the <pre> tags, not necessary for other purpouses
212-
this.formData = {
213-
...this.formData,
214-
...values,
215-
};
216-
},
217-
};
218-
219-
export default {
12+
export default defineComponent({
22013
name: 'app',
221-
data,
222-
methods,
223-
mounted() {
224-
console.log(this.$formUtils);
14+
setup() {
15+
const form = reactive<DynamicForm>({
16+
id: 'form',
17+
fields: [
18+
new TextInput({
19+
label: 'Name',
20+
}),
21+
new SelectInput<string>({
22+
label: 'Games',
23+
options: [
24+
{
25+
key: 'the-last-of-us',
26+
value: 'The Last of Us II',
27+
},
28+
{
29+
key: 'death-stranding',
30+
value: 'Death Stranding',
31+
},
32+
{
33+
key: 'nier-automata',
34+
value: 'Nier Automata',
35+
},
36+
],
37+
}),
38+
],
39+
});
40+
return {
41+
form,
42+
};
22543
},
226-
};
44+
});
22745
</script>
228-
<style lang="scss">
229-
.avocado-field {
230-
position: relative;
231-
232-
.form-control {
233-
border-color: #aec64c;
234-
background-color: #e2eb5d52;
235-
border-radius: 16px;
236-
}
237-
238-
i {
239-
position: absolute;
240-
top: 5px;
241-
right: 5px;
242-
}
243-
}
244-
</style>
46+
<style lang="scss"></style>

dev/vue/main.js

Lines changed: 0 additions & 12 deletions
This file was deleted.

0 commit comments

Comments
 (0)