@vxe-ui/plugin-render-antd 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2019 Xu Liangzhan
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,149 @@
1
+ # @vxe-ui/plugin-render-antd
2
+
3
+ [Vxe UI](https://vxeui.com/) plug-in for compatibility with the [ant-design-vue](https://www.npmjs.com/package/ant-design-vue) component.
4
+
5
+ ## Compatibility
6
+
7
+ It corresponds to [vxe-table v4](https://www.npmjs.com/package/vxe-table) | [vxe-pc-ui v4](https://www.npmjs.com/package/vxe-pc-ui)
8
+
9
+ ## Installing
10
+
11
+ ```shell
12
+ npm install @vxe-ui/plugin-render-antd
13
+ ```
14
+
15
+ ```javascript
16
+ // ...
17
+ // Use vxe-pc-ui
18
+ import { VxeUI } from 'vxe-pc-ui'
19
+ // Use vxe-table
20
+ // import { VxeUI } from 'vxe-table'
21
+ import VxeUIPluginRenderAntd from '@vxe-ui/plugin-render-antd'
22
+ import '@vxe-ui/plugin-render-antd/dist/style.css'
23
+ // ...
24
+
25
+ VxeUI.use(VxeUIPluginRenderAntd)
26
+ ```
27
+
28
+
29
+ ## API
30
+
31
+ ### cell-render 默认的渲染器配置项说明
32
+
33
+ | 属性 | 描述 | 类型 | 可选值 | 默认值 |
34
+ |------|------|-----|-----|-----|
35
+ | name | 支持的渲染组件 | String | AInput, AAutocomplete, AInputNumber, ASwitch, ARate, AButton, AButtons | — |
36
+ | props | 渲染组件附加属性,参数请查看被渲染的 Component props | Object | — | {} |
37
+ | options | 只对 name=ASelect 有效,下拉组件选项列表 | Array | — | [] |
38
+ | optionProps | 只对 name=ASelect 有效,下拉组件选项属性参数配置 | Object | — | { value: 'value', label: 'label' } |
39
+ | optionGroups | 只对 name=ASelect 有效,下拉组件分组选项列表 | Array | — | [] |
40
+ | optionGroupProps | 只对 name=ASelect 有效,下拉组件分组选项属性参数配置 | Object | — | { options: 'options', label: 'label' } |
41
+ | events | 渲染组件附加事件,参数为 ( {row,rowIndex,column,columnIndex}, ...Component arguments ) | Object | — | — |
42
+ | nativeEvents | 渲染组件附加事件,参数为 ( {row,rowIndex,column,columnIndex}, ...Component arguments ) | Object | — | — |
43
+
44
+ ### edit-render 可编辑渲染器配置项说明
45
+
46
+ | 属性 | 描述 | 类型 | 可选值 | 默认值 |
47
+ |------|------|-----|-----|-----|
48
+ | name | 支持的渲染组件 | String | AInput, AAutocomplete, AInputNumber, ASelect, ACascader, ADatePicker, AMonthPicker, ARangePicker, AWeekPicker, ATimePicker, ATreeSelect, ASwitch, ARate, AButton, AButtons | — |
49
+ | props | 渲染组件附加属性,参数请查看被渲染的 Component props | Object | — | {} |
50
+ | options | 只对 name=ASelect 有效,下拉组件选项列表 | Array | — | [] |
51
+ | optionProps | 只对 name=ASelect 有效,下拉组件选项属性参数配置 | Object | — | { value: 'value', label: 'label' } |
52
+ | optionGroups | 只对 name=ASelect 有效,下拉组件分组选项列表 | Array | — | [] |
53
+ | optionGroupProps | 只对 name=ASelect 有效,下拉组件分组选项属性参数配置 | Object | — | { options: 'options', label: 'label' } |
54
+ | events | 渲染组件附加事件,参数为 ( {row,rowIndex,column,columnIndex}, ...Component arguments ) | Object | — | — |
55
+ | nativeEvents | 渲染组件附加事件,参数为 ( {row,rowIndex,column,columnIndex}, ...Component arguments ) | Object | — | — |
56
+
57
+ ### filter-render 筛选渲染器配置项说明
58
+
59
+ | 属性 | 描述 | 类型 | 可选值 | 默认值 |
60
+ |------|------|-----|-----|-----|
61
+ | name | 支持的渲染组件 | String | AInput, AAutocomplete, AInputNumber, ASelect, ASwitch, ARate | — |
62
+ | props | 渲染组件附加属性,参数请查看被渲染的 Component props | Object | — | {} |
63
+ | options | 只对 name=ASelect 有效,下拉组件选项列表 | Array | — | [] |
64
+ | optionProps | 只对 name=ASelect 有效,下拉组件选项属性参数配置 | Object | — | { value: 'value', label: 'label' } |
65
+ | optionGroups | 只对 name=ASelect 有效,下拉组件分组选项列表 | Array | — | [] |
66
+ | optionGroupProps | 只对 name=ASelect 有效,下拉组件分组选项属性参数配置 | Object | — | { options: 'options', label: 'label' } |
67
+ | events | 渲染组件附加事件,参数为 ( {}, ...Component arguments ) | Object | — | — |
68
+ | nativeEvents | 渲染组件附加事件,参数为 ( {}, ...Component arguments ) | Object | — | — |
69
+
70
+ ### item-render 表单-项选渲染器配置项说明
71
+
72
+ | 属性 | 描述 | 类型 | 可选值 | 默认值 |
73
+ |------|------|-----|-----|-----|
74
+ | name | 支持的渲染组件 | String | AInput, AAutocomplete, AInputNumber, ASelect, ASwitch, ARate, ARadio, ACheckbox, AButton, AButtons | — |
75
+ | props | 渲染组件附加属性,参数请查看被渲染的 Component props | Object | — | {} |
76
+ | options | 只对 name=ASelect 有效,下拉组件选项列表 | Array | — | [] |
77
+ | optionProps | 只对 name=ASelect 有效,下拉组件选项属性参数配置 | Object | — | { value: 'value', label: 'label' } |
78
+ | optionGroups | 只对 name=ASelect 有效,下拉组件分组选项列表 | Array | — | [] |
79
+ | optionGroupProps | 只对 name=ASelect 有效,下拉组件分组选项属性参数配置 | Object | — | { options: 'options', label: 'label' } |
80
+ | events | 渲染组件附加事件,参数为 ( {}, ...Component arguments ) | Object | — | — |
81
+ | nativeEvents | 渲染组件附加事件,参数为 ( {}, ...Component arguments ) | Object | — | — |
82
+
83
+ ## Cell demo
84
+
85
+ ```html
86
+ <vxe-table
87
+ height="600"
88
+ :data="tableData"
89
+ :edit-config="{trigger: 'click', mode: 'cell'}">
90
+ <vxe-column field="name" title="Name" :edit-render="{name: 'AInput'}"></vxe-column>
91
+ <vxe-column field="age" title="Age" :edit-render="{name: 'AInputNumber'}"></vxe-column>
92
+ <vxe-column field="date" title="Date" width="200" :edit-render="{name: 'ADatePicker'}"></vxe-column>
93
+ </vxe-table>
94
+ ```
95
+
96
+ ```javascript
97
+ export default {
98
+ data () {
99
+ return {
100
+ tableData: [
101
+ { id: 100, name: 'test0', age: 28, sex: '1', date: '' },
102
+ { id: 101, name: 'test1', age: 32, sex: '0', date: '' },
103
+ { id: 102, name: 'test2', age: 36, sex: '1', date: '' }
104
+ ]
105
+ }
106
+ }
107
+ }
108
+ ```
109
+
110
+ ## Filter demo
111
+
112
+ ```html
113
+ <vxe-table
114
+ height="600"
115
+ :data="tableData">
116
+ <vxe-column field="name" title="Name":filters="nameOptions" :filter-render="{name: 'AInput'}"></vxe-column>
117
+ <vxe-column field="age" title="Age"></vxe-column>
118
+ <vxe-column field="date" title="Date" ></vxe-column>
119
+ </vxe-table>
120
+ ```
121
+
122
+ ```javascript
123
+ import { defineComponent } from 'vue'
124
+
125
+ export default defineComponent({
126
+ setup () {
127
+ return {
128
+ nameOptions: [
129
+ { data: '' }
130
+ ],
131
+ tableData: [
132
+ { id: 100, name: 'test0', age: 28, date: '' },
133
+ { id: 101, name: 'test1', age: 32, date: '' },
134
+ { id: 102, name: 'test2', age: 36, date: '' }
135
+ ]
136
+ }
137
+ }
138
+ })
139
+ ```
140
+
141
+ ## Contributors
142
+
143
+ Thank you to everyone who contributed to this project.
144
+
145
+ [![vxe-ui-plugins](https://contrib.rocks/image?repo=x-extends/vxe-ui-plugins)](https://github.com/x-extends/vxe-ui-plugins/graphs/contributors)
146
+
147
+ ## License
148
+
149
+ [MIT](LICENSE) © 2019-present, Xu Liangzhan
package/index.ts ADDED
@@ -0,0 +1,757 @@
1
+ import { h, resolveComponent, ComponentOptions } from 'vue'
2
+ import XEUtils from 'xe-utils'
3
+
4
+ import type { VxeUIExport, VxeTableDefines, VxeColumnPropTypes, VxeGlobalRendererHandles, VxeGlobalInterceptorHandles, FormItemContentRenderParams } from 'vxe-pc-ui'
5
+
6
+ let VxeUI: VxeUIExport
7
+ // eslint-disable-next-line no-unused-vars
8
+ let Antd: any
9
+
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 getItemProps (renderOpts: VxeGlobalRendererHandles.RenderOptions, params: FormItemContentRenderParams, value: any, defaultProps?: { [prop: string]: any }) {
54
+ return XEUtils.assign({}, defaultProps, renderOpts.props, { [getModelProp(renderOpts)]: value })
55
+ }
56
+
57
+ function formatText (cellValue: any) {
58
+ return '' + (isEmptyValue(cellValue) ? '' : cellValue)
59
+ }
60
+
61
+ function getCellLabelVNs (renderOpts: VxeColumnPropTypes.EditRender, params: VxeGlobalRendererHandles.RenderCellParams, cellLabel: any) {
62
+ const { placeholder } = renderOpts
63
+ return [
64
+ h('span', {
65
+ class: 'vxe-cell--label'
66
+ }, placeholder && isEmptyValue(cellLabel)
67
+ ? [
68
+ h('span', {
69
+ class: 'vxe-cell--placeholder'
70
+ }, formatText(placeholder))
71
+ ]
72
+ : formatText(cellLabel))
73
+ ]
74
+ }
75
+
76
+ function getOns (renderOpts: VxeGlobalRendererHandles.RenderOptions, params: VxeGlobalRendererHandles.RenderParams, inputFunc?: Function, changeFunc?: Function) {
77
+ const { events } = renderOpts
78
+ const modelEvent = getModelEvent(renderOpts)
79
+ const changeEvent = getChangeEvent(renderOpts)
80
+ const isSameEvent = changeEvent === modelEvent
81
+ const ons: { [type: string]: Function } = {}
82
+ XEUtils.objectEach(events, (func: Function, key: string) => {
83
+ ons[getOnName(key)] = function (...args: any[]) {
84
+ func(params, ...args)
85
+ }
86
+ })
87
+ if (inputFunc) {
88
+ ons[getOnName(modelEvent)] = function (targetEvnt: any) {
89
+ inputFunc(targetEvnt)
90
+ if (events && events[modelEvent]) {
91
+ events[modelEvent](params, targetEvnt)
92
+ }
93
+ if (isSameEvent && changeFunc) {
94
+ changeFunc(targetEvnt)
95
+ }
96
+ }
97
+ }
98
+ if (!isSameEvent && changeFunc) {
99
+ ons[getOnName(changeEvent)] = function (...args: any[]) {
100
+ changeFunc(...args)
101
+ if (events && events[changeEvent]) {
102
+ events[changeEvent](params, ...args)
103
+ }
104
+ }
105
+ }
106
+ return ons
107
+ }
108
+
109
+ function getEditOns (renderOpts: VxeGlobalRendererHandles.RenderOptions, params: VxeGlobalRendererHandles.RenderEditParams) {
110
+ const { $table, row, column } = params
111
+ return getOns(renderOpts, params, (value: any) => {
112
+ // 处理 model 值双向绑定
113
+ XEUtils.set(row, column.field, value)
114
+ }, () => {
115
+ // 处理 change 事件相关逻辑
116
+ $table.updateStatus(params)
117
+ })
118
+ }
119
+
120
+ function getFilterOns (renderOpts: any, params: VxeGlobalRendererHandles.RenderFilterParams, option: VxeTableDefines.FilterOption, changeFunc: Function) {
121
+ return getOns(renderOpts, params, (value: any) => {
122
+ // 处理 model 值双向绑定
123
+ option.data = value
124
+ }, changeFunc)
125
+ }
126
+
127
+ function getItemOns (renderOpts: VxeGlobalRendererHandles.RenderOptions, params: FormItemContentRenderParams) {
128
+ const { $form, data, field } = params
129
+ return getOns(renderOpts, params, (value: any) => {
130
+ // 处理 model 值双向绑定
131
+ XEUtils.set(data, field, value)
132
+ }, () => {
133
+ // 处理 change 事件相关逻辑
134
+ $form.updateStatus(params)
135
+ })
136
+ }
137
+
138
+ function matchCascaderData (index: number, list: any[], values: any[], labels: any[]) {
139
+ const val = values[index]
140
+ if (list && values.length > index) {
141
+ XEUtils.each(list, (item) => {
142
+ if (item.value === val) {
143
+ labels.push(item.label)
144
+ matchCascaderData(++index, item.children, values, labels)
145
+ }
146
+ })
147
+ }
148
+ }
149
+
150
+ function formatDatePicker (defaultFormat: string) {
151
+ return function (renderOpts: VxeColumnPropTypes.EditRender, params: VxeGlobalRendererHandles.RenderCellParams) {
152
+ return getCellLabelVNs(renderOpts, params, getDatePickerCellValue(renderOpts, params, defaultFormat))
153
+ }
154
+ }
155
+
156
+ function getSelectCellValue (renderOpts: VxeColumnPropTypes.EditRender, params: VxeGlobalRendererHandles.RenderCellParams) {
157
+ const { options = [], optionGroups, props = {}, optionProps = {}, optionGroupProps = {} } = renderOpts
158
+ const { row, column } = params
159
+ const labelProp = optionProps.label || 'label'
160
+ const valueProp = optionProps.value || 'value'
161
+ const groupOptions = optionGroupProps.options || 'options'
162
+ const cellValue = XEUtils.get(row, column.field)
163
+ if (!isEmptyValue(cellValue)) {
164
+ return XEUtils.map(props.mode === 'multiple' ? cellValue : [cellValue], optionGroups
165
+ ? (value) => {
166
+ let selectItem
167
+ for (let index = 0; index < optionGroups.length; index++) {
168
+ selectItem = XEUtils.find(optionGroups[index][groupOptions], (item) => item[valueProp] === value)
169
+ if (selectItem) {
170
+ break
171
+ }
172
+ }
173
+ return selectItem ? selectItem[labelProp] : value
174
+ }
175
+ : (value) => {
176
+ const selectItem = XEUtils.find(options, (item) => item[valueProp] === value)
177
+ return selectItem ? selectItem[labelProp] : value
178
+ }).join(', ')
179
+ }
180
+ return ''
181
+ }
182
+
183
+ function getCascaderCellValue (renderOpts: VxeGlobalRendererHandles.RenderOptions, params: VxeGlobalRendererHandles.RenderCellParams | VxeGlobalRendererHandles.ExportMethodParams) {
184
+ const { props = {} } = renderOpts
185
+ const { row, column } = params
186
+ const cellValue = XEUtils.get(row, column.field)
187
+ const values = cellValue || []
188
+ const labels: Array<any> = []
189
+ matchCascaderData(0, props.options, values, labels)
190
+ return (props.showAllLevels === false ? labels.slice(labels.length - 1, labels.length) : labels).join(` ${props.separator || '/'} `)
191
+ }
192
+
193
+ function getRangePickerCellValue (renderOpts: VxeColumnPropTypes.EditRender, params: VxeGlobalRendererHandles.RenderCellParams | VxeGlobalRendererHandles.RenderEditParams) {
194
+ const { props = {} } = renderOpts
195
+ const { row, column } = params
196
+ let cellValue = XEUtils.get(row, column.field)
197
+ if (cellValue) {
198
+ cellValue = XEUtils.map(cellValue, (date: any) => {
199
+ return date && date.format ? date.format(props.format || 'YYYY-MM-DD') : XEUtils.toDateString(date, dateFormatToVxeFormat(props.format || 'YYYY-MM-DD'))
200
+ }).join(' ~ ')
201
+ }
202
+ return cellValue
203
+ }
204
+
205
+ function getTreeSelectCellValue (renderOpts: VxeGlobalRendererHandles.RenderOptions, params: VxeGlobalRendererHandles.RenderCellParams | VxeGlobalRendererHandles.RenderEditParams) {
206
+ const { props = {} } = renderOpts
207
+ const { treeData, treeCheckable } = props
208
+ const { row, column } = params
209
+ const cellValue = XEUtils.get(row, column.field)
210
+ if (!isEmptyValue(cellValue)) {
211
+ return XEUtils.map(treeCheckable ? cellValue : [cellValue], (value) => {
212
+ const matchObj = XEUtils.findTree(treeData, (item: any) => item.value === value, { children: 'children' })
213
+ return matchObj ? matchObj.item.title : value
214
+ }).join(', ')
215
+ }
216
+ return cellValue
217
+ }
218
+
219
+ function getDatePickerCellValue (renderOpts: VxeGlobalRendererHandles.RenderOptions, params: VxeGlobalRendererHandles.RenderCellParams | VxeGlobalRendererHandles.ExportMethodParams, defaultFormat: string) {
220
+ const { props = {} } = renderOpts
221
+ const { row, column } = params
222
+ let cellValue = XEUtils.get(row, column.field)
223
+ if (cellValue) {
224
+ cellValue = cellValue.format ? cellValue.format(props.format || defaultFormat) : XEUtils.toDateString(cellValue, dateFormatToVxeFormat(props.format || defaultFormat))
225
+ }
226
+ return cellValue
227
+ }
228
+
229
+ function createEditRender (defaultProps?: { [key: string]: any }) {
230
+ return function (renderOpts: VxeColumnPropTypes.EditRender & { name: string }, params: VxeGlobalRendererHandles.RenderEditParams) {
231
+ const { row, column } = params
232
+ const { name, attrs } = renderOpts
233
+ const cellValue = XEUtils.get(row, column.field)
234
+ return [
235
+ h(resolveComponent(name), {
236
+ ...attrs,
237
+ ...getCellEditFilterProps(renderOpts, params, cellValue, defaultProps),
238
+ ...getEditOns(renderOpts, params)
239
+ })
240
+ ]
241
+ }
242
+ }
243
+
244
+ function defaultButtonEditRender (renderOpts: VxeColumnPropTypes.EditRender, params: VxeGlobalRendererHandles.RenderEditParams) {
245
+ const { attrs } = renderOpts
246
+ return [
247
+ h(resolveComponent('a-button'), {
248
+ ...attrs,
249
+ ...getCellEditFilterProps(renderOpts, params, null),
250
+ ...getOns(renderOpts, params)
251
+ }, cellText(renderOpts.content))
252
+ ]
253
+ }
254
+
255
+ function defaultButtonsEditRender (renderOpts: VxeColumnPropTypes.EditRender, params: VxeGlobalRendererHandles.RenderEditParams) {
256
+ const { children } = renderOpts
257
+ if (children) {
258
+ return children.map((childRenderOpts: VxeColumnPropTypes.EditRender) => defaultButtonEditRender(childRenderOpts, params)[0])
259
+ }
260
+ return []
261
+ }
262
+
263
+ function createFilterRender (defaultProps?: { [key: string]: any }) {
264
+ return function (renderOpts: VxeColumnPropTypes.FilterRender & { name: string }, params: VxeGlobalRendererHandles.RenderFilterParams) {
265
+ const { column } = params
266
+ const { name, attrs } = renderOpts
267
+ return [
268
+ h('div', {
269
+ class: 'vxe-table--filter-antd-wrapper'
270
+ }, column.filters.map((option, oIndex) => {
271
+ const optionValue = option.data
272
+ return h(resolveComponent(name), {
273
+ key: oIndex,
274
+ ...attrs,
275
+ ...getCellEditFilterProps(renderOpts, params, optionValue, defaultProps),
276
+ ...getFilterOns(renderOpts, params, option, () => {
277
+ // 处理 change 事件相关逻辑
278
+ handleConfirmFilter(params, !!option.data, option)
279
+ })
280
+ })
281
+ }))
282
+ ]
283
+ }
284
+ }
285
+
286
+ function handleConfirmFilter (params: VxeGlobalRendererHandles.RenderFilterParams, checked: boolean, option: VxeTableDefines.FilterOption) {
287
+ const { $panel } = params
288
+ $panel.changeOption(null, checked, option)
289
+ }
290
+
291
+ /**
292
+ * 模糊匹配
293
+ * @param params
294
+ */
295
+ function defaultFuzzyFilterMethod (params: VxeGlobalRendererHandles.FilterMethodParams) {
296
+ const { option, row, column } = params
297
+ const { data } = option
298
+ const cellValue = XEUtils.get(row, column.field)
299
+ return XEUtils.toValueString(cellValue).indexOf(data) > -1
300
+ }
301
+
302
+ /**
303
+ * 精确匹配
304
+ * @param params
305
+ */
306
+ function defaultExactFilterMethod (params: VxeGlobalRendererHandles.FilterMethodParams) {
307
+ const { option, row, column } = params
308
+ const { data } = option
309
+ const cellValue = XEUtils.get(row, column.field)
310
+ /* eslint-disable eqeqeq */
311
+ return cellValue === data
312
+ }
313
+
314
+ function cellText (cellValue: any): string[] {
315
+ return [formatText(cellValue)]
316
+ }
317
+
318
+ function renderOptions (options: any[], optionProps: VxeGlobalRendererHandles.RenderOptionProps) {
319
+ const labelProp = optionProps.label || 'label'
320
+ const valueProp = optionProps.value || 'value'
321
+ return XEUtils.map(options, (item, oIndex) => {
322
+ return h(resolveComponent('a-select-option') as ComponentOptions, {
323
+ key: oIndex,
324
+ value: item[valueProp],
325
+ disabled: item.disabled
326
+ }, {
327
+ default: () => cellText(item[labelProp])
328
+ })
329
+ })
330
+ }
331
+
332
+ function createFormItemRender (defaultProps?: { [key: string]: any }) {
333
+ return function (renderOpts: VxeGlobalRendererHandles.RenderItemContentOptions & { name: string }, params: FormItemContentRenderParams) {
334
+ const { data, field } = params
335
+ const { name } = renderOpts
336
+ const { attrs } = renderOpts
337
+ const itemValue = XEUtils.get(data, field)
338
+ return [
339
+ h(resolveComponent(name), {
340
+ ...attrs,
341
+ ...getItemProps(renderOpts, params, itemValue, defaultProps),
342
+ ...getItemOns(renderOpts, params)
343
+ })
344
+ ]
345
+ }
346
+ }
347
+
348
+ function defaultButtonItemRender (renderOpts: VxeGlobalRendererHandles.RenderItemContentOptions, params: FormItemContentRenderParams) {
349
+ const { attrs } = renderOpts
350
+ const props = getItemProps(renderOpts, params, null)
351
+ return [
352
+ h(resolveComponent('a-button') as ComponentOptions, {
353
+ ...attrs,
354
+ ...props,
355
+ ...getItemOns(renderOpts, params)
356
+ }, {
357
+ default: () => cellText(renderOpts.content || props.content)
358
+ })
359
+ ]
360
+ }
361
+
362
+ function defaultButtonsItemRender (renderOpts: VxeGlobalRendererHandles.RenderItemContentOptions, params: FormItemContentRenderParams) {
363
+ const { children } = renderOpts
364
+ if (children) {
365
+ return children.map((childRenderOpts: VxeGlobalRendererHandles.RenderItemContentOptions) => defaultButtonItemRender(childRenderOpts, params)[0])
366
+ }
367
+ return []
368
+ }
369
+
370
+ function createDatePickerExportMethod (defaultFormat: string) {
371
+ return function (params: VxeGlobalRendererHandles.ExportMethodParams) {
372
+ const { row, column, options } = params
373
+ return options && options.original ? XEUtils.get(row, column.field) : getDatePickerCellValue(column.editRender || column.cellRender, params, defaultFormat)
374
+ }
375
+ }
376
+
377
+ function createExportMethod (getExportCellValue: Function) {
378
+ return function (params: VxeGlobalRendererHandles.ExportMethodParams) {
379
+ const { row, column, options } = params
380
+ return options && options.original ? XEUtils.get(row, column.field) : getExportCellValue(column.editRender || column.cellRender, params)
381
+ }
382
+ }
383
+
384
+ function createFormItemRadioAndCheckboxRender () {
385
+ return function (renderOpts: VxeGlobalRendererHandles.RenderItemContentOptions & { name: string }, params: FormItemContentRenderParams) {
386
+ const { name, options = [], optionProps = {} } = renderOpts
387
+ const { data, field } = params
388
+ const { attrs } = renderOpts
389
+ const labelProp = optionProps.label || 'label'
390
+ const valueProp = optionProps.value || 'value'
391
+ const itemValue = XEUtils.get(data, field)
392
+ return [
393
+ h(resolveComponent(`${name}Group`) as ComponentOptions, {
394
+ ...attrs,
395
+ ...getItemProps(renderOpts, params, itemValue),
396
+ ...getItemOns(renderOpts, params)
397
+ }, {
398
+ default: () => {
399
+ return options.map((option, oIndex) => {
400
+ return h(resolveComponent(name) as ComponentOptions, {
401
+ key: oIndex,
402
+ value: option[valueProp],
403
+ disabled: option.disabled
404
+ }, {
405
+ default: () => cellText(option[labelProp])
406
+ })
407
+ })
408
+ }
409
+ })
410
+ ]
411
+ }
412
+ }
413
+
414
+ /**
415
+ * 检查触发源是否属于目标节点
416
+ */
417
+ function getEventTargetNode (evnt: any, container: HTMLElement, className: string) {
418
+ let targetElem
419
+ let target = evnt.target
420
+ while (target && target.nodeType && target !== document) {
421
+ if (className && target.className && target.className.split && target.className.split(' ').indexOf(className) > -1) {
422
+ targetElem = target
423
+ } else if (target === container) {
424
+ return { flag: className ? !!targetElem : true, container, targetElem: targetElem }
425
+ }
426
+ target = target.parentNode
427
+ }
428
+ return { flag: false }
429
+ }
430
+
431
+ /**
432
+ * 事件兼容性处理
433
+ */
434
+ function handleClearEvent (params: VxeGlobalInterceptorHandles.InterceptorClearFilterParams | VxeGlobalInterceptorHandles.InterceptorClearEditParams | VxeGlobalInterceptorHandles.InterceptorClearAreasParams) {
435
+ const { $event } = params
436
+ const bodyElem = document.body
437
+ if (
438
+ // 下拉框
439
+ getEventTargetNode($event, bodyElem, 'ant-select-dropdown').flag ||
440
+ // 级联
441
+ getEventTargetNode($event, bodyElem, 'ant-cascader-menus').flag ||
442
+ // 日期
443
+ getEventTargetNode($event, bodyElem, 'ant-picker-dropdown').flag ||
444
+ getEventTargetNode($event, bodyElem, 'ant-calendar-picker-container').flag ||
445
+ // 时间选择
446
+ getEventTargetNode($event, bodyElem, 'ant-time-picker-panel').flag
447
+ ) {
448
+ return false
449
+ }
450
+ }
451
+
452
+ export const VxeUIPluginRenderAntd = {
453
+ install (core: VxeUIExport, options?: {
454
+ Antd?: any
455
+ }) {
456
+ VxeUI = core
457
+ Antd = options ? options.Antd : {}
458
+
459
+ // 检查版本
460
+ if (!/^(4)\./.test(VxeUI.uiVersion)) {
461
+ console.error('[plugin-render-antd 4.x] Version 4.x is required')
462
+ }
463
+
464
+ VxeUI.renderer.mixin({
465
+ AAutoComplete: {
466
+ autofocus: 'input.ant-input',
467
+ renderDefault: createEditRender(),
468
+ renderEdit: createEditRender(),
469
+ renderFilter: createFilterRender(),
470
+ defaultFilterMethod: defaultExactFilterMethod,
471
+ renderItemContent: createFormItemRender()
472
+ },
473
+ AInput: {
474
+ autofocus: 'input.ant-input',
475
+ renderDefault: createEditRender(),
476
+ renderEdit: createEditRender(),
477
+ renderFilter: createFilterRender(),
478
+ defaultFilterMethod: defaultFuzzyFilterMethod,
479
+ renderItemContent: createFormItemRender()
480
+ },
481
+ AInputNumber: {
482
+ autofocus: 'input.ant-input-number-input',
483
+ renderDefault: createEditRender(),
484
+ renderEdit: createEditRender(),
485
+ renderFilter: createFilterRender(),
486
+ defaultFilterMethod: defaultFuzzyFilterMethod,
487
+ renderItemContent: createFormItemRender()
488
+ },
489
+ ASelect: {
490
+ renderEdit (renderOpts, params) {
491
+ const { options = [], optionGroups, optionProps = {}, optionGroupProps = {} } = renderOpts
492
+ const { row, column } = params
493
+ const { attrs } = renderOpts
494
+ const cellValue = XEUtils.get(row, column.field)
495
+ const props = getCellEditFilterProps(renderOpts, params, cellValue)
496
+ const ons = getEditOns(renderOpts, params)
497
+ if (optionGroups) {
498
+ const groupOptions = optionGroupProps.options || 'options'
499
+ const groupLabel = optionGroupProps.label || 'label'
500
+ return [
501
+ h(resolveComponent('a-select') as ComponentOptions, {
502
+ ...props,
503
+ ...attrs,
504
+ ...ons
505
+ }, {
506
+ default: () => {
507
+ return XEUtils.map(optionGroups, (group, gIndex) => {
508
+ return h(resolveComponent('a-select-opt-group') as ComponentOptions, {
509
+ key: gIndex
510
+ }, {
511
+ label: () => {
512
+ return h('span', {}, group[groupLabel])
513
+ },
514
+ default: () => renderOptions(group[groupOptions], optionProps)
515
+ })
516
+ })
517
+ }
518
+ })
519
+ ]
520
+ }
521
+ return [
522
+ h(resolveComponent('a-select') as ComponentOptions, {
523
+ ...props,
524
+ ...attrs,
525
+ ...ons
526
+ }, {
527
+ default: () => renderOptions(options, optionProps)
528
+ })
529
+ ]
530
+ },
531
+ renderCell (renderOpts, params) {
532
+ return getCellLabelVNs(renderOpts, params, getSelectCellValue(renderOpts, params))
533
+ },
534
+ renderFilter (renderOpts, params) {
535
+ const { options = [], optionGroups, optionProps = {}, optionGroupProps = {} } = renderOpts
536
+ const groupOptions = optionGroupProps.options || 'options'
537
+ const groupLabel = optionGroupProps.label || 'label'
538
+ const { column } = params
539
+ const { attrs } = renderOpts
540
+ return [
541
+ h('div', {
542
+ class: 'vxe-table--filter-antd-wrapper'
543
+ }, optionGroups
544
+ ? column.filters.map((option, oIndex) => {
545
+ const optionValue = option.data
546
+ const props = getCellEditFilterProps(renderOpts, params, optionValue)
547
+ return h(resolveComponent('a-select') as ComponentOptions, {
548
+ key: oIndex,
549
+ ...attrs,
550
+ ...props,
551
+ ...getFilterOns(renderOpts, params, option, () => {
552
+ // 处理 change 事件相关逻辑
553
+ handleConfirmFilter(params, props.mode === 'multiple' ? (option.data && option.data.length > 0) : !XEUtils.eqNull(option.data), option)
554
+ })
555
+ }, {
556
+ default: () => {
557
+ return XEUtils.map(optionGroups, (group, gIndex) => {
558
+ return h(resolveComponent('a-select-opt-group') as ComponentOptions, {
559
+ key: gIndex
560
+ }, {
561
+ label: () => {
562
+ return h('span', {}, group[groupLabel])
563
+ },
564
+ default: () => renderOptions(group[groupOptions], optionProps)
565
+ })
566
+ })
567
+ }
568
+ })
569
+ })
570
+ : column.filters.map((option, oIndex) => {
571
+ const optionValue = option.data
572
+ const props = getCellEditFilterProps(renderOpts, params, optionValue)
573
+ return h(resolveComponent('a-select') as ComponentOptions, {
574
+ key: oIndex,
575
+ ...attrs,
576
+ ...props,
577
+ ...getFilterOns(renderOpts, params, option, () => {
578
+ // 处理 change 事件相关逻辑
579
+ handleConfirmFilter(params, props.mode === 'multiple' ? (option.data && option.data.length > 0) : !XEUtils.eqNull(option.data), option)
580
+ })
581
+ }, {
582
+ default: () => renderOptions(options, optionProps)
583
+ })
584
+ }))
585
+ ]
586
+ },
587
+ defaultFilterMethod (params) {
588
+ const { option, row, column } = params
589
+ const { data } = option
590
+ const { field, filterRender: renderOpts } = column
591
+ const { props = {} } = renderOpts
592
+ const cellValue = XEUtils.get(row, field)
593
+ if (props.mode === 'multiple') {
594
+ if (XEUtils.isArray(cellValue)) {
595
+ return XEUtils.includeArrays(cellValue, data)
596
+ }
597
+ return data.indexOf(cellValue) > -1
598
+ }
599
+ /* eslint-disable eqeqeq */
600
+ return cellValue == data
601
+ },
602
+ renderItemContent (renderOpts, params) {
603
+ const { options = [], optionGroups, optionProps = {}, optionGroupProps = {} } = renderOpts
604
+ const { data, field } = params
605
+ const { attrs } = renderOpts
606
+ const itemValue = XEUtils.get(data, field)
607
+ const props = getItemProps(renderOpts, params, itemValue)
608
+ const ons = getItemOns(renderOpts, params)
609
+ if (optionGroups) {
610
+ const groupOptions = optionGroupProps.options || 'options'
611
+ const groupLabel = optionGroupProps.label || 'label'
612
+ return [
613
+ h(resolveComponent('a-select') as ComponentOptions, {
614
+ ...attrs,
615
+ ...props,
616
+ ...ons
617
+ }, {
618
+ default: () => {
619
+ return XEUtils.map(optionGroups, (group, gIndex) => {
620
+ return h(resolveComponent('a-select-opt-group') as ComponentOptions, {
621
+ key: gIndex
622
+ }, {
623
+ label: () => {
624
+ return h('span', {}, group[groupLabel])
625
+ },
626
+ default: () => renderOptions(group[groupOptions], optionProps)
627
+ })
628
+ })
629
+ }
630
+ })
631
+ ]
632
+ }
633
+ return [
634
+ h(resolveComponent('a-select') as ComponentOptions, {
635
+ ...attrs,
636
+ ...props,
637
+ ...ons
638
+ }, {
639
+ default: () => renderOptions(options, optionProps)
640
+ })
641
+ ]
642
+ },
643
+ exportMethod: createExportMethod(getSelectCellValue)
644
+ },
645
+ ACascader: {
646
+ renderEdit: createEditRender(),
647
+ renderCell (renderOpts, params) {
648
+ return getCellLabelVNs(renderOpts, params, getCascaderCellValue(renderOpts, params))
649
+ },
650
+ renderItemContent: createFormItemRender(),
651
+ exportMethod: createExportMethod(getCascaderCellValue)
652
+ },
653
+ ADatePicker: {
654
+ renderEdit: createEditRender(),
655
+ renderCell: formatDatePicker('YYYY-MM-DD'),
656
+ renderItemContent: createFormItemRender(),
657
+ exportMethod: createDatePickerExportMethod('YYYY-MM-DD')
658
+ },
659
+ AMonthPicker: {
660
+ renderEdit: createEditRender(),
661
+ renderCell: formatDatePicker('YYYY-MM'),
662
+ renderItemContent: createFormItemRender(),
663
+ exportMethod: createDatePickerExportMethod('YYYY-MM')
664
+ },
665
+ ARangePicker: {
666
+ renderEdit: createEditRender(),
667
+ renderCell (renderOpts, params) {
668
+ return getCellLabelVNs(renderOpts, params, getRangePickerCellValue(renderOpts, params))
669
+ },
670
+ renderItemContent: createFormItemRender(),
671
+ exportMethod: createExportMethod(getRangePickerCellValue)
672
+ },
673
+ AWeekPicker: {
674
+ renderEdit: createEditRender(),
675
+ renderCell: formatDatePicker('YYYY-WW周'),
676
+ renderItemContent: createFormItemRender(),
677
+ exportMethod: createDatePickerExportMethod('YYYY-WW周')
678
+ },
679
+ ATimePicker: {
680
+ renderEdit: createEditRender(),
681
+ renderCell: formatDatePicker('HH:mm:ss'),
682
+ renderItemContent: createFormItemRender(),
683
+ exportMethod: createDatePickerExportMethod('HH:mm:ss')
684
+ },
685
+ ATreeSelect: {
686
+ renderEdit: createEditRender(),
687
+ renderCell (renderOpts, params) {
688
+ return getCellLabelVNs(renderOpts, params, getTreeSelectCellValue(renderOpts, params))
689
+ },
690
+ renderItemContent: createFormItemRender(),
691
+ exportMethod: createExportMethod(getTreeSelectCellValue)
692
+ },
693
+ ARate: {
694
+ renderDefault: createEditRender(),
695
+ renderEdit: createEditRender(),
696
+ renderFilter: createFilterRender(),
697
+ defaultFilterMethod: defaultExactFilterMethod,
698
+ renderItemContent: createFormItemRender()
699
+ },
700
+ ASwitch: {
701
+ renderDefault: createEditRender(),
702
+ renderEdit: createEditRender(),
703
+ renderFilter (renderOpts, params) {
704
+ const { column } = params
705
+ const { name, attrs } = renderOpts
706
+ return [
707
+ h('div', {
708
+ class: 'vxe-table--filter-antd-wrapper'
709
+ }, column.filters.map((option, oIndex) => {
710
+ const optionValue = option.data
711
+ return h(name as string, {
712
+ key: oIndex,
713
+ ...attrs,
714
+ ...getCellEditFilterProps(renderOpts, params, optionValue),
715
+ ...getFilterOns(renderOpts, params, option, () => {
716
+ // 处理 change 事件相关逻辑
717
+ handleConfirmFilter(params, XEUtils.isBoolean(option.data), option)
718
+ })
719
+ })
720
+ }))
721
+ ]
722
+ },
723
+ defaultFilterMethod: defaultExactFilterMethod,
724
+ renderItemContent: createFormItemRender()
725
+ },
726
+ ARadio: {
727
+ renderItemContent: createFormItemRadioAndCheckboxRender()
728
+ },
729
+ ACheckbox: {
730
+ renderItemContent: createFormItemRadioAndCheckboxRender()
731
+ },
732
+ AButton: {
733
+ renderEdit: defaultButtonEditRender,
734
+ renderDefault: defaultButtonEditRender,
735
+ renderItemContent: defaultButtonItemRender
736
+ },
737
+ AButtons: {
738
+ renderEdit: defaultButtonsEditRender,
739
+ renderDefault: defaultButtonsEditRender,
740
+ renderItemContent: defaultButtonsItemRender
741
+ }
742
+ })
743
+
744
+ VxeUI.interceptor.add('event.clearFilter', handleClearEvent)
745
+ VxeUI.interceptor.add('event.clearEdit', handleClearEvent)
746
+ VxeUI.interceptor.add('event.clearAreas', handleClearEvent)
747
+
748
+ // 兼容老版本
749
+ VxeUI.interceptor.add('event.clearActived', handleClearEvent)
750
+ }
751
+ }
752
+
753
+ if (typeof window !== 'undefined' && window.VxeUI && window.VxeUI.use) {
754
+ window.VxeUI.use(VxeUIPluginRenderAntd)
755
+ }
756
+
757
+ export default VxeUIPluginRenderAntd
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "@vxe-ui/plugin-render-antd",
3
+ "version": "4.0.0",
4
+ "description": "Vxe UI plug-in for compatibility with the ant-design-vue component.",
5
+ "scripts": {
6
+ "lib": "gulp build"
7
+ },
8
+ "files": [
9
+ "types",
10
+ "dist",
11
+ "*.ts",
12
+ "*.d.ts"
13
+ ],
14
+ "main": "dist/index.common.js",
15
+ "unpkg": "dist/index.umd.js",
16
+ "jsdelivr": "dist/index.umd.js",
17
+ "style": "dist/style.css",
18
+ "typings": "types/index.d.ts",
19
+ "devDependencies": {
20
+ "@babel/core": "^7.12.3",
21
+ "@babel/plugin-transform-runtime": "^7.12.1",
22
+ "@babel/preset-env": "^7.12.1",
23
+ "@babel/runtime": "^7.12.5",
24
+ "@typescript-eslint/eslint-plugin": "^4.6.1",
25
+ "@typescript-eslint/parser": "^4.6.1",
26
+ "del": "^6.0.0",
27
+ "eslint": "^7.13.0",
28
+ "eslint-config-prettier": "^6.15.0",
29
+ "eslint-config-standard": "^16.0.1",
30
+ "eslint-friendly-formatter": "^4.0.1",
31
+ "eslint-plugin-import": "^2.22.1",
32
+ "eslint-plugin-node": "^11.1.0",
33
+ "eslint-plugin-prettier": "^3.1.4",
34
+ "eslint-plugin-promise": "^4.2.1",
35
+ "eslint-plugin-standard": "^4.0.2",
36
+ "eslint-plugin-typescript": "^0.14.0",
37
+ "gulp": "^4.0.2",
38
+ "gulp-autoprefixer": "^8.0.0",
39
+ "gulp-babel": "^8.0.0",
40
+ "gulp-clean-css": "^4.3.0",
41
+ "gulp-concat": "^2.6.1",
42
+ "gulp-rename": "^2.0.0",
43
+ "gulp-replace": "^1.1.3",
44
+ "gulp-sass": "^5.1.0",
45
+ "gulp-sourcemaps": "^3.0.0",
46
+ "gulp-typescript": "^5.0.1",
47
+ "gulp-uglify": "^3.0.2",
48
+ "markdown-doctest": "^1.1.0",
49
+ "prettier": "^2.1.2",
50
+ "sass": "^1.55.0",
51
+ "typescript": "^4.6.4",
52
+ "vue": "^3.4.27",
53
+ "vxe-pc-ui": "^4.0.23",
54
+ "vxe-table": "^4.7.25"
55
+ },
56
+ "repository": {
57
+ "type": "git",
58
+ "url": "git+https://github.com/x-extends/vxe-ui-plugins.git"
59
+ },
60
+ "keywords": [
61
+ "vxe-ui-plugins"
62
+ ],
63
+ "author": {
64
+ "name": "Xu Liangzhan",
65
+ "email": "xu_liangzhan@163.com"
66
+ },
67
+ "license": "MIT",
68
+ "bugs": {
69
+ "url": "https://github.com/x-extends/vxe-ui-plugins/issues"
70
+ },
71
+ "homepage": "https://github.com/x-extends/vxe-ui-plugins#readme"
72
+ }
@@ -0,0 +1,12 @@
1
+ import { VxeUIExport } from 'vxe-pc-ui'
2
+
3
+ /**
4
+ * 基于 Vxe UI 的适配插件,用于兼容 ant-design-vue 组件库
5
+ */
6
+ export declare const VxeUIPluginRenderAntd: {
7
+ install (VxeUI: VxeUIExport, options?: {
8
+ Antd?: any
9
+ }): void
10
+ }
11
+
12
+ export default VxeUIPluginRenderAntd