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.
Files changed (133) hide show
  1. package/.eslintignore +5 -0
  2. package/.eslintrc.js +192 -0
  3. package/.gitignore +3 -0
  4. package/README.md +4 -0
  5. package/babel.config.js +5 -0
  6. package/docs/.vuepress/config.js +169 -0
  7. package/docs/.vuepress/styles/index.styl +62 -0
  8. package/docs/.vuepress/styles/palette.styl +20 -0
  9. package/docs/.vuepress/theme/enhanceApp.js +100 -0
  10. package/docs/.vuepress/theme/index.js +3 -0
  11. package/docs/README.md +13 -0
  12. package/docs/components/description.md +519 -0
  13. package/docs/components/dialog-select.md +91 -0
  14. package/docs/components/display.md +36 -0
  15. package/docs/components/enums.md +33 -0
  16. package/docs/components/icon.md +406 -0
  17. package/docs/components/link-group.md +39 -0
  18. package/docs/components/page-detail.md +48 -0
  19. package/docs/components/page-module.md +51 -0
  20. package/docs/components/pro-form.md +958 -0
  21. package/docs/components/pro-table.md +683 -0
  22. package/docs/components/request.md +44 -0
  23. package/docs/components/search-table.md +963 -0
  24. package/docs/components/space.md +35 -0
  25. package/docs/components/sub-title.md +24 -0
  26. package/docs/components/submit-module.md +24 -0
  27. package/docs/template/add.md +124 -0
  28. package/docs/template/confirm.md +28 -0
  29. package/docs/template/detail.md +240 -0
  30. package/docs/template/dialog.md +339 -0
  31. package/docs/template/list.md +464 -0
  32. package/docs/template/tabs-mini.md +32 -0
  33. package/docs/template/tabs.md +32 -0
  34. package/jsconfig.json +19 -0
  35. package/lib/iov-pro-components.css +1 -0
  36. package/lib/iov-pro-components.min.js +7 -0
  37. package/lib/postcss.config.js +8 -0
  38. package/package.json +75 -0
  39. package/patches/vue-server-renderer+2.7.16.patch +13 -0
  40. package/rollup.config.mjs +79 -0
  41. package/src/App.vue +103 -0
  42. package/src/main.js +33 -0
  43. package/src/packages/column-tooltip/index.js +7 -0
  44. package/src/packages/column-tooltip/src/main.vue +127 -0
  45. package/src/packages/description/index.js +7 -0
  46. package/src/packages/description/src/main.vue +375 -0
  47. package/src/packages/description/src/text.vue +103 -0
  48. package/src/packages/dialog-select/index.js +7 -0
  49. package/src/packages/dialog-select/src/main.vue +308 -0
  50. package/src/packages/display/index.js +7 -0
  51. package/src/packages/display/src/main.vue +44 -0
  52. package/src/packages/enums/index.js +7 -0
  53. package/src/packages/enums/src/main.vue +23 -0
  54. package/src/packages/export/index.js +7 -0
  55. package/src/packages/export/src/main.vue +316 -0
  56. package/src/packages/fixed-button-group/index.js +7 -0
  57. package/src/packages/fixed-button-group/src/main.vue +104 -0
  58. package/src/packages/form/index.js +7 -0
  59. package/src/packages/form/src/collapse.vue +149 -0
  60. package/src/packages/form/src/main.vue +1190 -0
  61. package/src/packages/form-collapse/index.js +7 -0
  62. package/src/packages/index.js +86 -0
  63. package/src/packages/link-group/index.js +7 -0
  64. package/src/packages/link-group/src/main.vue +52 -0
  65. package/src/packages/page-detail/index.js +7 -0
  66. package/src/packages/page-detail/src/main.vue +123 -0
  67. package/src/packages/page-module/index.js +7 -0
  68. package/src/packages/page-module/src/main.vue +56 -0
  69. package/src/packages/preview/index.js +7 -0
  70. package/src/packages/preview/src/eval-image-viewer.js +50 -0
  71. package/src/packages/preview/src/image-viewer.vue +366 -0
  72. package/src/packages/preview/src/main.vue +97 -0
  73. package/src/packages/request/index.js +7 -0
  74. package/src/packages/request/src/main.vue +125 -0
  75. package/src/packages/search-table/index.js +7 -0
  76. package/src/packages/search-table/src/inner-tabs.vue +237 -0
  77. package/src/packages/search-table/src/main.vue +472 -0
  78. package/src/packages/search-table/src/outer-tabs.vue +45 -0
  79. package/src/packages/search-table-inner-tabs/index.js +7 -0
  80. package/src/packages/search-table-outer-tabs/index.js +7 -0
  81. package/src/packages/space/index.js +7 -0
  82. package/src/packages/space/src/main.vue +74 -0
  83. package/src/packages/sub-title/index.js +7 -0
  84. package/src/packages/sub-title/src/main.vue +70 -0
  85. package/src/packages/submit-module/index.js +7 -0
  86. package/src/packages/submit-module/src/main.vue +67 -0
  87. package/src/packages/table/index.js +7 -0
  88. package/src/packages/table/src/filter.vue +89 -0
  89. package/src/packages/table/src/main.vue +668 -0
  90. package/src/packages/table/src/search.vue +90 -0
  91. package/src/packages/table/src/sort.vue +118 -0
  92. package/src/packages/theme/index.scss +15 -0
  93. package/src/packages/theme/src/column-tooltip.scss +23 -0
  94. package/src/packages/theme/src/common/color.scss +134 -0
  95. package/src/packages/theme/src/description.scss +56 -0
  96. package/src/packages/theme/src/dialog-select.scss +32 -0
  97. package/src/packages/theme/src/fixed-button-group.scss +25 -0
  98. package/src/packages/theme/src/form.scss +11 -0
  99. package/src/packages/theme/src/link-group.scss +43 -0
  100. package/src/packages/theme/src/page-detail.scss +61 -0
  101. package/src/packages/theme/src/page-module.scss +46 -0
  102. package/src/packages/theme/src/preview.scss +67 -0
  103. package/src/packages/theme/src/search-table.scss +185 -0
  104. package/src/packages/theme/src/space.scss +12 -0
  105. package/src/packages/theme/src/sub-title.scss +47 -0
  106. package/src/packages/theme/src/submit-module.scss +13 -0
  107. package/src/packages/theme/src/table.scss +129 -0
  108. package/src/packages/theme/src/toolbar.scss +109 -0
  109. package/src/packages/toolbar/index.js +7 -0
  110. package/src/packages/toolbar/src/main.vue +126 -0
  111. package/src/packages/toolbar/src/setting.vue +217 -0
  112. package/src/packages/toolbar/src/style.vue +68 -0
  113. package/src/packages/toolbar/src/zoom.vue +65 -0
  114. package/src/router.js +83 -0
  115. package/src/utils/config-center.js +218 -0
  116. package/src/utils/function-eval.js +84 -0
  117. package/src/utils/index.js +104 -0
  118. package/src/views/column-tooltip.vue +37 -0
  119. package/src/views/components/OtherSelect.vue +18 -0
  120. package/src/views/description.vue +60 -0
  121. package/src/views/detail.vue +146 -0
  122. package/src/views/directive/number.js +82 -0
  123. package/src/views/enums.vue +22 -0
  124. package/src/views/export.vue +9 -0
  125. package/src/views/form-collapse.vue +185 -0
  126. package/src/views/form.vue +402 -0
  127. package/src/views/link-group.vue +16 -0
  128. package/src/views/preview.vue +33 -0
  129. package/src/views/request.vue +56 -0
  130. package/src/views/search-table.vue +297 -0
  131. package/src/views/table.vue +145 -0
  132. package/src/views/toolbar.vue +30 -0
  133. 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>