@vxe-ui/plugin-render-element 4.3.1 → 4.4.1

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/src/form/index.ts CHANGED
@@ -1,326 +1,326 @@
1
- import { h, ComponentOptions } from 'vue'
2
- import { getCurrComponent } from '../util/comp'
3
- import XEUtils from 'xe-utils'
4
-
5
- import type { VxeUIExport, VxeGlobalRendererHandles, VxeFormConstructor, VxeFormPrivateMethods } from 'vxe-pc-ui'
6
-
7
- /**
8
- * 表单 - 渲染器
9
- */
10
- export function defineFormRender (VxeUI: VxeUIExport) {
11
- function isEmptyValue (cellValue: any) {
12
- return cellValue === null || cellValue === undefined || cellValue === ''
13
- }
14
-
15
- function getOnName (type: string) {
16
- return 'on' + type.substring(0, 1).toLocaleUpperCase() + type.substring(1)
17
- }
18
-
19
- function getModelProp (renderOpts: VxeGlobalRendererHandles.RenderOptions) {
20
- return 'modelValue'
21
- }
22
-
23
- function getModelEvent (renderOpts: VxeGlobalRendererHandles.RenderOptions) {
24
- return 'update:modelValue'
25
- }
26
-
27
- function getChangeEvent (renderOpts: VxeGlobalRendererHandles.RenderOptions) {
28
- let type = 'change'
29
- switch (renderOpts.name) {
30
- case 'ElAutocomplete':
31
- type = 'select'
32
- break
33
- case 'ElInput':
34
- case 'ElInputNumber':
35
- type = 'input'
36
- break
37
- }
38
- return type
39
- }
40
-
41
- function getItemProps (renderOpts: VxeGlobalRendererHandles.RenderOptions, params: any, value: any, defaultProps?: { [prop: string]: any }) {
42
- return XEUtils.assign({}, defaultProps, renderOpts.props, { [getModelProp(renderOpts)]: value })
43
- }
44
-
45
- function formatText (cellValue: any) {
46
- return '' + (isEmptyValue(cellValue) ? '' : cellValue)
47
- }
48
-
49
- function getOns (renderOpts: VxeGlobalRendererHandles.RenderOptions, params: VxeGlobalRendererHandles.RenderParams, inputFunc?: Function, changeFunc?: Function) {
50
- const { events } = renderOpts
51
- const modelEvent = getModelEvent(renderOpts)
52
- const changeEvent = getChangeEvent(renderOpts)
53
- const isSameEvent = changeEvent === modelEvent
54
- const ons: { [type: string]: Function } = {}
55
- XEUtils.objectEach(events, (func: Function, key: string) => {
56
- ons[getOnName(key)] = function (...args: any[]) {
57
- func(params, ...args)
58
- }
59
- })
60
- if (inputFunc) {
61
- ons[getOnName(modelEvent)] = function (targetEvnt: any) {
62
- inputFunc(targetEvnt)
63
- if (events && events[modelEvent]) {
64
- events[modelEvent](params, targetEvnt)
65
- }
66
- if (isSameEvent && changeFunc) {
67
- changeFunc(targetEvnt)
68
- }
69
- }
70
- }
71
- if (!isSameEvent && changeFunc) {
72
- ons[getOnName(changeEvent)] = function (...args: any[]) {
73
- changeFunc(...args)
74
- if (events && events[changeEvent]) {
75
- events[changeEvent](params, ...args)
76
- }
77
- }
78
- }
79
- return ons
80
- }
81
-
82
- function getItemOns (renderOpts: VxeGlobalRendererHandles.RenderFormItemContentOptions, params: any) {
83
- const { $form, data, field } = params
84
- return getOns(renderOpts, params, (value: any) => {
85
- // 处理 model 值双向绑定
86
- XEUtils.set(data, field, value)
87
- }, () => {
88
- // 处理 change 事件相关逻辑
89
- $form.updateStatus(params)
90
- if (renderOpts.changeToSubmit) {
91
- ($form as VxeFormConstructor & VxeFormPrivateMethods).handleSubmitEvent(new Event('change'))
92
- }
93
- })
94
- }
95
-
96
- function renderOptions (options: any[], optionProps: VxeGlobalRendererHandles.RenderOptionProps) {
97
- const labelProp = optionProps.label || 'label'
98
- const valueProp = optionProps.value || 'value'
99
- return XEUtils.map(options, (item, oIndex) => {
100
- return h(getCurrComponent('el-option'), {
101
- key: oIndex,
102
- value: item[valueProp],
103
- label: item[labelProp],
104
- disabled: item.disabled
105
- })
106
- })
107
- }
108
-
109
- function cellText (cellValue: any): string[] {
110
- return [formatText(cellValue)]
111
- }
112
-
113
- function createFormItemRender (defaultProps?: { [key: string]: any }) {
114
- return function (renderOpts: VxeGlobalRendererHandles.RenderItemContentOptions & { name: string }, params: any) {
115
- const { data, field } = params
116
- const { name } = renderOpts
117
- const { attrs } = renderOpts
118
- const itemValue = XEUtils.get(data, field)
119
- return [
120
- h(getCurrComponent(name), {
121
- ...attrs,
122
- ...getItemProps(renderOpts, params, itemValue, defaultProps),
123
- ...getItemOns(renderOpts, params)
124
- })
125
- ]
126
- }
127
- }
128
-
129
- function defaultButtonItemRender (renderOpts: VxeGlobalRendererHandles.RenderItemContentOptions, params: any) {
130
- const { attrs } = renderOpts
131
- const props = getItemProps(renderOpts, params, null)
132
- return [
133
- h(getCurrComponent('el-button') as ComponentOptions, {
134
- ...attrs,
135
- ...props,
136
- ...getOns(renderOpts, params)
137
- }, {
138
- default: () => cellText(renderOpts.content || props.content)
139
- })
140
- ]
141
- }
142
-
143
- function defaultButtonsItemRender (renderOpts: VxeGlobalRendererHandles.RenderItemContentOptions, params: any) {
144
- const { children } = renderOpts
145
- if (children) {
146
- return children.map((childRenderOpts: VxeGlobalRendererHandles.RenderItemContentOptions) => defaultButtonItemRender(childRenderOpts, params)[0])
147
- }
148
- return []
149
- }
150
-
151
- /**
152
- * 已废弃
153
- * @deprecated
154
- */
155
- function createOldFormItemRadioAndCheckboxRender () {
156
- return function (renderOpts: VxeGlobalRendererHandles.RenderItemContentOptions & { name: string }, params: any) {
157
- const { name, options = [], optionProps = {}, attrs } = renderOpts
158
- const { data, field } = params
159
- const labelProp = optionProps.label || 'label'
160
- const valueProp = optionProps.value || 'value'
161
- const itemValue = XEUtils.get(data, field)
162
- return [
163
- h(getCurrComponent(`${name}Group`) as ComponentOptions, {
164
- ...attrs,
165
- ...getItemProps(renderOpts, params, itemValue),
166
- ...getItemOns(renderOpts, params)
167
- }, {
168
- default: () => {
169
- return options.map((option, oIndex) => {
170
- return h(getCurrComponent(name) as ComponentOptions, {
171
- key: oIndex,
172
- label: option[valueProp],
173
- disabled: option.disabled
174
- }, {
175
- default: () => cellText(option[labelProp])
176
- })
177
- })
178
- }
179
- })
180
- ]
181
- }
182
- }
183
-
184
- VxeUI.renderer.mixin({
185
- ElAutocomplete: {
186
- renderFormItemContent: createFormItemRender()
187
- },
188
- ElInput: {
189
- renderFormItemContent: createFormItemRender()
190
- },
191
- ElInputNumber: {
192
- renderFormItemContent: createFormItemRender()
193
- },
194
- ElSelect: {
195
- renderFormItemContent (renderOpts, params) {
196
- const { options = [], optionGroups, optionProps = {}, optionGroupProps = {} } = renderOpts
197
- const { data, field } = params
198
- const { attrs } = renderOpts
199
- const itemValue = XEUtils.get(data, field)
200
- const props = getItemProps(renderOpts, params, itemValue)
201
- const ons = getItemOns(renderOpts, params)
202
- if (optionGroups) {
203
- const groupOptions = optionGroupProps.options || 'options'
204
- const groupLabel = optionGroupProps.label || 'label'
205
- return [
206
- h(getCurrComponent('el-select') as ComponentOptions, {
207
- ...attrs,
208
- ...props,
209
- ...ons
210
- }, {
211
- default: () => {
212
- return XEUtils.map(optionGroups, (group, gIndex) => {
213
- return h(getCurrComponent('el-option-group') as ComponentOptions, {
214
- label: group[groupLabel],
215
- key: gIndex
216
- }, {
217
- default: () => renderOptions(group[groupOptions], optionProps)
218
- })
219
- })
220
- }
221
- })
222
- ]
223
- }
224
- return [
225
- h(getCurrComponent('el-select') as ComponentOptions, {
226
- ...attrs,
227
- ...props,
228
- ...ons
229
- }, {
230
- default: () => renderOptions(options, optionProps)
231
- })
232
- ]
233
- }
234
- },
235
- ElCascader: {
236
- renderFormItemContent: createFormItemRender()
237
- },
238
- ElDatePicker: {
239
- renderFormItemContent: createFormItemRender()
240
- },
241
- ElTimePicker: {
242
- renderFormItemContent: createFormItemRender()
243
- },
244
- ElTimeSelect: {
245
- renderFormItemContent: createFormItemRender()
246
- },
247
- ElRate: {
248
- renderFormItemContent: createFormItemRender()
249
- },
250
- ElSwitch: {
251
- renderFormItemContent: createFormItemRender()
252
- },
253
- ElSlider: {
254
- renderFormItemContent: createFormItemRender()
255
- },
256
- ElRadioGroup: {
257
- renderFormItemContent (renderOpts, params) {
258
- const { options = [], optionProps = {}, attrs } = renderOpts
259
- const { data, field } = params
260
- const labelProp = optionProps.label || 'label'
261
- const valueProp = optionProps.value || 'value'
262
- const itemValue = XEUtils.get(data, field)
263
- return [
264
- h(getCurrComponent('el-radio-group'), {
265
- ...attrs,
266
- ...getItemProps(renderOpts, params, itemValue),
267
- ...getItemOns(renderOpts, params)
268
- }, {
269
- default: () => {
270
- return options.map((option, oIndex) => {
271
- return h(getCurrComponent('el-radio'), {
272
- key: oIndex,
273
- value: option[valueProp],
274
- disabled: option.disabled
275
- }, {
276
- default: () => cellText(option[labelProp])
277
- })
278
- })
279
- }
280
- })
281
- ]
282
- }
283
- },
284
- ElCheckboxGroup: {
285
- renderFormItemContent (renderOpts, params) {
286
- const { options = [], optionProps = {}, attrs } = renderOpts
287
- const { data, field } = params
288
- const labelProp = optionProps.label || 'label'
289
- const valueProp = optionProps.value || 'value'
290
- const itemValue = XEUtils.get(data, field)
291
- return [
292
- h(getCurrComponent('el-checkbox-group'), {
293
- ...attrs,
294
- ...getItemProps(renderOpts, params, itemValue),
295
- ...getItemOns(renderOpts, params)
296
- }, {
297
- default: () => {
298
- return options.map((option, oIndex) => {
299
- return h(getCurrComponent('el-checkbox'), {
300
- key: oIndex,
301
- value: option[valueProp],
302
- label: option[labelProp],
303
- disabled: option.disabled
304
- })
305
- })
306
- }
307
- })
308
- ]
309
- }
310
- },
311
- ElButton: {
312
- renderFormItemContent: defaultButtonItemRender
313
- },
314
-
315
- // 已废弃
316
- ElRadio: {
317
- renderFormItemContent: createOldFormItemRadioAndCheckboxRender()
318
- },
319
- ElCheckbox: {
320
- renderFormItemContent: createOldFormItemRadioAndCheckboxRender()
321
- },
322
- ElButtons: {
323
- renderFormItemContent: defaultButtonsItemRender
324
- }
325
- })
326
- }
1
+ import { h, ComponentOptions } from 'vue'
2
+ import { getCurrComponent } from '../util/comp'
3
+ import XEUtils from 'xe-utils'
4
+
5
+ import type { VxeUIExport, VxeGlobalRendererHandles, VxeFormConstructor, VxeFormPrivateMethods } from 'vxe-pc-ui'
6
+
7
+ /**
8
+ * 表单 - 渲染器
9
+ */
10
+ export function defineFormRender (VxeUI: VxeUIExport) {
11
+ function isEmptyValue (cellValue: any) {
12
+ return cellValue === null || cellValue === undefined || cellValue === ''
13
+ }
14
+
15
+ function getOnName (type: string) {
16
+ return 'on' + type.substring(0, 1).toLocaleUpperCase() + type.substring(1)
17
+ }
18
+
19
+ function getModelProp (renderOpts: VxeGlobalRendererHandles.RenderOptions) {
20
+ return 'modelValue'
21
+ }
22
+
23
+ function getModelEvent (renderOpts: VxeGlobalRendererHandles.RenderOptions) {
24
+ return 'update:modelValue'
25
+ }
26
+
27
+ function getChangeEvent (renderOpts: VxeGlobalRendererHandles.RenderOptions) {
28
+ let type = 'change'
29
+ switch (renderOpts.name) {
30
+ case 'ElAutocomplete':
31
+ type = 'select'
32
+ break
33
+ case 'ElInput':
34
+ case 'ElInputNumber':
35
+ type = 'input'
36
+ break
37
+ }
38
+ return type
39
+ }
40
+
41
+ function getItemProps (renderOpts: VxeGlobalRendererHandles.RenderOptions, params: any, value: any, defaultProps?: { [prop: string]: any }) {
42
+ return XEUtils.assign({}, defaultProps, renderOpts.props, { [getModelProp(renderOpts)]: value })
43
+ }
44
+
45
+ function formatText (cellValue: any) {
46
+ return '' + (isEmptyValue(cellValue) ? '' : cellValue)
47
+ }
48
+
49
+ function getOns (renderOpts: VxeGlobalRendererHandles.RenderOptions, params: VxeGlobalRendererHandles.RenderParams, inputFunc?: Function, changeFunc?: Function) {
50
+ const { events } = renderOpts
51
+ const modelEvent = getModelEvent(renderOpts)
52
+ const changeEvent = getChangeEvent(renderOpts)
53
+ const isSameEvent = changeEvent === modelEvent
54
+ const ons: { [type: string]: Function } = {}
55
+ XEUtils.objectEach(events, (func: Function, key: string) => {
56
+ ons[getOnName(key)] = function (...args: any[]) {
57
+ func(params, ...args)
58
+ }
59
+ })
60
+ if (inputFunc) {
61
+ ons[getOnName(modelEvent)] = function (targetEvnt: any) {
62
+ inputFunc(targetEvnt)
63
+ if (events && events[modelEvent]) {
64
+ events[modelEvent](params, targetEvnt)
65
+ }
66
+ if (isSameEvent && changeFunc) {
67
+ changeFunc(targetEvnt)
68
+ }
69
+ }
70
+ }
71
+ if (!isSameEvent && changeFunc) {
72
+ ons[getOnName(changeEvent)] = function (...args: any[]) {
73
+ changeFunc(...args)
74
+ if (events && events[changeEvent]) {
75
+ events[changeEvent](params, ...args)
76
+ }
77
+ }
78
+ }
79
+ return ons
80
+ }
81
+
82
+ function getItemOns (renderOpts: VxeGlobalRendererHandles.RenderFormItemContentOptions, params: any) {
83
+ const { $form, data, field } = params
84
+ return getOns(renderOpts, params, (value: any) => {
85
+ // 处理 model 值双向绑定
86
+ XEUtils.set(data, field, value)
87
+ }, () => {
88
+ // 处理 change 事件相关逻辑
89
+ $form.updateStatus(params)
90
+ if (renderOpts.changeToSubmit) {
91
+ ($form as VxeFormConstructor & VxeFormPrivateMethods).handleSubmitEvent(new Event('change'))
92
+ }
93
+ })
94
+ }
95
+
96
+ function renderOptions (options: any[], optionProps: VxeGlobalRendererHandles.RenderOptionProps) {
97
+ const labelProp = optionProps.label || 'label'
98
+ const valueProp = optionProps.value || 'value'
99
+ return XEUtils.map(options, (item, oIndex) => {
100
+ return h(getCurrComponent('el-option'), {
101
+ key: oIndex,
102
+ value: item[valueProp],
103
+ label: item[labelProp],
104
+ disabled: item.disabled
105
+ })
106
+ })
107
+ }
108
+
109
+ function cellText (cellValue: any): string[] {
110
+ return [formatText(cellValue)]
111
+ }
112
+
113
+ function createFormItemRender (defaultProps?: { [key: string]: any }) {
114
+ return function (renderOpts: VxeGlobalRendererHandles.RenderItemContentOptions & { name: string }, params: any) {
115
+ const { data, field } = params
116
+ const { name } = renderOpts
117
+ const { attrs } = renderOpts
118
+ const itemValue = XEUtils.get(data, field)
119
+ return [
120
+ h(getCurrComponent(name), {
121
+ ...attrs,
122
+ ...getItemProps(renderOpts, params, itemValue, defaultProps),
123
+ ...getItemOns(renderOpts, params)
124
+ })
125
+ ]
126
+ }
127
+ }
128
+
129
+ function defaultButtonItemRender (renderOpts: VxeGlobalRendererHandles.RenderItemContentOptions, params: any) {
130
+ const { attrs } = renderOpts
131
+ const props = getItemProps(renderOpts, params, null)
132
+ return [
133
+ h(getCurrComponent('el-button') as ComponentOptions, {
134
+ ...attrs,
135
+ ...props,
136
+ ...getOns(renderOpts, params)
137
+ }, {
138
+ default: () => cellText(renderOpts.content || props.content)
139
+ })
140
+ ]
141
+ }
142
+
143
+ function defaultButtonsItemRender (renderOpts: VxeGlobalRendererHandles.RenderItemContentOptions, params: any) {
144
+ const { children } = renderOpts
145
+ if (children) {
146
+ return children.map((childRenderOpts: VxeGlobalRendererHandles.RenderItemContentOptions) => defaultButtonItemRender(childRenderOpts, params)[0])
147
+ }
148
+ return []
149
+ }
150
+
151
+ /**
152
+ * 已废弃
153
+ * @deprecated
154
+ */
155
+ function createOldFormItemRadioAndCheckboxRender () {
156
+ return function (renderOpts: VxeGlobalRendererHandles.RenderItemContentOptions & { name: string }, params: any) {
157
+ const { name, options = [], optionProps = {}, attrs } = renderOpts
158
+ const { data, field } = params
159
+ const labelProp = optionProps.label || 'label'
160
+ const valueProp = optionProps.value || 'value'
161
+ const itemValue = XEUtils.get(data, field)
162
+ return [
163
+ h(getCurrComponent(`${name}Group`) as ComponentOptions, {
164
+ ...attrs,
165
+ ...getItemProps(renderOpts, params, itemValue),
166
+ ...getItemOns(renderOpts, params)
167
+ }, {
168
+ default: () => {
169
+ return options.map((option, oIndex) => {
170
+ return h(getCurrComponent(name) as ComponentOptions, {
171
+ key: oIndex,
172
+ label: option[valueProp],
173
+ disabled: option.disabled
174
+ }, {
175
+ default: () => cellText(option[labelProp])
176
+ })
177
+ })
178
+ }
179
+ })
180
+ ]
181
+ }
182
+ }
183
+
184
+ VxeUI.renderer.mixin({
185
+ ElAutocomplete: {
186
+ renderFormItemContent: createFormItemRender()
187
+ },
188
+ ElInput: {
189
+ renderFormItemContent: createFormItemRender()
190
+ },
191
+ ElInputNumber: {
192
+ renderFormItemContent: createFormItemRender()
193
+ },
194
+ ElSelect: {
195
+ renderFormItemContent (renderOpts, params) {
196
+ const { options = [], optionGroups, optionProps = {}, optionGroupProps = {} } = renderOpts
197
+ const { data, field } = params
198
+ const { attrs } = renderOpts
199
+ const itemValue = XEUtils.get(data, field)
200
+ const props = getItemProps(renderOpts, params, itemValue)
201
+ const ons = getItemOns(renderOpts, params)
202
+ if (optionGroups) {
203
+ const groupOptions = optionGroupProps.options || 'options'
204
+ const groupLabel = optionGroupProps.label || 'label'
205
+ return [
206
+ h(getCurrComponent('el-select') as ComponentOptions, {
207
+ ...attrs,
208
+ ...props,
209
+ ...ons
210
+ }, {
211
+ default: () => {
212
+ return XEUtils.map(optionGroups, (group, gIndex) => {
213
+ return h(getCurrComponent('el-option-group') as ComponentOptions, {
214
+ label: group[groupLabel],
215
+ key: gIndex
216
+ }, {
217
+ default: () => renderOptions(group[groupOptions], optionProps)
218
+ })
219
+ })
220
+ }
221
+ })
222
+ ]
223
+ }
224
+ return [
225
+ h(getCurrComponent('el-select') as ComponentOptions, {
226
+ ...attrs,
227
+ ...props,
228
+ ...ons
229
+ }, {
230
+ default: () => renderOptions(options, optionProps)
231
+ })
232
+ ]
233
+ }
234
+ },
235
+ ElCascader: {
236
+ renderFormItemContent: createFormItemRender()
237
+ },
238
+ ElDatePicker: {
239
+ renderFormItemContent: createFormItemRender()
240
+ },
241
+ ElTimePicker: {
242
+ renderFormItemContent: createFormItemRender()
243
+ },
244
+ ElTimeSelect: {
245
+ renderFormItemContent: createFormItemRender()
246
+ },
247
+ ElRate: {
248
+ renderFormItemContent: createFormItemRender()
249
+ },
250
+ ElSwitch: {
251
+ renderFormItemContent: createFormItemRender()
252
+ },
253
+ ElSlider: {
254
+ renderFormItemContent: createFormItemRender()
255
+ },
256
+ ElRadioGroup: {
257
+ renderFormItemContent (renderOpts, params) {
258
+ const { options = [], optionProps = {}, attrs } = renderOpts
259
+ const { data, field } = params
260
+ const labelProp = optionProps.label || 'label'
261
+ const valueProp = optionProps.value || 'value'
262
+ const itemValue = XEUtils.get(data, field)
263
+ return [
264
+ h(getCurrComponent('el-radio-group'), {
265
+ ...attrs,
266
+ ...getItemProps(renderOpts, params, itemValue),
267
+ ...getItemOns(renderOpts, params)
268
+ }, {
269
+ default: () => {
270
+ return options.map((option, oIndex) => {
271
+ return h(getCurrComponent('el-radio'), {
272
+ key: oIndex,
273
+ value: option[valueProp],
274
+ disabled: option.disabled
275
+ }, {
276
+ default: () => cellText(option[labelProp])
277
+ })
278
+ })
279
+ }
280
+ })
281
+ ]
282
+ }
283
+ },
284
+ ElCheckboxGroup: {
285
+ renderFormItemContent (renderOpts, params) {
286
+ const { options = [], optionProps = {}, attrs } = renderOpts
287
+ const { data, field } = params
288
+ const labelProp = optionProps.label || 'label'
289
+ const valueProp = optionProps.value || 'value'
290
+ const itemValue = XEUtils.get(data, field)
291
+ return [
292
+ h(getCurrComponent('el-checkbox-group'), {
293
+ ...attrs,
294
+ ...getItemProps(renderOpts, params, itemValue),
295
+ ...getItemOns(renderOpts, params)
296
+ }, {
297
+ default: () => {
298
+ return options.map((option, oIndex) => {
299
+ return h(getCurrComponent('el-checkbox'), {
300
+ key: oIndex,
301
+ value: option[valueProp],
302
+ label: option[labelProp],
303
+ disabled: option.disabled
304
+ })
305
+ })
306
+ }
307
+ })
308
+ ]
309
+ }
310
+ },
311
+ ElButton: {
312
+ renderFormItemContent: defaultButtonItemRender
313
+ },
314
+
315
+ // 已废弃
316
+ ElRadio: {
317
+ renderFormItemContent: createOldFormItemRadioAndCheckboxRender()
318
+ },
319
+ ElCheckbox: {
320
+ renderFormItemContent: createOldFormItemRadioAndCheckboxRender()
321
+ },
322
+ ElButtons: {
323
+ renderFormItemContent: defaultButtonsItemRender
324
+ }
325
+ })
326
+ }