tianheng-ui 0.1.36 → 0.1.38

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/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.36",
4
+ "version": "0.1.38",
5
5
  "author": "shu lang <403732931@qq.com>",
6
6
  "license": "MIT",
7
7
  "private": false,
@@ -2,6 +2,7 @@
2
2
  <el-dialog
3
3
  class="th-dialog"
4
4
  :class="[customClass]"
5
+ :style="{'z-index':zIndex}"
5
6
  :visible.sync="visible"
6
7
  :width="width"
7
8
  :top="top"
@@ -87,7 +88,9 @@ export default {
87
88
  showFullscreen: { type: Boolean, default: true },
88
89
  fullscreenIcon: { type: String, default: "el-icon-full-screen" },
89
90
 
90
- showFooter: { type: Boolean, default: true }
91
+ showFooter: { type: Boolean, default: true },
92
+
93
+ zIndex: Number
91
94
  },
92
95
  data() {
93
96
  return {
@@ -13,7 +13,7 @@
13
13
  <el-form-item prop="fieldsType" required>
14
14
  <el-tooltip
15
15
  slot="label"
16
- effect="dark"
16
+ effect="light"
17
17
  content="字段的配置方式"
18
18
  placement="top"
19
19
  >
@@ -31,7 +31,7 @@
31
31
  >
32
32
  <el-tooltip
33
33
  slot="label"
34
- effect="dark"
34
+ effect="light"
35
35
  content="使用接口的出参配置可选字段"
36
36
  placement="top"
37
37
  >
@@ -83,7 +83,7 @@
83
83
  <el-form-item>
84
84
  <el-tooltip
85
85
  slot="label"
86
- effect="dark"
86
+ effect="light"
87
87
  content="一般用于编辑和详情的数据回显"
88
88
  placement="top"
89
89
  >
@@ -1,124 +1,270 @@
1
1
  <template>
2
- <div class="widget-config" v-if="show">
3
- <el-form
4
- :model="data"
5
- label-position="left"
6
- label-width="80px"
7
- size="small"
8
- :rules="formRules"
9
- ref="formRef"
10
- >
11
- <el-collapse v-model="collapseValue">
12
- <el-collapse-item title="通用配置" name="group-general">
13
- <el-form-item>
14
- <el-tooltip
15
- slot="label"
16
- effect="dark"
17
- content="切换组件会导致该组件配置信息重置,请谨慎使用!"
18
- placement="top"
19
- >
20
- <span style="color: #409EFF;">组件切换</span>
21
- </el-tooltip>
22
- <el-select
23
- :value="data.type"
24
- style="width:100%;"
25
- placeholder="请选择类型"
26
- @change="handleTypeChange"
27
- >
28
- <el-option
29
- v-for="item in Object.values(compsData)"
30
- :key="item.type"
31
- :label="item.name"
32
- :value="item.type"
2
+ <div class="formWidgetConfig">
3
+ <div class="tabs th-sticky_top">
4
+ <div
5
+ v-for="(item, index) in tabsMenus"
6
+ :key="index"
7
+ class="tabs-item"
8
+ :class="{ 'tabs-item__active': activeTab.value === item.value }"
9
+ @click="handleTabsChange(item)"
10
+ >
11
+ {{ item.title }}
12
+ </div>
13
+ </div>
14
+
15
+ <div v-if="activeTab.value === 'field'">
16
+ <el-form
17
+ :model="data"
18
+ label-position="left"
19
+ label-width="80px"
20
+ size="small"
21
+ :rules="formRules"
22
+ ref="formRef"
23
+ >
24
+ <el-collapse v-model="collapseValue">
25
+ <el-collapse-item title="通用配置" name="group-general">
26
+ <el-form-item>
27
+ <el-tooltip
28
+ slot="label"
29
+ effect="light"
30
+ content="切换组件会导致该组件配置信息重置,请谨慎使用!"
31
+ placement="top"
33
32
  >
34
- </el-option>
35
- </el-select>
36
- </el-form-item>
37
- <el-form-item required v-if="config.fieldsType === 'fieldsApi'">
38
- <el-tooltip
39
- slot="label"
40
- effect="dark"
41
- content="组件关联数据表中的唯一字段"
42
- placement="top"
43
- >
44
- <span style="color: #409EFF;">字段标识</span>
45
- </el-tooltip>
46
- <el-select
47
- v-model="data.model"
48
- style="width:100%;"
49
- placeholder="请选择字段"
50
- >
51
- <el-option
52
- v-for="item in fields"
53
- :key="item.prop"
54
- :label="item.label"
55
- :value="item.prop"
33
+ <span style="color: #409EFF;">组件切换</span>
34
+ </el-tooltip>
35
+ <el-select
36
+ :value="data.type"
37
+ style="width:100%;"
38
+ placeholder="请选择类型"
39
+ @change="handleTypeChange"
56
40
  >
57
- </el-option>
58
- </el-select>
59
- </el-form-item>
60
- <el-form-item>
61
- <el-tooltip
62
- slot="label"
63
- effect="dark"
64
- content="表单提交时的入参名,对应数据表中的字段,非必要不修改!"
65
- placement="top"
66
- >
67
- <span style="color: #409EFF;">组件字段</span>
68
- </el-tooltip>
69
- <el-input v-model="data.model"></el-input>
70
- </el-form-item>
71
- </el-collapse-item>
41
+ <el-option
42
+ v-for="item in Object.values(compsData)"
43
+ :key="item.type"
44
+ :label="item.name"
45
+ :value="item.type"
46
+ >
47
+ </el-option>
48
+ </el-select>
49
+ </el-form-item>
50
+ <el-form-item v-if="config.fieldsType === 'fieldsApi'" prop="model">
51
+ <el-tooltip
52
+ slot="label"
53
+ effect="light"
54
+ content="组件关联数据表中的唯一字段"
55
+ placement="top"
56
+ >
57
+ <span style="color: #409EFF;">字段标识</span>
58
+ </el-tooltip>
59
+ <el-select
60
+ v-model="data.model"
61
+ style="width:100%;"
62
+ placeholder="请选择字段"
63
+ >
64
+ <el-option
65
+ v-for="item in fields"
66
+ :key="item.prop"
67
+ :label="item.label"
68
+ :value="item.prop"
69
+ >
70
+ </el-option>
71
+ </el-select>
72
+ </el-form-item>
73
+ <el-form-item prop="model">
74
+ <el-tooltip
75
+ slot="label"
76
+ effect="light"
77
+ content="表单提交时的入参名,对应数据表中的字段,非必要不修改!"
78
+ placement="top"
79
+ >
80
+ <span style="color: #409EFF;">组件字段</span>
81
+ </el-tooltip>
82
+ <el-input v-model="data.model"></el-input>
83
+ </el-form-item>
84
+ </el-collapse-item>
72
85
 
73
- <component
74
- :widget="data"
75
- :config="config"
76
- :fields="fields"
77
- :apiConfig="apiConfig"
78
- :is="compsData[data.type].content"
79
- ></component>
86
+ <component
87
+ :widget="data"
88
+ :config="config"
89
+ :fields="fields"
90
+ :apiConfig="apiConfig"
91
+ :is="compsData[data.type].content"
92
+ ></component>
80
93
 
81
- <el-collapse-item
82
- v-if="data.events && Object.keys(data.events).length"
83
- name="group-action"
84
- >
85
- <div slot="title" style="width:100%">
86
- <span>动作设置</span>
87
- <span
88
- style="float: right;margin-right: 10px;"
89
- @click.stop="handleEventDialogShow"
90
- >配置</span
91
- >
92
- </div>
93
- <el-form-item
94
- v-for="event in Object.keys(data.events)"
95
- :key="event"
96
- :label="event"
94
+ <el-collapse-item
95
+ v-if="data.events && Object.keys(data.events).length"
96
+ name="group-action"
97
97
  >
98
- <div class="events-item">
98
+ <div slot="title" style="width:100%">
99
+ <span>动作设置</span>
100
+ <span
101
+ style="float: right;margin-right: 10px;"
102
+ @click.stop="handleEventDialogShow"
103
+ >配置</span
104
+ >
105
+ </div>
106
+ <el-form-item
107
+ v-for="event in Object.keys(data.events)"
108
+ :key="event"
109
+ :label="event"
110
+ >
111
+ <div class="events-item">
112
+ <el-select
113
+ v-model="data.events[event]"
114
+ placeholder="请选择"
115
+ clearable
116
+ >
117
+ <el-option
118
+ v-for="item in config.eventScript"
119
+ :key="item.id"
120
+ :label="item.label"
121
+ :value="item.id"
122
+ >
123
+ </el-option>
124
+ </el-select>
125
+ <i
126
+ v-if="data.events[event]"
127
+ class="el-icon-edit"
128
+ @click="handleEventsCollapseClick(data.events[event])"
129
+ ></i>
130
+ </div>
131
+ </el-form-item>
132
+ </el-collapse-item>
133
+ </el-collapse>
134
+ </el-form>
135
+ </div>
136
+ <div v-if="activeTab.value === 'form'">
137
+ <el-form
138
+ :model="config"
139
+ label-position="left"
140
+ label-width="80px"
141
+ size="small"
142
+ :rules="formRules"
143
+ ref="formRef"
144
+ >
145
+ <el-collapse v-model="collapseValue">
146
+ <el-collapse-item title="表单配置" name="group-form">
147
+ <el-form-item prop="fieldsType" required>
148
+ <el-tooltip
149
+ slot="label"
150
+ effect="light"
151
+ content="字段的配置方式"
152
+ placement="top"
153
+ >
154
+ <span style="color: #409EFF;">字段类型</span>
155
+ </el-tooltip>
156
+ <el-radio-group v-model="config.fieldsType">
157
+ <el-radio-button label="custom">自定义</el-radio-button>
158
+ <el-radio-button label="fieldsApi">接口导入</el-radio-button>
159
+ </el-radio-group>
160
+ </el-form-item>
161
+ <el-form-item
162
+ v-if="config.fieldsType === 'fieldsApi'"
163
+ prop="fieldsApi"
164
+ required
165
+ >
166
+ <el-tooltip
167
+ slot="label"
168
+ effect="light"
169
+ content="使用接口的出参配置可选字段"
170
+ placement="top"
171
+ >
172
+ <span style="color: #409EFF;">字段接口</span>
173
+ </el-tooltip>
99
174
  <el-select
100
- v-model="data.events[event]"
175
+ v-model="config.fieldsApi"
176
+ style="width:100%"
177
+ clearable
101
178
  placeholder="请选择"
179
+ no-data-text="暂无接口,请前往【数据源模块】创建"
180
+ @change="handleFieldsApiChange"
181
+ >
182
+ <el-option
183
+ v-for="item in Object.values(apiConfig)"
184
+ :key="item.id"
185
+ :label="item.label"
186
+ :value="item.id"
187
+ >
188
+ </el-option>
189
+ </el-select>
190
+ </el-form-item>
191
+ <el-form-item label="表单标题" prop="title" required>
192
+ <el-input
193
+ v-model="config.title"
194
+ placeholder="请输入"
102
195
  clearable
196
+ ></el-input>
197
+ </el-form-item>
198
+ <el-form-item label="表单宽度">
199
+ <el-input v-model="config.width"></el-input>
200
+ </el-form-item>
201
+ <el-form-item label="组件库">
202
+ <el-radio-group v-model="config.ui">
203
+ <el-radio-button label="element">Element</el-radio-button>
204
+ <el-radio-button label="vant" disabled>Vant</el-radio-button>
205
+ </el-radio-group>
206
+ </el-form-item>
207
+ <el-form-item label="组件尺寸">
208
+ <el-radio-group v-model="config.size">
209
+ <el-radio-button label="medium">medium</el-radio-button>
210
+ <el-radio-button label="small">small</el-radio-button>
211
+ <el-radio-button label="mini">mini</el-radio-button>
212
+ </el-radio-group>
213
+ </el-form-item>
214
+ </el-collapse-item>
215
+ <el-collapse-item title="数据配置" name="group-resultData">
216
+ <el-form-item>
217
+ <el-tooltip
218
+ slot="label"
219
+ effect="light"
220
+ content="一般用于编辑和详情的数据回显"
221
+ placement="top"
222
+ >
223
+ <span style="color: #409EFF;">数据回填</span>
224
+ </el-tooltip>
225
+ <el-select
226
+ v-model="config.mounted.api"
227
+ value-key="id"
228
+ clearable
229
+ placeholder="请选择数据方法"
230
+ no-data-text="暂无接口,请前往【接口模块】创建"
103
231
  >
104
232
  <el-option
105
- v-for="item in config.eventScript"
233
+ v-for="item in Object.values(apiConfig)"
106
234
  :key="item.id"
107
235
  :label="item.label"
108
236
  :value="item.id"
109
237
  >
110
238
  </el-option>
111
239
  </el-select>
112
- <i
113
- v-if="data.events[event]"
114
- class="el-icon-edit"
115
- @click="handleEventsCollapseClick(data.events[event])"
116
- ></i>
117
- </div>
118
- </el-form-item>
119
- </el-collapse-item>
120
- </el-collapse>
121
- </el-form>
240
+ </el-form-item>
241
+ </el-collapse-item>
242
+ <el-collapse-item title="标签配置" name="group-label">
243
+ <el-form-item label="标签宽度">
244
+ <el-input-number
245
+ v-model="config.labelWidth"
246
+ :min="0"
247
+ :step="5"
248
+ ></el-input-number>
249
+ </el-form-item>
250
+ <el-form-item label="对齐方式">
251
+ <el-radio-group v-model="config.labelPosition">
252
+ <el-radio-button label="left">左对齐</el-radio-button>
253
+ <el-radio-button label="right">右对齐</el-radio-button>
254
+ <el-radio-button label="top">顶部对齐</el-radio-button>
255
+ </el-radio-group>
256
+ </el-form-item>
257
+ </el-collapse-item>
258
+ <el-collapse-item title="属性配置" name="group-attributes">
259
+ <el-form-item label-width="0">
260
+ <el-checkbox v-model="config.disabled">禁用 </el-checkbox>
261
+ <el-checkbox v-model="config.hideLabel">隐藏标签 </el-checkbox>
262
+ </el-form-item>
263
+ </el-collapse-item>
264
+ </el-collapse>
265
+ </el-form>
266
+ </div>
267
+ <div v-if="activeTab.value === 'css'"></div>
122
268
 
123
269
  <th-dialog
124
270
  title="动作设置"
@@ -248,6 +394,12 @@ export default {
248
394
  data() {
249
395
  return {
250
396
  compsData: deepClone(compsData),
397
+ tabsMenus: [
398
+ { title: "组件配置", value: "field" },
399
+ { title: "表单属性", value: "form" },
400
+ { title: "样式设置", value: "css" }
401
+ ],
402
+ activeTab: {},
251
403
  validator: {
252
404
  type: null,
253
405
  required: null,
@@ -292,124 +444,43 @@ export default {
292
444
  score: 1
293
445
  }
294
446
  ],
295
- collapseValue: ["group-general", "group-element", "group-action"],
296
- formRules: {}
297
- };
298
- },
299
- // watch: {
300
- // "data.options.isRange": function(val) {
301
- // if (typeof val !== "undefined") {
302
- // if (val) {
303
- // this.data.options.defaultValue = null;
304
- // } else {
305
- // if (Object.keys(this.data.options).indexOf("defaultValue") >= 0)
306
- // this.data.options.defaultValue = "";
307
- // }
308
- // }
309
- // },
310
- // "data.options.required": function(val) {
311
- // this.validateRequired(val);
312
- // },
313
- // "data.options.dataType": function(val) {
314
- // this.validateDataType(val);
315
- // },
316
- // "data.options.pattern": function(val) {
317
- // this.valiatePattern(val);
318
- // },
319
- // "data.name": function(val) {
320
- // if (this.data.options) {
321
- // this.validateRequired(this.data.options.required);
322
- // this.validateDataType(this.data.options.dataType);
323
- // this.valiatePattern(this.data.options.pattern);
324
- // }
325
- // }
326
- // },
327
- computed: {
328
- show() {
329
- if (this.data && Object.keys(this.data).length > 0) {
330
- return true;
447
+ collapseValue: [
448
+ "group-general",
449
+ "group-element",
450
+ "group-action",
451
+ "group-form",
452
+ "group-resultData",
453
+ "group-label",
454
+ "group-attributes"
455
+ ],
456
+ formRules: {
457
+ model: [
458
+ { required: true, message: "请填选组件字段", trigger: "change" }
459
+ ],
460
+ fieldsApi: [
461
+ { required: true, message: "请选择字段接口", trigger: "change" }
462
+ ],
463
+ title: [
464
+ { required: true, message: "请填写表单标题", trigger: "change" }
465
+ ]
331
466
  }
332
- return false;
333
- }
467
+ };
334
468
  },
335
469
  created() {
470
+ this.activeTab = this.tabsMenus[1];
336
471
  const keys = Object.keys(this.compsData);
337
472
  for (const key of keys) {
338
473
  this.compsData[key].content = require(`./custom/configs/${key}`).default;
339
474
  }
340
475
  },
341
476
  methods: {
342
- generateRule() {
343
- this.data.rules = [];
344
- Object.keys(this.validator).forEach(key => {
345
- if (this.validator[key]) {
346
- this.data.rules.push(this.validator[key]);
347
- }
348
- });
349
- },
350
-
351
- validateRequired(val) {
352
- if (val) {
353
- this.validator.required = {
354
- required: true,
355
- message: `${this.data.name}必须填写`
356
- };
357
- } else {
358
- this.validator.required = null;
359
- }
360
-
361
- this.$nextTick(() => {
362
- this.generateRule();
363
- });
364
- },
365
-
366
- validateDataType(val) {
367
- if (!this.show) {
368
- return false;
369
- }
370
-
371
- if (val) {
372
- this.validator.type = {
373
- type: val,
374
- message: this.data.name + "格式不正确"
375
- };
376
- } else {
377
- this.validator.type = null;
378
- }
477
+ handleTabsChange(item) {
478
+ if (!this.data.model)
479
+ return this.$message.warning("请从左侧拖拽来添加组件");
379
480
 
380
- this.generateRule();
481
+ this.activeTab = item;
381
482
  },
382
- valiatePattern(val) {
383
- if (!this.show) {
384
- return false;
385
- }
386
-
387
- if (val) {
388
- this.validator.pattern = {
389
- pattern: val,
390
- message: this.data.name + "格式不匹配"
391
- };
392
- } else {
393
- this.validator.pattern = null;
394
- }
395
483
 
396
- this.generateRule();
397
- },
398
- handleInputNumberChange() {
399
- if (this.data.options.minRows > this.data.options.maxRows) {
400
- this.data.options.maxRows = this.data.options.minRows;
401
- }
402
- },
403
- handleImguploadType(val) {
404
- if (val == "picture-card") {
405
- this.data.options.drag = false;
406
- }
407
- },
408
- handleImguploadDrag(val) {
409
- if (val) {
410
- this.data.options.listType = "default";
411
- }
412
- },
413
484
  handleEventDialogShow() {
414
485
  this.eventsDialog = {
415
486
  visible: true,
@@ -445,16 +516,14 @@ export default {
445
516
  this.eventsDialog.eventScript.splice(index, 1);
446
517
  },
447
518
  handleEventsCollapseClick(eventKey) {
448
- for (let i = 0; i < this.config.eventScript.length; i++) {
449
- const event = this.config.eventScript[i];
519
+ const eventScript = deepClone(this.config.eventScript);
520
+ for (let i = 0; i < eventScript.length; i++) {
521
+ const event = eventScript[i];
450
522
  if (event.key === eventKey) {
451
- const eventScript = JSON.parse(
452
- JSON.stringify(this.config.eventScript)
453
- );
454
523
  this.eventsDialog = {
455
524
  visible: true,
456
525
  eventScript: eventScript,
457
- active: eventScript[i]
526
+ active: event
458
527
  };
459
528
  break;
460
529
  }
@@ -463,13 +532,27 @@ export default {
463
532
  handleTypeChange(val) {
464
533
  const config = deepClone(this.compsData[val].config);
465
534
  this.$emit("update", config);
535
+ },
536
+ handleFieldsApiChange() {
537
+ this.$emit("fieldsChange");
538
+ },
539
+ formValidate() {
540
+ return new Promise((resolve, reject) => {
541
+ if (this.$refs.formRef) {
542
+ this.$refs.formRef.validate(valid => {
543
+ resolve(valid);
544
+ });
545
+ } else {
546
+ reject();
547
+ }
548
+ });
466
549
  }
467
550
  }
468
551
  };
469
552
  </script>
470
553
 
471
554
  <style lang="scss">
472
- .widget-config {
555
+ .formWidgetConfig {
473
556
  .el-collapse-item__header {
474
557
  padding: 0 10px;
475
558
  height: 40px;
@@ -489,7 +572,23 @@ export default {
489
572
  </style>
490
573
 
491
574
  <style lang="scss" scoped>
492
- .widget-config {
575
+ .formWidgetConfig {
576
+ .tabs {
577
+ display: flex;
578
+ align-items: center;
579
+ height: 45px;
580
+
581
+ .tabs-item {
582
+ flex: 1;
583
+ text-align: center;
584
+ line-height: 44px;
585
+ cursor: pointer;
586
+ }
587
+ .tabs-item__active {
588
+ border-bottom: 2px solid #409eff;
589
+ }
590
+ }
591
+
493
592
  .events-item {
494
593
  display: flex;
495
594
  align-items: center;
@@ -115,3 +115,11 @@ export default {
115
115
  }
116
116
  };
117
117
  </script>
118
+
119
+ <style lang="scss" scoped>
120
+ .widget-form-container {
121
+ position: relative;
122
+ width: 100%;
123
+ height: calc(100% - 45px);
124
+ }
125
+ </style>