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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "tianheng-ui",
3
3
  "description": "A Vue.js project",
4
- "version": "0.0.73",
4
+ "version": "0.0.75",
5
5
  "author": "shu lang <403732931@qq.com>",
6
6
  "license": "MIT",
7
7
  "private": false,
@@ -41,7 +41,7 @@
41
41
  <el-button
42
42
  v-if="showAffirm"
43
43
  type="primary"
44
- :loading="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 v-if="upload" type="text" size="medium"
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
- preview: {
392
- type: Boolean,
393
- default: false
394
- },
395
- generateCode: {
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
- clearable: {
408
- type: Boolean,
409
- default: false
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
- basicComponents,
452
- layoutComponents,
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
- // console.log(this.$refs.widgetForm);
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,17 @@
1
+ <template>
2
+ <div>
3
+
4
+ </div>
5
+ </template>
6
+
7
+ <script>
8
+ export default {
9
+ data() {
10
+ return {};
11
+ },
12
+ mounted() {},
13
+ methods: {},
14
+ };
15
+ </script>
16
+
17
+ <style lang="scss" scoped></style>
@@ -0,0 +1,15 @@
1
+ <template>
2
+ <div></div>
3
+ </template>
4
+
5
+ <script>
6
+ export default {
7
+ data() {
8
+ return {};
9
+ },
10
+ mounted() {},
11
+ methods: {}
12
+ };
13
+ </script>
14
+
15
+ <style lang="scss" scoped></style>
@@ -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,5 @@
1
+ import TableMaking from "./index.vue";
2
+ TableMaking.install = function(Vue) {
3
+ Vue.component(TableMaking.name, TableMaking);
4
+ };
5
+ export default TableMaking;
@@ -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>