-
Notifications
You must be signed in to change notification settings - Fork 917
/
maker.js
75 lines (64 loc) · 2.15 KB
/
maker.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import Creator, {creatorFactory} from './creator';
import {parseJson, enumerable} from '../core/util';
import {extend, isPlainObject, isString, isValidChildren} from '@form-create/utils';
export default function makerFactory() {
let maker = {};
const commonMaker = creatorFactory('');
extend(maker, {
create(type, field, title) {
let make = commonMaker('', field);
make._data.type = type;
make._data.title = title;
return make;
},
createTmp(template, vm, field, title) {
let make = commonMaker('', field);
make._data.type = 'template';
make._data.template = template;
make._data.title = title;
make._data.vm = vm;
return make;
}
});
maker.template = maker.createTmp;
maker.parse = parse;
return maker;
}
function parse(rule, toMaker = false) {
if (isString(rule)) rule = parseJson(rule);
if (rule instanceof Creator) return toMaker ? rule : rule.getRule();
if (isPlainObject(rule)) {
const maker = ruleToMaker(rule);
return toMaker ? maker : maker.getRule();
} else if (!Array.isArray(rule)) return rule;
else {
const rules = rule.map(r => parse(r, toMaker));
Object.defineProperties(rules, {
find: enumerable(findField),
model: enumerable(model)
});
return rules;
}
}
function findField(field, origin) {
let children = [];
for (let i in this) {
const rule = this[i] instanceof Creator ? this[i]._data : this[i];
if (rule.field === field) return origin === true ? rule : this[i];
if (isValidChildren(rule.children)) children = children.concat(rule.children);
}
if (children.length > 0) return findField.call(children, field);
}
function model(formData) {
Object.keys(formData).forEach(field => {
const rule = this.find(field, true);
if (rule) rule.value = formData[field];
});
}
function ruleToMaker(rule) {
const maker = new Creator();
Object.keys(rule).forEach(key => {
maker._data[key] = rule[key];
});
return maker;
}