tianheng-ui 0.1.63 → 0.1.65

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. package/lib/theme-chalk/index.scss +1 -1
  2. package/lib/theme-chalk/styles/feature.scss +1 -0
  3. package/lib/tianheng-ui.js +13 -13
  4. package/package.json +1 -1
  5. package/packages/CodeEditor/index.vue +41 -19
  6. package/packages/FormMaking/GenerateForm.vue +67 -71
  7. package/packages/FormMaking/WidgetConfig.vue +1 -1
  8. package/packages/FormMaking/WidgetForm.vue +11 -5
  9. package/packages/FormMaking/WidgetFormItem.vue +11 -4
  10. package/packages/FormMaking/WidgetGuide.vue +0 -0
  11. package/packages/FormMaking/WidgetTools.vue +2 -2
  12. package/packages/FormMaking/custom/config.js +320 -76
  13. package/packages/FormMaking/custom/configs/blank.vue +1 -1
  14. package/packages/FormMaking/custom/configs/button.vue +2 -2
  15. package/packages/FormMaking/custom/configs/cascader.vue +71 -34
  16. package/packages/FormMaking/custom/configs/cell.vue +1 -1
  17. package/packages/FormMaking/custom/configs/checkbox.vue +95 -64
  18. package/packages/FormMaking/custom/configs/color.vue +1 -1
  19. package/packages/FormMaking/custom/configs/date.vue +1 -1
  20. package/packages/FormMaking/custom/configs/descriptions.vue +314 -0
  21. package/packages/FormMaking/custom/configs/divider.vue +1 -1
  22. package/packages/FormMaking/custom/configs/editor.vue +1 -1
  23. package/packages/FormMaking/custom/configs/filler.vue +1 -1
  24. package/packages/FormMaking/custom/configs/grid.vue +33 -22
  25. package/packages/FormMaking/custom/configs/image.vue +1 -1
  26. package/packages/FormMaking/custom/configs/input.vue +1 -1
  27. package/packages/FormMaking/custom/configs/number.vue +1 -1
  28. package/packages/FormMaking/custom/configs/radio.vue +84 -53
  29. package/packages/FormMaking/custom/configs/rate.vue +1 -1
  30. package/packages/FormMaking/custom/configs/select.vue +157 -158
  31. package/packages/FormMaking/custom/configs/slider.vue +1 -1
  32. package/packages/FormMaking/custom/configs/switch.vue +1 -1
  33. package/packages/FormMaking/custom/configs/table.vue +1 -1
  34. package/packages/FormMaking/custom/configs/tableH5.vue +1 -1
  35. package/packages/FormMaking/custom/configs/tabs.vue +1 -1
  36. package/packages/FormMaking/custom/configs/text.vue +1 -1
  37. package/packages/FormMaking/custom/configs/textarea.vue +1 -1
  38. package/packages/FormMaking/custom/configs/time.vue +1 -1
  39. package/packages/FormMaking/custom/configs/upload.vue +1 -1
  40. package/packages/FormMaking/custom/configs/workflow.vue +494 -0
  41. package/packages/FormMaking/custom/index.js +4 -2
  42. package/packages/FormMaking/custom/items/cascader.vue +2 -2
  43. package/packages/FormMaking/custom/items/checkbox.vue +6 -10
  44. package/packages/FormMaking/custom/items/descriptions.vue +75 -0
  45. package/packages/FormMaking/custom/items/grid_dev.vue +2 -2
  46. package/packages/FormMaking/custom/items/list_dev.vue +10 -22
  47. package/packages/FormMaking/custom/items/radio.vue +5 -9
  48. package/packages/FormMaking/custom/items/select.vue +2 -4
  49. package/packages/FormMaking/custom/items/tableH5_dev.vue +9 -18
  50. package/packages/FormMaking/custom/items/table_dev.vue +13 -3
  51. package/packages/FormMaking/custom/items/tabs_dev.vue +3 -2
  52. package/packages/FormMaking/custom/items/workflow.vue +131 -0
  53. package/packages/FormMaking/custom/register.js +15 -1
  54. package/packages/FormMaking/index.vue +61 -27
  55. package/packages/FormMaking/styles/index.scss +156 -478
  56. package/packages/TableMaking/index.vue +4 -1
  57. package/packages/TableMaking/widgetGuide.vue +96 -0
  58. package/packages/TableMaking/widgetTable.vue +0 -7
  59. package/packages/Workflow/index.vue +0 -31
  60. package/packages/FormMaking/GenerateFormItemH5.vue +0 -825
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.63",
4
+ "version": "0.1.65",
5
5
  "author": "shu lang <403732931@qq.com>",
6
6
  "license": "MIT",
7
7
  "private": false,
@@ -46,7 +46,7 @@ export default {
46
46
  },
47
47
  props: {
48
48
  // 编辑器内容
49
- value: String,
49
+ value: [String, Object, Array],
50
50
  // 默认语言
51
51
  language: {
52
52
  type: String,
@@ -76,17 +76,32 @@ export default {
76
76
  data() {
77
77
  return {
78
78
  editor: null,
79
- generateId:
80
- "id_" +
81
- Math.random()
82
- .toString(36)
83
- .substr(2, 4)
79
+ editorValue: this.value,
80
+ generateId: `id_${Math.random()
81
+ .toString(36)
82
+ .substr(2, 4)}`,
83
+ dataType: ""
84
84
  };
85
85
  },
86
- mounted() {
87
- // 初始化
88
- this.initEditor();
89
- this.setCompleteData();
86
+ watch: {
87
+ value(val) {
88
+ this.dataType = val.constructor;
89
+ if (this.dataType === Object || this.dataType === Array)
90
+ this.editorValue = JSON.stringify(val, null, 2);
91
+ else this.editorValue = val;
92
+ },
93
+ editorValue(val) {
94
+ if (this.dataType === Object || this.dataType === Array)
95
+ try {
96
+ this.$emit("change", JSON.parse(val));
97
+ } catch (error) {}
98
+ else this.$emit("change", val);
99
+
100
+ if (this.editor.getValue() !== val) {
101
+ this.editor.setValue(val);
102
+ this.editor.clearSelection();
103
+ }
104
+ }
90
105
  },
91
106
  computed: {
92
107
  selfStyle() {
@@ -102,24 +117,25 @@ export default {
102
117
  return style;
103
118
  }
104
119
  },
105
- watch: {
106
- value(val) {
107
- if (this.editor.getValue() !== val) {
108
- this.editor.setValue(val);
109
- this.editor.clearSelection();
110
- }
111
- }
120
+ mounted() {
121
+ // 初始化
122
+ this.initEditor();
123
+ this.setCompleteData();
112
124
  },
113
125
  methods: {
114
126
  // 初始化
115
127
  initEditor() {
128
+ this.dataType = this.editorValue.constructor;
116
129
  // 创建实例
117
130
  this.editor = ace.edit(this.$refs[this.generateId], {
118
131
  mode: `ace/mode/${this.language}`,
119
132
  theme: `ace/theme/${this.theme}`,
120
133
  fontSize: 14,
121
134
  tabSize: 2,
122
- value: this.value,
135
+ value:
136
+ this.dataType === Object || this.dataType === Array
137
+ ? JSON.stringify(this.editorValue, null, 2)
138
+ : this.editorValue,
123
139
  selectionStyle: "text",
124
140
  maxLines: this.maxLines,
125
141
  readOnly: this.readonly,
@@ -138,7 +154,7 @@ export default {
138
154
  });
139
155
  // 设置值改变监听
140
156
  this.editor.on("change", () => {
141
- this.$emit("change", this.editor.getValue());
157
+ this.editorValue = this.editor.getValue();
142
158
  });
143
159
  },
144
160
  setCompleteData() {
@@ -169,6 +185,12 @@ export default {
169
185
  this.editor.destroy();
170
186
  this.editor = null;
171
187
  }
188
+ },
189
+ setValue(val) {
190
+ if (this.editor) {
191
+ this.editor.setValue(val);
192
+ this.editor.clearSelection();
193
+ }
172
194
  }
173
195
  },
174
196
  beforeDestroy() {
@@ -24,7 +24,7 @@
24
24
  :slotKeys="slotKeys"
25
25
  :config="formConfig.config"
26
26
  :componentsData="componentsData"
27
- @input-change="onInputChange"
27
+ @input-change="handleInputChange"
28
28
  @button-submit="handleButtonSubmit"
29
29
  >
30
30
  <template v-for="name in slotKeys" :slot="name">
@@ -32,32 +32,6 @@
32
32
  </template>
33
33
  </genetate-form-item>
34
34
  </el-form>
35
- <!-- <van-form
36
- v-else
37
- class="generateForm"
38
- :class="{ 'form-hideLabel': formConfig.config.hideLabel }"
39
- :style="{ width: formWidth }"
40
- style="margin: 0 auto;"
41
- :label-align="formConfig.config.labelPosition"
42
- :label-width="formConfig.config.labelWidth + 'px'"
43
- ref="generateForm"
44
- >
45
- <genetate-form-item-h5
46
- v-for="item in formConfig.list"
47
- :key="item.key"
48
- :models.sync="models"
49
- :widget="item"
50
- :slotKeys="slotKeys"
51
- :config="formConfig.config"
52
- :prop="item.type === 'grid' ? '' : item.model"
53
- :componentsData="componentsData"
54
- @input-change="onInputChange"
55
- >
56
- <template v-for="name in slotKeys" :slot="name">
57
- <slot :name="name" />
58
- </template>
59
- </genetate-form-item-h5>
60
- </van-form> -->
61
35
  </div>
62
36
  </template>
63
37
 
@@ -70,6 +44,8 @@ export default {
70
44
  name: "thFormGenerate",
71
45
  components: { GenetateFormItem },
72
46
  props: {
47
+ formId: String,
48
+ query: Object,
73
49
  oauthConfig: {
74
50
  type: Object,
75
51
  default: () => {
@@ -99,7 +75,6 @@ export default {
99
75
  return {
100
76
  formConfig: this.config,
101
77
  models: this.value,
102
- query: {},
103
78
  componentsData: [],
104
79
  axios: null,
105
80
  showForm: false
@@ -117,15 +92,16 @@ export default {
117
92
  },
118
93
  value(val) {
119
94
  if (val) this.models = val;
95
+ console.log("watch models =>", this.models);
120
96
  }
121
97
  },
122
98
  created() {
123
- this.query = this.$route.query || {};
124
99
  localStorage.setItem("_TH_OauthConfig", JSON.stringify(this.oauthConfig));
125
100
  this.axios = Axios.init(this.oauthConfig);
126
101
  },
127
102
  mounted() {
128
103
  this.generateModle(this.formConfig.list, this.models);
104
+ console.log("mounted models =>", this.models);
129
105
  this.handleMountedRemotData();
130
106
  this.showForm = true;
131
107
  },
@@ -203,9 +179,15 @@ export default {
203
179
  },
204
180
  // 获取组件的远端数据
205
181
  hendleElementRemoteData(item) {
206
- if (!item.options.remote) return;
182
+ if (!item.options.remote || !item.options.remote.open) return;
207
183
  if (item.type === "upload" || item.type === "button") return;
208
- const api = this.formConfig.config.network[item.options.remoteFunc];
184
+
185
+ let api = "";
186
+ if (item.options.remote.api.constructor === String) {
187
+ api = this.formConfig.config.network[item.options.remote.api];
188
+ } else {
189
+ api = deepClone(item.options.remote.api);
190
+ }
209
191
  if (!api) return this.$message.warning("未知的接口,请检查配置信息");
210
192
 
211
193
  const requestConfig = {
@@ -218,8 +200,8 @@ export default {
218
200
  const params = {};
219
201
  for (let e of api.inParams) {
220
202
  const value =
221
- e.defaultValue || getProperty(this.query, e.alias) || null;
222
- setProperty(params, e.alias, value);
203
+ e.defaultValue || getProperty(this.query, e.pAlias) || null;
204
+ setProperty(params, e.pAlias, value);
223
205
  }
224
206
  if (api.needPage) {
225
207
  params.pageNum = params.pageNum || 1;
@@ -230,33 +212,43 @@ export default {
230
212
  else requestConfig.data = params;
231
213
 
232
214
  this.axios(requestConfig).then(res => {
233
- const props = {
234
- value: item.options.props.value || "value",
235
- label: item.options.props.label || "label",
236
- children: item.options.props.children || "children"
237
- };
238
- const initOptions = list => {
239
- return list.map(element => {
240
- const dic = {
241
- value: element[props.value],
242
- label: element[props.label]
243
- };
244
- if (element[props.children] && element[props.children].length) {
245
- dic.children = initOptions(element[props.children]);
246
- }
247
- return dic;
248
- });
249
- };
250
215
  const resultData = res.data.records ? res.data.records : res.data;
251
- item.options.remoteOptions = initOptions(resultData);
216
+ if (item.type === "descriptions" || item.type === "workflow") {
217
+ item.options.defaultValue = resultData;
218
+ } else {
219
+ const props = {
220
+ value: item.options.remote.props.value || "value",
221
+ label: item.options.remote.props.label || "label",
222
+ children: item.options.remote.props.children || "children"
223
+ };
224
+ const initOptions = list => {
225
+ return list.map(element => {
226
+ const dic = {
227
+ value: element[props.value],
228
+ label: element[props.label]
229
+ };
230
+ if (element[props.children] && element[props.children].length) {
231
+ dic.children = initOptions(element[props.children]);
232
+ }
233
+ return dic;
234
+ });
235
+ };
236
+ item.options.options = initOptions(resultData);
237
+ }
252
238
  });
253
239
  },
254
240
  handleMountedRemotData() {
255
241
  if (!this.formConfig.config.mounted.api) return;
256
242
 
257
- const api = this.formConfig.config.network[
258
- this.formConfig.config.mounted.api
259
- ];
243
+ let api = "";
244
+ if (this.formConfig.config.mounted.api.constructor === String) {
245
+ api = this.formConfig.config.network[
246
+ this.formConfig.config.mounted.api
247
+ ];
248
+ } else {
249
+ api = deepClone(this.formConfig.config.mounted.api);
250
+ }
251
+
260
252
  if (!api) return this.$message.warning("未知的接口,请检查配置信息");
261
253
 
262
254
  const requestConfig = {
@@ -286,12 +278,20 @@ export default {
286
278
  });
287
279
  },
288
280
  handleButtonSubmit(element) {
289
- console.log(element);
290
- const api = this.formConfig.config.network[element.options.remoteFunc];
281
+ if (!element.options.remote.api)
282
+ return this.$emit("button-submit", element);
283
+
284
+ let api = "";
285
+ if (element.options.remote.api.constructor === String) {
286
+ api = this.formConfig.config.network[element.options.remote.api];
287
+ } else {
288
+ api = deepClone(element.options.remote.api);
289
+ }
290
+
291
291
  if (!api) return this.$message.warning("未知的接口,请检查配置信息");
292
292
 
293
293
  let params = {};
294
- const inParams = api.inParams;
294
+ const inParams = api.inParams || [];
295
295
  const initParams = list => {
296
296
  list.map(item => {
297
297
  if (item.children) {
@@ -311,7 +311,10 @@ export default {
311
311
  const requestConfig = {
312
312
  url: api.url,
313
313
  method: api.method,
314
- headers: api.headers
314
+ headers: {
315
+ ...api.headers,
316
+ formId: this.formId
317
+ }
315
318
  };
316
319
  if (["get", "delete"].includes(api.method.toLowerCase()))
317
320
  requestConfig.params = params;
@@ -330,6 +333,12 @@ export default {
330
333
  });
331
334
  });
332
335
  },
336
+ handleInputChange(value, field) {
337
+ this.$emit("change", field, value, this.models);
338
+ },
339
+ reset() {
340
+ this.$refs.generateForm.resetFields();
341
+ },
333
342
  getData() {
334
343
  return new Promise((resolve, reject) => {
335
344
  this.$refs.generateForm.validate(valid => {
@@ -341,12 +350,6 @@ export default {
341
350
  });
342
351
  });
343
352
  },
344
- reset() {
345
- this.$refs.generateForm.resetFields();
346
- },
347
- onInputChange(value, field) {
348
- this.$emit("change", field, value, this.models);
349
- },
350
353
  setConfig(json) {
351
354
  this.formConfig = json;
352
355
  this.generateModle(this.formConfig.list, this.models);
@@ -377,13 +380,6 @@ export default {
377
380
  }
378
381
  }
379
382
 
380
- .widget-form-list-filler {
381
- margin-bottom: 0 !important;
382
- }
383
- .widget-form-list-image {
384
- margin-bottom: 0 !important;
385
- }
386
-
387
383
  .tableH5 {
388
384
  // 操作按钮布局
389
385
  .tableH5-item > div {
@@ -338,7 +338,7 @@
338
338
  <div class="list-item-title">Function</div>
339
339
  <div class="list-item-value">{{ item.label }}</div>
340
340
  <el-popconfirm
341
- :title="`是否确定删除方法 ${item.label}`"
341
+ :title="`是否确定删除 ${item.label}`"
342
342
  confirm-button-text="删除"
343
343
  confirm-button-type="danger"
344
344
  @confirm="handleEventDialogDelete(item, index)"
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div class="widget-form-container" ref="formContainer">
2
+ <div class="widgetForm" ref="formContainer">
3
3
  <th-empty
4
4
  v-if="data.list.length == 0"
5
5
  class="form-empty"
@@ -21,9 +21,9 @@
21
21
  v-model="data.list"
22
22
  v-bind="{
23
23
  group: 'people',
24
- ghostClass: 'ghost',
25
24
  animation: 200,
26
- handle: '.drag-widget'
25
+ handle: '.drag-widget',
26
+ ghostClass: 'draggable-ghost'
27
27
  }"
28
28
  @add="handleWidgetAdd"
29
29
  >
@@ -117,11 +117,11 @@ export default {
117
117
  </script>
118
118
 
119
119
  <style lang="scss" scoped>
120
- .widget-form-container {
120
+ .widgetForm {
121
121
  position: relative;
122
122
  width: 100%;
123
123
  height: calc(100% - 45px);
124
- overflow-y: scroll;
124
+ overflow-y: overlay;
125
125
 
126
126
  .form-empty {
127
127
  position: absolute;
@@ -136,5 +136,11 @@ export default {
136
136
  font-size: 20px;
137
137
  }
138
138
  }
139
+ .draggable {
140
+ height: 100%;
141
+ .draggable-list {
142
+ min-height: 100%;
143
+ }
144
+ }
139
145
  }
140
146
  </style>
@@ -2,14 +2,14 @@
2
2
  <el-form-item
3
3
  class="widgetFormItem"
4
4
  :class="{
5
- active: selectWidget.model == widget.model,
6
- isRequired: widget.options.required,
5
+ isActive: selectWidget.model == widget.model,
7
6
  isLayout: layoutElements.includes(widget.type),
8
7
  [`widget-form-list-${widget.type}`]: true,
9
8
  [widget.model]: true
10
9
  }"
11
10
  :label="widget.options.hideLabel ? '' : widget.name"
12
11
  :label-width="labelWidth"
12
+ :required="widget.options.required"
13
13
  :ref="widget.model"
14
14
  @click.native.stop="selectWidget = widget"
15
15
  >
@@ -30,8 +30,15 @@
30
30
  }"
31
31
  >
32
32
  <div class="actions">
33
- <i class="iconfont icon-icon_clone" @click.stop="handleWidgetClone"></i>
34
- <i class="iconfont icon-trash" @click.stop="handleWidgetDelete"></i>
33
+ <div class="clone">
34
+ <i
35
+ class="iconfont icon-icon_clone"
36
+ @click.stop="handleWidgetClone"
37
+ ></i>
38
+ </div>
39
+ <div class="trash">
40
+ <i class="iconfont icon-trash" @click.stop="handleWidgetDelete"></i>
41
+ </div>
35
42
  </div>
36
43
 
37
44
  <div class="drag">
File without changes
@@ -480,8 +480,8 @@ export default {
480
480
  });
481
481
  } else if (item.type === "table" || item.type === "tableH5") {
482
482
  initList(item.options.columns);
483
- } else if (item.options.remote || item.options.remoteFunc) {
484
- fieldsApi[item.model] = item.options.remoteFunc;
483
+ } else if (item.options.remote?.open || item.options.remote?.api) {
484
+ fieldsApi[item.model] = item.options.remote.api;
485
485
  }
486
486
  }
487
487
  };