Skip to content

Commit 3a1c267

Browse files
committed
Merge remote-tracking branch 'refs/remotes/origin/master' into next
2 parents 454fa0e + d5d4508 commit 3a1c267

File tree

3 files changed

+143
-5
lines changed

3 files changed

+143
-5
lines changed

README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# vue-form-generator [![NPM version](https://img.shields.io/npm/v/vue-form-generator.svg)](https://www.npmjs.com/package/vue-form-generator)
2-
A schema-based form generator component for Vue.js v1.x.x
2+
A schema-based form generator component for Vue.js.
33

44
[![Codacy Badge](https://api.codacy.com/project/badge/Grade/912039aa815e40de8315032519aa7e6c)](https://www.codacy.com/app/mereg-norbert/vue-form-generator?utm_source=github.com&utm_medium=referral&utm_content=icebob/vue-form-generator&utm_campaign=Badge_Grade)
55
[![Build Status](https://travis-ci.org/icebob/vue-form-generator.svg?branch=master)](https://travis-ci.org/icebob/vue-form-generator)
@@ -11,7 +11,7 @@ A schema-based form generator component for Vue.js v1.x.x
1111
[![devDependency Status](https://david-dm.org/icebob/vue-form-generator/dev-status.svg)](https://david-dm.org/icebob/vue-form-generator#info=devDependencies)
1212
[![Downloads](https://img.shields.io/npm/dt/vue-form-generator.svg)](https://www.npmjs.com/package/vue-form-generator)
1313

14-
**Vue v2.x support is under development!**
14+
[**Vue v2.x pre-release is available!**](https://github.com/icebob/vue-form-generator/releases)
1515

1616
## Demo
1717
[JSFiddle simple example](https://jsfiddle.net/icebob/0mg1v81e/)

src/formGenerator.vue

+36-3
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,9 @@ div
118118
let baseClasses = {
119119
error: field.errors && field.errors.length > 0,
120120
disabled: this.fieldDisabled(field),
121-
readonly: field.readonly,
122-
featured: field.featured,
123-
required: field.required
121+
readonly: this.fieldReadonly(field),
122+
featured: this.fieldFeatured(field),
123+
required: this.fieldRequired(field)
124124
};
125125
126126
if (isArray(field.styleClasses)) {
@@ -151,6 +151,17 @@ div
151151
return field.disabled;
152152
},
153153
154+
// Get required prop of field
155+
fieldRequired(field) {
156+
if (isFunction(field.required))
157+
return field.required(this.model);
158+
159+
if (isNil(field.required))
160+
return false;
161+
162+
return field.required;
163+
},
164+
154165
// Get visible prop of field
155166
fieldVisible(field) {
156167
if (isFunction(field.visible))
@@ -162,6 +173,28 @@ div
162173
return field.visible;
163174
},
164175
176+
// Get readonly prop of field
177+
fieldReadonly(field) {
178+
if (isFunction(field.readonly))
179+
return field.readonly(this.model);
180+
181+
if (isNil(field.readonly))
182+
return false;
183+
184+
return field.readonly;
185+
},
186+
187+
// Get featured prop of field
188+
fieldFeatured(field) {
189+
if (isFunction(field.featured))
190+
return field.featured(this.model);
191+
192+
if (isNil(field.featured))
193+
return false;
194+
195+
return field.featured;
196+
},
197+
165198
// Validating the model properties
166199
validate() {
167200
// console.log("Validate!", this.model);

test/unit/specs/VueFormGenerator.spec.js

+105
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,111 @@ describe("VueFormGenerator.vue", () => {
311311

312312
});
313313

314+
describe("check fieldReadonly with function", () => {
315+
let schema = {
316+
fields: [
317+
{
318+
type: "text",
319+
label: "Name",
320+
model: "name",
321+
readonly(model) { return model.status; }
322+
}
323+
]
324+
};
325+
326+
let model = {
327+
name: "John Doe",
328+
status: true
329+
};
330+
331+
before( () => {
332+
createFormGenerator(schema, model);
333+
});
334+
335+
it("should be readonly", () => {
336+
expect(el.querySelector(".form-group").classList.contains("readonly")).to.be.true;
337+
});
338+
339+
it("should be writable", (done) => {
340+
model.status = false;
341+
vm.$nextTick(() => {
342+
expect(el.querySelector(".form-group").classList.contains("readonly")).to.be.false;
343+
done();
344+
});
345+
});
346+
347+
});
348+
349+
describe("check fieldFeatured with function", () => {
350+
let schema = {
351+
fields: [
352+
{
353+
type: "text",
354+
label: "Name",
355+
model: "name",
356+
featured(model) { return model.status; }
357+
}
358+
]
359+
};
360+
361+
let model = {
362+
name: "John Doe",
363+
status: true
364+
};
365+
366+
before( () => {
367+
createFormGenerator(schema, model);
368+
});
369+
370+
it("should be featured", () => {
371+
expect(el.querySelector(".form-group").classList.contains("featured")).to.be.true;
372+
});
373+
374+
it("should not be featured", (done) => {
375+
model.status = false;
376+
vm.$nextTick(() => {
377+
expect(el.querySelector(".form-group").classList.contains("featured")).to.be.false;
378+
done();
379+
});
380+
});
381+
382+
});
383+
384+
describe("check fieldRequired with function", () => {
385+
let schema = {
386+
fields: [
387+
{
388+
type: "text",
389+
label: "Name",
390+
model: "name",
391+
required(model) { return model.status; }
392+
}
393+
]
394+
};
395+
396+
let model = {
397+
name: "John Doe",
398+
status: true
399+
};
400+
401+
before( () => {
402+
createFormGenerator(schema, model);
403+
});
404+
405+
it("should be required", () => {
406+
expect(el.querySelector(".form-group").classList.contains("required")).to.be.true;
407+
});
408+
409+
it("should be optional", (done) => {
410+
model.status = false;
411+
vm.$nextTick(() => {
412+
expect(el.querySelector(".form-group").classList.contains("required")).to.be.false;
413+
done();
414+
});
415+
});
416+
417+
});
418+
314419
describe("check fieldVisible with function", () => {
315420
let schema = {
316421
fields: [

0 commit comments

Comments
 (0)