tianheng-ui 0.1.44 → 0.1.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/tianheng-ui.js +13 -13
- package/package.json +1 -1
- package/packages/FormMaking/GenerateForm.vue +93 -84
- package/packages/FormMaking/GenerateFormItem.vue +40 -130
- package/packages/FormMaking/WidgetConfig.vue +123 -59
- package/packages/FormMaking/WidgetFormItem.vue +1 -1
- package/packages/FormMaking/WidgetTools.vue +34 -9
- package/packages/FormMaking/custom/config.js +6 -2
- package/packages/FormMaking/custom/configs/button.vue +2 -2
- package/packages/FormMaking/custom/configs/cascader.vue +2 -2
- package/packages/FormMaking/custom/configs/checkbox.vue +2 -2
- package/packages/FormMaking/custom/configs/grid.vue +12 -0
- package/packages/FormMaking/custom/configs/list.vue +18 -0
- package/packages/FormMaking/custom/configs/radio.vue +2 -2
- package/packages/FormMaking/custom/configs/select.vue +2 -2
- package/packages/FormMaking/custom/configs/tabs.vue +2 -2
- package/packages/FormMaking/custom/configs/upload.vue +2 -2
- package/packages/FormMaking/custom/items/alliance.vue +2 -2
- package/packages/FormMaking/custom/items/blank_dev.vue +2 -2
- package/packages/FormMaking/custom/items/blank_pro.vue +2 -2
- package/packages/FormMaking/custom/items/button.vue +2 -2
- package/packages/FormMaking/custom/items/cascader.vue +2 -2
- package/packages/FormMaking/custom/items/cell.vue +2 -2
- package/packages/FormMaking/custom/items/checkbox.vue +2 -2
- package/packages/FormMaking/custom/items/color.vue +2 -2
- package/packages/FormMaking/custom/items/date.vue +2 -2
- package/packages/FormMaking/custom/items/divider.vue +2 -2
- package/packages/FormMaking/custom/items/editor.vue +2 -2
- package/packages/FormMaking/custom/items/filler.vue +2 -2
- package/packages/FormMaking/custom/items/grid_dev.vue +2 -2
- package/packages/FormMaking/custom/items/grid_pro.vue +18 -4
- package/packages/FormMaking/custom/items/image.vue +2 -2
- package/packages/FormMaking/custom/items/input.vue +2 -2
- package/packages/FormMaking/custom/items/list_dev.vue +2 -2
- package/packages/FormMaking/custom/items/number.vue +2 -2
- package/packages/FormMaking/custom/items/radio.vue +2 -2
- package/packages/FormMaking/custom/items/rate.vue +2 -2
- package/packages/FormMaking/custom/items/select.vue +2 -2
- package/packages/FormMaking/custom/items/slider.vue +2 -2
- package/packages/FormMaking/custom/items/switch.vue +2 -2
- package/packages/FormMaking/custom/items/tableH5_dev.vue +2 -2
- package/packages/FormMaking/custom/items/tableH5_pro.vue +26 -18
- package/packages/FormMaking/custom/items/table_dev.vue +2 -2
- package/packages/FormMaking/custom/items/table_pro.vue +10 -5
- package/packages/FormMaking/custom/items/tabs_dev.vue +2 -2
- package/packages/FormMaking/custom/items/tabs_pro.vue +14 -9
- package/packages/FormMaking/custom/items/text.vue +2 -2
- package/packages/FormMaking/custom/items/textarea.vue +2 -2
- package/packages/FormMaking/custom/items/time.vue +2 -2
- package/packages/FormMaking/custom/items/upload.vue +2 -2
- package/packages/FormMaking/custom/mixins/index.js +69 -13
- package/packages/FormMaking/index.vue +62 -57
- package/packages/TableMaking/custom/config.js +4 -1
- package/packages/TableMaking/custom/items/table/index-pc.vue +3 -3
- package/packages/TableMaking/index.vue +44 -6
- package/packages/TableMaking/widgetConfig.vue +55 -27
- package/packages/TableMaking/widgetTable.vue +4 -4
package/package.json
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
<template>
|
2
|
-
<div v-if="formConfig.config">
|
2
|
+
<div v-if="formConfig.config && showForm">
|
3
3
|
<el-form
|
4
4
|
class="generateForm"
|
5
5
|
:class="{ isHideLabel: formConfig.config.hideLabel }"
|
@@ -14,11 +14,15 @@
|
|
14
14
|
<genetate-form-item
|
15
15
|
v-for="item in formConfig.list"
|
16
16
|
:key="item.key"
|
17
|
-
:models.sync="models"
|
18
17
|
:widget="item"
|
18
|
+
:model.sync="
|
19
|
+
item.type === 'grid' && !item.options.isEntity
|
20
|
+
? models
|
21
|
+
: models[item.model]
|
22
|
+
"
|
23
|
+
:models="models"
|
19
24
|
:slotKeys="slotKeys"
|
20
25
|
:config="formConfig.config"
|
21
|
-
:prop="item.type === 'grid' ? '' : item.model"
|
22
26
|
:componentsData="componentsData"
|
23
27
|
@input-change="onInputChange"
|
24
28
|
@button-submit="handleButtonSubmit"
|
@@ -97,7 +101,8 @@ export default {
|
|
97
101
|
models: {},
|
98
102
|
query: {},
|
99
103
|
componentsData: [],
|
100
|
-
axios: null
|
104
|
+
axios: null,
|
105
|
+
showForm: false
|
101
106
|
};
|
102
107
|
},
|
103
108
|
computed: {
|
@@ -128,113 +133,117 @@ export default {
|
|
128
133
|
this.query = this.$route.query || {};
|
129
134
|
localStorage.setItem("_TH_OauthConfig", JSON.stringify(this.oauthConfig));
|
130
135
|
this.axios = Axios.init(this.oauthConfig);
|
131
|
-
this.generateModle(this.formConfig.list);
|
132
136
|
},
|
133
|
-
mounted() {
|
137
|
+
mounted() {
|
138
|
+
this.generateModle(this.formConfig.list, this.models);
|
139
|
+
console.log("models =>", this.models);
|
140
|
+
this.showForm = true;
|
141
|
+
},
|
134
142
|
methods: {
|
135
143
|
generateModle(genList, modelObj) {
|
136
144
|
if (!genList) return;
|
137
145
|
genList.map(item => {
|
138
146
|
if (item.type === "grid") {
|
139
|
-
item.options.
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
item.options.columns.forEach(item2 => {
|
146
|
-
this.$set(modelObj[item.model], item2.value, {});
|
147
|
-
this.generateModle(item2.list, modelObj[item.model][item2.value]);
|
147
|
+
if (item.options.isEntity) {
|
148
|
+
const dic = {};
|
149
|
+
modelObj[item.model] = dic;
|
150
|
+
|
151
|
+
item.options.columns.forEach(item => {
|
152
|
+
this.generateModle(item.list, dic);
|
148
153
|
});
|
149
154
|
} else {
|
150
|
-
|
151
|
-
|
152
|
-
this.$set(this.models[item.model], item2.value, {});
|
153
|
-
this.generateModle(
|
154
|
-
item2.list,
|
155
|
-
this.models[item.model][item2.value]
|
156
|
-
);
|
155
|
+
item.options.columns.forEach(item => {
|
156
|
+
this.generateModle(item.list, modelObj);
|
157
157
|
});
|
158
158
|
}
|
159
|
+
} else if (item.type === "tabs") {
|
160
|
+
const dic = {};
|
161
|
+
modelObj[item.model] = dic;
|
162
|
+
|
163
|
+
item.options.columns.forEach(item2 => {
|
164
|
+
dic[item2.value] = {};
|
165
|
+
this.generateModle(item2.list, dic[item2.value]);
|
166
|
+
});
|
159
167
|
} else if (item.type === "table" || item.type === "tableH5") {
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
);
|
166
|
-
this.generateModle(item.options.columns, modelObj[item.model]);
|
167
|
-
} else {
|
168
|
-
this.$set(
|
169
|
-
this.models,
|
170
|
-
item.model,
|
171
|
-
JSON.parse(item.options.defaultValue || "[]")
|
172
|
-
);
|
173
|
-
this.generateModle(item.options.columns, this.models[item.model]);
|
174
|
-
}
|
175
|
-
} else if (modelObj) {
|
176
|
-
if (!modelObj[item.model]) {
|
177
|
-
this.$set(modelObj, item.model, item.options.defaultValue);
|
178
|
-
}
|
168
|
+
const arr = item.options.defaultValue
|
169
|
+
? JSON.parse(item.options.defaultValue)
|
170
|
+
: "";
|
171
|
+
const dic = {};
|
172
|
+
modelObj[item.model] = arr || [dic];
|
179
173
|
|
174
|
+
this.generateModle(item.options.columns, dic);
|
175
|
+
}
|
176
|
+
// else if (modelObj) {
|
177
|
+
// if (!modelObj[item.model]) {
|
178
|
+
// this.$set(modelObj, item.model, item.options.defaultValue);
|
179
|
+
// }
|
180
|
+
// this.generateRules(item);
|
181
|
+
// }
|
182
|
+
else if (item.type === "blank") {
|
183
|
+
const value = eval(`this.value.${item.model}`);
|
184
|
+
const defaultValue = { String: "", Object: {}, Array: [] }[
|
185
|
+
item.options.defaultType
|
186
|
+
];
|
187
|
+
modelObj[item.model] = value || defaultValue;
|
180
188
|
this.generateRules(item);
|
181
189
|
} else {
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
item.model,
|
189
|
-
item.options.defaultType === "String"
|
190
|
-
? ""
|
191
|
-
: item.options.defaultType === "Object"
|
192
|
-
? {}
|
193
|
-
: []
|
194
|
-
);
|
195
|
-
} else {
|
196
|
-
this.$set(
|
197
|
-
this.models,
|
198
|
-
item.model,
|
199
|
-
JSON.parse(JSON.stringify(item.options.defaultValue))
|
200
|
-
);
|
201
|
-
}
|
202
|
-
}
|
203
|
-
|
190
|
+
// const value = this.value ? eval(`this.value.${item.model}`) : "";
|
191
|
+
const value = this.value[item.model];
|
192
|
+
const defaultValue = JSON.parse(
|
193
|
+
JSON.stringify(item.options.defaultValue)
|
194
|
+
);
|
195
|
+
this.$set(modelObj, item.model, value || defaultValue);
|
204
196
|
this.generateRules(item);
|
205
197
|
}
|
206
198
|
});
|
207
199
|
},
|
208
200
|
generateRules(item) {
|
209
|
-
|
210
|
-
item.rules
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
201
|
+
// 配置正则校验
|
202
|
+
if (item.rules) {
|
203
|
+
item.rules.forEach(rule => {
|
204
|
+
if (rule.patternStr) {
|
205
|
+
rule.pattern = new RegExp(rule.patternStr);
|
206
|
+
}
|
207
|
+
});
|
208
|
+
} else {
|
209
|
+
item.rules = [];
|
210
|
+
}
|
211
|
+
// 配置必填项校验
|
212
|
+
if (item.options.required) {
|
213
|
+
item.rules.push({
|
214
|
+
required: true,
|
215
|
+
message: "必需项",
|
216
|
+
trigger: "change"
|
217
|
+
});
|
218
|
+
}
|
215
219
|
this.hendleRemoteData(item);
|
216
220
|
},
|
217
221
|
hendleRemoteData(item) {
|
218
222
|
if (!item.options.remote) return;
|
219
223
|
if (item.type === "upload" || item.type === "button") return;
|
220
|
-
const
|
221
|
-
if (!
|
224
|
+
const api = this.formConfig.config.network[item.options.remoteFunc];
|
225
|
+
if (!api) return this.$message.warning("未知的请求接口,请检查配置信息");
|
222
226
|
|
223
|
-
const
|
224
|
-
|
225
|
-
|
227
|
+
const requestConfig = {
|
228
|
+
url: api.url,
|
229
|
+
method: api.method,
|
230
|
+
headers: api.headers
|
231
|
+
};
|
232
|
+
const params = {};
|
233
|
+
for (let e of api.inParams) {
|
234
|
+
params[e.alias] =
|
235
|
+
eval(`this.models.${e.pAlias}`) ||
|
236
|
+
eval(`this.query.${e.pAlias}`) ||
|
237
|
+
null;
|
226
238
|
}
|
227
|
-
if (
|
228
|
-
|
229
|
-
|
239
|
+
if (api.needPage) {
|
240
|
+
params.pageNum = 1;
|
241
|
+
params.pageSize = 20;
|
230
242
|
}
|
243
|
+
if (["POST", "PUT"].includes(api.method)) requestConfig.data = params;
|
244
|
+
else requestConfig.params = requestConfig;
|
231
245
|
|
232
|
-
this.axios({
|
233
|
-
url: remoteFunc.url,
|
234
|
-
method: remoteFunc.method,
|
235
|
-
headers: remoteFunc.headers,
|
236
|
-
data: remoteFunc.params
|
237
|
-
}).then(res => {
|
246
|
+
this.axios(requestConfig).then(res => {
|
238
247
|
const resultData = res.data.records ? res.data.records : res.data;
|
239
248
|
item.options.remoteOptions = resultData.map(element => {
|
240
249
|
return {
|
@@ -267,7 +276,7 @@ export default {
|
|
267
276
|
},
|
268
277
|
setConfig(json) {
|
269
278
|
this.formConfig = json;
|
270
|
-
this.generateModle(this.formConfig.list);
|
279
|
+
this.generateModle(this.formConfig.list, this.models);
|
271
280
|
}
|
272
281
|
}
|
273
282
|
};
|
@@ -7,24 +7,17 @@
|
|
7
7
|
}"
|
8
8
|
:label="widget.options.hideLabel ? '' : widget.name"
|
9
9
|
:label-width="labelWidth"
|
10
|
-
:prop="
|
11
|
-
:rules="
|
12
|
-
widget.options.required
|
13
|
-
? [
|
14
|
-
...widget.rules,
|
15
|
-
{ required: true, message: '必需项', trigger: 'change' }
|
16
|
-
]
|
17
|
-
: widget.rules
|
18
|
-
"
|
10
|
+
:prop="pModel ? `${pModel}.${widget.model}` : widget.model"
|
11
|
+
:rules="widget.rules"
|
19
12
|
:ref="widget.model"
|
20
13
|
>
|
21
14
|
<component
|
22
15
|
:is="compsData[widget.type].content"
|
23
|
-
:value.sync="dataModel"
|
24
16
|
:widget="widget"
|
25
|
-
:
|
17
|
+
:model.sync="dataModel"
|
26
18
|
:models="models"
|
27
|
-
:
|
19
|
+
:config="config"
|
20
|
+
:pModel="pModel"
|
28
21
|
:slotKeys="slotKeys"
|
29
22
|
:componentsData="componentsData"
|
30
23
|
@button-submit="handleButtonSubmit"
|
@@ -37,39 +30,56 @@
|
|
37
30
|
</template>
|
38
31
|
|
39
32
|
<script>
|
40
|
-
import {
|
33
|
+
import { deepClone } from "./util/index";
|
41
34
|
import { VueEditor } from "vue2-editor";
|
42
35
|
import compsData from "./custom/register";
|
43
36
|
import FmUpload from "./Upload";
|
44
37
|
|
45
38
|
export default {
|
46
39
|
name: "generate-form-item",
|
47
|
-
props: [
|
40
|
+
props: [
|
41
|
+
"widget",
|
42
|
+
"model",
|
43
|
+
"models",
|
44
|
+
"pModel",
|
45
|
+
"slotKeys",
|
46
|
+
"config",
|
47
|
+
"componentsData"
|
48
|
+
],
|
48
49
|
components: { FmUpload, VueEditor },
|
49
50
|
data() {
|
50
51
|
return {
|
51
52
|
compsData: deepClone(compsData),
|
52
|
-
dataModel: this.
|
53
|
+
dataModel: this.model
|
54
|
+
// dataModel: this.models[this.widget.model]
|
53
55
|
};
|
54
56
|
},
|
55
57
|
watch: {
|
56
|
-
|
57
|
-
|
58
|
-
handler(val) {
|
59
|
-
this.models[this.widget.model] = val;
|
60
|
-
this.$emit("update:models", {
|
61
|
-
...this.models,
|
62
|
-
[this.widget.model]: val
|
63
|
-
});
|
64
|
-
this.$emit("input-change", val, this.widget.model);
|
65
|
-
}
|
58
|
+
model(val) {
|
59
|
+
this.dataModel = val;
|
66
60
|
},
|
67
|
-
|
68
|
-
|
69
|
-
handler(val) {
|
70
|
-
this.dataModel = val[this.widget.model];
|
71
|
-
}
|
61
|
+
dataModel(val) {
|
62
|
+
this.$emit("update:model", val);
|
72
63
|
}
|
64
|
+
// dataModel: {
|
65
|
+
// deep: true,
|
66
|
+
// handler(val) {
|
67
|
+
// console.log("watch dataModel =>", val);
|
68
|
+
// this.models[this.widget.model] = val;
|
69
|
+
// this.$emit("update:models", {
|
70
|
+
// ...this.models,
|
71
|
+
// [this.widget.model]: val
|
72
|
+
// });
|
73
|
+
// this.$emit("input-change", val, this.widget.model);
|
74
|
+
// }
|
75
|
+
// },
|
76
|
+
// models: {
|
77
|
+
// deep: true,
|
78
|
+
// handler(val) {
|
79
|
+
// console.log("watch models =>", val);
|
80
|
+
// this.dataModel = val[this.widget.model];
|
81
|
+
// }
|
82
|
+
// }
|
73
83
|
},
|
74
84
|
computed: {
|
75
85
|
labelWidth() {
|
@@ -103,108 +113,8 @@ export default {
|
|
103
113
|
});
|
104
114
|
},
|
105
115
|
methods: {
|
106
|
-
inputTypeDict,
|
107
|
-
handleTimePicker(vals) {
|
108
|
-
this.dataModel = [];
|
109
|
-
this.dataModel[0] = vals;
|
110
|
-
this.widget.options.endTimePickerOptions.minTime = vals;
|
111
|
-
},
|
112
|
-
handleRemove(file, fileList) {
|
113
|
-
this.dataModel = {
|
114
|
-
data: fileList,
|
115
|
-
remoteApi: this.widget.options.remoteApi
|
116
|
-
};
|
117
|
-
},
|
118
|
-
handleAvatar(res, file) {
|
119
|
-
this.dataModel = {
|
120
|
-
data: file,
|
121
|
-
remoteApi: this.widget.options.remoteApi
|
122
|
-
};
|
123
|
-
},
|
124
|
-
handleAvatarError() {
|
125
|
-
console.log("上传失败!");
|
126
|
-
},
|
127
|
-
handleTableAdd() {
|
128
|
-
let dic = {};
|
129
|
-
this.widget.list.forEach(item => {
|
130
|
-
if (item.type === "grid") {
|
131
|
-
for (let i = 0; i < item.options.columns.length; i++) {
|
132
|
-
const element = item.options.columns[i];
|
133
|
-
for (let j = 0; j < element.list.length; j++) {
|
134
|
-
const element2 = element.list[j];
|
135
|
-
dic[element2.model] = element2.options.defaultValue;
|
136
|
-
}
|
137
|
-
}
|
138
|
-
} else {
|
139
|
-
dic[item.model] = item.options.defaultValue;
|
140
|
-
}
|
141
|
-
});
|
142
|
-
this.dataModel.push(dic);
|
143
|
-
},
|
144
|
-
handleTableDelete(index) {
|
145
|
-
this.dataModel.splice(index, 1);
|
146
|
-
},
|
147
116
|
handleButtonSubmit(val) {
|
148
117
|
this.$emit("button-submit", val);
|
149
|
-
},
|
150
|
-
|
151
|
-
// 支撑 JavaScript 动态编译
|
152
|
-
handleEventAction(key) {
|
153
|
-
if (!key) return;
|
154
|
-
|
155
|
-
const eventScript = this.config.eventScript;
|
156
|
-
for (let i = 0; i < eventScript.length; i++) {
|
157
|
-
const element = eventScript[i];
|
158
|
-
if (element.key === key) {
|
159
|
-
const func = `(item,value)=>{${element.value}}`;
|
160
|
-
eval(func)(this.widget, this.dataModel);
|
161
|
-
}
|
162
|
-
}
|
163
|
-
},
|
164
|
-
// 显示组件
|
165
|
-
display(keys) {
|
166
|
-
if (!keys || keys.length === 0) return;
|
167
|
-
for (let i = 0; i < keys.length; i++) {
|
168
|
-
const key = keys[i];
|
169
|
-
if (this.componentsData[key]) {
|
170
|
-
// this.componentsData[key].options.hidden = false;
|
171
|
-
this.$set(this.componentsData[key].options, "hidden", false);
|
172
|
-
console.log("display =>", keys, this.componentsData);
|
173
|
-
}
|
174
|
-
}
|
175
|
-
},
|
176
|
-
// 隐藏组件
|
177
|
-
hide(keys) {
|
178
|
-
if (!keys || keys.length === 0) return;
|
179
|
-
for (let i = 0; i < keys.length; i++) {
|
180
|
-
const key = keys[i];
|
181
|
-
if (this.componentsData[key]) {
|
182
|
-
// this.componentsData[key].options.hidden = true;
|
183
|
-
this.$set(this.componentsData[key].options, "hidden", true);
|
184
|
-
console.log("hide =>", keys, this.componentsData);
|
185
|
-
}
|
186
|
-
}
|
187
|
-
},
|
188
|
-
// 设置数据,仅支持修改当前组件节点下的数据
|
189
|
-
setData(obj) {
|
190
|
-
const keys = Object.keys(obj);
|
191
|
-
for (let i = 0; i < keys.length; i++) {
|
192
|
-
const arr = keys[i].split(".");
|
193
|
-
if (arr.length === 1) {
|
194
|
-
const key = keys[i];
|
195
|
-
const value = obj[key];
|
196
|
-
this.$set(this.models, key, value);
|
197
|
-
} else {
|
198
|
-
const key = arr.pop();
|
199
|
-
const value = obj[keys[i]];
|
200
|
-
const path = arr.join(".");
|
201
|
-
this.$set(eval(`this.models.${path}`), key, value);
|
202
|
-
}
|
203
|
-
}
|
204
|
-
},
|
205
|
-
// 获取数据,仅支持获取当前组件节点下的数据
|
206
|
-
getData(obj) {
|
207
|
-
return this.models;
|
208
118
|
}
|
209
119
|
}
|
210
120
|
};
|