three-trees-ui 1.0.53 → 1.0.55
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/LICENSE +21 -21
- package/lib/three-trees-ui.common.js +470 -230
- package/lib/three-trees-ui.css +1 -1
- package/lib/three-trees-ui.umd.js +470 -230
- package/lib/three-trees-ui.umd.min.js +1 -1
- package/package.json +1 -1
- package/packages/DataLists/index.js +7 -0
- package/packages/DataLists/src/main.vue +117 -0
- package/packages/QuerySqlPreview/src/QuerySqlPreview.vue +5 -2
- package/packages/Subtable/src/SubExportDialog.vue +31 -1
- package/packages/Subtable/src/SubImportDialog.vue +42 -2
- package/src/index.js +2 -0
- package/src/mixins/onlineSubtable.js +3 -0
- package/src/mixins/querySqlPreview.js +85 -2
package/package.json
CHANGED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div v-if="permission != 'n'" class="ht-data-lists">
|
|
3
|
+
<div class="column-content">
|
|
4
|
+
<el-tabs
|
|
5
|
+
v-if="tabPaneList.length > 1"
|
|
6
|
+
v-model="activeName"
|
|
7
|
+
@tab-click="handleTabClick"
|
|
8
|
+
>
|
|
9
|
+
<el-tab-pane
|
|
10
|
+
v-for="item in tabPaneList"
|
|
11
|
+
:key="item.dataTemplateKey"
|
|
12
|
+
:name="item.dataTemplateKey"
|
|
13
|
+
>
|
|
14
|
+
<span slot="label">{{ item.name }}</span>
|
|
15
|
+
</el-tab-pane>
|
|
16
|
+
</el-tabs>
|
|
17
|
+
<div
|
|
18
|
+
v-if="tabPaneList && tabPaneList.length == 1"
|
|
19
|
+
class="ht-data-lists-title"
|
|
20
|
+
>
|
|
21
|
+
{{ tabPaneList[0].name }}
|
|
22
|
+
</div>
|
|
23
|
+
<div class="table-wrap" :class="{ 'no-tabs': tabPaneList.length <= 1 }">
|
|
24
|
+
<ht-query-sql-preview
|
|
25
|
+
:key="viewId"
|
|
26
|
+
:view-id="viewId"
|
|
27
|
+
:query-view-options="queryViewOptions"
|
|
28
|
+
:show-query-view-name="false"
|
|
29
|
+
></ht-query-sql-preview>
|
|
30
|
+
</div>
|
|
31
|
+
</div>
|
|
32
|
+
</div>
|
|
33
|
+
</template>
|
|
34
|
+
<script>
|
|
35
|
+
import permission from '@/mixins/permission.js'
|
|
36
|
+
export default {
|
|
37
|
+
name: 'HtDataLists',
|
|
38
|
+
mixins: [permission],
|
|
39
|
+
props: {
|
|
40
|
+
pageSize: {
|
|
41
|
+
type: Number,
|
|
42
|
+
default: 10,
|
|
43
|
+
},
|
|
44
|
+
options: {
|
|
45
|
+
type: String,
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
data() {
|
|
49
|
+
return {
|
|
50
|
+
tabPaneList: [],
|
|
51
|
+
activeName: '',
|
|
52
|
+
viewId: '',
|
|
53
|
+
queryViewOptions: {},
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
watch: {
|
|
57
|
+
options: {
|
|
58
|
+
handler(val) {
|
|
59
|
+
debugger
|
|
60
|
+
if (val) {
|
|
61
|
+
this.tabPaneList = JSON.parse(val)
|
|
62
|
+
this.activeName = this.tabPaneList[0].dataTemplateKey
|
|
63
|
+
this.viewId = this.tabPaneList[0].dataTemplateId
|
|
64
|
+
this.queryViewOptions = this.tabPaneList[0].bindOptions
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
immediate: true,
|
|
68
|
+
deep: true,
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
methods: {
|
|
72
|
+
handleTabClick() {
|
|
73
|
+
let data = this.tabPaneList.filter((item) => {
|
|
74
|
+
return item.dataTemplateKey === this.activeName
|
|
75
|
+
})
|
|
76
|
+
this.viewId = data[0].dataTemplateId
|
|
77
|
+
this.queryView = data[0].bindOptions
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
}
|
|
81
|
+
</script>
|
|
82
|
+
|
|
83
|
+
<style lang="scss" scoped>
|
|
84
|
+
.ht-data-lists {
|
|
85
|
+
.el-tabs {
|
|
86
|
+
padding: 24px 0;
|
|
87
|
+
.el-tabs__content {
|
|
88
|
+
padding: 0;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
.el-tabs__header {
|
|
92
|
+
margin: 0;
|
|
93
|
+
.el-tabs__nav-wrap::after {
|
|
94
|
+
height: 0px;
|
|
95
|
+
background: #eeeeee;
|
|
96
|
+
}
|
|
97
|
+
.el-tabs__item {
|
|
98
|
+
font-size: 14px;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
.no-tabs {
|
|
102
|
+
padding: 24px 0;
|
|
103
|
+
}
|
|
104
|
+
.el-tabs__header {
|
|
105
|
+
margin: 0;
|
|
106
|
+
}
|
|
107
|
+
::v-deep .is-vertical {
|
|
108
|
+
border: none !important;
|
|
109
|
+
}
|
|
110
|
+
.ht-data-lists-title {
|
|
111
|
+
font-size: 16px;
|
|
112
|
+
font-weight: 550;
|
|
113
|
+
color: #262626;
|
|
114
|
+
margin-top: 24px;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
</style>
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
:alias="alias"
|
|
10
10
|
:single="single"
|
|
11
11
|
:query-view="queryView"
|
|
12
|
+
:query-view-options="queryViewOptions"
|
|
12
13
|
class="data-preview-wrap"
|
|
13
14
|
/>
|
|
14
15
|
</template>
|
|
@@ -20,13 +21,14 @@
|
|
|
20
21
|
<script>
|
|
21
22
|
import Vue from 'vue'
|
|
22
23
|
import querySqlPreview from '@/mixins/querySqlPreview.js'
|
|
23
|
-
|
|
24
|
+
export default {
|
|
24
25
|
name: 'HtQuerySqlPreview',
|
|
25
26
|
props: {
|
|
26
27
|
viewId: {
|
|
27
28
|
type: String,
|
|
28
29
|
default: '',
|
|
29
30
|
},
|
|
31
|
+
queryViewOptions: Object,
|
|
30
32
|
},
|
|
31
33
|
data() {
|
|
32
34
|
return {
|
|
@@ -77,6 +79,7 @@
|
|
|
77
79
|
sqlAlias: String,
|
|
78
80
|
alias: String,
|
|
79
81
|
queryView: Object,
|
|
82
|
+
queryViewOptions: Object,
|
|
80
83
|
},
|
|
81
84
|
data() {
|
|
82
85
|
return {}
|
|
@@ -160,4 +163,4 @@
|
|
|
160
163
|
font-weight: bold;
|
|
161
164
|
color: #f56c6c;
|
|
162
165
|
}
|
|
163
|
-
</style>
|
|
166
|
+
</style>
|
|
@@ -47,6 +47,33 @@
|
|
|
47
47
|
}
|
|
48
48
|
},
|
|
49
49
|
methods: {
|
|
50
|
+
// 配置的数据字典 导出时翻译为汉字
|
|
51
|
+
changeDictionary(data) {
|
|
52
|
+
return new Promise(async (resolve, reject) => {
|
|
53
|
+
for (let i = 0; i < data.length; i++) {
|
|
54
|
+
for (let j = 0; j < this.columns.length; j++) {
|
|
55
|
+
if (
|
|
56
|
+
data[i][this.columns[j].name] &&
|
|
57
|
+
this.columns[j].ctrlType == 'dic' &&
|
|
58
|
+
this.columns[j].alias
|
|
59
|
+
) {
|
|
60
|
+
let result = await this.$requestConfig.getDictionaryByKey(
|
|
61
|
+
this.columns[j].alias
|
|
62
|
+
)
|
|
63
|
+
if (result) {
|
|
64
|
+
let dictionary = result.find((item) => {
|
|
65
|
+
return item.key == data[i][this.columns[j].name]
|
|
66
|
+
})
|
|
67
|
+
if (dictionary) {
|
|
68
|
+
data[i][this.columns[j].name] = dictionary.name
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
resolve()
|
|
75
|
+
})
|
|
76
|
+
},
|
|
50
77
|
changeRowKey(rows) {
|
|
51
78
|
var exportData = []
|
|
52
79
|
rows.forEach((row) => {
|
|
@@ -68,7 +95,10 @@
|
|
|
68
95
|
pInst,
|
|
69
96
|
this.subtablePagination
|
|
70
97
|
)
|
|
71
|
-
.then((data) => {
|
|
98
|
+
.then(async (data) => {
|
|
99
|
+
data = JSON.parse(JSON.stringify(data))
|
|
100
|
+
// 导出时 字典转换
|
|
101
|
+
await this.changeDictionary(data)
|
|
72
102
|
let exportData = this.changeRowKey(data)
|
|
73
103
|
const sheet = this.$XLSX.utils.json_to_sheet(exportData),
|
|
74
104
|
blob = this.sheet2blob(sheet)
|
|
@@ -115,6 +115,7 @@
|
|
|
115
115
|
{ mode: 'override', desc: '覆盖导入' },
|
|
116
116
|
{ mode: 'merge', desc: '合并导入', disabled: true },
|
|
117
117
|
],
|
|
118
|
+
cacheDicData: {}, // 缓存字典数据
|
|
118
119
|
}
|
|
119
120
|
},
|
|
120
121
|
computed: {
|
|
@@ -172,6 +173,44 @@
|
|
|
172
173
|
SubPagination.clear(this.dataSubname)
|
|
173
174
|
},
|
|
174
175
|
methods: {
|
|
176
|
+
changeDictionary(data) {
|
|
177
|
+
return new Promise(async (resolve) => {
|
|
178
|
+
for (let i = 0; i < data.length; i++) {
|
|
179
|
+
for (let j = 0; j < this.columns.length; j++) {
|
|
180
|
+
if (
|
|
181
|
+
data[i][this.columns[j].name] &&
|
|
182
|
+
this.columns[j].ctrlType == 'dic' &&
|
|
183
|
+
this.columns[j].alias
|
|
184
|
+
) {
|
|
185
|
+
// 将数据缓存,如果相同别名就不去请求字典数据
|
|
186
|
+
let result = null
|
|
187
|
+
if (this.cacheDicData[this.columns[j].alias]) {
|
|
188
|
+
result = this.cacheDicData[this.columns[j].alias]
|
|
189
|
+
} else {
|
|
190
|
+
result = await this.$requestConfig.getDictionaryByKey(
|
|
191
|
+
this.columns[j].alias
|
|
192
|
+
)
|
|
193
|
+
}
|
|
194
|
+
if (result) {
|
|
195
|
+
this.cacheDicData[this.columns[j].alias] = result
|
|
196
|
+
let dictionary = result.find((item) => {
|
|
197
|
+
return (
|
|
198
|
+
item.name == data[i][this.columns[j].name] ||
|
|
199
|
+
item.key == data[i][this.columns[j].name]
|
|
200
|
+
)
|
|
201
|
+
})
|
|
202
|
+
if (dictionary) {
|
|
203
|
+
data[i][this.columns[j].name] = dictionary.key
|
|
204
|
+
} else {
|
|
205
|
+
data[i][this.columns[j].name] = ''
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
resolve(data)
|
|
212
|
+
})
|
|
213
|
+
},
|
|
175
214
|
//子表模板导出
|
|
176
215
|
exportFormSub() {
|
|
177
216
|
let columns = this.columns.filter((item) => {
|
|
@@ -211,7 +250,7 @@
|
|
|
211
250
|
})
|
|
212
251
|
return importRows
|
|
213
252
|
},
|
|
214
|
-
dialogConfirm() {
|
|
253
|
+
async dialogConfirm() {
|
|
215
254
|
if (this.importRows.length == 0) {
|
|
216
255
|
this.$message.error('请选择要导入的文件')
|
|
217
256
|
return
|
|
@@ -250,9 +289,10 @@
|
|
|
250
289
|
}
|
|
251
290
|
}
|
|
252
291
|
}
|
|
292
|
+
let importRows = await this.changeDictionary(this.importRows)
|
|
253
293
|
SubPagination.importData(
|
|
254
294
|
this.dataSubname,
|
|
255
|
-
|
|
295
|
+
importRows,
|
|
256
296
|
this.mode,
|
|
257
297
|
this.mergeFunc
|
|
258
298
|
)
|
package/src/index.js
CHANGED
|
@@ -83,6 +83,7 @@ import HtChart from '../packages/Chart/index'
|
|
|
83
83
|
import HtMap from '../packages/Map/index'
|
|
84
84
|
import HtQrcode from '../packages/Qrcode/index'
|
|
85
85
|
import HtDataView from '../packages/DataView/index'
|
|
86
|
+
import HtDataLists from '../packages/DataLists/index'
|
|
86
87
|
import HtRelevantFlow from '../packages/RelevantFlow/index'
|
|
87
88
|
import HtMilepost from '../packages/Milepost/index'
|
|
88
89
|
import HtText from '../packages/Text/index'
|
|
@@ -199,6 +200,7 @@ const HotentUi = {
|
|
|
199
200
|
HtMap,
|
|
200
201
|
HtQrcode,
|
|
201
202
|
HtDataView,
|
|
203
|
+
HtDataLists,
|
|
202
204
|
HtTemplatePreview,
|
|
203
205
|
HtTemplatePreviewFile,
|
|
204
206
|
HtTemplatePreviewImage,
|
|
@@ -116,8 +116,76 @@ export default {
|
|
|
116
116
|
},
|
|
117
117
|
immediate: true,
|
|
118
118
|
},
|
|
119
|
+
queryViewOptions: {
|
|
120
|
+
handler(newVal) {
|
|
121
|
+
this.handelBindFiledValua()
|
|
122
|
+
},
|
|
123
|
+
immediate: true,
|
|
124
|
+
deep: true,
|
|
125
|
+
},
|
|
119
126
|
},
|
|
120
127
|
methods: {
|
|
128
|
+
handelBindFiledValua() {
|
|
129
|
+
//数据视图控件
|
|
130
|
+
let _me = this
|
|
131
|
+
if (this.queryViewOptions) {
|
|
132
|
+
const pInst = utils.getOnlineFormInstance(
|
|
133
|
+
this.$parent.$parent.$parent.$parent
|
|
134
|
+
)
|
|
135
|
+
if (
|
|
136
|
+
pInst.data &&
|
|
137
|
+
!pInst.data[this.queryViewOptions.boDefAlias] &&
|
|
138
|
+
this.queryViewOptions.boDefAlias
|
|
139
|
+
) {
|
|
140
|
+
this.queryViewOptions.boDefAlias = Object.keys(pInst.data)[0]
|
|
141
|
+
}
|
|
142
|
+
//关联查询字段
|
|
143
|
+
let selectList = this.queryViewOptions.selectList
|
|
144
|
+
if (selectList && selectList.length > 0) {
|
|
145
|
+
for (let i = 0; i < selectList.length; i++) {
|
|
146
|
+
if (selectList[i].selectField) {
|
|
147
|
+
const path =
|
|
148
|
+
'data.' +
|
|
149
|
+
this.queryViewOptions.boDefAlias +
|
|
150
|
+
'.' +
|
|
151
|
+
selectList[i].selectField
|
|
152
|
+
|
|
153
|
+
let value = utils.getValueByPath(pInst, path)
|
|
154
|
+
//获取绑定的类型,判断是否和选择的类型一致,此处针对时间格式和字符串格式匹配的兼容处理
|
|
155
|
+
const selectFieldType = selectList[i].selectFieldType
|
|
156
|
+
const bindSelectdType = selectList[i].bindSelectdType
|
|
157
|
+
if (
|
|
158
|
+
selectFieldType &&
|
|
159
|
+
bindSelectdType &&
|
|
160
|
+
selectFieldType !== bindSelectdType
|
|
161
|
+
) {
|
|
162
|
+
if (
|
|
163
|
+
bindSelectdType.includes('date') ||
|
|
164
|
+
selectFieldType.includes('date')
|
|
165
|
+
) {
|
|
166
|
+
//如果不为日期格式,则给一个空字符串 isNaN(value) && !isNaN(Date.parse(value))
|
|
167
|
+
// 可以判断是个字符串是否是时间格式,取反则表示无法转换成字符串,则改一默认值
|
|
168
|
+
if (!(isNaN(value) && !isNaN(Date.parse(value)))) {
|
|
169
|
+
value = ''
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
selectList[i].selectValue = value
|
|
174
|
+
|
|
175
|
+
//添加监听
|
|
176
|
+
pInst.$watch(path, function(newVal, oldVal) {
|
|
177
|
+
_.debounce(() => {
|
|
178
|
+
if (newVal !== oldVal) {
|
|
179
|
+
_me.queryViewOptions.selectList[i].selectValue = newVal
|
|
180
|
+
_me.search()
|
|
181
|
+
}
|
|
182
|
+
}, 500)()
|
|
183
|
+
})
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
},
|
|
121
189
|
filterOldSummaryValByType(type) {
|
|
122
190
|
const keys = this.summaryTableData.map((item) => item.key)
|
|
123
191
|
if (keys && keys.length && keys.includes(type)) {
|
|
@@ -276,18 +344,33 @@ export default {
|
|
|
276
344
|
}
|
|
277
345
|
},
|
|
278
346
|
search(param, cb) {
|
|
279
|
-
|
|
347
|
+
!param && (param = {})
|
|
280
348
|
param.pageBean = this.pagination
|
|
349
|
+
const dataTemplateQueryVo = {
|
|
350
|
+
queryFilter: param,
|
|
351
|
+
}
|
|
281
352
|
//保存查询参数,用于作为导出的查询参数
|
|
353
|
+
if (this.queryViewOptions) {
|
|
354
|
+
//关联查询字段
|
|
355
|
+
if (
|
|
356
|
+
this.queryViewOptions.selectList &&
|
|
357
|
+
this.queryViewOptions.selectList.length > 0
|
|
358
|
+
) {
|
|
359
|
+
dataTemplateQueryVo.selectList = this.queryViewOptions.selectList
|
|
360
|
+
}
|
|
361
|
+
}
|
|
282
362
|
this.queryParam = { ...param }
|
|
283
363
|
let obj = {
|
|
284
364
|
sqlAlias: this.sqlAlias || this.queryView.sqlAlias,
|
|
285
365
|
alias: this.alias || this.queryView.alias,
|
|
286
|
-
param:
|
|
366
|
+
param: dataTemplateQueryVo,
|
|
287
367
|
}
|
|
288
368
|
this.getQuerySqlViewByPagination(obj, cb)
|
|
369
|
+
|
|
370
|
+
|
|
289
371
|
},
|
|
290
372
|
getQuerySqlViewByPagination(param, cb) {
|
|
373
|
+
debugger
|
|
291
374
|
this.$requestConfig
|
|
292
375
|
.getQueryViewDataList(param)
|
|
293
376
|
.then((response) => {
|