tianheng-ui 0.0.73 → 0.0.75
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 +12 -12
- package/package.json +1 -1
- package/packages/Dialog/index.vue +2 -2
- package/packages/FormMaking/Container.vue +35 -38
- package/packages/TableMaking/custom/configs/fieldSearch.vue +17 -0
- package/packages/TableMaking/custom/configs/fieldTable.vue +15 -0
- package/packages/TableMaking/index.vue +126 -0
- package/packages/TableMaking/making.js +5 -0
- package/packages/TableMaking/widgetConfig.vue +263 -0
- package/packages/TableMaking/widgetTable.vue +240 -0
- package/packages/index.js +4 -0
package/package.json
CHANGED
@@ -41,7 +41,7 @@
|
|
41
41
|
<el-button
|
42
42
|
v-if="showAffirm"
|
43
43
|
type="primary"
|
44
|
-
:loading="
|
44
|
+
:loading="affirmLoading"
|
45
45
|
@click="handleAffirm"
|
46
46
|
>{{ affirmText }}</el-button
|
47
47
|
>
|
@@ -61,7 +61,6 @@ export default {
|
|
61
61
|
},
|
62
62
|
props: {
|
63
63
|
visible: Boolean,
|
64
|
-
loading: Boolean,
|
65
64
|
title: { type: String, default: "" },
|
66
65
|
width: { type: String, default: "800px" },
|
67
66
|
fullscreen: { type: Boolean, default: false },
|
@@ -76,6 +75,7 @@ export default {
|
|
76
75
|
destroyOnClose: { type: Boolean, default: false },
|
77
76
|
|
78
77
|
showAffirm: { type: Boolean, default: true },
|
78
|
+
affirmLoading: Boolean,
|
79
79
|
affirmText: { type: String, default: "确 认" },
|
80
80
|
|
81
81
|
showCancel: { type: Boolean, default: true },
|
@@ -117,6 +117,7 @@
|
|
117
117
|
style="margin:0 10px;"
|
118
118
|
>
|
119
119
|
<el-button
|
120
|
+
v-if="tools.includes('upload')"
|
120
121
|
type="text"
|
121
122
|
size="medium"
|
122
123
|
icon="el-icon-upload2"
|
@@ -131,12 +132,9 @@
|
|
131
132
|
:show-file-list="false"
|
132
133
|
:on-change="onExcelFileChange"
|
133
134
|
>
|
134
|
-
<el-button
|
135
|
-
>导入EXCEL
|
136
|
-
</el-button>
|
135
|
+
<el-button type="text" size="medium">导入EXCEL </el-button>
|
137
136
|
</el-upload>
|
138
137
|
<el-button
|
139
|
-
v-if="upload"
|
140
138
|
type="text"
|
141
139
|
size="medium"
|
142
140
|
@click="dialog.import.visible = true"
|
@@ -146,7 +144,7 @@
|
|
146
144
|
</el-popover>
|
147
145
|
|
148
146
|
<el-button
|
149
|
-
v-if="clearable"
|
147
|
+
v-if="tools.includes('clearable')"
|
150
148
|
type="text"
|
151
149
|
size="medium"
|
152
150
|
icon="el-icon-delete"
|
@@ -154,7 +152,7 @@
|
|
154
152
|
>清空
|
155
153
|
</el-button>
|
156
154
|
<el-button
|
157
|
-
v-if="preview"
|
155
|
+
v-if="tools.includes('preview')"
|
158
156
|
type="text"
|
159
157
|
size="medium"
|
160
158
|
icon="el-icon-view"
|
@@ -162,7 +160,7 @@
|
|
162
160
|
>预览
|
163
161
|
</el-button>
|
164
162
|
<el-button
|
165
|
-
v-if="generateJson"
|
163
|
+
v-if="tools.includes('generateJson')"
|
166
164
|
type="text"
|
167
165
|
size="medium"
|
168
166
|
icon="el-icon-tickets"
|
@@ -170,7 +168,7 @@
|
|
170
168
|
>生成JSON</el-button
|
171
169
|
>
|
172
170
|
<el-button
|
173
|
-
v-if="generateCode"
|
171
|
+
v-if="tools.includes('generateCode')"
|
174
172
|
type="text"
|
175
173
|
size="medium"
|
176
174
|
icon="el-icon-document"
|
@@ -385,28 +383,26 @@ export default {
|
|
385
383
|
WidgetConfig,
|
386
384
|
FormConfig,
|
387
385
|
WidgetForm,
|
388
|
-
GenerateForm
|
386
|
+
GenerateForm
|
389
387
|
},
|
390
388
|
props: {
|
391
|
-
|
392
|
-
type:
|
393
|
-
default:
|
394
|
-
|
395
|
-
|
396
|
-
type: Boolean,
|
397
|
-
default: false
|
398
|
-
},
|
399
|
-
generateJson: {
|
400
|
-
type: Boolean,
|
401
|
-
default: false
|
402
|
-
},
|
403
|
-
upload: {
|
404
|
-
type: Boolean,
|
405
|
-
default: false
|
389
|
+
data: {
|
390
|
+
type: Object,
|
391
|
+
default: () => {
|
392
|
+
return { list: [], config: baseConfig };
|
393
|
+
}
|
406
394
|
},
|
407
|
-
|
408
|
-
type:
|
409
|
-
default:
|
395
|
+
tools: {
|
396
|
+
type: Array,
|
397
|
+
default: () => {
|
398
|
+
return [
|
399
|
+
"upload",
|
400
|
+
"clearable",
|
401
|
+
"preview",
|
402
|
+
"generateCode",
|
403
|
+
"generateJson"
|
404
|
+
];
|
405
|
+
}
|
410
406
|
},
|
411
407
|
basicFields: {
|
412
408
|
type: Array,
|
@@ -447,15 +443,12 @@ export default {
|
|
447
443
|
}
|
448
444
|
},
|
449
445
|
data() {
|
446
|
+
this.basicComponents = basicComponents;
|
447
|
+
this.layoutComponents = layoutComponents;
|
448
|
+
this.advanceComponents = advanceComponents;
|
450
449
|
return {
|
451
|
-
|
452
|
-
|
453
|
-
advanceComponents,
|
454
|
-
widgetFormSelect: null,
|
455
|
-
widgetFormData: {
|
456
|
-
list: [],
|
457
|
-
config: baseConfig
|
458
|
-
},
|
450
|
+
widgetFormData: this.data,
|
451
|
+
widgetFormSelect: this.data.list[0],
|
459
452
|
widgetValue: {},
|
460
453
|
configTab: "widget",
|
461
454
|
client: "monitor",
|
@@ -517,8 +510,12 @@ export default {
|
|
517
510
|
widgetFormData: {
|
518
511
|
deep: true,
|
519
512
|
handler: function(val) {
|
520
|
-
|
513
|
+
this.$emit("update:data", val);
|
521
514
|
}
|
515
|
+
},
|
516
|
+
data(val) {
|
517
|
+
this.setJSON(val);
|
518
|
+
// this.widgetFormData = val;
|
522
519
|
}
|
523
520
|
},
|
524
521
|
mounted() {},
|
@@ -618,9 +615,9 @@ export default {
|
|
618
615
|
const data = this.getComponentsConfig("input");
|
619
616
|
let name = titleDom.innerText;
|
620
617
|
if (name.charAt(0) === "*") {
|
621
|
-
name = name.slice(1)
|
618
|
+
name = name.slice(1);
|
622
619
|
data.options.required = true;
|
623
|
-
data.rules = data.rules || []
|
620
|
+
data.rules = data.rules || [];
|
624
621
|
data.rules.push({
|
625
622
|
required: true,
|
626
623
|
message: "单行文本必须填写"
|
@@ -0,0 +1,126 @@
|
|
1
|
+
<template>
|
2
|
+
<div class="th-table-making">
|
3
|
+
<el-container>
|
4
|
+
<el-container>
|
5
|
+
<el-header>
|
6
|
+
<el-button type="text" size="medium" icon="el-icon-delete">
|
7
|
+
桌面端
|
8
|
+
</el-button>
|
9
|
+
<el-button type="text" size="medium" icon="el-icon-delete">
|
10
|
+
移动端
|
11
|
+
</el-button>
|
12
|
+
</el-header>
|
13
|
+
<el-main>
|
14
|
+
<widget-table
|
15
|
+
:searchFields="searchFields"
|
16
|
+
:tableFields="tableFields"
|
17
|
+
@move="handleMoveChange"
|
18
|
+
></widget-table>
|
19
|
+
</el-main>
|
20
|
+
</el-container>
|
21
|
+
<el-aside width="300px">
|
22
|
+
<widget-config
|
23
|
+
:fields="fields"
|
24
|
+
ref="configRef"
|
25
|
+
@fields-change="handleFieldsChange"
|
26
|
+
></widget-config>
|
27
|
+
</el-aside>
|
28
|
+
</el-container>
|
29
|
+
</div>
|
30
|
+
</template>
|
31
|
+
|
32
|
+
<script>
|
33
|
+
import WidgetTable from "./widgetTable.vue";
|
34
|
+
import WidgetConfig from "./widgetConfig.vue";
|
35
|
+
export default {
|
36
|
+
name: "ThTableMaking",
|
37
|
+
components: { WidgetTable, WidgetConfig },
|
38
|
+
props: {
|
39
|
+
fields: {
|
40
|
+
type: Array,
|
41
|
+
default: () => {
|
42
|
+
return [];
|
43
|
+
}
|
44
|
+
}
|
45
|
+
},
|
46
|
+
data() {
|
47
|
+
return {
|
48
|
+
searchFields: [],
|
49
|
+
tableFields: []
|
50
|
+
};
|
51
|
+
},
|
52
|
+
mounted() {},
|
53
|
+
methods: {
|
54
|
+
handleFieldsChange(val) {
|
55
|
+
console.log("handleFieldsChange =>", val);
|
56
|
+
const type = val.type;
|
57
|
+
const data = val.data;
|
58
|
+
const list = [];
|
59
|
+
data.forEach(i => {
|
60
|
+
list.push(JSON.parse(JSON.stringify(this.fields[i])));
|
61
|
+
});
|
62
|
+
if (type === 0) {
|
63
|
+
this.searchFields = list;
|
64
|
+
} else {
|
65
|
+
this.tableFields = list;
|
66
|
+
}
|
67
|
+
},
|
68
|
+
handleMoveChange(val) {
|
69
|
+
console.log("handleMoveChange =>", val);
|
70
|
+
const type = val.type;
|
71
|
+
const data = val.data;
|
72
|
+
const newIndex = data.newIndex;
|
73
|
+
const oldIndex = data.oldIndex;
|
74
|
+
if (type === "search") {
|
75
|
+
let list = this.$refs.configRef.search.fields;
|
76
|
+
list = this.mobile(list, oldIndex, newIndex);
|
77
|
+
this.$refs.configRef.search.fields = list;
|
78
|
+
this.searchFields = this.mobile(this.searchFields, oldIndex, newIndex)
|
79
|
+
} else {
|
80
|
+
let list = this.$refs.configRef.table.fields;
|
81
|
+
list = this.mobile(list, oldIndex, newIndex);
|
82
|
+
this.$refs.configRef.table.fields = list;
|
83
|
+
this.tableFields = this.mobile(this.tableFields, oldIndex, newIndex)
|
84
|
+
}
|
85
|
+
},
|
86
|
+
mobile(list, oldIndex, newIndex) {
|
87
|
+
const item = JSON.parse(JSON.stringify(list[oldIndex]));
|
88
|
+
if (oldIndex < newIndex) {
|
89
|
+
list.splice(newIndex + 1, 0, item);
|
90
|
+
list.splice(oldIndex, 1);
|
91
|
+
}
|
92
|
+
if (oldIndex > newIndex) {
|
93
|
+
list.splice(newIndex, 0, item);
|
94
|
+
list.splice(oldIndex + 1, 1);
|
95
|
+
}
|
96
|
+
return list;
|
97
|
+
},
|
98
|
+
getJson(){}
|
99
|
+
}
|
100
|
+
};
|
101
|
+
</script>
|
102
|
+
|
103
|
+
<style lang="scss" scoped>
|
104
|
+
.th-table-making {
|
105
|
+
height: 100%;
|
106
|
+
background-color: white;
|
107
|
+
border: 1px solid #dcdfe6;
|
108
|
+
|
109
|
+
.el-container {
|
110
|
+
height: 100%;
|
111
|
+
}
|
112
|
+
.el-header {
|
113
|
+
height: 45px !important;
|
114
|
+
line-height: 45px;
|
115
|
+
border-bottom: 1px solid #dcdfe6;
|
116
|
+
}
|
117
|
+
.el-main {
|
118
|
+
padding: 5px;
|
119
|
+
background-color: #fafafa;
|
120
|
+
}
|
121
|
+
.el-aside {
|
122
|
+
border-left: 1px solid #dcdfe6;
|
123
|
+
box-sizing: border-box;
|
124
|
+
}
|
125
|
+
}
|
126
|
+
</style>
|
@@ -0,0 +1,263 @@
|
|
1
|
+
<template>
|
2
|
+
<div class="widgetConfig">
|
3
|
+
<div class="tabs">
|
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="handleTabsSelect(item)"
|
10
|
+
>
|
11
|
+
{{ item.title }}
|
12
|
+
</div>
|
13
|
+
</div>
|
14
|
+
<div v-if="activeTab.value === 0" class="fields">
|
15
|
+
<el-checkbox
|
16
|
+
:indeterminate="search.isIndeterminate"
|
17
|
+
v-model="search.isCheckAll"
|
18
|
+
@change="handleSearchCheckAllChange"
|
19
|
+
>全选</el-checkbox
|
20
|
+
>
|
21
|
+
<el-checkbox-group v-model="search.fields" @change="handleChange">
|
22
|
+
<el-checkbox
|
23
|
+
v-for="(item, index) in fields"
|
24
|
+
:label="index"
|
25
|
+
:key="index"
|
26
|
+
>{{ item.label }}</el-checkbox
|
27
|
+
>
|
28
|
+
</el-checkbox-group>
|
29
|
+
</div>
|
30
|
+
<div v-if="activeTab.value === 1" class="fields">
|
31
|
+
<el-checkbox
|
32
|
+
:indeterminate="table.isIndeterminate"
|
33
|
+
v-model="table.isCheckAll"
|
34
|
+
@change="handleTableCheckAllChange"
|
35
|
+
>全选</el-checkbox
|
36
|
+
>
|
37
|
+
<el-checkbox-group v-model="table.fields" @change="handleChange">
|
38
|
+
<el-checkbox
|
39
|
+
v-for="(item, index) in fields"
|
40
|
+
:label="index"
|
41
|
+
:key="index"
|
42
|
+
>{{ item.label }}</el-checkbox
|
43
|
+
>
|
44
|
+
</el-checkbox-group>
|
45
|
+
</div>
|
46
|
+
<div v-if="activeTab.value === 2" class="tableConfig">
|
47
|
+
<el-form
|
48
|
+
:model="tableConfig"
|
49
|
+
label-position="left"
|
50
|
+
label-width="80px"
|
51
|
+
size="mini"
|
52
|
+
>
|
53
|
+
<el-collapse v-model="tableCollapse" @change="handleChange">
|
54
|
+
<el-collapse-item title="表格配置" name="1">
|
55
|
+
<el-form-item label="高级查询">
|
56
|
+
<el-switch v-model="tableConfig.search"> </el-switch>
|
57
|
+
</el-form-item>
|
58
|
+
<el-form-item label="排序类型">
|
59
|
+
<el-radio-group v-model="tableConfig.sortType">
|
60
|
+
<el-radio-button label="1">降序</el-radio-button>
|
61
|
+
<el-radio-button label="2">升序</el-radio-button>
|
62
|
+
</el-radio-group>
|
63
|
+
</el-form-item>
|
64
|
+
<el-form-item label="排序字段">
|
65
|
+
<el-select v-model="tableConfig.sortField" placeholder="请选择">
|
66
|
+
<el-option
|
67
|
+
v-for="item in []"
|
68
|
+
:key="item.value"
|
69
|
+
:label="item.label"
|
70
|
+
:value="item.value"
|
71
|
+
>
|
72
|
+
</el-option>
|
73
|
+
</el-select>
|
74
|
+
</el-form-item>
|
75
|
+
<el-form-item label="分页设置">
|
76
|
+
<el-switch v-model="tableConfig.openPaging"> </el-switch>
|
77
|
+
</el-form-item>
|
78
|
+
<el-form-item label="分页条数">
|
79
|
+
<el-radio-group v-model="tableConfig.pageSize">
|
80
|
+
<el-radio-button :label="20">20条</el-radio-button>
|
81
|
+
<el-radio-button :label="50">50条</el-radio-button>
|
82
|
+
<el-radio-button :label="100">100条</el-radio-button>
|
83
|
+
<el-radio-button :label="500">500条</el-radio-button>
|
84
|
+
</el-radio-group>
|
85
|
+
</el-form-item>
|
86
|
+
</el-collapse-item>
|
87
|
+
<el-collapse-item title="子表配置" name="2">
|
88
|
+
<el-form-item label="子表样式">
|
89
|
+
<el-select v-model="tableConfig.sortField" placeholder="请选择">
|
90
|
+
<el-option
|
91
|
+
v-for="item in []"
|
92
|
+
:key="item.value"
|
93
|
+
:label="item.label"
|
94
|
+
:value="item.value"
|
95
|
+
>
|
96
|
+
</el-option>
|
97
|
+
</el-select>
|
98
|
+
</el-form-item>
|
99
|
+
</el-collapse-item>
|
100
|
+
<el-collapse-item title="按钮配置" name="3">
|
101
|
+
<div>
|
102
|
+
与现实生活一致:与现实生活的流程、逻辑保持一致,遵循用户习惯的语言和概念;
|
103
|
+
</div>
|
104
|
+
</el-collapse-item>
|
105
|
+
<el-collapse-item title="权限设置" name="4">
|
106
|
+
<div>
|
107
|
+
与现实生活一致:与现实生活的流程、逻辑保持一致,遵循用户习惯的语言和概念;
|
108
|
+
</div>
|
109
|
+
</el-collapse-item>
|
110
|
+
</el-collapse>
|
111
|
+
</el-form>
|
112
|
+
</div>
|
113
|
+
</div>
|
114
|
+
</template>
|
115
|
+
|
116
|
+
<script>
|
117
|
+
export default {
|
118
|
+
props: {
|
119
|
+
fields: {
|
120
|
+
type: Array,
|
121
|
+
default: () => {
|
122
|
+
return [];
|
123
|
+
}
|
124
|
+
}
|
125
|
+
},
|
126
|
+
data() {
|
127
|
+
return {
|
128
|
+
tabsMenus: [
|
129
|
+
{ title: "查询字段", value: 0 },
|
130
|
+
{ title: "列表字段", value: 1 },
|
131
|
+
{ title: "列表属性", value: 2 }
|
132
|
+
],
|
133
|
+
activeTab: { title: "查询字段", value: 0 },
|
134
|
+
search: {
|
135
|
+
fields: [],
|
136
|
+
isCheckAll: false,
|
137
|
+
isIndeterminate: false
|
138
|
+
},
|
139
|
+
table: {
|
140
|
+
fields: [],
|
141
|
+
isCheckAll: false,
|
142
|
+
isIndeterminate: false
|
143
|
+
},
|
144
|
+
tableCollapse: ["1"],
|
145
|
+
tableConfig: {
|
146
|
+
search: true,
|
147
|
+
sortType: "1",
|
148
|
+
sortField: "",
|
149
|
+
openPaging: true,
|
150
|
+
pageSize: 20
|
151
|
+
}
|
152
|
+
};
|
153
|
+
},
|
154
|
+
mounted() {},
|
155
|
+
methods: {
|
156
|
+
handleTabsSelect(val) {
|
157
|
+
this.activeTab = val;
|
158
|
+
},
|
159
|
+
handleChange() {
|
160
|
+
if (this.activeTab.value === 0) {
|
161
|
+
const count = this.search.fields.length;
|
162
|
+
this.search.isCheckAll = count === this.fields.length;
|
163
|
+
this.search.isIndeterminate = count > 0 && count < this.fields.length;
|
164
|
+
this.$emit("fields-change", {
|
165
|
+
type: this.activeTab.value,
|
166
|
+
data: this.search.fields
|
167
|
+
});
|
168
|
+
} else {
|
169
|
+
const count = this.table.fields.length;
|
170
|
+
this.table.isCheckAll = count === this.fields.length;
|
171
|
+
this.table.isIndeterminate = count > 0 && count < this.fields.length;
|
172
|
+
this.$emit("fields-change", {
|
173
|
+
type: this.activeTab.value,
|
174
|
+
data: this.table.fields
|
175
|
+
});
|
176
|
+
}
|
177
|
+
},
|
178
|
+
handleSearchCheckAllChange(val) {
|
179
|
+
const list = [];
|
180
|
+
if (val) {
|
181
|
+
for (let i = 0; i < this.fields.length; i++) {
|
182
|
+
list.push(i);
|
183
|
+
}
|
184
|
+
}
|
185
|
+
this.search.fields = list;
|
186
|
+
this.search.isIndeterminate = false;
|
187
|
+
this.handleChange();
|
188
|
+
},
|
189
|
+
handleTableCheckAllChange(val) {
|
190
|
+
const list = [];
|
191
|
+
if (val) {
|
192
|
+
for (let i = 0; i < this.fields.length; i++) {
|
193
|
+
list.push(i);
|
194
|
+
}
|
195
|
+
}
|
196
|
+
this.table.fields = list;
|
197
|
+
this.table.isIndeterminate = false;
|
198
|
+
this.handleChange();
|
199
|
+
}
|
200
|
+
}
|
201
|
+
};
|
202
|
+
</script>
|
203
|
+
|
204
|
+
<style lang="scss" scoped>
|
205
|
+
.widgetConfig {
|
206
|
+
height: 100%;
|
207
|
+
background-color: white;
|
208
|
+
.tabs {
|
209
|
+
display: flex;
|
210
|
+
align-items: center;
|
211
|
+
height: 45px;
|
212
|
+
border-bottom: 1px solid #dcdfe6;
|
213
|
+
box-sizing: border-box;
|
214
|
+
|
215
|
+
.tabs-item {
|
216
|
+
flex: 1;
|
217
|
+
text-align: center;
|
218
|
+
line-height: 44px;
|
219
|
+
cursor: pointer;
|
220
|
+
}
|
221
|
+
.tabs-item__active {
|
222
|
+
border-bottom: 2px solid #409eff;
|
223
|
+
}
|
224
|
+
}
|
225
|
+
|
226
|
+
.fields {
|
227
|
+
height: calc(100% - 45px);
|
228
|
+
.fields-item {
|
229
|
+
padding: 0 10px;
|
230
|
+
height: 30px;
|
231
|
+
line-height: 30px;
|
232
|
+
}
|
233
|
+
|
234
|
+
.el-checkbox {
|
235
|
+
padding: 0 10px;
|
236
|
+
width: 100%;
|
237
|
+
height: 30px;
|
238
|
+
line-height: 30px;
|
239
|
+
}
|
240
|
+
}
|
241
|
+
|
242
|
+
.tableConfig {
|
243
|
+
height: calc(100% - 45px);
|
244
|
+
}
|
245
|
+
}
|
246
|
+
</style>
|
247
|
+
|
248
|
+
<style lang="scss">
|
249
|
+
.tableConfig {
|
250
|
+
.el-collapse-item__header {
|
251
|
+
padding: 0 10px;
|
252
|
+
height: 40px;
|
253
|
+
line-height: 40px;
|
254
|
+
background-color: #f5f7f9;
|
255
|
+
}
|
256
|
+
.el-collapse-item__wrap {
|
257
|
+
padding: 10px;
|
258
|
+
}
|
259
|
+
.el-radio-button__inner {
|
260
|
+
padding: 7px;
|
261
|
+
}
|
262
|
+
}
|
263
|
+
</style>
|