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

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,542 @@
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, 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
+ }