@vxe-ui/plugin-render-antd 4.0.7 → 4.0.8

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.
@@ -1,542 +1,543 @@
1
- import { h, resolveComponent, ComponentOptions } from 'vue'
2
- import XEUtils from 'xe-utils'
3
-
4
- import type { VxeUIExport, VxeTableDefines, VxeColumnPropTypes, VxeGlobalRendererHandles } from 'vxe-pc-ui'
5
-
6
- /**
7
- * 表格 - 渲染器
8
- */
9
- export function defineTableRender (VxeUI: VxeUIExport) {
10
- function isEmptyValue (cellValue: any) {
11
- return cellValue === null || cellValue === undefined || cellValue === ''
12
- }
13
-
14
- function getOnName (type: string) {
15
- return 'on' + type.substring(0, 1).toLocaleUpperCase() + type.substring(1)
16
- }
17
-
18
- function getModelProp (renderOpts: VxeGlobalRendererHandles.RenderOptions) {
19
- let prop = 'value'
20
- switch (renderOpts.name) {
21
- case 'ASwitch':
22
- prop = 'checked'
23
- break
24
- }
25
- return prop
26
- }
27
-
28
- function getModelEvent (renderOpts: VxeGlobalRendererHandles.RenderOptions) {
29
- let type = 'update:value'
30
- switch (renderOpts.name) {
31
- case 'ASwitch':
32
- type = 'update:checked'
33
- break
34
- }
35
- return type
36
- }
37
-
38
- function dateFormatToVxeFormat (format: string) {
39
- if (format) {
40
- return `${format}`.replace('YYYY', 'yyyy').replace('DD', 'dd')
41
- }
42
- return format
43
- }
44
-
45
- function getChangeEvent (renderOpts: VxeGlobalRendererHandles.RenderOptions) {
46
- return 'change'
47
- }
48
-
49
- function getCellEditFilterProps (renderOpts: any, params: VxeGlobalRendererHandles.RenderEditParams | VxeGlobalRendererHandles.RenderFilterParams, value: any, defaultProps?: { [prop: string]: any }) {
50
- return XEUtils.assign({}, defaultProps, renderOpts.props, { [getModelProp(renderOpts)]: value })
51
- }
52
-
53
- function formatText (cellValue: any) {
54
- return '' + (isEmptyValue(cellValue) ? '' : cellValue)
55
- }
56
-
57
- function getCellLabelVNs (renderOpts: VxeColumnPropTypes.EditRender, params: VxeGlobalRendererHandles.RenderCellParams, cellLabel: any) {
58
- const { placeholder } = renderOpts
59
- return [
60
- h('span', {
61
- class: 'vxe-cell--label'
62
- }, placeholder && isEmptyValue(cellLabel)
63
- ? [
64
- h('span', {
65
- class: 'vxe-cell--placeholder'
66
- }, formatText(placeholder))
67
- ]
68
- : formatText(cellLabel))
69
- ]
70
- }
71
-
72
- function getOns (renderOpts: VxeGlobalRendererHandles.RenderOptions, params: VxeGlobalRendererHandles.RenderParams, inputFunc?: Function, changeFunc?: Function) {
73
- const { events } = renderOpts
74
- const modelEvent = getModelEvent(renderOpts)
75
- const changeEvent = getChangeEvent(renderOpts)
76
- const isSameEvent = changeEvent === modelEvent
77
- const ons: { [type: string]: Function } = {}
78
- XEUtils.objectEach(events, (func: Function, key: string) => {
79
- ons[getOnName(key)] = function (...args: any[]) {
80
- func(params, ...args)
81
- }
82
- })
83
- if (inputFunc) {
84
- ons[getOnName(modelEvent)] = function (targetEvnt: any) {
85
- inputFunc(targetEvnt)
86
- if (events && events[modelEvent]) {
87
- events[modelEvent](params, targetEvnt)
88
- }
89
- if (isSameEvent && changeFunc) {
90
- changeFunc(targetEvnt)
91
- }
92
- }
93
- }
94
- if (!isSameEvent && changeFunc) {
95
- ons[getOnName(changeEvent)] = function (...args: any[]) {
96
- changeFunc(...args)
97
- if (events && events[changeEvent]) {
98
- events[changeEvent](params, ...args)
99
- }
100
- }
101
- }
102
- return ons
103
- }
104
-
105
- function getEditOns (renderOpts: VxeGlobalRendererHandles.RenderOptions, params: VxeGlobalRendererHandles.RenderEditParams) {
106
- const { $table, row, column } = params
107
- return getOns(renderOpts, params, (value: any) => {
108
- // 处理 model 值双向绑定
109
- XEUtils.set(row, column.field, value)
110
- }, () => {
111
- // 处理 change 事件相关逻辑
112
- $table.updateStatus(params)
113
- })
114
- }
115
-
116
- function getFilterOns (renderOpts: any, params: VxeGlobalRendererHandles.RenderFilterParams, option: VxeTableDefines.FilterOption, changeFunc: Function) {
117
- return getOns(renderOpts, params, (value: any) => {
118
- // 处理 model 值双向绑定
119
- option.data = value
120
- }, changeFunc)
121
- }
122
-
123
- function matchCascaderData (index: number, list: any[], values: any[], labels: any[]) {
124
- const val = values[index]
125
- if (list && values.length > index) {
126
- XEUtils.each(list, (item) => {
127
- if (item.value === val) {
128
- labels.push(item.label)
129
- matchCascaderData(++index, item.children, values, labels)
130
- }
131
- })
132
- }
133
- }
134
-
135
- function formatDatePicker (defaultFormat?: string) {
136
- return function (renderOpts: VxeColumnPropTypes.EditRender, params: VxeGlobalRendererHandles.RenderCellParams) {
137
- return getCellLabelVNs(renderOpts, params, getDatePickerCellValue(renderOpts, params, defaultFormat))
138
- }
139
- }
140
-
141
- function formatTimePicker (defaultFormat?: string) {
142
- return function (renderOpts: VxeColumnPropTypes.EditRender, params: VxeGlobalRendererHandles.RenderCellParams) {
143
- const { props = {} } = renderOpts
144
- const { row, column } = params
145
- let cellValue = XEUtils.get(row, column.field)
146
- try {
147
- if (cellValue) {
148
- if (!XEUtils.isString(cellValue)) {
149
- cellValue = cellValue.format ? cellValue.format(props.format || props.valueFormat || defaultFormat) : XEUtils.toDateString(cellValue, dateFormatToVxeFormat(props.format || props.valueFormat || defaultFormat))
150
- }
151
- }
152
- } catch (e) {}
153
- return getCellLabelVNs(renderOpts, params, cellValue)
154
- }
155
- }
156
-
157
- function getSelectCellValue (renderOpts: VxeColumnPropTypes.EditRender, params: VxeGlobalRendererHandles.RenderCellParams) {
158
- const { options = [], optionGroups, props = {}, optionProps = {}, optionGroupProps = {} } = renderOpts
159
- const { row, column } = params
160
- const labelProp = optionProps.label || 'label'
161
- const valueProp = optionProps.value || 'value'
162
- const groupOptions = optionGroupProps.options || 'options'
163
- const cellValue = XEUtils.get(row, column.field)
164
- if (!isEmptyValue(cellValue)) {
165
- return XEUtils.map(props.mode === 'multiple' ? cellValue : [cellValue], optionGroups
166
- ? (value) => {
167
- let selectItem
168
- for (let index = 0; index < optionGroups.length; index++) {
169
- selectItem = XEUtils.find(optionGroups[index][groupOptions], (item) => item[valueProp] === value)
170
- if (selectItem) {
171
- break
172
- }
173
- }
174
- return selectItem ? selectItem[labelProp] : value
175
- }
176
- : (value) => {
177
- const selectItem = XEUtils.find(options, (item) => item[valueProp] === value)
178
- return selectItem ? selectItem[labelProp] : value
179
- }).join(', ')
180
- }
181
- return ''
182
- }
183
-
184
- function getCascaderCellValue (renderOpts: VxeGlobalRendererHandles.RenderOptions, params: VxeGlobalRendererHandles.RenderCellParams | VxeGlobalRendererHandles.ExportMethodParams) {
185
- const { props = {} } = renderOpts
186
- const { row, column } = params
187
- const cellValue = XEUtils.get(row, column.field)
188
- const values = cellValue || []
189
- const labels: Array<any> = []
190
- matchCascaderData(0, props.options, values, labels)
191
- return (props.showAllLevels === false ? labels.slice(labels.length - 1, labels.length) : labels).join(` ${props.separator || '/'} `)
192
- }
193
-
194
- function getRangePickerCellValue (renderOpts: VxeColumnPropTypes.EditRender, params: VxeGlobalRendererHandles.RenderCellParams | VxeGlobalRendererHandles.RenderEditParams) {
195
- const { props = {} } = renderOpts
196
- const { row, column } = params
197
- let cellValue = XEUtils.get(row, column.field)
198
- if (cellValue) {
199
- cellValue = XEUtils.map(cellValue, (date: any) => {
200
- return date && date.format ? date.format(props.format || 'YYYY-MM-DD') : XEUtils.toDateString(date, dateFormatToVxeFormat(props.format || 'YYYY-MM-DD'))
201
- }).join(' ~ ')
202
- }
203
- return cellValue
204
- }
205
-
206
- function getTreeSelectCellValue (renderOpts: VxeGlobalRendererHandles.RenderOptions, params: VxeGlobalRendererHandles.RenderCellParams | VxeGlobalRendererHandles.RenderEditParams) {
207
- const { props = {} } = renderOpts
208
- const { treeData, treeCheckable } = props
209
- const { row, column } = params
210
- const cellValue = XEUtils.get(row, column.field)
211
- if (!isEmptyValue(cellValue)) {
212
- return XEUtils.map(treeCheckable ? cellValue : [cellValue], (value) => {
213
- const matchObj = XEUtils.findTree(treeData, (item: any) => item.value === value, { children: 'children' })
214
- return matchObj ? matchObj.item.title : value
215
- }).join(', ')
216
- }
217
- return cellValue
218
- }
219
-
220
- function getDatePickerCellValue (renderOpts: VxeGlobalRendererHandles.RenderOptions, params: VxeGlobalRendererHandles.RenderCellParams | VxeGlobalRendererHandles.ExportMethodParams, defaultFormat?: string) {
221
- const { props = {} } = renderOpts
222
- const { row, column } = params
223
- let cellValue = XEUtils.get(row, column.field)
224
- try {
225
- if (cellValue) {
226
- if (!defaultFormat) {
227
- if (renderOpts.name === 'ADatePicker') {
228
- switch (props.picker) {
229
- case 'week':
230
- defaultFormat = 'YYYY-WW周'
231
- break
232
- case 'month':
233
- defaultFormat = 'YYYY-MM'
234
- break
235
- case 'year':
236
- defaultFormat = 'YYYY'
237
- break
238
- default:
239
- defaultFormat = props.showTime ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD'
240
- break
241
- }
242
- }
243
- }
244
- cellValue = cellValue.format ? cellValue.format(props.format || defaultFormat) : XEUtils.toDateString(cellValue, dateFormatToVxeFormat(props.format || defaultFormat))
245
- }
246
- } catch (e) {}
247
- return cellValue
248
- }
249
-
250
- function createEditRender (defaultProps?: { [key: string]: any }) {
251
- return function (renderOpts: VxeColumnPropTypes.EditRender & { name: string }, params: VxeGlobalRendererHandles.RenderEditParams) {
252
- const { row, column } = params
253
- const { name, attrs } = renderOpts
254
- const cellValue = XEUtils.get(row, column.field)
255
- return [
256
- h(resolveComponent(name), {
257
- ...attrs,
258
- ...getCellEditFilterProps(renderOpts, params, cellValue, defaultProps),
259
- ...getEditOns(renderOpts, params)
260
- })
261
- ]
262
- }
263
- }
264
-
265
- function defaultButtonEditRender (renderOpts: VxeColumnPropTypes.EditRender, params: VxeGlobalRendererHandles.RenderEditParams) {
266
- const { attrs } = renderOpts
267
- return [
268
- h(resolveComponent('a-button'), {
269
- ...attrs,
270
- ...getCellEditFilterProps(renderOpts, params, null),
271
- ...getOns(renderOpts, params)
272
- }, cellText(renderOpts.content))
273
- ]
274
- }
275
-
276
- function defaultButtonsEditRender (renderOpts: VxeColumnPropTypes.EditRender, params: VxeGlobalRendererHandles.RenderEditParams) {
277
- const { children } = renderOpts
278
- if (children) {
279
- return children.map((childRenderOpts: VxeColumnPropTypes.EditRender) => defaultButtonEditRender(childRenderOpts, params)[0])
280
- }
281
- return []
282
- }
283
-
284
- function createFilterRender (defaultProps?: { [key: string]: any }) {
285
- return function (renderOpts: VxeColumnPropTypes.FilterRender & { name: string }, params: VxeGlobalRendererHandles.RenderFilterParams) {
286
- const { column } = params
287
- const { name, attrs } = renderOpts
288
- return [
289
- h('div', {
290
- class: 'vxe-table--filter-antd-wrapper'
291
- }, column.filters.map((option, oIndex) => {
292
- const optionValue = option.data
293
- return h(resolveComponent(name), {
294
- key: oIndex,
295
- ...attrs,
296
- ...getCellEditFilterProps(renderOpts, params, optionValue, defaultProps),
297
- ...getFilterOns(renderOpts, params, option, () => {
298
- // 处理 change 事件相关逻辑
299
- handleConfirmFilter(params, !!option.data, option)
300
- })
301
- })
302
- }))
303
- ]
304
- }
305
- }
306
-
307
- function handleConfirmFilter (params: VxeGlobalRendererHandles.RenderFilterParams, checked: boolean, option: VxeTableDefines.FilterOption) {
308
- const { $panel } = params
309
- $panel.changeOption(null, checked, option)
310
- }
311
-
312
- /**
313
- * 模糊匹配
314
- * @param params
315
- */
316
- function defaultFuzzyFilterMethod (params: VxeGlobalRendererHandles.FilterMethodParams) {
317
- const { option, row, column } = params
318
- const { data } = option
319
- const cellValue = XEUtils.get(row, column.field)
320
- return XEUtils.toValueString(cellValue).indexOf(data) > -1
321
- }
322
-
323
- /**
324
- * 精确匹配
325
- * @param params
326
- */
327
- function defaultExactFilterMethod (params: VxeGlobalRendererHandles.FilterMethodParams) {
328
- const { option, row, column } = params
329
- const { data } = option
330
- const cellValue = XEUtils.get(row, column.field)
331
- /* eslint-disable eqeqeq */
332
- return cellValue === data
333
- }
334
-
335
- function cellText (cellValue: any): string[] {
336
- return [formatText(cellValue)]
337
- }
338
-
339
- function createDatePickerExportMethod (defaultFormat?: string) {
340
- return function (params: VxeGlobalRendererHandles.ExportMethodParams) {
341
- const { row, column, options } = params
342
- return options && options.original ? XEUtils.get(row, column.field) : getDatePickerCellValue(column.editRender || column.cellRender, params, defaultFormat)
343
- }
344
- }
345
-
346
- function createExportMethod (getExportCellValue: Function) {
347
- return function (params: VxeGlobalRendererHandles.ExportMethodParams) {
348
- const { row, column, options } = params
349
- return options && options.original ? XEUtils.get(row, column.field) : getExportCellValue(column.editRender || column.cellRender, params)
350
- }
351
- }
352
-
353
- VxeUI.renderer.mixin({
354
- AAutoComplete: {
355
- tableAutoFocus: 'input',
356
- renderTableDefault: createEditRender(),
357
- renderTableEdit: createEditRender(),
358
- renderTableFilter: createFilterRender(),
359
- tableFilterDefaultMethod: defaultExactFilterMethod
360
- },
361
- AInput: {
362
- tableAutoFocus: 'input',
363
- renderTableDefault: createEditRender(),
364
- renderTableEdit: createEditRender(),
365
- renderTableFilter: createFilterRender(),
366
- tableFilterDefaultMethod: defaultFuzzyFilterMethod
367
- },
368
- AInputNumber: {
369
- tableAutoFocus: 'input',
370
- renderTableDefault: createEditRender(),
371
- renderTableEdit: createEditRender(),
372
- renderTableFilter: createFilterRender(),
373
- tableFilterDefaultMethod: defaultFuzzyFilterMethod
374
- },
375
- ASelect: {
376
- renderTableEdit (renderOpts, params) {
377
- const { options, optionGroups } = renderOpts
378
- const { row, column } = params
379
- const { attrs } = renderOpts
380
- const cellValue = XEUtils.get(row, column.field)
381
- const props = getCellEditFilterProps(renderOpts, params, cellValue)
382
- const ons = getEditOns(renderOpts, params)
383
- if (optionGroups) {
384
- return [
385
- h(resolveComponent('a-select') as ComponentOptions, {
386
- ...props,
387
- ...attrs,
388
- options: optionGroups,
389
- ...ons
390
- })
391
- ]
392
- }
393
- return [
394
- h(resolveComponent('a-select') as ComponentOptions, {
395
- ...props,
396
- ...attrs,
397
- options: props.options || options,
398
- ...ons
399
- })
400
- ]
401
- },
402
- renderTableCell (renderOpts, params) {
403
- return getCellLabelVNs(renderOpts, params, getSelectCellValue(renderOpts, params))
404
- },
405
- renderTableFilter (renderOpts, params) {
406
- const { options = [], optionGroups, optionGroupProps = {} } = renderOpts
407
- const groupOptions = optionGroupProps.options || 'options'
408
- const { column } = params
409
- const { attrs } = renderOpts
410
- return [
411
- h('div', {
412
- class: 'vxe-table--filter-antd-wrapper'
413
- }, optionGroups
414
- ? column.filters.map((option, oIndex) => {
415
- const optionValue = option.data
416
- const props = getCellEditFilterProps(renderOpts, params, optionValue)
417
- return h(resolveComponent('a-select') as ComponentOptions, {
418
- key: oIndex,
419
- ...attrs,
420
- ...props,
421
- options: groupOptions,
422
- ...getFilterOns(renderOpts, params, option, () => {
423
- // 处理 change 事件相关逻辑
424
- handleConfirmFilter(params, props.mode === 'multiple' ? (option.data && option.data.length > 0) : !XEUtils.eqNull(option.data), option)
425
- })
426
- })
427
- })
428
- : column.filters.map((option, oIndex) => {
429
- const optionValue = option.data
430
- const props = getCellEditFilterProps(renderOpts, params, optionValue)
431
- return h(resolveComponent('a-select') as ComponentOptions, {
432
- key: oIndex,
433
- ...attrs,
434
- ...props,
435
- options: props.options || options,
436
- ...getFilterOns(renderOpts, params, option, () => {
437
- // 处理 change 事件相关逻辑
438
- handleConfirmFilter(params, props.mode === 'multiple' ? (option.data && option.data.length > 0) : !XEUtils.eqNull(option.data), option)
439
- })
440
- })
441
- }))
442
- ]
443
- },
444
- tableFilterDefaultMethod (params) {
445
- const { option, row, column } = params
446
- const { data } = option
447
- const { field, filterRender: renderOpts } = column
448
- const { props = {} } = renderOpts
449
- const cellValue = XEUtils.get(row, field)
450
- if (props.mode === 'multiple') {
451
- if (XEUtils.isArray(cellValue)) {
452
- return XEUtils.includeArrays(cellValue, data)
453
- }
454
- return data.indexOf(cellValue) > -1
455
- }
456
- /* eslint-disable eqeqeq */
457
- return cellValue == data
458
- },
459
- tableExportMethod: createExportMethod(getSelectCellValue)
460
- },
461
- ACascader: {
462
- renderTableEdit: createEditRender(),
463
- renderTableCell (renderOpts, params) {
464
- return getCellLabelVNs(renderOpts, params, getCascaderCellValue(renderOpts, params))
465
- },
466
- tableExportMethod: createExportMethod(getCascaderCellValue)
467
- },
468
- ADatePicker: {
469
- renderTableEdit: createEditRender(),
470
- renderTableCell: formatDatePicker(),
471
- tableExportMethod: createDatePickerExportMethod()
472
- },
473
- AMonthPicker: {
474
- renderTableEdit: createEditRender(),
475
- renderTableCell: formatDatePicker('YYYY-MM'),
476
- tableExportMethod: createDatePickerExportMethod('YYYY-MM')
477
- },
478
- ARangePicker: {
479
- renderTableEdit: createEditRender(),
480
- renderTableCell (renderOpts, params) {
481
- return getCellLabelVNs(renderOpts, params, getRangePickerCellValue(renderOpts, params))
482
- },
483
- tableExportMethod: createExportMethod(getRangePickerCellValue)
484
- },
485
- AWeekPicker: {
486
- renderTableEdit: createEditRender(),
487
- renderTableCell: formatDatePicker('YYYY-WW周'),
488
- tableExportMethod: createDatePickerExportMethod('YYYY-WW周')
489
- },
490
- ATimePicker: {
491
- renderTableEdit: createEditRender(),
492
- renderTableCell: formatTimePicker('HH:mm:ss'),
493
- tableExportMethod: createDatePickerExportMethod('HH:mm:ss')
494
- },
495
- ATreeSelect: {
496
- renderTableEdit: createEditRender(),
497
- renderTableCell (renderOpts, params) {
498
- return getCellLabelVNs(renderOpts, params, getTreeSelectCellValue(renderOpts, params))
499
- },
500
- tableExportMethod: createExportMethod(getTreeSelectCellValue)
501
- },
502
- ARate: {
503
- renderTableDefault: createEditRender(),
504
- renderTableEdit: createEditRender(),
505
- renderTableFilter: createFilterRender(),
506
- tableFilterDefaultMethod: defaultExactFilterMethod
507
- },
508
- ASwitch: {
509
- renderTableDefault: createEditRender(),
510
- renderTableEdit: createEditRender(),
511
- renderTableFilter (renderOpts, params) {
512
- const { column } = params
513
- const { name, attrs } = renderOpts
514
- return [
515
- h('div', {
516
- class: 'vxe-table--filter-antd-wrapper'
517
- }, column.filters.map((option, oIndex) => {
518
- const optionValue = option.data
519
- return h(name as string, {
520
- key: oIndex,
521
- ...attrs,
522
- ...getCellEditFilterProps(renderOpts, params, optionValue),
523
- ...getFilterOns(renderOpts, params, option, () => {
524
- // 处理 change 事件相关逻辑
525
- handleConfirmFilter(params, XEUtils.isBoolean(option.data), option)
526
- })
527
- })
528
- }))
529
- ]
530
- },
531
- tableFilterDefaultMethod: defaultExactFilterMethod
532
- },
533
- AButton: {
534
- renderTableEdit: defaultButtonEditRender,
535
- renderTableDefault: defaultButtonEditRender
536
- },
537
- AButtons: {
538
- renderTableEdit: defaultButtonsEditRender,
539
- renderTableDefault: defaultButtonsEditRender
540
- }
541
- })
542
- }
1
+ import { h, resolveComponent, ComponentOptions } from 'vue'
2
+ import XEUtils from 'xe-utils'
3
+
4
+ import type { VxeUIExport, VxeGlobalRendererHandles } from 'vxe-pc-ui'
5
+ import type { VxeTableDefines, VxeColumnPropTypes } from 'vxe-table'
6
+
7
+ /**
8
+ * 表格 - 渲染器
9
+ */
10
+ export function defineTableRender (VxeUI: VxeUIExport) {
11
+ function isEmptyValue (cellValue: any) {
12
+ return cellValue === null || cellValue === undefined || cellValue === ''
13
+ }
14
+
15
+ function getOnName (type: string) {
16
+ return 'on' + type.substring(0, 1).toLocaleUpperCase() + type.substring(1)
17
+ }
18
+
19
+ function getModelProp (renderOpts: VxeGlobalRendererHandles.RenderOptions) {
20
+ let prop = 'value'
21
+ switch (renderOpts.name) {
22
+ case 'ASwitch':
23
+ prop = 'checked'
24
+ break
25
+ }
26
+ return prop
27
+ }
28
+
29
+ function getModelEvent (renderOpts: VxeGlobalRendererHandles.RenderOptions) {
30
+ let type = 'update:value'
31
+ switch (renderOpts.name) {
32
+ case 'ASwitch':
33
+ type = 'update:checked'
34
+ break
35
+ }
36
+ return type
37
+ }
38
+
39
+ function dateFormatToVxeFormat (format: string) {
40
+ if (format) {
41
+ return `${format}`.replace('YYYY', 'yyyy').replace('DD', 'dd')
42
+ }
43
+ return format
44
+ }
45
+
46
+ function getChangeEvent (renderOpts: VxeGlobalRendererHandles.RenderOptions) {
47
+ return 'change'
48
+ }
49
+
50
+ function getCellEditFilterProps (renderOpts: any, params: VxeGlobalRendererHandles.RenderEditParams | VxeGlobalRendererHandles.RenderFilterParams, value: any, defaultProps?: { [prop: string]: any }) {
51
+ return XEUtils.assign({}, defaultProps, renderOpts.props, { [getModelProp(renderOpts)]: value })
52
+ }
53
+
54
+ function formatText (cellValue: any) {
55
+ return '' + (isEmptyValue(cellValue) ? '' : cellValue)
56
+ }
57
+
58
+ function getCellLabelVNs (renderOpts: VxeColumnPropTypes.EditRender, params: VxeGlobalRendererHandles.RenderCellParams, cellLabel: any) {
59
+ const { placeholder } = renderOpts
60
+ return [
61
+ h('span', {
62
+ class: 'vxe-cell--label'
63
+ }, placeholder && isEmptyValue(cellLabel)
64
+ ? [
65
+ h('span', {
66
+ class: 'vxe-cell--placeholder'
67
+ }, formatText(placeholder))
68
+ ]
69
+ : formatText(cellLabel))
70
+ ]
71
+ }
72
+
73
+ function getOns (renderOpts: VxeGlobalRendererHandles.RenderOptions, params: VxeGlobalRendererHandles.RenderParams, inputFunc?: Function, changeFunc?: Function) {
74
+ const { events } = renderOpts
75
+ const modelEvent = getModelEvent(renderOpts)
76
+ const changeEvent = getChangeEvent(renderOpts)
77
+ const isSameEvent = changeEvent === modelEvent
78
+ const ons: { [type: string]: Function } = {}
79
+ XEUtils.objectEach(events, (func: Function, key: string) => {
80
+ ons[getOnName(key)] = function (...args: any[]) {
81
+ func(params, ...args)
82
+ }
83
+ })
84
+ if (inputFunc) {
85
+ ons[getOnName(modelEvent)] = function (targetEvnt: any) {
86
+ inputFunc(targetEvnt)
87
+ if (events && events[modelEvent]) {
88
+ events[modelEvent](params, targetEvnt)
89
+ }
90
+ if (isSameEvent && changeFunc) {
91
+ changeFunc(targetEvnt)
92
+ }
93
+ }
94
+ }
95
+ if (!isSameEvent && changeFunc) {
96
+ ons[getOnName(changeEvent)] = function (...args: any[]) {
97
+ changeFunc(...args)
98
+ if (events && events[changeEvent]) {
99
+ events[changeEvent](params, ...args)
100
+ }
101
+ }
102
+ }
103
+ return ons
104
+ }
105
+
106
+ function getEditOns (renderOpts: VxeGlobalRendererHandles.RenderOptions, params: VxeGlobalRendererHandles.RenderEditParams) {
107
+ const { $table, row, column } = params
108
+ return getOns(renderOpts, params, (value: any) => {
109
+ // 处理 model 值双向绑定
110
+ XEUtils.set(row, column.field, value)
111
+ }, () => {
112
+ // 处理 change 事件相关逻辑
113
+ $table.updateStatus(params)
114
+ })
115
+ }
116
+
117
+ function getFilterOns (renderOpts: any, params: VxeGlobalRendererHandles.RenderFilterParams, option: VxeTableDefines.FilterOption, changeFunc: Function) {
118
+ return getOns(renderOpts, params, (value: any) => {
119
+ // 处理 model 值双向绑定
120
+ option.data = value
121
+ }, changeFunc)
122
+ }
123
+
124
+ function matchCascaderData (index: number, list: any[], values: any[], labels: any[]) {
125
+ const val = values[index]
126
+ if (list && values.length > index) {
127
+ XEUtils.each(list, (item) => {
128
+ if (item.value === val) {
129
+ labels.push(item.label)
130
+ matchCascaderData(++index, item.children, values, labels)
131
+ }
132
+ })
133
+ }
134
+ }
135
+
136
+ function formatDatePicker (defaultFormat?: string) {
137
+ return function (renderOpts: VxeColumnPropTypes.EditRender, params: VxeGlobalRendererHandles.RenderCellParams) {
138
+ return getCellLabelVNs(renderOpts, params, getDatePickerCellValue(renderOpts, params, defaultFormat))
139
+ }
140
+ }
141
+
142
+ function formatTimePicker (defaultFormat?: string) {
143
+ return function (renderOpts: VxeColumnPropTypes.EditRender, params: VxeGlobalRendererHandles.RenderCellParams) {
144
+ const { props = {} } = renderOpts
145
+ const { row, column } = params
146
+ let cellValue = XEUtils.get(row, column.field)
147
+ try {
148
+ if (cellValue) {
149
+ if (!XEUtils.isString(cellValue)) {
150
+ cellValue = cellValue.format ? cellValue.format(props.format || props.valueFormat || defaultFormat) : XEUtils.toDateString(cellValue, dateFormatToVxeFormat(props.format || props.valueFormat || defaultFormat))
151
+ }
152
+ }
153
+ } catch (e) {}
154
+ return getCellLabelVNs(renderOpts, params, cellValue)
155
+ }
156
+ }
157
+
158
+ function getSelectCellValue (renderOpts: VxeColumnPropTypes.EditRender, params: VxeGlobalRendererHandles.RenderCellParams) {
159
+ const { options = [], optionGroups, props = {}, optionProps = {}, optionGroupProps = {} } = renderOpts
160
+ const { row, column } = params
161
+ const labelProp = optionProps.label || 'label'
162
+ const valueProp = optionProps.value || 'value'
163
+ const groupOptions = optionGroupProps.options || 'options'
164
+ const cellValue = XEUtils.get(row, column.field)
165
+ if (!isEmptyValue(cellValue)) {
166
+ return XEUtils.map(props.mode === 'multiple' ? cellValue : [cellValue], optionGroups
167
+ ? (value) => {
168
+ let selectItem
169
+ for (let index = 0; index < optionGroups.length; index++) {
170
+ selectItem = XEUtils.find(optionGroups[index][groupOptions], (item) => item[valueProp] === value)
171
+ if (selectItem) {
172
+ break
173
+ }
174
+ }
175
+ return selectItem ? selectItem[labelProp] : value
176
+ }
177
+ : (value) => {
178
+ const selectItem = XEUtils.find(options, (item) => item[valueProp] === value)
179
+ return selectItem ? selectItem[labelProp] : value
180
+ }).join(', ')
181
+ }
182
+ return ''
183
+ }
184
+
185
+ function getCascaderCellValue (renderOpts: VxeGlobalRendererHandles.RenderOptions, params: VxeGlobalRendererHandles.RenderCellParams | VxeGlobalRendererHandles.ExportMethodParams) {
186
+ const { props = {} } = renderOpts
187
+ const { row, column } = params
188
+ const cellValue = XEUtils.get(row, column.field)
189
+ const values = cellValue || []
190
+ const labels: Array<any> = []
191
+ matchCascaderData(0, props.options, values, labels)
192
+ return (props.showAllLevels === false ? labels.slice(labels.length - 1, labels.length) : labels).join(` ${props.separator || '/'} `)
193
+ }
194
+
195
+ function getRangePickerCellValue (renderOpts: VxeColumnPropTypes.EditRender, params: VxeGlobalRendererHandles.RenderCellParams | VxeGlobalRendererHandles.RenderEditParams) {
196
+ const { props = {} } = renderOpts
197
+ const { row, column } = params
198
+ let cellValue = XEUtils.get(row, column.field)
199
+ if (cellValue) {
200
+ cellValue = XEUtils.map(cellValue, (date: any) => {
201
+ return date && date.format ? date.format(props.format || 'YYYY-MM-DD') : XEUtils.toDateString(date, dateFormatToVxeFormat(props.format || 'YYYY-MM-DD'))
202
+ }).join(' ~ ')
203
+ }
204
+ return cellValue
205
+ }
206
+
207
+ function getTreeSelectCellValue (renderOpts: VxeGlobalRendererHandles.RenderOptions, params: VxeGlobalRendererHandles.RenderCellParams | VxeGlobalRendererHandles.RenderEditParams) {
208
+ const { props = {} } = renderOpts
209
+ const { treeData, treeCheckable } = props
210
+ const { row, column } = params
211
+ const cellValue = XEUtils.get(row, column.field)
212
+ if (!isEmptyValue(cellValue)) {
213
+ return XEUtils.map(treeCheckable ? cellValue : [cellValue], (value) => {
214
+ const matchObj = XEUtils.findTree(treeData, (item: any) => item.value === value, { children: 'children' })
215
+ return matchObj ? matchObj.item.title : value
216
+ }).join(', ')
217
+ }
218
+ return cellValue
219
+ }
220
+
221
+ function getDatePickerCellValue (renderOpts: VxeGlobalRendererHandles.RenderOptions, params: VxeGlobalRendererHandles.RenderCellParams | VxeGlobalRendererHandles.ExportMethodParams, defaultFormat?: string) {
222
+ const { props = {} } = renderOpts
223
+ const { row, column } = params
224
+ let cellValue = XEUtils.get(row, column.field)
225
+ try {
226
+ if (cellValue) {
227
+ if (!defaultFormat) {
228
+ if (renderOpts.name === 'ADatePicker') {
229
+ switch (props.picker) {
230
+ case 'week':
231
+ defaultFormat = 'YYYY-WW周'
232
+ break
233
+ case 'month':
234
+ defaultFormat = 'YYYY-MM'
235
+ break
236
+ case 'year':
237
+ defaultFormat = 'YYYY'
238
+ break
239
+ default:
240
+ defaultFormat = props.showTime ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD'
241
+ break
242
+ }
243
+ }
244
+ }
245
+ cellValue = cellValue.format ? cellValue.format(props.format || defaultFormat) : XEUtils.toDateString(cellValue, dateFormatToVxeFormat(props.format || defaultFormat))
246
+ }
247
+ } catch (e) {}
248
+ return cellValue
249
+ }
250
+
251
+ function createEditRender (defaultProps?: { [key: string]: any }) {
252
+ return function (renderOpts: VxeColumnPropTypes.EditRender & { name: string }, params: VxeGlobalRendererHandles.RenderEditParams) {
253
+ const { row, column } = params
254
+ const { name, attrs } = renderOpts
255
+ const cellValue = XEUtils.get(row, column.field)
256
+ return [
257
+ h(resolveComponent(name), {
258
+ ...attrs,
259
+ ...getCellEditFilterProps(renderOpts, params, cellValue, defaultProps),
260
+ ...getEditOns(renderOpts, params)
261
+ })
262
+ ]
263
+ }
264
+ }
265
+
266
+ function defaultButtonEditRender (renderOpts: VxeColumnPropTypes.EditRender, params: VxeGlobalRendererHandles.RenderEditParams) {
267
+ const { attrs } = renderOpts
268
+ return [
269
+ h(resolveComponent('a-button'), {
270
+ ...attrs,
271
+ ...getCellEditFilterProps(renderOpts, params, null),
272
+ ...getOns(renderOpts, params)
273
+ }, cellText(renderOpts.content))
274
+ ]
275
+ }
276
+
277
+ function defaultButtonsEditRender (renderOpts: VxeColumnPropTypes.EditRender, params: VxeGlobalRendererHandles.RenderEditParams) {
278
+ const { children } = renderOpts
279
+ if (children) {
280
+ return children.map((childRenderOpts: VxeColumnPropTypes.EditRender) => defaultButtonEditRender(childRenderOpts, params)[0])
281
+ }
282
+ return []
283
+ }
284
+
285
+ function createFilterRender (defaultProps?: { [key: string]: any }) {
286
+ return function (renderOpts: VxeColumnPropTypes.FilterRender & { name: string }, params: VxeGlobalRendererHandles.RenderFilterParams) {
287
+ const { column } = params
288
+ const { name, attrs } = renderOpts
289
+ return [
290
+ h('div', {
291
+ class: 'vxe-table--filter-antd-wrapper'
292
+ }, column.filters.map((option, oIndex) => {
293
+ const optionValue = option.data
294
+ return h(resolveComponent(name), {
295
+ key: oIndex,
296
+ ...attrs,
297
+ ...getCellEditFilterProps(renderOpts, params, optionValue, defaultProps),
298
+ ...getFilterOns(renderOpts, params, option, () => {
299
+ // 处理 change 事件相关逻辑
300
+ handleConfirmFilter(params, !!option.data, option)
301
+ })
302
+ })
303
+ }))
304
+ ]
305
+ }
306
+ }
307
+
308
+ function handleConfirmFilter (params: VxeGlobalRendererHandles.RenderFilterParams, checked: boolean, option: VxeTableDefines.FilterOption) {
309
+ const { $panel } = params
310
+ $panel.changeOption(null, checked, option)
311
+ }
312
+
313
+ /**
314
+ * 模糊匹配
315
+ * @param params
316
+ */
317
+ function defaultFuzzyFilterMethod (params: VxeGlobalRendererHandles.FilterMethodParams) {
318
+ const { option, row, column } = params
319
+ const { data } = option
320
+ const cellValue = XEUtils.get(row, column.field)
321
+ return XEUtils.toValueString(cellValue).indexOf(data) > -1
322
+ }
323
+
324
+ /**
325
+ * 精确匹配
326
+ * @param params
327
+ */
328
+ function defaultExactFilterMethod (params: VxeGlobalRendererHandles.FilterMethodParams) {
329
+ const { option, row, column } = params
330
+ const { data } = option
331
+ const cellValue = XEUtils.get(row, column.field)
332
+ /* eslint-disable eqeqeq */
333
+ return cellValue === data
334
+ }
335
+
336
+ function cellText (cellValue: any): string[] {
337
+ return [formatText(cellValue)]
338
+ }
339
+
340
+ function createDatePickerExportMethod (defaultFormat?: string) {
341
+ return function (params: VxeGlobalRendererHandles.ExportMethodParams) {
342
+ const { row, column, options } = params
343
+ return options && options.original ? XEUtils.get(row, column.field) : getDatePickerCellValue(column.editRender || column.cellRender, params, defaultFormat)
344
+ }
345
+ }
346
+
347
+ function createExportMethod (getExportCellValue: Function) {
348
+ return function (params: VxeGlobalRendererHandles.ExportMethodParams) {
349
+ const { row, column, options } = params
350
+ return options && options.original ? XEUtils.get(row, column.field) : getExportCellValue(column.editRender || column.cellRender, params)
351
+ }
352
+ }
353
+
354
+ VxeUI.renderer.mixin({
355
+ AAutoComplete: {
356
+ tableAutoFocus: 'input',
357
+ renderTableDefault: createEditRender(),
358
+ renderTableEdit: createEditRender(),
359
+ renderTableFilter: createFilterRender(),
360
+ tableFilterDefaultMethod: defaultExactFilterMethod
361
+ },
362
+ AInput: {
363
+ tableAutoFocus: 'input',
364
+ renderTableDefault: createEditRender(),
365
+ renderTableEdit: createEditRender(),
366
+ renderTableFilter: createFilterRender(),
367
+ tableFilterDefaultMethod: defaultFuzzyFilterMethod
368
+ },
369
+ AInputNumber: {
370
+ tableAutoFocus: 'input',
371
+ renderTableDefault: createEditRender(),
372
+ renderTableEdit: createEditRender(),
373
+ renderTableFilter: createFilterRender(),
374
+ tableFilterDefaultMethod: defaultFuzzyFilterMethod
375
+ },
376
+ ASelect: {
377
+ renderTableEdit (renderOpts, params) {
378
+ const { options, optionGroups } = renderOpts
379
+ const { row, column } = params
380
+ const { attrs } = renderOpts
381
+ const cellValue = XEUtils.get(row, column.field)
382
+ const props = getCellEditFilterProps(renderOpts, params, cellValue)
383
+ const ons = getEditOns(renderOpts, params)
384
+ if (optionGroups) {
385
+ return [
386
+ h(resolveComponent('a-select') as ComponentOptions, {
387
+ ...props,
388
+ ...attrs,
389
+ options: optionGroups,
390
+ ...ons
391
+ })
392
+ ]
393
+ }
394
+ return [
395
+ h(resolveComponent('a-select') as ComponentOptions, {
396
+ ...props,
397
+ ...attrs,
398
+ options: props.options || options,
399
+ ...ons
400
+ })
401
+ ]
402
+ },
403
+ renderTableCell (renderOpts, params) {
404
+ return getCellLabelVNs(renderOpts, params, getSelectCellValue(renderOpts, params))
405
+ },
406
+ renderTableFilter (renderOpts, params) {
407
+ const { options = [], optionGroups, optionGroupProps = {} } = renderOpts
408
+ const groupOptions = optionGroupProps.options || 'options'
409
+ const { column } = params
410
+ const { attrs } = renderOpts
411
+ return [
412
+ h('div', {
413
+ class: 'vxe-table--filter-antd-wrapper'
414
+ }, optionGroups
415
+ ? column.filters.map((option, oIndex) => {
416
+ const optionValue = option.data
417
+ const props = getCellEditFilterProps(renderOpts, params, optionValue)
418
+ return h(resolveComponent('a-select') as ComponentOptions, {
419
+ key: oIndex,
420
+ ...attrs,
421
+ ...props,
422
+ options: groupOptions,
423
+ ...getFilterOns(renderOpts, params, option, () => {
424
+ // 处理 change 事件相关逻辑
425
+ handleConfirmFilter(params, props.mode === 'multiple' ? (option.data && option.data.length > 0) : !XEUtils.eqNull(option.data), option)
426
+ })
427
+ })
428
+ })
429
+ : column.filters.map((option, oIndex) => {
430
+ const optionValue = option.data
431
+ const props = getCellEditFilterProps(renderOpts, params, optionValue)
432
+ return h(resolveComponent('a-select') as ComponentOptions, {
433
+ key: oIndex,
434
+ ...attrs,
435
+ ...props,
436
+ options: props.options || options,
437
+ ...getFilterOns(renderOpts, params, option, () => {
438
+ // 处理 change 事件相关逻辑
439
+ handleConfirmFilter(params, props.mode === 'multiple' ? (option.data && option.data.length > 0) : !XEUtils.eqNull(option.data), option)
440
+ })
441
+ })
442
+ }))
443
+ ]
444
+ },
445
+ tableFilterDefaultMethod (params) {
446
+ const { option, row, column } = params
447
+ const { data } = option
448
+ const { field, filterRender: renderOpts } = column
449
+ const { props = {} } = renderOpts
450
+ const cellValue = XEUtils.get(row, field)
451
+ if (props.mode === 'multiple') {
452
+ if (XEUtils.isArray(cellValue)) {
453
+ return XEUtils.includeArrays(cellValue, data)
454
+ }
455
+ return data.indexOf(cellValue) > -1
456
+ }
457
+ /* eslint-disable eqeqeq */
458
+ return cellValue == data
459
+ },
460
+ tableExportMethod: createExportMethod(getSelectCellValue)
461
+ },
462
+ ACascader: {
463
+ renderTableEdit: createEditRender(),
464
+ renderTableCell (renderOpts, params) {
465
+ return getCellLabelVNs(renderOpts, params, getCascaderCellValue(renderOpts, params))
466
+ },
467
+ tableExportMethod: createExportMethod(getCascaderCellValue)
468
+ },
469
+ ADatePicker: {
470
+ renderTableEdit: createEditRender(),
471
+ renderTableCell: formatDatePicker(),
472
+ tableExportMethod: createDatePickerExportMethod()
473
+ },
474
+ AMonthPicker: {
475
+ renderTableEdit: createEditRender(),
476
+ renderTableCell: formatDatePicker('YYYY-MM'),
477
+ tableExportMethod: createDatePickerExportMethod('YYYY-MM')
478
+ },
479
+ ARangePicker: {
480
+ renderTableEdit: createEditRender(),
481
+ renderTableCell (renderOpts, params) {
482
+ return getCellLabelVNs(renderOpts, params, getRangePickerCellValue(renderOpts, params))
483
+ },
484
+ tableExportMethod: createExportMethod(getRangePickerCellValue)
485
+ },
486
+ AWeekPicker: {
487
+ renderTableEdit: createEditRender(),
488
+ renderTableCell: formatDatePicker('YYYY-WW周'),
489
+ tableExportMethod: createDatePickerExportMethod('YYYY-WW周')
490
+ },
491
+ ATimePicker: {
492
+ renderTableEdit: createEditRender(),
493
+ renderTableCell: formatTimePicker('HH:mm:ss'),
494
+ tableExportMethod: createDatePickerExportMethod('HH:mm:ss')
495
+ },
496
+ ATreeSelect: {
497
+ renderTableEdit: createEditRender(),
498
+ renderTableCell (renderOpts, params) {
499
+ return getCellLabelVNs(renderOpts, params, getTreeSelectCellValue(renderOpts, params))
500
+ },
501
+ tableExportMethod: createExportMethod(getTreeSelectCellValue)
502
+ },
503
+ ARate: {
504
+ renderTableDefault: createEditRender(),
505
+ renderTableEdit: createEditRender(),
506
+ renderTableFilter: createFilterRender(),
507
+ tableFilterDefaultMethod: defaultExactFilterMethod
508
+ },
509
+ ASwitch: {
510
+ renderTableDefault: createEditRender(),
511
+ renderTableEdit: createEditRender(),
512
+ renderTableFilter (renderOpts, params) {
513
+ const { column } = params
514
+ const { name, attrs } = renderOpts
515
+ return [
516
+ h('div', {
517
+ class: 'vxe-table--filter-antd-wrapper'
518
+ }, column.filters.map((option, oIndex) => {
519
+ const optionValue = option.data
520
+ return h(name as string, {
521
+ key: oIndex,
522
+ ...attrs,
523
+ ...getCellEditFilterProps(renderOpts, params, optionValue),
524
+ ...getFilterOns(renderOpts, params, option, () => {
525
+ // 处理 change 事件相关逻辑
526
+ handleConfirmFilter(params, XEUtils.isBoolean(option.data), option)
527
+ })
528
+ })
529
+ }))
530
+ ]
531
+ },
532
+ tableFilterDefaultMethod: defaultExactFilterMethod
533
+ },
534
+ AButton: {
535
+ renderTableEdit: defaultButtonEditRender,
536
+ renderTableDefault: defaultButtonEditRender
537
+ },
538
+ AButtons: {
539
+ renderTableEdit: defaultButtonsEditRender,
540
+ renderTableDefault: defaultButtonsEditRender
541
+ }
542
+ })
543
+ }