tianheng-ui 0.1.10 → 0.1.12

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 (72) hide show
  1. package/lib/theme-chalk/styles/reset.scss +0 -2
  2. package/lib/tianheng-ui.js +13 -14
  3. package/package.json +1 -1
  4. package/packages/FormMaking/GenerateForm.vue +16 -11
  5. package/packages/FormMaking/GenerateFormItem.vue +73 -581
  6. package/packages/FormMaking/GenerateFormItemH5.vue +6 -6
  7. package/packages/FormMaking/Upload/index.vue +0 -1
  8. package/packages/FormMaking/WidgetConfig.vue +100 -77
  9. package/packages/FormMaking/WidgetForm.vue +7 -48
  10. package/packages/FormMaking/WidgetFormItem.vue +41 -65
  11. package/packages/FormMaking/WidgetSelect.vue +160 -0
  12. package/packages/FormMaking/WidgetTools.vue +538 -0
  13. package/packages/FormMaking/config/index.js +6 -0
  14. package/packages/FormMaking/custom/config.js +119 -87
  15. package/packages/FormMaking/custom/configs/button.vue +24 -25
  16. package/packages/FormMaking/custom/configs/cascader.vue +7 -7
  17. package/packages/FormMaking/custom/configs/checkbox.vue +23 -22
  18. package/packages/FormMaking/custom/configs/color.vue +3 -3
  19. package/packages/FormMaking/custom/configs/date.vue +3 -3
  20. package/packages/FormMaking/custom/configs/grid.vue +4 -4
  21. package/packages/FormMaking/custom/configs/input.vue +138 -31
  22. package/packages/FormMaking/custom/configs/number.vue +5 -5
  23. package/packages/FormMaking/custom/configs/radio.vue +23 -19
  24. package/packages/FormMaking/custom/configs/rate.vue +3 -3
  25. package/packages/FormMaking/custom/configs/select.vue +25 -20
  26. package/packages/FormMaking/custom/configs/slider.vue +3 -3
  27. package/packages/FormMaking/custom/configs/switch.vue +3 -3
  28. package/packages/FormMaking/custom/configs/table.vue +2 -2
  29. package/packages/FormMaking/custom/configs/{table_h5.vue → tableH5.vue} +2 -2
  30. package/packages/FormMaking/custom/configs/tabs.vue +18 -23
  31. package/packages/FormMaking/custom/configs/textarea.vue +124 -22
  32. package/packages/FormMaking/custom/configs/time.vue +3 -3
  33. package/packages/FormMaking/custom/configs/upload.vue +5 -5
  34. package/packages/FormMaking/custom/index.js +2 -4
  35. package/packages/FormMaking/custom/items/alliance.vue +30 -29
  36. package/packages/FormMaking/custom/items/blank_pro.vue +14 -0
  37. package/packages/FormMaking/custom/items/button.vue +36 -1
  38. package/packages/FormMaking/custom/items/cascader.vue +6 -2
  39. package/packages/FormMaking/custom/items/cell.vue +0 -2
  40. package/packages/FormMaking/custom/items/checkbox.vue +18 -8
  41. package/packages/FormMaking/custom/items/color.vue +1 -1
  42. package/packages/FormMaking/custom/items/date.vue +1 -1
  43. package/packages/FormMaking/custom/items/editor.vue +1 -1
  44. package/packages/FormMaking/custom/items/{grid.vue → grid_dev.vue} +16 -47
  45. package/packages/FormMaking/custom/items/grid_pro.vue +45 -0
  46. package/packages/FormMaking/custom/items/image.vue +0 -28
  47. package/packages/FormMaking/custom/items/input.vue +15 -9
  48. package/packages/FormMaking/custom/items/number.vue +4 -4
  49. package/packages/FormMaking/custom/items/radio.vue +17 -7
  50. package/packages/FormMaking/custom/items/rate.vue +1 -1
  51. package/packages/FormMaking/custom/items/select.vue +12 -6
  52. package/packages/FormMaking/custom/items/slider.vue +1 -1
  53. package/packages/FormMaking/custom/items/switch.vue +1 -1
  54. package/packages/FormMaking/custom/items/{table_h5.vue → tableH5_dev.vue} +44 -49
  55. package/packages/FormMaking/custom/items/tableH5_pro.vue +113 -0
  56. package/packages/FormMaking/custom/items/{table.vue → table_dev.vue} +21 -41
  57. package/packages/FormMaking/custom/items/table_pro.vue +114 -0
  58. package/packages/FormMaking/custom/items/tabs_dev.vue +101 -0
  59. package/packages/FormMaking/custom/items/tabs_pro.vue +50 -0
  60. package/packages/FormMaking/custom/items/text.vue +1 -1
  61. package/packages/FormMaking/custom/items/textarea.vue +4 -13
  62. package/packages/FormMaking/custom/items/time.vue +3 -3
  63. package/packages/FormMaking/custom/items/upload.vue +15 -14
  64. package/packages/FormMaking/custom/mixins/index.js +28 -6
  65. package/packages/FormMaking/custom/register.js +22 -11
  66. package/packages/FormMaking/index.vue +95 -468
  67. package/packages/FormMaking/styles/index.scss +235 -242
  68. package/packages/FormMaking/util/generateCode.js +3 -3
  69. package/packages/FormMaking/util/index.js +33 -23
  70. package/packages/FormMaking/util/request.js +9 -12
  71. package/packages/FormMaking/custom/items/tabs.vue +0 -145
  72. /package/packages/FormMaking/custom/items/{blank.vue → blank_dev.vue} +0 -0
@@ -0,0 +1,114 @@
1
+ <template>
2
+ <el-table
3
+ style="width:100%"
4
+ :data="dataModel"
5
+ :stripe="widget.options.stripe"
6
+ :show-header="widget.options.showHeader"
7
+ :highlight-current-row="widget.options.highlightCurrentRow"
8
+ :border="widget.options.border"
9
+ >
10
+ <el-table-column
11
+ v-if="widget.options.isSerial"
12
+ label="序号"
13
+ type="index"
14
+ width="50"
15
+ align="center"
16
+ >
17
+ </el-table-column>
18
+ <el-table-column
19
+ v-for="element in widget.options.columns"
20
+ :key="`table_${element.key}`"
21
+ :label="element.name"
22
+ :prop="element.model"
23
+ :width="element.options.width"
24
+ >
25
+ <template slot-scope="scope">
26
+ <generate-form-item
27
+ :models.sync="dataModel[scope.$index]"
28
+ :widget="element"
29
+ :remote="remote"
30
+ :config="config"
31
+ :prop="`${prop}.${scope.$index}.${element.model}`"
32
+ :slotKeys="slotKeys"
33
+ :componentsData="componentsData"
34
+ >
35
+ <template v-for="name in slotKeys" :slot="name">
36
+ <slot :name="name" />
37
+ </template>
38
+ </generate-form-item>
39
+ </template>
40
+ </el-table-column>
41
+ <el-table-column
42
+ v-if="widget.options.isDelete"
43
+ fixed="right"
44
+ label="操作"
45
+ width="60"
46
+ align="center"
47
+ >
48
+ <template slot-scope="scope">
49
+ <el-button
50
+ style="color:#F56C6C"
51
+ type="text"
52
+ @click.native.prevent="handleTableDelete(scope.$index)"
53
+ >
54
+ 移除
55
+ </el-button>
56
+ </template>
57
+ </el-table-column>
58
+ <template v-if="widget.options.isAdd" slot="append">
59
+ <div
60
+ style="text-align: center;"
61
+ :style="{
62
+ borderTop:
63
+ dataModel && dataModel.length != 0 ? '' : '1px solid #EBEEF5'
64
+ }"
65
+ >
66
+ <el-button
67
+ type="text"
68
+ :disabled="widget.options.disabled"
69
+ @click="handleTableAdd"
70
+ >新增</el-button
71
+ >
72
+ </div>
73
+ </template>
74
+ </el-table>
75
+ </template>
76
+
77
+ <script>
78
+ import { itemsComponent } from "../mixins/index";
79
+ import GenerateFormItem from "../../GenerateFormItem.vue";
80
+ export default {
81
+ components: { GenerateFormItem },
82
+ mixins: [itemsComponent],
83
+ props: ["models", "remote", "prop", "slotKeys", "componentsData"],
84
+ data() {
85
+ return {};
86
+ },
87
+
88
+ methods: {
89
+ handleTableAdd() {
90
+ let dic = {};
91
+ this.widget.options.columns.forEach(item => {
92
+ if (item.type === "grid") {
93
+ for (let i = 0; i < item.options.columns.length; i++) {
94
+ const element = item.options.columns[i];
95
+ for (let j = 0; j < element.options.columns.length; j++) {
96
+ const element2 = element.options.columns[j];
97
+ dic[element2.model] = element2.options.defaultValue;
98
+ }
99
+ }
100
+ } else {
101
+ dic[item.model] = item.options.defaultValue;
102
+ }
103
+ });
104
+
105
+ this.dataModel.push(dic);
106
+ },
107
+ handleTableDelete(index) {
108
+ this.dataModel.splice(index, 1);
109
+ }
110
+ }
111
+ };
112
+ </script>
113
+
114
+ <style></style>
@@ -0,0 +1,101 @@
1
+ <template>
2
+ <el-tabs
3
+ v-model="widget.options.defaultValue"
4
+ :type="widget.options.type"
5
+ :tab-position="widget.options.tabPosition"
6
+ >
7
+ <el-tab-pane
8
+ v-for="(column, columnIndex) in widget.options.columns"
9
+ :key="`tabs_${columnIndex}`"
10
+ :label="column.label"
11
+ :name="column.value"
12
+ >
13
+ <draggable
14
+ v-model="column.list"
15
+ :no-transition-on-drag="true"
16
+ v-bind="{
17
+ group: 'people',
18
+ ghostClass: 'ghost',
19
+ animation: 200,
20
+ handle: '.drag-widget'
21
+ }"
22
+ @add="handleWidgetAdd($event, widget, columnIndex)"
23
+ >
24
+ <transition-group name="fade" tag="div" class="widget-col-list">
25
+ <widget-form-item
26
+ v-for="(element, elementIndex) in column.list.filter(item => {
27
+ return item.key;
28
+ })"
29
+ :key="element.key"
30
+ :widget="element"
31
+ :widgetIndex="elementIndex"
32
+ :widgetArray="column.list"
33
+ :select.sync="selectWidget"
34
+ :config="config"
35
+ ></widget-form-item>
36
+ </transition-group>
37
+ </draggable>
38
+ </el-tab-pane>
39
+ </el-tabs>
40
+ </template>
41
+
42
+ <script>
43
+ import { itemsComponent } from "../mixins/index";
44
+ import Draggable from "vuedraggable";
45
+ import WidgetFormItem from "../../WidgetFormItem.vue";
46
+ export default {
47
+ components: { Draggable, WidgetFormItem },
48
+ mixins: [itemsComponent],
49
+ data() {
50
+ return {
51
+ selectWidget: {}
52
+ };
53
+ },
54
+ watch: {
55
+ select(val) {
56
+ this.selectWidget = val;
57
+ },
58
+ selectWidget: {
59
+ handler(val) {
60
+ this.$emit("update:select", val);
61
+ },
62
+ deep: true
63
+ }
64
+ },
65
+ methods: {
66
+ handleWidgetAdd($event, row, colIndex) {
67
+ const newIndex = $event.newIndex;
68
+ const oldIndex = $event.oldIndex;
69
+ const item = $event.item;
70
+ const newComponent = JSON.parse(
71
+ JSON.stringify(row.options.columns[colIndex].list[newIndex])
72
+ );
73
+
74
+ // 防止布局元素的嵌套拖拽
75
+ if (
76
+ item.className.indexOf("tabs") !== -1 ||
77
+ item.className.indexOf("alliance") !== -1
78
+ ) {
79
+ // 如果是列表中拖拽的元素需要还原到原来位置
80
+ item.tagName === "DIV" &&
81
+ this.widgetArray.splice(oldIndex, 0, newComponent);
82
+
83
+ row.options.columns[colIndex].list.splice(newIndex, 1);
84
+ return false;
85
+ }
86
+
87
+ const key =
88
+ Date.parse(new Date()) + "_" + Math.ceil(Math.random() * 99999);
89
+ if (!newComponent.model) {
90
+ newComponent.key = key;
91
+ newComponent.model = `${newComponent.type}_${key}`;
92
+ }
93
+ this.$set(row.options.columns[colIndex].list, newIndex, newComponent);
94
+
95
+ this.selectWidget = newComponent;
96
+ }
97
+ }
98
+ };
99
+ </script>
100
+
101
+ <style></style>
@@ -0,0 +1,50 @@
1
+ <template>
2
+ <el-tabs
3
+ v-model="widget.options.defaultValue"
4
+ :type="widget.options.type"
5
+ :tab-position="widget.options.tabPosition"
6
+ >
7
+ <el-tab-pane
8
+ v-for="(column, columnIndex) in widget.options.columns"
9
+ :key="`tabs_${columnIndex}`"
10
+ :label="column.label"
11
+ :name="column.value"
12
+ >
13
+ <generate-form-item
14
+ v-for="element in column.list"
15
+ :key="`tabs_${columnIndex}_${element.key}`"
16
+ :widget="element"
17
+ :models.sync="dataModel[column.value]"
18
+ :config="config"
19
+ :remote="remote"
20
+ :prop="
21
+ element.type === 'grid'
22
+ ? `${prop}.${column.value}`
23
+ : `${prop}.${column.value}.${element.model}`
24
+ "
25
+ :slotKeys="slotKeys"
26
+ :componentsData="componentsData"
27
+ >
28
+ <template v-for="name in slotKeys" :slot="name">
29
+ <slot :name="name" />
30
+ </template>
31
+ </generate-form-item>
32
+ </el-tab-pane>
33
+ </el-tabs>
34
+ </template>
35
+
36
+ <script>
37
+ import { itemsComponent } from "../mixins/index";
38
+ import GenerateFormItem from "../../GenerateFormItem.vue";
39
+ export default {
40
+ components: { GenerateFormItem },
41
+ mixins: [itemsComponent],
42
+ props: ["models", "remote", "prop", "slotKeys", "componentsData"],
43
+ data() {
44
+ return {};
45
+ },
46
+ methods: {}
47
+ };
48
+ </script>
49
+
50
+ <style></style>
@@ -4,7 +4,7 @@
4
4
  height: widget.options.height,
5
5
  textAlign: widget.options.textAlign
6
6
  }"
7
- v-html="widget.options.defaultValue"
7
+ v-html="dataModel"
8
8
  ></div>
9
9
  </template>
10
10
 
@@ -1,15 +1,13 @@
1
1
  <template>
2
2
  <el-input
3
3
  type="textarea"
4
- v-model="widget.options.defaultValue"
5
- :style="{ width: widget.options.width }"
4
+ v-model="dataModel"
6
5
  :disabled="widget.options.disabled"
7
6
  :placeholder="widget.options.placeholder"
7
+ :style="{ width: widget.options.width }"
8
8
  :maxlength="widget.options.maxlength"
9
- :show-word-limit="widget.options.showWordLimit"
10
9
  :clearable="widget.options.clearable"
11
- :suffix-icon="widget.options.suffixIcon"
12
- :prefix-icon="widget.options.prefixIcon"
10
+ :show-word-limit="widget.options.showWordLimit"
13
11
  :autosize="{
14
12
  minRows: widget.options.minRows,
15
13
  maxRows: widget.options.maxRows
@@ -17,14 +15,7 @@
17
15
  @input="handleEventAction(widget.events.onChange)"
18
16
  @focus="handleEventAction(widget.events.onFocus)"
19
17
  @blur="handleEventAction(widget.events.onBlur)"
20
- >
21
- <template v-if="widget.options.prepend" slot="prepend">
22
- <span v-html="widget.options.prepend"></span>
23
- </template>
24
- <template v-if="widget.options.append" slot="append">
25
- <span v-html="widget.options.append"></span>
26
- </template>
27
- </el-input>
18
+ ></el-input>
28
19
  </template>
29
20
 
30
21
  <script>
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <el-time-picker
3
- v-model="widget.options.defaultValue"
3
+ v-model="dataModel"
4
4
  :style="{ width: widget.options.width }"
5
5
  :is-range="widget.options.isRange"
6
6
  :placeholder="widget.options.placeholder"
@@ -10,11 +10,11 @@
10
10
  :disabled="widget.options.disabled"
11
11
  :editable="widget.options.editable"
12
12
  :clearable="widget.options.clearable"
13
- :arrow-control="widget.options.arrowControl"
13
+ :arrowControl="widget.options.arrowControl"
14
+ :value-format="widget.options.format"
14
15
  :picker-options="{
15
16
  selectableRange: `${widget.options.pickerOptions.selectableRange[0]} - ${widget.options.pickerOptions.selectableRange[1]}`
16
17
  }"
17
- :value-format="widget.options.format"
18
18
  @change="handleEventAction(widget.events.onChange)"
19
19
  @focus="handleEventAction(widget.events.onFocus)"
20
20
  @blur="handleEventAction(widget.events.onBlur)"
@@ -1,17 +1,19 @@
1
1
  <template>
2
2
  <div>
3
3
  <el-upload
4
+ class="upload-demo"
4
5
  :action="uploadUrl"
5
6
  :headers="widget.options.remote ? widget.options.remoteFunc.headers : {}"
6
7
  :data="widget.options.remote ? widget.options.remoteFunc.params : {}"
7
8
  :multiple="widget.options.multiple"
8
9
  :limit="widget.options.length"
10
+ :width="widget.options.size.width"
11
+ :height="widget.options.size.height"
9
12
  :list-type="widget.options.listType"
10
- :file-list="widget.options.defaultValue"
11
13
  :drag="widget.options.drag"
12
14
  :disabled="widget.options.disabled"
15
+ :auto-upload="true"
13
16
  :on-change="handleAvatar"
14
- :on-success="handleSuccess"
15
17
  :on-error="handleAvatarError"
16
18
  :on-preview="
17
19
  file => handlePictureCardPreview(file, widget.options.listType)
@@ -19,27 +21,26 @@
19
21
  :on-remove="handleRemove"
20
22
  >
21
23
  <el-button
24
+ size="small"
25
+ type="primary"
26
+ :disabled="widget.options.disabled"
22
27
  v-if="
23
28
  ['default', 'picture'].includes(widget.options.listType) &&
24
29
  !widget.options.drag
25
30
  "
26
- size="small"
27
- type="primary"
28
- :disabled="widget.options.disabled"
29
31
  >点击上传</el-button
30
32
  >
31
33
  <i
34
+ slot="default"
35
+ class="el-icon-plus"
32
36
  v-if="
33
37
  widget.options.listType === 'picture-card' && !widget.options.drag
34
38
  "
35
- slot="default"
36
- class="el-icon-plus"
37
39
  ></i>
38
- <template v-if="widget.options.drag">
39
- <i class="el-icon-upload"></i>
40
- <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
41
- </template>
42
-
40
+ <i class="el-icon-upload" v-if="widget.options.drag"></i>
41
+ <div class="el-upload__text" v-if="widget.options.drag">
42
+ 将文件拖到此处,或<em>点击上传</em>
43
+ </div>
43
44
  <div
44
45
  slot="tip"
45
46
  class="el-upload__tip"
@@ -87,10 +88,10 @@ export default {
87
88
  }
88
89
  },
89
90
  handleRemove(file, fileList) {
90
- this.widgetArray.options.defaultValue = fileList;
91
+ this.widget.options.defaultValue = fileList;
91
92
  },
92
93
  handleAvatar(res, file) {
93
- this.widgetArray.options.defaultValue = file;
94
+ this.widget.options.defaultValue = file;
94
95
  },
95
96
  handleAvatarError() {
96
97
  console.log("上传失败!");
@@ -33,17 +33,39 @@ export const configComponent = {
33
33
  };
34
34
 
35
35
  export const itemsComponent = {
36
- props: ["widget", "widgetArray", "select", "config"],
36
+ props: ["value", "widget", "widgetArray", "models", "select", "config"],
37
+ data() {
38
+ return {
39
+ dataModel: this.value
40
+ };
41
+ },
42
+ watch: {
43
+ value(val) {
44
+ this.dataModel = val;
45
+ },
46
+ dataModel: {
47
+ handler(val) {
48
+ this.$emit("update:value", val);
49
+ },
50
+ deep: true
51
+ }
52
+ },
37
53
  methods: {
38
54
  handleEventAction(key) {
39
55
  const eventScript = this.config.eventScript;
40
- for (let i = 0; i < eventScript.length; i++) {
41
- const element = eventScript[i];
42
- if (element.key === key) {
43
- const func = `(item,value)=>{${element.func}}`;
44
- eval(func)(this.widget, this.widget.options.defaultValue);
56
+ if (key) {
57
+ for (let i = 0; i < eventScript.length; i++) {
58
+ const element = eventScript[i];
59
+ if (element.key === key) {
60
+ const func = `(item,value)=>{${element.func}}`;
61
+ eval(func)(this.widget, this.widget.options.defaultValue);
62
+ }
45
63
  }
46
64
  }
65
+ if (this.widget.type === "button") {
66
+ this.hendleRemoteData();
67
+ return;
68
+ }
47
69
  },
48
70
  display(keys) {
49
71
  console.log("请在 预览 模式下使用 display 方法");
@@ -1,18 +1,29 @@
1
1
  //在此注册组件
2
- import { basicComponents, advanceComponents, layoutComponents } from "./index";
3
-
4
- const allComponents = [
5
- ...basicComponents,
6
- ...advanceComponents,
7
- ...layoutComponents
8
- ];
2
+ import { basicComponents, advanceComponents, layoutComponents } from "./config";
9
3
 
10
4
  let compsData = {};
11
- for (let i in allComponents) {
12
- const comp = {
13
- name: allComponents[i],
5
+ for (const config of basicComponents) {
6
+ compsData[config.type] = {
7
+ name: config.name,
8
+ type: config.type,
9
+ config: config,
10
+ content: null
11
+ };
12
+ }
13
+ for (const config of advanceComponents) {
14
+ compsData[config.type] = {
15
+ name: config.name,
16
+ type: config.type,
17
+ config: config,
18
+ content: null
19
+ };
20
+ }
21
+ for (const config of layoutComponents) {
22
+ compsData[config.type] = {
23
+ name: config.name,
24
+ type: config.type,
25
+ config: config,
14
26
  content: null
15
27
  };
16
- compsData[allComponents[i]] = comp;
17
28
  }
18
29
  export default compsData;