Skip to content

Commit afe2d30

Browse files
committed
2 parents e8f20cc + 925d9d2 commit afe2d30

File tree

106 files changed

+4932
-16266
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

106 files changed

+4932
-16266
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,6 @@ test/coverage
2222
/website/dist
2323
/dist
2424
/deploy-baidu
25-
/coverage
25+
/test/unit/coverage
2626
gh-pages/
2727
.vscode/

build/webpack.website.dev.config.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ module.exports = merge(webpackBaseConfig, {
2323
devServer: {
2424
compress: true,
2525
port: 9000,
26-
host: 'localhost',
26+
host: '0.0.0.0',
2727
historyApiFallback: true,
2828
hot: true,
2929
inline: true,
@@ -41,6 +41,11 @@ module.exports = merge(webpackBaseConfig, {
4141

4242
devtool: 'eval-source-map',
4343

44+
resolve: {
45+
alias: {
46+
'@': path.resolve(__dirname, '../website'),
47+
}
48+
},
4449
// 入口
4550
entry: {
4651
main: path.resolve(__dirname, '../website/main'),

form-generator.svg

Lines changed: 942 additions & 942 deletions
Loading

form-generator.xmind

225 KB
Binary file not shown.

package-lock.json

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

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
"url": "https://github.com/JSON-Drived-Configurable-Platform/form-generator-iview"
3838
},
3939
"peerDependencies": {
40-
"iview": "^3.4.0",
40+
"iview": "^3.5.4",
4141
"vue": "^2.6.10"
4242
},
4343
"devDependencies": {

src/fieldGenerator.vue

Lines changed: 63 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -5,41 +5,49 @@
55
:style="itemStyle"
66
>
77
<component
8-
:is="getFieldCom(field.type)"
8+
:is="getFieldCom(computedField.type)"
99
:class="classes"
10-
:field="field"
10+
:field="computedField"
1111
:inline="inline"
12-
:size="field.size || size"
12+
:size="computedField.size || size"
1313
/>
1414
</div>
1515
<FormItem
1616
v-else-if="show"
17-
:label="field.label"
18-
:prop="field.model"
19-
:required="field.required"
17+
:label="computedField.label"
18+
:prop="computedField.model"
19+
:required="computedField.required"
2020
:rules="getRules"
21-
:label-width="field.labelWidth"
21+
:label-width="computedField.labelWidth"
2222
:class="itemClasses"
2323
:style="itemStyle"
2424
>
25-
<Icon
26-
v-if="labelTip.icon"
27-
:type="labelTip.icon.name"
28-
:size="labelTip.icon.size"
29-
:color="labelTip.icon.color"
30-
@click="handleIconClick"
31-
@mouseenter.native="handleIconMouseEnter"
32-
@mouseleave.native="handleIconMouseLeave"
33-
/>
34-
<div v-if="contentShow" v-html="labelTip.content.body" />
25+
<div
26+
:class="[labelTipClasses, labelTip.class]"
27+
@mouseenter="handleIconMouseEnter"
28+
@mouseleave="handleIconMouseLeave"
29+
>
30+
<Icon
31+
v-if="labelTip.icon"
32+
:type="labelTip.icon.name"
33+
:size="labelTip.icon.size"
34+
:color="labelTip.icon.color"
35+
@click="handleIconClick"
36+
/>
37+
<div
38+
v-if="contentShow"
39+
:class="labelTipContentClasses"
40+
v-html="labelTip.content.body"
41+
/>
42+
</div>
3543
<component
36-
:is="getFieldCom(field.type)"
44+
:is="getFieldCom(computedField.type)"
3745
:class="classes"
38-
:field="field"
46+
:field="computedField"
3947
:inline="inline"
4048
:api-base="apiBase"
41-
:size="field.size || size"
42-
:request-interceptor="requestInterceptor"
49+
:size="computedField.size || size"
50+
:dynamic-config-data="requestInterceptor"
4351
:params-container="paramsContainer"
4452
@on-change="handleFieldChange"
4553
@on-preview="handleFieldPreview"
@@ -59,6 +67,7 @@ import {classPrefix} from './utils/const';
5967
import {getValidType} from './utils/getValidType';
6068
import schema from 'async-validator';
6169
import axios from './utils/http';
70+
import {isFunction} from './utils/func';
6271
import {setValue} from './utils/processValue';
6372
6473
const notFormfields = ['Divider'];
@@ -80,7 +89,7 @@ export default {
8089
}
8190
},
8291
field: {
83-
type: [Object, Array],
92+
type: [Object, Array, Function],
8493
required: true,
8594
default() {
8695
return {};
@@ -107,18 +116,24 @@ export default {
107116
},
108117
computed: {
109118
classes() {
110-
return `${classPrefix}-${this.field.type.toLowerCase()}`;
119+
return `${classPrefix}-${this.computedField.type.toLowerCase()}`;
111120
},
112121
itemClasses() {
113122
return `${classPrefix}-form-item`;
114123
},
124+
labelTipClasses() {
125+
return `${classPrefix}-labelTip-wp`;
126+
},
127+
labelTipContentClasses() {
128+
return `${classPrefix}-labelTip-content`;
129+
},
115130
notFormfield() {
116-
return notFormfields.includes(this.field.type);
131+
return notFormfields.includes(this.computedField.type);
117132
},
118133
itemStyle() {
119-
const inline = this.field.inline || this.inline;
134+
const inline = this.computedField.inline || this.inline;
120135
const itemWidth = inline ? this.itemWidth : (this.itemWidth || '100%');
121-
let width = this.field.width || itemWidth;
136+
let width = this.computedField.width || itemWidth;
122137
// 兼容老版本的字符串数值,如果是数值字符串,则转为int
123138
if (typeof width === 'string' && /^\d+$/.test(width)) {
124139
width = parseInt(width);
@@ -129,8 +144,17 @@ export default {
129144
// width: typeof width !== 'number' ? width + 'px' : width
130145
};
131146
},
132-
show() {
147+
computedField() {
133148
const field = this.field;
149+
if (field && isFunction(field)) {
150+
const params = Object.assign({}, this.form.model, this.paramsContainer);
151+
const newField = Object.assign({}, field(params));
152+
return newField;
153+
}
154+
return field;
155+
},
156+
show() {
157+
const field = this.computedField;
134158
const model = this.form.model;
135159
const validateValue = Object.assign({}, model || {}, this.paramsContainer || {});
136160
let show = true;
@@ -152,19 +176,18 @@ export default {
152176
}
153177
});
154178
}
155-
// console.log(field.model, valid, model);
156179
return show;
157180
},
158181
labelTip() {
159-
let labelTip = this.field.labelTip || {};
182+
let labelTip = this.computedField.labelTip || {};
160183
return labelTip;
161184
},
162185
contentShow() {
163-
let content = this.field.labelTip && this.field.labelTip.content || {};
186+
let content = this.computedField.labelTip && this.computedField.labelTip.content || {};
164187
return content.ifShow;
165188
},
166189
getRules() {
167-
const field = this.field;
190+
const field = this.computedField;
168191
const type = field.type.toLowerCase();
169192
const subtype = field.subtype;
170193
@@ -236,7 +259,7 @@ export default {
236259
}
237260
},
238261
created() {
239-
let field = this.field;
262+
let field = this.computedField;
240263
// 老版本兼容
241264
if (field.subType) {
242265
field.subtype = field.subType;
@@ -253,14 +276,14 @@ export default {
253276
this.$emit('on-field-change', {
254277
model,
255278
value,
256-
field: this.field
279+
field: this.computedField
257280
});
258281
},
259282
handleFieldPreview(model, value) {
260283
this.$emit('on-field-preview', {
261284
model,
262285
value,
263-
field: this.field
286+
field: this.computedField
264287
});
265288
},
266289
handleSubmitClick(component) {
@@ -281,17 +304,17 @@ export default {
281304
},
282305
handleIconClick() {
283306
this.$emit('on-label-tip-click',{
284-
field: this.field
307+
field: this.computedField
285308
});
286309
},
287310
handleIconMouseEnter() {
288311
this.$emit('on-label-tip-mouseIn', {
289-
field: this.field
312+
field: this.computedField
290313
});
291314
},
292315
handleIconMouseLeave() {
293316
this.$emit('on-label-tip-mouseOut', {
294-
field: this.field
317+
field: this.computedField
295318
});
296319
},
297320
getFieldCom(comType = '') {
@@ -303,10 +326,10 @@ export default {
303326
handelListItemClick(value) {
304327
this.$emit('on-list-item-click', value);
305328
},
306-
329+
307330
308331
submit(component) {
309-
let field = component.field;
332+
let field = component.computedField;
310333
return new Promise((resolve, reject) => {
311334
try {
312335
this.form.validate(
@@ -366,7 +389,7 @@ export default {
366389
},
367390
handleHttpRequest(component) {
368391
component.loading = true;
369-
let field = component.field;
392+
let field = component.computedField;
370393
this.doAjaxAction(component.field).then(() => {
371394
component.loading = false;
372395
this.$Message.info(`${field.text}成功!`);

src/fields/fieldInputMultiple.vue

Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
<script>
5757
import {Input, Tag} from 'iview';
5858
import {getValue} from '../utils/processValue';
59+
import schema from 'async-validator';
5960
6061
export default {
6162
inject: ['form'],
@@ -97,17 +98,63 @@ export default {
9798
this.handleAdd(e);
9899
}
99100
},
101+
// 通过field.inputRules校验
102+
validator() {
103+
let formItem = this.$parent;
104+
105+
if (typeof this.field.inputRules === 'object') {
106+
let descriptor = {};
107+
descriptor[this.field.model] = this.field.inputRules;
108+
109+
let validator = new schema(descriptor);
110+
let model = {};
111+
112+
model[this.field.model] = this.value;
113+
114+
validator.validate(model, errors => {
115+
if (errors) {
116+
this.validateMessage = errors ? errors[0].message : '';
117+
118+
formItem.validateState = 'error';
119+
formItem.validateMessage = this.validateMessage;
120+
return;
121+
} else {
122+
formItem.validateState = 'success';
123+
this.validateMessage = '';
124+
}
125+
});
126+
} else {
127+
formItem.validateState = 'success';
128+
this.validateMessage = '';
129+
}
130+
},
100131
handleAdd(e) {
101132
if (!this.value) {
102133
this.$Message.warning('请输入数据后添加');
103134
return;
104135
}
105-
if (this.list.indexOf(this.value) === -1) {
106-
this.field.succMessage && this.$Message.success(this.field.succMessage);
107-
this.list.push(this.value);
108-
this.value = '';
109-
this.$emit('on-change', this.field.model, this.list, e, this.field);
136+
if (this.list.indexOf(this.value) !== -1) {
137+
this.$Message.warning(`${this.value}已存在`);
138+
return;
110139
}
140+
if (this.defaultList.indexOf(this.value) !== -1) {
141+
this.$Message.warning(`${this.value}已存在`);
142+
return;
143+
}
144+
145+
if (!this.validateMessage) {
146+
this.addMember(e);
147+
}
148+
},
149+
addMember(e) {
150+
let formItem = this.$parent;
151+
formItem.validateState = 'success';
152+
153+
this.field.succMessage && this.$Message.success(this.field.succMessage);
154+
this.list.push(this.value);
155+
this.value = '';
156+
// this.$set(this.form.model, this.field.model, this.list);
157+
this.$emit('on-change', this.field.model, this.list, e, this.field);
111158
},
112159
handelMemberDelete(i, e) {
113160
this.list.splice(i, 1);
@@ -116,6 +163,7 @@ export default {
116163
},
117164
handleChange(e) {
118165
this.value = e.target.value;
166+
this.validator();
119167
}
120168
}
121169
};

src/fields/fieldSelect.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
:disabled="field.disabled || false"
4545
:clearable="clearable"
4646
:size="size"
47+
:transfer="field.transfer || false"
4748
:placeholder="field.placeholder"
4849
:filterable="filterable || false"
4950
:loading="loading"

0 commit comments

Comments
 (0)