diff --git a/apps/docs/.vitepress/config.js b/apps/docs/.vitepress/config.js index e7152b2..3ce522b 100644 --- a/apps/docs/.vitepress/config.js +++ b/apps/docs/.vitepress/config.js @@ -58,6 +58,7 @@ export default defineConfig({ { text: 'FieldColor', link: '/guide/fields/FieldColor' }, { text: 'FieldMask', link: '/guide/fields/FieldMask' }, { text: 'FieldNumber', link: '/guide/fields/FieldNumber' }, + { text: 'FieldObject', link: '/guide/fields/FieldObject' }, { text: 'FieldPassword', link: '/guide/fields/FieldPassword' }, { text: 'FieldRadio', link: '/guide/fields/FieldRadio' }, { text: 'FieldReset', link: '/guide/fields/FieldReset' }, diff --git a/apps/docs/components/examples/fields/FieldObjectExample.vue b/apps/docs/components/examples/fields/FieldObjectExample.vue new file mode 100644 index 0000000..d59116e --- /dev/null +++ b/apps/docs/components/examples/fields/FieldObjectExample.vue @@ -0,0 +1,63 @@ + + + \ No newline at end of file diff --git a/apps/docs/guide/fields/FieldObject.md b/apps/docs/guide/fields/FieldObject.md new file mode 100644 index 0000000..d3c1c24 --- /dev/null +++ b/apps/docs/guide/fields/FieldObject.md @@ -0,0 +1,112 @@ +# FieldObject +`FieldObject` is a field that has its own `schema`, meaning the field itself +renders other fields. These fields will return their values to the object inside +the model that is assigned to the `FieldObject` component. + +### type `object` + + + +## Basic example +::: details Code +```js +const form = ref({ + model: { + person: { + name: '', + surname: '', + age: null + } + }, + schema: { + fields: [ + { + type: 'object', + model: 'person', + schema: { + fields: [ + { + type: 'input', + inputType: 'text', + model: 'name', + label: 'Name' + }, + { + type: 'input', + inputType: 'text', + model: 'surname', + label: 'Surname' + }, + { + type: 'input', + inputType: 'number', + model: 'age', + label: 'Age' + } + ] + } + } + ] + } +}) +``` +::: + + +## With validators +::: details Code +```js +function minLengthThree (value) { + return value && value.length >= 3 +} + +function overEighteen (value) { + return value && value >= 18 +} + +// ...... +fields: [ + { + type: 'object', + model: 'person', + schema: { + fields: [ + { + type: 'input', + inputType: 'text', + model: 'name', + label: 'Name', + validator: minLengthThree + }, + { + type: 'input', + inputType: 'text', + model: 'surname', + label: 'Surname', + validator: minLengthThree + }, + { + type: 'input', + inputType: 'number', + model: 'age', + label: 'Age', + validator: overEighteen + } + ] + } + } + ] +``` +::: +::: info +In this example, `name` and `surname` must have a length of three letters or more, `age` must be at least 18. +::: + + + +## Properties +| Property | Default | Type | Description | +|----------|---------|----------|---------------------------------------------| +| schema | `{}` | `Object` | A form schema, as seen in `FormGenerator.vue` | \ No newline at end of file diff --git a/apps/docs/guide/form-generator/events.md b/apps/docs/guide/form-generator/events.md index 7971642..239031d 100644 --- a/apps/docs/guide/form-generator/events.md +++ b/apps/docs/guide/form-generator/events.md @@ -1,4 +1,27 @@ These are events emitted by the `vue-form-generator` component. +## `field-validated` +Emitted when a field inside the form has been validated. + +### Event arguments +- `validations` - an object with the field's errors and the field schema + - `fieldErrors` - an array of error messages that have been thrown during validations; + - `field` - the field as defined in the schema + +An example from the [`FieldObject`](/guide/fields/FieldObject) component: +```vue [FieldObject.vue] + +``` + ## `submit` -Emitted when all fields have been validated and no errors occurred during said validations. \ No newline at end of file +Emitted when all fields have been validated and no errors occurred during said validations. diff --git a/package.json b/package.json index de122c7..718c3eb 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "main": "./dist/vue3-form-generator.js", "scripts": { "dev": "vite", - "dev:sass": "sass --watch src/scss/themes:playground/css/", + "dev:sass": "sass --watch src/scss/themes:apps/playground/css/", "test": "vitest", "build": "vite build && sass src/scss/themes/:dist/themes/", "preview": "vite preview", diff --git a/src/FormGenerator.vue b/src/FormGenerator.vue index 4b99637..333c5f3 100644 --- a/src/FormGenerator.vue +++ b/src/FormGenerator.vue @@ -3,7 +3,7 @@ import { computed, ref } from 'vue' import { resetObjectProperties, toUniqueArray } from '@/helpers' import FormGroup from './FormGroup.vue' -const emits = defineEmits([ 'submit' ]) +const emits = defineEmits([ 'submit', 'field-validated' ]) const props = defineProps({ id: { @@ -55,6 +55,7 @@ const updateGeneratorModel = ({ model, value }) => { * @param field field schema object that has been validated. */ const onFieldValidated = ({ fieldErrors, field }) => { + emits('field-validated', { fieldErrors, field }) if (!fieldErrors.length) { if (!(field.model in formErrors.value)) return else { @@ -82,7 +83,7 @@ const onReset = () => { props.model = resetObjectProperties(props.model) } -defineExpose({ hasErrors }) +defineExpose({ hasErrors, formErrors })