Skip to content

Grouping fields #209

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 11 commits into from
May 31, 2017
78 changes: 78 additions & 0 deletions dev/grouping/app.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
<template lang="html">
<form>
<vue-form-generator :schema="schema" :model="model" :options="formOptions" tag="section"></vue-form-generator>
<pre>{{ model }}</pre>
</form>
</template>

<script>
import Vue from "vue";

export default {
data () {
return {
model: {
name: 'Brian Blessed',
email: "[email protected]",
others: {
more: "More",
things: "Things"
},
single: 'blah'
},

schema: {
groups:[{
legend: "Contact Details",
fields: [
{
type: "input",
inputType: "text",
label: "Name",
model: "name"
},
{
type: "input",
inputType: "email",
label: "Email",
model: "email"
}
]
},{
legend: "Other Details",
fields: [
{
type: "input",
inputType: "text",
label: "More",
model: "others.more"
},
{
type: "input",
inputType: "text",
label: "Things",
model: "others.things"
}
]
}],
fields: [
{
type: "input",
inputType: "text",
label: "Single field (without group)",
model: "single"
}
]
},

formOptions: {
fieldIdPrefix: 'frm1-'
}
}
},

created() {
window.app = this;
}
}
</script>
12 changes: 12 additions & 0 deletions dev/grouping/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>vue-form-generator multiple forms demo</title>
</head>
<body>
<div class="container-fluid"></div>
<div id="app"></div>
<script src="/grouping.js"></script>
</body>
</html>
9 changes: 9 additions & 0 deletions dev/grouping/main.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import Vue from "vue";
import VueFormGenerator from "../../src";
Vue.use(VueFormGenerator);

import App from './app.vue';

new Vue({
...App
}).$mount('#app');
6 changes: 4 additions & 2 deletions src/fields/abstractField.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ export default {
props: [
"model",
"schema",
"options",
"disabled"
],

Expand Down Expand Up @@ -163,14 +164,15 @@ export default {
},

getFieldID(schema) {
const idPrefix = this.options && this.options.fieldIdPrefix ? this.options.fieldIdPrefix : "";
// Try to get a reasonable default id from the schema,
// then slugify it.
if (typeof schema.id !== "undefined") {
// If an ID's been explicitly set, use it unchanged
return schema.id;
return idPrefix + schema.id;
} else {
// Return the slugified version of either:
return (schema.inputName || schema.label || schema.model)
return idPrefix + (schema.inputName || schema.label || schema.model)
// NB: This is a very simple, conservative, slugify function,
// avoiding extra dependencies.
.toString()
Expand Down
58 changes: 43 additions & 15 deletions src/formGenerator.vue
Original file line number Diff line number Diff line change
@@ -1,20 +1,38 @@
<template lang="pug">
div
fieldset.vue-form-generator(v-if='schema != null', :is='tag')
template(v-for='field in fields')
div.vue-form-generator(v-if='schema != null')
template(v-for='field in fields')
fieldset(:is='tag')
.form-group(v-if='fieldVisible(field)', :class='getFieldRowClasses(field)')
label(v-if="fieldTypeHasLabel(field)", :for="getFieldID(field)")
| {{ field.label }}
span.help(v-if='field.help')
i.icon
.helpText(v-html='field.help')
.field-wrap
component(:is='getFieldType(field)', :disabled='fieldDisabled(field)', :model='model', :schema.sync='field', @model-updated='modelUpdated', @validated="onFieldValidated")
component(:is='getFieldType(field)', :disabled='fieldDisabled(field)', :model='model', :schema='field', :options='options', @model-updated='modelUpdated', @validated="onFieldValidated")
.buttons(v-if='buttonVisibility(field)')
button(v-for='btn in field.buttons', @click='buttonClickHandler(btn, field)', :class='btn.classes') {{ btn.label }}
.hint(v-if='field.hint') {{ field.hint }}
.errors.help-block(v-if='fieldErrors(field).length > 0')
span(v-for='(error, index) in fieldErrors(field)', track-by='index') {{ error }}

template(v-for='group in groups')
fieldset
legend(v-if='group.legend') {{ group.legend }}
template(v-for='field in group.fields')
.form-group(v-if='fieldVisible(field)', :class='getFieldRowClasses(field)')
label(v-if="fieldTypeHasLabel(field)", :for="getFieldID(field)")
| {{ field.label }}
span.help(v-if='field.help')
i.icon
.helpText(v-html='field.help')
.field-wrap
component(:is='getFieldType(field)', :disabled='fieldDisabled(field)', :model='model', :schema='field', :options='options',@model-updated='modelUpdated', @validated="onFieldValidated")
.buttons(v-if='buttonVisibility(field)')
button(v-for='btn in field.buttons', @click='buttonClickHandler(btn, field)', :class='btn.classes') {{ btn.label }}
.hint(v-if='field.hint') {{ field.hint }}
.errors.help-block(v-if='fieldErrors(field).length > 0')
span(v-for='(error, index) in fieldErrors(field)', track-by='index') {{ error }}
</template>

<script>
Expand Down Expand Up @@ -91,17 +109,27 @@ div
},

computed: {
fields() {
let res = [];
if (this.schema) {
each(this.schema.fields, (field) => {
if (!this.multiple || field.multi === true)
res.push(field);
});
}

return res;
}
fields() {
let res = [];
if (this.schema && this.schema.fields) {
each(this.schema.fields, (field) => {
if (!this.multiple || field.multi === true)
res.push(field);
});
}

return res;
},
groups() {
let res = [];
if (this.schema && this.schema.groups) {
each(this.schema.groups, (group) => {
res.push(group);
});
}

return res;
}
},

watch: {
Expand Down
33 changes: 17 additions & 16 deletions webpack.dev.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,23 +17,24 @@ var loaders = [
test: /\.json$/,
loader: 'json'
},
{
test: /\.(woff2?|svg)$/,
loader: "url"
//loader: "url?limit=10000"
{
test: /\.(woff2?|svg)$/,
loader: "url"
//loader: "url?limit=10000"
},
{
test: /\.(ttf|eot)$/,
loader: "url"
{
test: /\.(ttf|eot)$/,
loader: "url"
}
];

module.exports = {
devtool: "source-map",

entry: {
full: path.resolve("dev", "full", "main.js"),
mselect: path.resolve("dev", "multiselect", "main.js"),
grouping: path.resolve("dev", "grouping", "main.js"),
checklist: path.resolve("dev", "checklist", "main.js")
},

Expand All @@ -43,14 +44,14 @@ module.exports = {
publicPath: "/"
},

plugins: [
new webpack.DefinePlugin({
"process.env": {
NODE_ENV: JSON.stringify("development"),
FULL_BUNDLE: true
}
}),
],
plugins: [
new webpack.DefinePlugin({
"process.env": {
NODE_ENV: JSON.stringify("development"),
FULL_BUNDLE: true
}
}),
],

module: {
loaders
Expand Down