iov-pro-components 0.0.3
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/.eslintignore +5 -0
- package/.eslintrc.js +192 -0
- package/.gitignore +3 -0
- package/README.md +4 -0
- package/babel.config.js +5 -0
- package/docs/.vuepress/config.js +169 -0
- package/docs/.vuepress/styles/index.styl +62 -0
- package/docs/.vuepress/styles/palette.styl +20 -0
- package/docs/.vuepress/theme/enhanceApp.js +100 -0
- package/docs/.vuepress/theme/index.js +3 -0
- package/docs/README.md +13 -0
- package/docs/components/description.md +519 -0
- package/docs/components/dialog-select.md +91 -0
- package/docs/components/display.md +36 -0
- package/docs/components/enums.md +33 -0
- package/docs/components/icon.md +406 -0
- package/docs/components/link-group.md +39 -0
- package/docs/components/page-detail.md +48 -0
- package/docs/components/page-module.md +51 -0
- package/docs/components/pro-form.md +958 -0
- package/docs/components/pro-table.md +683 -0
- package/docs/components/request.md +44 -0
- package/docs/components/search-table.md +963 -0
- package/docs/components/space.md +35 -0
- package/docs/components/sub-title.md +24 -0
- package/docs/components/submit-module.md +24 -0
- package/docs/template/add.md +124 -0
- package/docs/template/confirm.md +28 -0
- package/docs/template/detail.md +240 -0
- package/docs/template/dialog.md +339 -0
- package/docs/template/list.md +464 -0
- package/docs/template/tabs-mini.md +32 -0
- package/docs/template/tabs.md +32 -0
- package/jsconfig.json +19 -0
- package/lib/iov-pro-components.css +1 -0
- package/lib/iov-pro-components.min.js +7 -0
- package/lib/postcss.config.js +8 -0
- package/package.json +75 -0
- package/patches/vue-server-renderer+2.7.16.patch +13 -0
- package/rollup.config.mjs +79 -0
- package/src/App.vue +103 -0
- package/src/main.js +33 -0
- package/src/packages/column-tooltip/index.js +7 -0
- package/src/packages/column-tooltip/src/main.vue +127 -0
- package/src/packages/description/index.js +7 -0
- package/src/packages/description/src/main.vue +375 -0
- package/src/packages/description/src/text.vue +103 -0
- package/src/packages/dialog-select/index.js +7 -0
- package/src/packages/dialog-select/src/main.vue +308 -0
- package/src/packages/display/index.js +7 -0
- package/src/packages/display/src/main.vue +44 -0
- package/src/packages/enums/index.js +7 -0
- package/src/packages/enums/src/main.vue +23 -0
- package/src/packages/export/index.js +7 -0
- package/src/packages/export/src/main.vue +316 -0
- package/src/packages/fixed-button-group/index.js +7 -0
- package/src/packages/fixed-button-group/src/main.vue +104 -0
- package/src/packages/form/index.js +7 -0
- package/src/packages/form/src/collapse.vue +149 -0
- package/src/packages/form/src/main.vue +1190 -0
- package/src/packages/form-collapse/index.js +7 -0
- package/src/packages/index.js +86 -0
- package/src/packages/link-group/index.js +7 -0
- package/src/packages/link-group/src/main.vue +52 -0
- package/src/packages/page-detail/index.js +7 -0
- package/src/packages/page-detail/src/main.vue +123 -0
- package/src/packages/page-module/index.js +7 -0
- package/src/packages/page-module/src/main.vue +56 -0
- package/src/packages/preview/index.js +7 -0
- package/src/packages/preview/src/eval-image-viewer.js +50 -0
- package/src/packages/preview/src/image-viewer.vue +366 -0
- package/src/packages/preview/src/main.vue +97 -0
- package/src/packages/request/index.js +7 -0
- package/src/packages/request/src/main.vue +125 -0
- package/src/packages/search-table/index.js +7 -0
- package/src/packages/search-table/src/inner-tabs.vue +237 -0
- package/src/packages/search-table/src/main.vue +472 -0
- package/src/packages/search-table/src/outer-tabs.vue +45 -0
- package/src/packages/search-table-inner-tabs/index.js +7 -0
- package/src/packages/search-table-outer-tabs/index.js +7 -0
- package/src/packages/space/index.js +7 -0
- package/src/packages/space/src/main.vue +74 -0
- package/src/packages/sub-title/index.js +7 -0
- package/src/packages/sub-title/src/main.vue +70 -0
- package/src/packages/submit-module/index.js +7 -0
- package/src/packages/submit-module/src/main.vue +67 -0
- package/src/packages/table/index.js +7 -0
- package/src/packages/table/src/filter.vue +89 -0
- package/src/packages/table/src/main.vue +668 -0
- package/src/packages/table/src/search.vue +90 -0
- package/src/packages/table/src/sort.vue +118 -0
- package/src/packages/theme/index.scss +15 -0
- package/src/packages/theme/src/column-tooltip.scss +23 -0
- package/src/packages/theme/src/common/color.scss +134 -0
- package/src/packages/theme/src/description.scss +56 -0
- package/src/packages/theme/src/dialog-select.scss +32 -0
- package/src/packages/theme/src/fixed-button-group.scss +25 -0
- package/src/packages/theme/src/form.scss +11 -0
- package/src/packages/theme/src/link-group.scss +43 -0
- package/src/packages/theme/src/page-detail.scss +61 -0
- package/src/packages/theme/src/page-module.scss +46 -0
- package/src/packages/theme/src/preview.scss +67 -0
- package/src/packages/theme/src/search-table.scss +185 -0
- package/src/packages/theme/src/space.scss +12 -0
- package/src/packages/theme/src/sub-title.scss +47 -0
- package/src/packages/theme/src/submit-module.scss +13 -0
- package/src/packages/theme/src/table.scss +129 -0
- package/src/packages/theme/src/toolbar.scss +109 -0
- package/src/packages/toolbar/index.js +7 -0
- package/src/packages/toolbar/src/main.vue +126 -0
- package/src/packages/toolbar/src/setting.vue +217 -0
- package/src/packages/toolbar/src/style.vue +68 -0
- package/src/packages/toolbar/src/zoom.vue +65 -0
- package/src/router.js +83 -0
- package/src/utils/config-center.js +218 -0
- package/src/utils/function-eval.js +84 -0
- package/src/utils/index.js +104 -0
- package/src/views/column-tooltip.vue +37 -0
- package/src/views/components/OtherSelect.vue +18 -0
- package/src/views/description.vue +60 -0
- package/src/views/detail.vue +146 -0
- package/src/views/directive/number.js +82 -0
- package/src/views/enums.vue +22 -0
- package/src/views/export.vue +9 -0
- package/src/views/form-collapse.vue +185 -0
- package/src/views/form.vue +402 -0
- package/src/views/link-group.vue +16 -0
- package/src/views/preview.vue +33 -0
- package/src/views/request.vue +56 -0
- package/src/views/search-table.vue +297 -0
- package/src/views/table.vue +145 -0
- package/src/views/toolbar.vue +30 -0
- package/vue.config.js +22 -0
|
@@ -0,0 +1,668 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import isEqual from 'lodash/isEqual'
|
|
3
|
+
import isNil from 'lodash/isNil'
|
|
4
|
+
import lodashGet from 'lodash/get'
|
|
5
|
+
import ProRequest from '@/packages/request'
|
|
6
|
+
import Space from '@/packages/space'
|
|
7
|
+
import Enums from '@/packages/enums'
|
|
8
|
+
import ColumnTooltip from '@/packages/column-tooltip'
|
|
9
|
+
import TableSearch from './search.vue'
|
|
10
|
+
import TableFilter from './filter.vue'
|
|
11
|
+
import TableSort, { SORT_ORDER } from './sort.vue'
|
|
12
|
+
import { getComponentNames } from '@/utils/config-center'
|
|
13
|
+
import { randomString } from '@/utils'
|
|
14
|
+
import functionEval, { isEvalFunction } from '@/utils/function-eval'
|
|
15
|
+
|
|
16
|
+
// 当前分页的事件
|
|
17
|
+
export const PAGINATION_EVENTS = [
|
|
18
|
+
'size-change',
|
|
19
|
+
'current-change',
|
|
20
|
+
'prev-click',
|
|
21
|
+
'next-click '
|
|
22
|
+
]
|
|
23
|
+
// 当前表格的事件
|
|
24
|
+
export const TABLE_EVENTS = [
|
|
25
|
+
'select',
|
|
26
|
+
'select-all',
|
|
27
|
+
'selection-change',
|
|
28
|
+
'cell-mouse-enter',
|
|
29
|
+
'cell-mouse-leave',
|
|
30
|
+
'cell-click',
|
|
31
|
+
'cell-dblclick',
|
|
32
|
+
'row-click',
|
|
33
|
+
'row-contextmenu',
|
|
34
|
+
'row-dblclick',
|
|
35
|
+
'header-click',
|
|
36
|
+
'header-contextmenu',
|
|
37
|
+
'sort-change',
|
|
38
|
+
'filter-change',
|
|
39
|
+
'current-change',
|
|
40
|
+
'header-dragend',
|
|
41
|
+
'expand-change'
|
|
42
|
+
]
|
|
43
|
+
|
|
44
|
+
// 高级功能
|
|
45
|
+
const ADVANCE_FUNCTION = {
|
|
46
|
+
searchable: TableSearch,
|
|
47
|
+
filters: TableFilter,
|
|
48
|
+
sortable: TableSort
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export default {
|
|
52
|
+
name: 'IovProTable',
|
|
53
|
+
inject: {
|
|
54
|
+
pageThis: { value: 'pageThis', default: null }
|
|
55
|
+
},
|
|
56
|
+
props: {
|
|
57
|
+
// 外部数据源
|
|
58
|
+
dataSource: {
|
|
59
|
+
type: Array,
|
|
60
|
+
default: () => []
|
|
61
|
+
},
|
|
62
|
+
// 表格项配置属性
|
|
63
|
+
columns: {
|
|
64
|
+
type: Array,
|
|
65
|
+
default: () => []
|
|
66
|
+
},
|
|
67
|
+
// 配置项
|
|
68
|
+
config: {
|
|
69
|
+
type: Object,
|
|
70
|
+
default: () => ({
|
|
71
|
+
// 表格配置
|
|
72
|
+
table: {},
|
|
73
|
+
// 分页配置,如需分页,则设置此值为false
|
|
74
|
+
pagination: {}
|
|
75
|
+
})
|
|
76
|
+
},
|
|
77
|
+
// 请求函数
|
|
78
|
+
// - api:请求方法
|
|
79
|
+
// - params:请求入参
|
|
80
|
+
// - requiredFields:接口请求必须的字段
|
|
81
|
+
// - reloadOnParamsChange:当params发生变化,是否重新请求接口
|
|
82
|
+
// - threshold:接口请求的阈值间隔,防止短时间快速请求
|
|
83
|
+
request: {
|
|
84
|
+
type: Object,
|
|
85
|
+
default: () => ({})
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
data() {
|
|
89
|
+
return {
|
|
90
|
+
updatedTableConfig: {},
|
|
91
|
+
advanceData: {},
|
|
92
|
+
displayColumns: [],
|
|
93
|
+
tableKey: randomString(32),
|
|
94
|
+
currPage: 1,
|
|
95
|
+
pageSize: this.config?.pagination?.pageSize || 10
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
computed: {
|
|
99
|
+
/**
|
|
100
|
+
* 请求的入参
|
|
101
|
+
* @time 2024-11-15 09:40:22
|
|
102
|
+
*/
|
|
103
|
+
requestProps() {
|
|
104
|
+
// 从配置中结构出api和入参,必穿字段等属性
|
|
105
|
+
const {
|
|
106
|
+
api,
|
|
107
|
+
params,
|
|
108
|
+
requiredFields,
|
|
109
|
+
reloadOnParamsChange,
|
|
110
|
+
threshold
|
|
111
|
+
} = this.request
|
|
112
|
+
// 请求入参
|
|
113
|
+
const requestParams = {
|
|
114
|
+
...(params || {}),
|
|
115
|
+
...this.advanceData,
|
|
116
|
+
currPage: this.currPage,
|
|
117
|
+
pageSize: this.pageSize
|
|
118
|
+
}
|
|
119
|
+
// 如果无需分页,则删除分页属性
|
|
120
|
+
if (this.config.pagination === false) {
|
|
121
|
+
delete requestParams.currPage
|
|
122
|
+
delete requestParams.pageSize
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
api: (...args) => {
|
|
126
|
+
// 如果当前传入了函数
|
|
127
|
+
if (typeof api === 'function') {
|
|
128
|
+
return api(...args)
|
|
129
|
+
} else {
|
|
130
|
+
// 如果有外部数据源
|
|
131
|
+
if (this.dataSource?.length > 0) {
|
|
132
|
+
return this.getListByDataSource(...args)
|
|
133
|
+
}
|
|
134
|
+
return { list: [], totalCount: 0 }
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
params: requestParams,
|
|
138
|
+
requiredFields,
|
|
139
|
+
reloadOnParamsChange: isNil(reloadOnParamsChange) ? true : reloadOnParamsChange,
|
|
140
|
+
threshold: threshold || 10
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* 表格配置
|
|
146
|
+
* @time 2024-11-15 09:52:03
|
|
147
|
+
*/
|
|
148
|
+
tableConfig() {
|
|
149
|
+
return {
|
|
150
|
+
...(this.config.table || {}),
|
|
151
|
+
...this.updatedTableConfig
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* 分页配置
|
|
157
|
+
* @time 2024-11-15 09:53:58
|
|
158
|
+
*/
|
|
159
|
+
paginationConfig() {
|
|
160
|
+
return {
|
|
161
|
+
pageSizes: [10, 20, 50],
|
|
162
|
+
layout: 'total, prev, pager, next, sizes',
|
|
163
|
+
...(this.config.pagination || {})
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* 映射字段
|
|
169
|
+
* @time 2024-11-15 13:57:44
|
|
170
|
+
*/
|
|
171
|
+
aliasMap() {
|
|
172
|
+
return {
|
|
173
|
+
list: 'list',
|
|
174
|
+
totalCount: 'totalCount',
|
|
175
|
+
...(this.request.aliasMap || {})
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
watch: {
|
|
180
|
+
/**
|
|
181
|
+
* 监听数据源变化
|
|
182
|
+
* @time 2024-11-20 11:26:50
|
|
183
|
+
*/
|
|
184
|
+
dataSource() {
|
|
185
|
+
this.reset()
|
|
186
|
+
},
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* 监听请求入参变化
|
|
190
|
+
* @time 2025-01-23 19:04:03
|
|
191
|
+
*/
|
|
192
|
+
'request.params': {
|
|
193
|
+
handler(newValue, oldValue) {
|
|
194
|
+
// 如果参数变化不需要重新请求数据
|
|
195
|
+
if (!this.request.reloadOnParamsChange) {
|
|
196
|
+
return
|
|
197
|
+
}
|
|
198
|
+
// 如果新老值相等,则不允许重新赋值
|
|
199
|
+
if (isEqual(newValue, oldValue)) {
|
|
200
|
+
return
|
|
201
|
+
}
|
|
202
|
+
// 从第一页开始加载
|
|
203
|
+
this.currPage = 1
|
|
204
|
+
},
|
|
205
|
+
deep: true
|
|
206
|
+
}
|
|
207
|
+
},
|
|
208
|
+
created() {
|
|
209
|
+
// 当前转换函数
|
|
210
|
+
this.functionEval = functionEval(() => ({
|
|
211
|
+
data: this.$refs.request.data,
|
|
212
|
+
config: this.config,
|
|
213
|
+
$route: this.$route,
|
|
214
|
+
$router: this.$router,
|
|
215
|
+
tableThis: this,
|
|
216
|
+
pageThis: this.pageThis || this.$parent
|
|
217
|
+
}))
|
|
218
|
+
},
|
|
219
|
+
mounted() {
|
|
220
|
+
this.doLayout(this.columns)
|
|
221
|
+
},
|
|
222
|
+
methods: {
|
|
223
|
+
/**
|
|
224
|
+
* 获取表格的props
|
|
225
|
+
* @param {Object} props 当前输入的props
|
|
226
|
+
* @time 2024-11-15 09:56:58
|
|
227
|
+
*/
|
|
228
|
+
getTableProps(props) {
|
|
229
|
+
// 当前属性的key
|
|
230
|
+
const PROP_KEYS = [
|
|
231
|
+
'index',
|
|
232
|
+
'columnKey',
|
|
233
|
+
'label',
|
|
234
|
+
'prop',
|
|
235
|
+
'width',
|
|
236
|
+
'minWidth',
|
|
237
|
+
'fixed',
|
|
238
|
+
'renderHeader',
|
|
239
|
+
'resizable',
|
|
240
|
+
'formatter',
|
|
241
|
+
'showOverflowTooltip',
|
|
242
|
+
'align',
|
|
243
|
+
'headerAlign',
|
|
244
|
+
'className',
|
|
245
|
+
'labelClassName',
|
|
246
|
+
'selectable',
|
|
247
|
+
'reserveSelection'
|
|
248
|
+
]
|
|
249
|
+
return PROP_KEYS.reduce(
|
|
250
|
+
(memo, propKey) => {
|
|
251
|
+
// 如果值非空,则继续添加
|
|
252
|
+
if (!isNil(props[propKey])) {
|
|
253
|
+
memo[propKey] = props[propKey]
|
|
254
|
+
}
|
|
255
|
+
return memo
|
|
256
|
+
}, {}
|
|
257
|
+
)
|
|
258
|
+
},
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* 绑定事件
|
|
262
|
+
* @param {Array} events 当前事件集合
|
|
263
|
+
* @time 2024-11-15 14:09:31
|
|
264
|
+
*/
|
|
265
|
+
bindEvent(events) {
|
|
266
|
+
return events.reduce(
|
|
267
|
+
(memo, key) => {
|
|
268
|
+
// 赋值事件
|
|
269
|
+
memo[key] = (...args) => {
|
|
270
|
+
// 事件名称
|
|
271
|
+
let eventKey = key
|
|
272
|
+
// 如果是current-change事件
|
|
273
|
+
if (key === 'current-change') {
|
|
274
|
+
// 如果当前设置的表格事件
|
|
275
|
+
if (events === TABLE_EVENTS) {
|
|
276
|
+
eventKey = `table-${key}`
|
|
277
|
+
} else {
|
|
278
|
+
// 设置当前页
|
|
279
|
+
this.currPage = args[0]
|
|
280
|
+
// 刷新接口
|
|
281
|
+
this.$nextTick(this.refresh.bind(this))
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
// 如果页码发生改变
|
|
285
|
+
if (key === 'size-change') {
|
|
286
|
+
// 重置到第一页开始请求接口
|
|
287
|
+
this.currPage = 1
|
|
288
|
+
// 设置每页展示条数
|
|
289
|
+
this.pageSize = args[0]
|
|
290
|
+
// 刷新接口
|
|
291
|
+
this.$nextTick(this.refresh.bind(this))
|
|
292
|
+
}
|
|
293
|
+
// 将事件抛出去
|
|
294
|
+
this.$emit(eventKey, ...args)
|
|
295
|
+
}
|
|
296
|
+
return memo
|
|
297
|
+
}, {}
|
|
298
|
+
)
|
|
299
|
+
},
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* 从dataSource中获取列表数据
|
|
303
|
+
* @time 2024-11-22 11:23:49
|
|
304
|
+
*/
|
|
305
|
+
getListByDataSource(params) {
|
|
306
|
+
// 获取所有入参的key(过滤掉分页属性,排序属性)
|
|
307
|
+
const paramKeys = Object.keys(params)
|
|
308
|
+
.filter(key => !['currPage', 'pageSize', 'sortBy', 'orderBy'].includes(key))
|
|
309
|
+
.filter(key => !isNil(params[key]))
|
|
310
|
+
// 开始过滤数据
|
|
311
|
+
let list = this.dataSource.filter(item => {
|
|
312
|
+
return paramKeys.every(key => {
|
|
313
|
+
// 如果筛选的数据是数组,但是当前表格数据不是
|
|
314
|
+
if (Array.isArray(params[key])) {
|
|
315
|
+
// 如果表格数据也是数组,则比较数据是否一致
|
|
316
|
+
if (Array.isArray(item[key])) {
|
|
317
|
+
return params[key].some(p => item[key].includes(p))
|
|
318
|
+
}
|
|
319
|
+
// 否则判断表格数据是否在筛选项里
|
|
320
|
+
return params[key].includes(item[key])
|
|
321
|
+
}
|
|
322
|
+
// 如果是字符串或者数字等类型,则判断
|
|
323
|
+
return `${item[key]}`.indexOf(params[key]) >= 0
|
|
324
|
+
})
|
|
325
|
+
})
|
|
326
|
+
// 开始排序
|
|
327
|
+
if (!isNil(params.orderBy)) {
|
|
328
|
+
list = list.sort((prev, next) => {
|
|
329
|
+
// 如果当前是升序
|
|
330
|
+
if (params.sortBy === SORT_ORDER.ASCENDING) {
|
|
331
|
+
return prev[params.orderBy] - next[params.orderBy]
|
|
332
|
+
}
|
|
333
|
+
// 如果是降序
|
|
334
|
+
return next[params.orderBy] - prev[params.orderBy]
|
|
335
|
+
})
|
|
336
|
+
}
|
|
337
|
+
// 开始分页(如果需要分页)
|
|
338
|
+
if (this.config.pagination !== false) {
|
|
339
|
+
list = list.slice((params.currPage - 1) * params.pageSize, params.currPage * params.pageSize)
|
|
340
|
+
}
|
|
341
|
+
return {
|
|
342
|
+
list,
|
|
343
|
+
totalCount: this.dataSource.length
|
|
344
|
+
}
|
|
345
|
+
},
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* 重新刷新数据
|
|
349
|
+
* @time 2024-11-18 09:44:47
|
|
350
|
+
*/
|
|
351
|
+
refresh() {
|
|
352
|
+
// 重新刷新数据
|
|
353
|
+
this.$refs.request.onReload()
|
|
354
|
+
},
|
|
355
|
+
|
|
356
|
+
/**
|
|
357
|
+
* 重置分页数据后刷新
|
|
358
|
+
* @param {Number} pageSize 页码
|
|
359
|
+
* @time 2024-11-18 09:46:02
|
|
360
|
+
*/
|
|
361
|
+
reset(pageSize) {
|
|
362
|
+
// 如果当前是数字
|
|
363
|
+
if (typeof pageSize === 'number') {
|
|
364
|
+
this.pageSize = pageSize
|
|
365
|
+
}
|
|
366
|
+
// 从第一页开始加载
|
|
367
|
+
this.currPage = 1
|
|
368
|
+
// 刷新列表数据
|
|
369
|
+
this.$nextTick(this.refresh.bind(this))
|
|
370
|
+
},
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* 当选择了高级属性
|
|
374
|
+
* @param {Object} column 当前列的配置
|
|
375
|
+
* @param {String|Array} value 当前输入或者选中的值
|
|
376
|
+
* @time 2024-11-22 11:10:38
|
|
377
|
+
*/
|
|
378
|
+
onConfirmAdvance(column, value) {
|
|
379
|
+
// 取出当前prop的值
|
|
380
|
+
const { prop, config } = column
|
|
381
|
+
// 开始设置值
|
|
382
|
+
this.$set(this.advanceData, config?.fieldKey || prop, value)
|
|
383
|
+
// 从第一页开始加载
|
|
384
|
+
this.currPage = 1
|
|
385
|
+
// 抛出过滤改变的方法
|
|
386
|
+
this.$emit('filter-change', column, value)
|
|
387
|
+
},
|
|
388
|
+
|
|
389
|
+
/**
|
|
390
|
+
* 如果重置了高级属性
|
|
391
|
+
* @param {Object} column 当前列的配置
|
|
392
|
+
* @time 2024-11-22 11:16:41
|
|
393
|
+
*/
|
|
394
|
+
onResetAdvance(column) {
|
|
395
|
+
// 取出当前prop的值
|
|
396
|
+
const { config, prop } = column
|
|
397
|
+
// 开始设置值
|
|
398
|
+
this.$set(this.advanceData, config?.fieldKey || prop, undefined)
|
|
399
|
+
// 从第一页开始加载
|
|
400
|
+
this.currPage = 1
|
|
401
|
+
// 抛出过滤改变的方法
|
|
402
|
+
this.$emit('filter-change', column, column.filters ? [] : '')
|
|
403
|
+
},
|
|
404
|
+
|
|
405
|
+
/**
|
|
406
|
+
* 如果点击了排序属性
|
|
407
|
+
* @param {Object} column 当前列的配置
|
|
408
|
+
* @param {String} sort 当前排序方式
|
|
409
|
+
* @time 2024-11-22 11:16:41
|
|
410
|
+
*/
|
|
411
|
+
onSortAdvance(column, sort) {
|
|
412
|
+
// 取出当前prop的值
|
|
413
|
+
const { prop } = column
|
|
414
|
+
// 设置排序方式
|
|
415
|
+
this.$set(this.advanceData, 'orderBy', isNil(sort) ? undefined : prop)
|
|
416
|
+
// 设置排序字段
|
|
417
|
+
this.$set(this.advanceData, 'sortBy', isNil(sort) ? undefined : sort)
|
|
418
|
+
// 如果request不监听params变化,则需要手动刷新
|
|
419
|
+
if (!this.requestProps.reloadOnParamsChange) {
|
|
420
|
+
this.reset(this.pageSize)
|
|
421
|
+
}
|
|
422
|
+
// 遍历所有的列,将其他列的排序方式清空
|
|
423
|
+
this.columns.forEach(c => {
|
|
424
|
+
// 如果循环出来的列是可排序,但是非当前排序字段
|
|
425
|
+
if (c !== column && c.sortable) {
|
|
426
|
+
this.$refs[`${c.prop}-sortable`] && this.$refs[`${c.prop}-sortable`].onReset()
|
|
427
|
+
}
|
|
428
|
+
})
|
|
429
|
+
// 抛出排序改变方法
|
|
430
|
+
this.$emit('sort-change', column, column.prop, sort)
|
|
431
|
+
},
|
|
432
|
+
|
|
433
|
+
/**
|
|
434
|
+
* 更新表格配置
|
|
435
|
+
* @param {Object} config 表格配置
|
|
436
|
+
* @time 2024-11-27 15:57:50
|
|
437
|
+
*/
|
|
438
|
+
updateTableConfig(config = {}) {
|
|
439
|
+
this.updatedTableConfig = {
|
|
440
|
+
...this.updatedTableConfig,
|
|
441
|
+
...config
|
|
442
|
+
}
|
|
443
|
+
},
|
|
444
|
+
|
|
445
|
+
/**
|
|
446
|
+
* 隐藏指定的表格
|
|
447
|
+
* @param {Array} columns 表格数据
|
|
448
|
+
* @time 2024-11-27 18:42:59
|
|
449
|
+
*/
|
|
450
|
+
doLayout(columns) {
|
|
451
|
+
// 记录当前隐藏的列
|
|
452
|
+
this.displayColumns = columns.filter(this.vif)
|
|
453
|
+
// 重新渲染
|
|
454
|
+
this.tableKey = randomString(32)
|
|
455
|
+
},
|
|
456
|
+
|
|
457
|
+
/**
|
|
458
|
+
* 判断当前表单项是否需要渲染
|
|
459
|
+
* @param {Object} itemConfig 表单项配置
|
|
460
|
+
* @time 2024-10-31 16:56:03
|
|
461
|
+
*/
|
|
462
|
+
vif(columnConfig) {
|
|
463
|
+
// 取出当前this
|
|
464
|
+
const tableThis = this
|
|
465
|
+
// 是否展示
|
|
466
|
+
let display = true
|
|
467
|
+
// 如果当前是boolean类型
|
|
468
|
+
if (typeof columnConfig.vif === 'boolean') {
|
|
469
|
+
display = columnConfig.vif
|
|
470
|
+
}
|
|
471
|
+
// 如果当前是函数
|
|
472
|
+
if (isEvalFunction(columnConfig.vif)) {
|
|
473
|
+
// 执行函数,获取展示状态
|
|
474
|
+
display = tableThis.functionEval(columnConfig.vif)()
|
|
475
|
+
}
|
|
476
|
+
// 返回状态
|
|
477
|
+
return display
|
|
478
|
+
}
|
|
479
|
+
},
|
|
480
|
+
render() {
|
|
481
|
+
const [
|
|
482
|
+
Table,
|
|
483
|
+
TableColumn,
|
|
484
|
+
Tag,
|
|
485
|
+
Link,
|
|
486
|
+
Pagination
|
|
487
|
+
] = getComponentNames(['table', 'table-column', 'tag', 'link', 'pagination'])
|
|
488
|
+
return (
|
|
489
|
+
<ProRequest
|
|
490
|
+
ref='request'
|
|
491
|
+
props={this.requestProps}
|
|
492
|
+
scopedSlots={{
|
|
493
|
+
default: ({ loading, data }) => (
|
|
494
|
+
<div
|
|
495
|
+
v-loading_fullscreen_lock={loading}
|
|
496
|
+
element-loading-spinner='page-loading'
|
|
497
|
+
class='iov-pro-table'
|
|
498
|
+
>
|
|
499
|
+
<Table
|
|
500
|
+
ref='table'
|
|
501
|
+
key={this.tableKey}
|
|
502
|
+
props={{
|
|
503
|
+
data: data ? lodashGet(data, this.aliasMap.list) : [],
|
|
504
|
+
...this.tableConfig
|
|
505
|
+
}}
|
|
506
|
+
class='iov-pro-table__table'
|
|
507
|
+
on={this.bindEvent(TABLE_EVENTS)}
|
|
508
|
+
>
|
|
509
|
+
{ // 遍历配置项
|
|
510
|
+
this.displayColumns.map(column => {
|
|
511
|
+
// 当前属性
|
|
512
|
+
const props = this.getTableProps(column)
|
|
513
|
+
// slots
|
|
514
|
+
const scopedSlots = {}
|
|
515
|
+
// 插槽的执行方法
|
|
516
|
+
const scopedSlotsFunc = column.slotName
|
|
517
|
+
? this.$scopedSlots[column.slotName]
|
|
518
|
+
: this.$scopedSlots[column.prop]
|
|
519
|
+
// 根据类型去设置props和scopedSlots
|
|
520
|
+
switch (column.type) {
|
|
521
|
+
case 'enum': // 如果当前是枚举类型
|
|
522
|
+
scopedSlots.default = ({ row }) => <Enums value={row[column.prop]} enums={column.enums} />
|
|
523
|
+
break
|
|
524
|
+
case 'tag': // 如果当前是tag
|
|
525
|
+
scopedSlots.default = ({ row }) => {
|
|
526
|
+
// 如果没有数据,则不渲染
|
|
527
|
+
if (isNil(row[column.prop])) {
|
|
528
|
+
return null
|
|
529
|
+
}
|
|
530
|
+
// 当前值
|
|
531
|
+
const value = Array.isArray(row[column.prop])
|
|
532
|
+
? row[column.prop]
|
|
533
|
+
: [row[column.prop]]
|
|
534
|
+
// 遍历当前值
|
|
535
|
+
return (
|
|
536
|
+
<Space
|
|
537
|
+
direction='horizontal'
|
|
538
|
+
align='center'
|
|
539
|
+
space={6}
|
|
540
|
+
>
|
|
541
|
+
{ // 遍历数据
|
|
542
|
+
value.map(v => {
|
|
543
|
+
// 取出当前枚举的值
|
|
544
|
+
const columnEnum = column.enums.find(e => e.value === v) || {}
|
|
545
|
+
// 当前展示的tag
|
|
546
|
+
return <Tag type={columnEnum.type} props={{ size: 'mini', hit: true, ...(column.config || {}) }}>{columnEnum.label}</Tag>
|
|
547
|
+
})
|
|
548
|
+
}
|
|
549
|
+
</Space>
|
|
550
|
+
)
|
|
551
|
+
}
|
|
552
|
+
break
|
|
553
|
+
case 'link': // 如果当前是超链接
|
|
554
|
+
scopedSlots.default = ({ row }) => {
|
|
555
|
+
// 超链接的点击事件
|
|
556
|
+
const linkClick = column.linkClick ? column.linkClick : () => {}
|
|
557
|
+
// 触发点击事件
|
|
558
|
+
return <Link type='primary' underline={false} onClick={linkClick}>{ column.linkText || row[column.prop] }</Link>
|
|
559
|
+
}
|
|
560
|
+
break
|
|
561
|
+
case 'popover': // 如果当前是浮动展示全部数据
|
|
562
|
+
scopedSlots.default = ({ row }) => (
|
|
563
|
+
<ColumnTooltip
|
|
564
|
+
props={{
|
|
565
|
+
data: row[column.prop],
|
|
566
|
+
...(column.config || {})
|
|
567
|
+
}}
|
|
568
|
+
/>
|
|
569
|
+
)
|
|
570
|
+
break
|
|
571
|
+
case 'img': // 如果当前是图片
|
|
572
|
+
scopedSlots.default = ({ row }) => (
|
|
573
|
+
<img
|
|
574
|
+
attrs={{
|
|
575
|
+
src: row[column.prop],
|
|
576
|
+
...(column.config || {})
|
|
577
|
+
}}
|
|
578
|
+
/>
|
|
579
|
+
)
|
|
580
|
+
break
|
|
581
|
+
case 'expand': // 如果当前是展开收起
|
|
582
|
+
// 当前类型
|
|
583
|
+
props.type = column.type
|
|
584
|
+
// 设置默认插槽
|
|
585
|
+
scopedSlots.default = scope => (scopedSlotsFunc ? scopedSlotsFunc(scope) : null)
|
|
586
|
+
break
|
|
587
|
+
case 'slot': // 如果当前是插槽
|
|
588
|
+
scopedSlots.default = scope => (scopedSlotsFunc ? scopedSlotsFunc(scope) : null)
|
|
589
|
+
break
|
|
590
|
+
default:
|
|
591
|
+
// 设置一下类型
|
|
592
|
+
props.type = column.type
|
|
593
|
+
break
|
|
594
|
+
}
|
|
595
|
+
// 表头header插槽
|
|
596
|
+
const tableColumnHeader = []
|
|
597
|
+
// 高级功能(筛选,搜索,排序)
|
|
598
|
+
Object.keys(ADVANCE_FUNCTION).forEach(name => {
|
|
599
|
+
// 如果有高级功能
|
|
600
|
+
if (!isNil(column[name])) {
|
|
601
|
+
// 获取当前组件
|
|
602
|
+
const AdvanceFn = ADVANCE_FUNCTION[name]
|
|
603
|
+
// 表头插槽多塞入一个组件
|
|
604
|
+
tableColumnHeader.push(
|
|
605
|
+
<AdvanceFn
|
|
606
|
+
ref={`${column.prop}-${name}`}
|
|
607
|
+
column={column}
|
|
608
|
+
onSort={this.onSortAdvance.bind(this, column)}
|
|
609
|
+
onConfirm={val => this.onConfirmAdvance(column, val)}
|
|
610
|
+
onReset={this.onResetAdvance.bind(this, column)}
|
|
611
|
+
/>
|
|
612
|
+
)
|
|
613
|
+
}
|
|
614
|
+
})
|
|
615
|
+
// 表头插槽
|
|
616
|
+
const scopedSlotsHeader = this.$scopedSlots[`${column.prop}:header`]
|
|
617
|
+
// 如果当前有搜索,排序等功能
|
|
618
|
+
if (tableColumnHeader.length > 0) {
|
|
619
|
+
scopedSlots.header = () => (
|
|
620
|
+
<Space
|
|
621
|
+
class='iov-pro-table__header'
|
|
622
|
+
align='center'
|
|
623
|
+
space='4'
|
|
624
|
+
direction='horizontal'
|
|
625
|
+
>{scopedSlotsHeader ? scopedSlotsHeader() : <span>{column.label}</span>}{tableColumnHeader}</Space>
|
|
626
|
+
)
|
|
627
|
+
} else {
|
|
628
|
+
// 如果表头需要插槽
|
|
629
|
+
if (scopedSlotsHeader) {
|
|
630
|
+
scopedSlots.header = scopedSlotsHeader
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
return (
|
|
634
|
+
<TableColumn
|
|
635
|
+
ref='tableColumn'
|
|
636
|
+
props={props}
|
|
637
|
+
scopedSlots={scopedSlots}
|
|
638
|
+
/>
|
|
639
|
+
)
|
|
640
|
+
})
|
|
641
|
+
}
|
|
642
|
+
</Table>
|
|
643
|
+
{ // 如果有分页数量才展示
|
|
644
|
+
data && lodashGet(data, this.aliasMap.totalCount) > 0 && this.config.pagination !== false
|
|
645
|
+
? (
|
|
646
|
+
<Pagination
|
|
647
|
+
props={{
|
|
648
|
+
...this.paginationConfig,
|
|
649
|
+
currentPage: this.currPage,
|
|
650
|
+
pageSize: this.pageSize,
|
|
651
|
+
total: lodashGet(data, this.aliasMap.totalCount)
|
|
652
|
+
}}
|
|
653
|
+
class='iov-pro-table__pagination'
|
|
654
|
+
on={this.bindEvent(PAGINATION_EVENTS)}
|
|
655
|
+
/>
|
|
656
|
+
) : null
|
|
657
|
+
}
|
|
658
|
+
</div>
|
|
659
|
+
)
|
|
660
|
+
}}
|
|
661
|
+
on={{
|
|
662
|
+
loaded: respData => this.$emit('loaded', respData)
|
|
663
|
+
}}
|
|
664
|
+
/>
|
|
665
|
+
)
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
</script>
|