@vxe-ui/plugin-render-antd 4.0.1 → 4.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.
@@ -0,0 +1,508 @@
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 getSelectCellValue (renderOpts: VxeColumnPropTypes.EditRender, params: VxeGlobalRendererHandles.RenderCellParams) {
142
+ const { options = [], optionGroups, props = {}, optionProps = {}, optionGroupProps = {} } = renderOpts
143
+ const { row, column } = params
144
+ const labelProp = optionProps.label || 'label'
145
+ const valueProp = optionProps.value || 'value'
146
+ const groupOptions = optionGroupProps.options || 'options'
147
+ const cellValue = XEUtils.get(row, column.field)
148
+ if (!isEmptyValue(cellValue)) {
149
+ return XEUtils.map(props.mode === 'multiple' ? cellValue : [cellValue], optionGroups
150
+ ? (value) => {
151
+ let selectItem
152
+ for (let index = 0; index < optionGroups.length; index++) {
153
+ selectItem = XEUtils.find(optionGroups[index][groupOptions], (item) => item[valueProp] === value)
154
+ if (selectItem) {
155
+ break
156
+ }
157
+ }
158
+ return selectItem ? selectItem[labelProp] : value
159
+ }
160
+ : (value) => {
161
+ const selectItem = XEUtils.find(options, (item) => item[valueProp] === value)
162
+ return selectItem ? selectItem[labelProp] : value
163
+ }).join(', ')
164
+ }
165
+ return ''
166
+ }
167
+
168
+ function getCascaderCellValue (renderOpts: VxeGlobalRendererHandles.RenderOptions, params: VxeGlobalRendererHandles.RenderCellParams | VxeGlobalRendererHandles.ExportMethodParams) {
169
+ const { props = {} } = renderOpts
170
+ const { row, column } = params
171
+ const cellValue = XEUtils.get(row, column.field)
172
+ const values = cellValue || []
173
+ const labels: Array<any> = []
174
+ matchCascaderData(0, props.options, values, labels)
175
+ return (props.showAllLevels === false ? labels.slice(labels.length - 1, labels.length) : labels).join(` ${props.separator || '/'} `)
176
+ }
177
+
178
+ function getRangePickerCellValue (renderOpts: VxeColumnPropTypes.EditRender, params: VxeGlobalRendererHandles.RenderCellParams | VxeGlobalRendererHandles.RenderEditParams) {
179
+ const { props = {} } = renderOpts
180
+ const { row, column } = params
181
+ let cellValue = XEUtils.get(row, column.field)
182
+ if (cellValue) {
183
+ cellValue = XEUtils.map(cellValue, (date: any) => {
184
+ return date && date.format ? date.format(props.format || 'YYYY-MM-DD') : XEUtils.toDateString(date, dateFormatToVxeFormat(props.format || 'YYYY-MM-DD'))
185
+ }).join(' ~ ')
186
+ }
187
+ return cellValue
188
+ }
189
+
190
+ function getTreeSelectCellValue (renderOpts: VxeGlobalRendererHandles.RenderOptions, params: VxeGlobalRendererHandles.RenderCellParams | VxeGlobalRendererHandles.RenderEditParams) {
191
+ const { props = {} } = renderOpts
192
+ const { treeData, treeCheckable } = props
193
+ const { row, column } = params
194
+ const cellValue = XEUtils.get(row, column.field)
195
+ if (!isEmptyValue(cellValue)) {
196
+ return XEUtils.map(treeCheckable ? cellValue : [cellValue], (value) => {
197
+ const matchObj = XEUtils.findTree(treeData, (item: any) => item.value === value, { children: 'children' })
198
+ return matchObj ? matchObj.item.title : value
199
+ }).join(', ')
200
+ }
201
+ return cellValue
202
+ }
203
+
204
+ function getDatePickerCellValue (renderOpts: VxeGlobalRendererHandles.RenderOptions, params: VxeGlobalRendererHandles.RenderCellParams | VxeGlobalRendererHandles.ExportMethodParams, defaultFormat: string) {
205
+ const { props = {} } = renderOpts
206
+ const { row, column } = params
207
+ let cellValue = XEUtils.get(row, column.field)
208
+ try {
209
+ if (cellValue) {
210
+ cellValue = cellValue.format ? cellValue.format(props.format || defaultFormat) : XEUtils.toDateString(cellValue, dateFormatToVxeFormat(props.format || defaultFormat))
211
+ }
212
+ } catch (e) {}
213
+ return cellValue
214
+ }
215
+
216
+ function createEditRender (defaultProps?: { [key: string]: any }) {
217
+ return function (renderOpts: VxeColumnPropTypes.EditRender & { name: string }, params: VxeGlobalRendererHandles.RenderEditParams) {
218
+ const { row, column } = params
219
+ const { name, attrs } = renderOpts
220
+ const cellValue = XEUtils.get(row, column.field)
221
+ return [
222
+ h(resolveComponent(name), {
223
+ ...attrs,
224
+ ...getCellEditFilterProps(renderOpts, params, cellValue, defaultProps),
225
+ ...getEditOns(renderOpts, params)
226
+ })
227
+ ]
228
+ }
229
+ }
230
+
231
+ function defaultButtonEditRender (renderOpts: VxeColumnPropTypes.EditRender, params: VxeGlobalRendererHandles.RenderEditParams) {
232
+ const { attrs } = renderOpts
233
+ return [
234
+ h(resolveComponent('a-button'), {
235
+ ...attrs,
236
+ ...getCellEditFilterProps(renderOpts, params, null),
237
+ ...getOns(renderOpts, params)
238
+ }, cellText(renderOpts.content))
239
+ ]
240
+ }
241
+
242
+ function defaultButtonsEditRender (renderOpts: VxeColumnPropTypes.EditRender, params: VxeGlobalRendererHandles.RenderEditParams) {
243
+ const { children } = renderOpts
244
+ if (children) {
245
+ return children.map((childRenderOpts: VxeColumnPropTypes.EditRender) => defaultButtonEditRender(childRenderOpts, params)[0])
246
+ }
247
+ return []
248
+ }
249
+
250
+ function createFilterRender (defaultProps?: { [key: string]: any }) {
251
+ return function (renderOpts: VxeColumnPropTypes.FilterRender & { name: string }, params: VxeGlobalRendererHandles.RenderFilterParams) {
252
+ const { column } = params
253
+ const { name, attrs } = renderOpts
254
+ return [
255
+ h('div', {
256
+ class: 'vxe-table--filter-antd-wrapper'
257
+ }, column.filters.map((option, oIndex) => {
258
+ const optionValue = option.data
259
+ return h(resolveComponent(name), {
260
+ key: oIndex,
261
+ ...attrs,
262
+ ...getCellEditFilterProps(renderOpts, params, optionValue, defaultProps),
263
+ ...getFilterOns(renderOpts, params, option, () => {
264
+ // 处理 change 事件相关逻辑
265
+ handleConfirmFilter(params, !!option.data, option)
266
+ })
267
+ })
268
+ }))
269
+ ]
270
+ }
271
+ }
272
+
273
+ function handleConfirmFilter (params: VxeGlobalRendererHandles.RenderFilterParams, checked: boolean, option: VxeTableDefines.FilterOption) {
274
+ const { $panel } = params
275
+ $panel.changeOption(null, checked, option)
276
+ }
277
+
278
+ /**
279
+ * 模糊匹配
280
+ * @param params
281
+ */
282
+ function defaultFuzzyFilterMethod (params: VxeGlobalRendererHandles.FilterMethodParams) {
283
+ const { option, row, column } = params
284
+ const { data } = option
285
+ const cellValue = XEUtils.get(row, column.field)
286
+ return XEUtils.toValueString(cellValue).indexOf(data) > -1
287
+ }
288
+
289
+ /**
290
+ * 精确匹配
291
+ * @param params
292
+ */
293
+ function defaultExactFilterMethod (params: VxeGlobalRendererHandles.FilterMethodParams) {
294
+ const { option, row, column } = params
295
+ const { data } = option
296
+ const cellValue = XEUtils.get(row, column.field)
297
+ /* eslint-disable eqeqeq */
298
+ return cellValue === data
299
+ }
300
+
301
+ function cellText (cellValue: any): string[] {
302
+ return [formatText(cellValue)]
303
+ }
304
+
305
+ function createDatePickerExportMethod (defaultFormat: string) {
306
+ return function (params: VxeGlobalRendererHandles.ExportMethodParams) {
307
+ const { row, column, options } = params
308
+ return options && options.original ? XEUtils.get(row, column.field) : getDatePickerCellValue(column.editRender || column.cellRender, params, defaultFormat)
309
+ }
310
+ }
311
+
312
+ function createExportMethod (getExportCellValue: Function) {
313
+ return function (params: VxeGlobalRendererHandles.ExportMethodParams) {
314
+ const { row, column, options } = params
315
+ return options && options.original ? XEUtils.get(row, column.field) : getExportCellValue(column.editRender || column.cellRender, params)
316
+ }
317
+ }
318
+
319
+ VxeUI.renderer.mixin({
320
+ AAutoComplete: {
321
+ tableAutoFocus: 'input.ant-input',
322
+ renderTableDefault: createEditRender(),
323
+ renderTableEdit: createEditRender(),
324
+ renderTableFilter: createFilterRender(),
325
+ tableFilterDefaultMethod: defaultExactFilterMethod
326
+ },
327
+ AInput: {
328
+ tableAutoFocus: 'input.ant-input',
329
+ renderTableDefault: createEditRender(),
330
+ renderTableEdit: createEditRender(),
331
+ renderTableFilter: createFilterRender(),
332
+ tableFilterDefaultMethod: defaultFuzzyFilterMethod
333
+ },
334
+ AInputNumber: {
335
+ tableAutoFocus: 'input.ant-input-number-input',
336
+ renderTableDefault: createEditRender(),
337
+ renderTableEdit: createEditRender(),
338
+ renderTableFilter: createFilterRender(),
339
+ tableFilterDefaultMethod: defaultFuzzyFilterMethod
340
+ },
341
+ ASelect: {
342
+ renderTableEdit (renderOpts, params) {
343
+ const { options, optionGroups } = renderOpts
344
+ const { row, column } = params
345
+ const { attrs } = renderOpts
346
+ const cellValue = XEUtils.get(row, column.field)
347
+ const props = getCellEditFilterProps(renderOpts, params, cellValue)
348
+ const ons = getEditOns(renderOpts, params)
349
+ if (optionGroups) {
350
+ return [
351
+ h(resolveComponent('a-select') as ComponentOptions, {
352
+ ...props,
353
+ ...attrs,
354
+ options: optionGroups,
355
+ ...ons
356
+ })
357
+ ]
358
+ }
359
+ return [
360
+ h(resolveComponent('a-select') as ComponentOptions, {
361
+ ...props,
362
+ ...attrs,
363
+ options: props.options || options,
364
+ ...ons
365
+ })
366
+ ]
367
+ },
368
+ renderTableCell (renderOpts, params) {
369
+ return getCellLabelVNs(renderOpts, params, getSelectCellValue(renderOpts, params))
370
+ },
371
+ renderTableFilter (renderOpts, params) {
372
+ const { options = [], optionGroups, optionGroupProps = {} } = renderOpts
373
+ const groupOptions = optionGroupProps.options || 'options'
374
+ const { column } = params
375
+ const { attrs } = renderOpts
376
+ return [
377
+ h('div', {
378
+ class: 'vxe-table--filter-antd-wrapper'
379
+ }, optionGroups
380
+ ? column.filters.map((option, oIndex) => {
381
+ const optionValue = option.data
382
+ const props = getCellEditFilterProps(renderOpts, params, optionValue)
383
+ return h(resolveComponent('a-select') as ComponentOptions, {
384
+ key: oIndex,
385
+ ...attrs,
386
+ ...props,
387
+ options: groupOptions,
388
+ ...getFilterOns(renderOpts, params, option, () => {
389
+ // 处理 change 事件相关逻辑
390
+ handleConfirmFilter(params, props.mode === 'multiple' ? (option.data && option.data.length > 0) : !XEUtils.eqNull(option.data), option)
391
+ })
392
+ })
393
+ })
394
+ : column.filters.map((option, oIndex) => {
395
+ const optionValue = option.data
396
+ const props = getCellEditFilterProps(renderOpts, params, optionValue)
397
+ return h(resolveComponent('a-select') as ComponentOptions, {
398
+ key: oIndex,
399
+ ...attrs,
400
+ ...props,
401
+ options: props.options || options,
402
+ ...getFilterOns(renderOpts, params, option, () => {
403
+ // 处理 change 事件相关逻辑
404
+ handleConfirmFilter(params, props.mode === 'multiple' ? (option.data && option.data.length > 0) : !XEUtils.eqNull(option.data), option)
405
+ })
406
+ })
407
+ }))
408
+ ]
409
+ },
410
+ tableFilterDefaultMethod (params) {
411
+ const { option, row, column } = params
412
+ const { data } = option
413
+ const { field, filterRender: renderOpts } = column
414
+ const { props = {} } = renderOpts
415
+ const cellValue = XEUtils.get(row, field)
416
+ if (props.mode === 'multiple') {
417
+ if (XEUtils.isArray(cellValue)) {
418
+ return XEUtils.includeArrays(cellValue, data)
419
+ }
420
+ return data.indexOf(cellValue) > -1
421
+ }
422
+ /* eslint-disable eqeqeq */
423
+ return cellValue == data
424
+ },
425
+ tableExportMethod: createExportMethod(getSelectCellValue)
426
+ },
427
+ ACascader: {
428
+ renderTableEdit: createEditRender(),
429
+ renderTableCell (renderOpts, params) {
430
+ return getCellLabelVNs(renderOpts, params, getCascaderCellValue(renderOpts, params))
431
+ },
432
+ tableExportMethod: createExportMethod(getCascaderCellValue)
433
+ },
434
+ ADatePicker: {
435
+ renderTableEdit: createEditRender(),
436
+ renderTableCell: formatDatePicker('YYYY-MM-DD'),
437
+ tableExportMethod: createDatePickerExportMethod('YYYY-MM-DD')
438
+ },
439
+ AMonthPicker: {
440
+ renderTableEdit: createEditRender(),
441
+ renderTableCell: formatDatePicker('YYYY-MM'),
442
+ tableExportMethod: createDatePickerExportMethod('YYYY-MM')
443
+ },
444
+ ARangePicker: {
445
+ renderTableEdit: createEditRender(),
446
+ renderTableCell (renderOpts, params) {
447
+ return getCellLabelVNs(renderOpts, params, getRangePickerCellValue(renderOpts, params))
448
+ },
449
+ tableExportMethod: createExportMethod(getRangePickerCellValue)
450
+ },
451
+ AWeekPicker: {
452
+ renderTableEdit: createEditRender(),
453
+ renderTableCell: formatDatePicker('YYYY-WW周'),
454
+ tableExportMethod: createDatePickerExportMethod('YYYY-WW周')
455
+ },
456
+ ATimePicker: {
457
+ renderTableEdit: createEditRender(),
458
+ renderTableCell: formatDatePicker('HH:mm:ss'),
459
+ tableExportMethod: createDatePickerExportMethod('HH:mm:ss')
460
+ },
461
+ ATreeSelect: {
462
+ renderTableEdit: createEditRender(),
463
+ renderTableCell (renderOpts, params) {
464
+ return getCellLabelVNs(renderOpts, params, getTreeSelectCellValue(renderOpts, params))
465
+ },
466
+ tableExportMethod: createExportMethod(getTreeSelectCellValue)
467
+ },
468
+ ARate: {
469
+ renderTableDefault: createEditRender(),
470
+ renderTableEdit: createEditRender(),
471
+ renderTableFilter: createFilterRender(),
472
+ tableFilterDefaultMethod: defaultExactFilterMethod
473
+ },
474
+ ASwitch: {
475
+ renderTableDefault: createEditRender(),
476
+ renderTableEdit: createEditRender(),
477
+ renderTableFilter (renderOpts, params) {
478
+ const { column } = params
479
+ const { name, attrs } = renderOpts
480
+ return [
481
+ h('div', {
482
+ class: 'vxe-table--filter-antd-wrapper'
483
+ }, column.filters.map((option, oIndex) => {
484
+ const optionValue = option.data
485
+ return h(name as string, {
486
+ key: oIndex,
487
+ ...attrs,
488
+ ...getCellEditFilterProps(renderOpts, params, optionValue),
489
+ ...getFilterOns(renderOpts, params, option, () => {
490
+ // 处理 change 事件相关逻辑
491
+ handleConfirmFilter(params, XEUtils.isBoolean(option.data), option)
492
+ })
493
+ })
494
+ }))
495
+ ]
496
+ },
497
+ tableFilterDefaultMethod: defaultExactFilterMethod
498
+ },
499
+ AButton: {
500
+ renderTableEdit: defaultButtonEditRender,
501
+ renderTableDefault: defaultButtonEditRender
502
+ },
503
+ AButtons: {
504
+ renderTableEdit: defaultButtonsEditRender,
505
+ renderTableDefault: defaultButtonsEditRender
506
+ }
507
+ })
508
+ }