tianheng-ui 0.1.44 → 0.1.46

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.
Files changed (57) hide show
  1. package/lib/tianheng-ui.js +13 -13
  2. package/package.json +1 -1
  3. package/packages/FormMaking/GenerateForm.vue +93 -84
  4. package/packages/FormMaking/GenerateFormItem.vue +41 -131
  5. package/packages/FormMaking/WidgetConfig.vue +126 -59
  6. package/packages/FormMaking/WidgetFormItem.vue +1 -1
  7. package/packages/FormMaking/WidgetTools.vue +34 -9
  8. package/packages/FormMaking/custom/config.js +6 -2
  9. package/packages/FormMaking/custom/configs/button.vue +2 -2
  10. package/packages/FormMaking/custom/configs/cascader.vue +2 -2
  11. package/packages/FormMaking/custom/configs/checkbox.vue +2 -2
  12. package/packages/FormMaking/custom/configs/grid.vue +12 -0
  13. package/packages/FormMaking/custom/configs/list.vue +18 -0
  14. package/packages/FormMaking/custom/configs/radio.vue +2 -2
  15. package/packages/FormMaking/custom/configs/select.vue +2 -2
  16. package/packages/FormMaking/custom/configs/tabs.vue +2 -2
  17. package/packages/FormMaking/custom/configs/upload.vue +2 -2
  18. package/packages/FormMaking/custom/items/alliance.vue +2 -2
  19. package/packages/FormMaking/custom/items/blank_dev.vue +2 -2
  20. package/packages/FormMaking/custom/items/blank_pro.vue +2 -2
  21. package/packages/FormMaking/custom/items/button.vue +2 -2
  22. package/packages/FormMaking/custom/items/cascader.vue +2 -2
  23. package/packages/FormMaking/custom/items/cell.vue +2 -2
  24. package/packages/FormMaking/custom/items/checkbox.vue +2 -2
  25. package/packages/FormMaking/custom/items/color.vue +2 -2
  26. package/packages/FormMaking/custom/items/date.vue +2 -2
  27. package/packages/FormMaking/custom/items/divider.vue +2 -2
  28. package/packages/FormMaking/custom/items/editor.vue +2 -2
  29. package/packages/FormMaking/custom/items/filler.vue +2 -2
  30. package/packages/FormMaking/custom/items/grid_dev.vue +2 -2
  31. package/packages/FormMaking/custom/items/grid_pro.vue +18 -4
  32. package/packages/FormMaking/custom/items/image.vue +2 -2
  33. package/packages/FormMaking/custom/items/input.vue +2 -2
  34. package/packages/FormMaking/custom/items/list_dev.vue +2 -2
  35. package/packages/FormMaking/custom/items/number.vue +2 -2
  36. package/packages/FormMaking/custom/items/radio.vue +2 -2
  37. package/packages/FormMaking/custom/items/rate.vue +2 -2
  38. package/packages/FormMaking/custom/items/select.vue +2 -2
  39. package/packages/FormMaking/custom/items/slider.vue +2 -2
  40. package/packages/FormMaking/custom/items/switch.vue +2 -2
  41. package/packages/FormMaking/custom/items/tableH5_dev.vue +2 -2
  42. package/packages/FormMaking/custom/items/tableH5_pro.vue +26 -18
  43. package/packages/FormMaking/custom/items/table_dev.vue +2 -2
  44. package/packages/FormMaking/custom/items/table_pro.vue +10 -5
  45. package/packages/FormMaking/custom/items/tabs_dev.vue +2 -2
  46. package/packages/FormMaking/custom/items/tabs_pro.vue +14 -9
  47. package/packages/FormMaking/custom/items/text.vue +2 -2
  48. package/packages/FormMaking/custom/items/textarea.vue +2 -2
  49. package/packages/FormMaking/custom/items/time.vue +2 -2
  50. package/packages/FormMaking/custom/items/upload.vue +2 -2
  51. package/packages/FormMaking/custom/mixins/index.js +69 -13
  52. package/packages/FormMaking/index.vue +65 -56
  53. package/packages/TableMaking/custom/config.js +4 -1
  54. package/packages/TableMaking/custom/items/table/index-pc.vue +3 -3
  55. package/packages/TableMaking/index.vue +44 -6
  56. package/packages/TableMaking/widgetConfig.vue +55 -27
  57. package/packages/TableMaking/widgetTable.vue +4 -4
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "tianheng-ui",
3
3
  "description": "A Vue.js project",
4
- "version": "0.1.44",
4
+ "version": "0.1.46",
5
5
  "author": "shu lang <403732931@qq.com>",
6
6
  "license": "MIT",
7
7
  "private": false,
@@ -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.columns.forEach(item => {
140
- this.generateModle(item.list, modelObj);
141
- });
142
- } else if (item.type === "tabs") {
143
- if (modelObj) {
144
- this.$set(modelObj, item.model, {});
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
- this.$set(this.models, item.model, {});
151
- item.options.columns.forEach(item2 => {
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
- if (modelObj) {
161
- this.$set(
162
- modelObj,
163
- item.model,
164
- JSON.parse(item.options.defaultValue || "[]")
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
- if (this.value && Object.keys(this.value).indexOf(item.model) >= 0) {
183
- this.$set(this.models, item.model, this.value[item.model]);
184
- } else {
185
- if (item.type === "blank") {
186
- this.$set(
187
- this.models,
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
- if (!item.rules) item.rules = [];
210
- item.rules.forEach(rule => {
211
- if (rule.patternStr) {
212
- rule.pattern = new RegExp(rule.patternStr);
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 func = this.formConfig.config.network[item.options.remoteFunc];
221
- if (!func) return this.$message.warning("未知的请求接口,请检查配置信息");
224
+ const api = this.formConfig.config.network[item.options.remoteFunc];
225
+ if (!api) return this.$message.warning("未知的请求接口,请检查配置信息");
222
226
 
223
- const remoteFunc = deepClone(func);
224
- for (let key of Object.keys(remoteFunc.params)) {
225
- remoteFunc.params[key] = this.models[key] || this.query[key] || null;
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 (remoteFunc.needPage) {
228
- remoteFunc.params.pageNum = 1;
229
- remoteFunc.params.pageSize = 20;
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="prop ? prop : widget.model"
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
- :config="config"
17
+ :model.sync="dataModel"
26
18
  :models="models"
27
- :prop="prop"
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 { inputTypeDict, deepClone } from "./util/index";
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: ["widget", "models", "prop", "slotKeys", "config", "componentsData"],
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.models[this.widget.model]
53
+ dataModel: this.model
54
+ // dataModel: this.models[this.widget.model]
53
55
  };
54
56
  },
55
57
  watch: {
56
- dataModel: {
57
- deep: true,
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
- models: {
68
- deep: true,
69
- handler(val) {
70
- this.dataModel = val[this.widget.model];
71
- }
72
- }
61
+ dataModel(val) {
62
+ this.$emit("update:model", val);
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
  };