@longhongguo/form-create-ant-design-vue 3.2.52 → 3.2.54
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/dist/form-create.esm.js +2 -2
- package/dist/form-create.esm.js.map +1 -1
- package/dist/form-create.js +2 -2
- package/dist/form-create.js.map +1 -1
- package/package.json +1 -1
- package/src/core/maker.js +5 -0
- package/src/parsers/flex.js +59 -0
- package/src/parsers/index.js +3 -1
- package/src/parsers/text.js +1 -135
- package/types/maker.d.ts +2 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@longhongguo/form-create-ant-design-vue",
|
|
3
|
-
"version": "3.2.
|
|
3
|
+
"version": "3.2.54",
|
|
4
4
|
"description": "AntDesignVue版本低代码表单|FormCreate 是一个可以通过 JSON 生成具有动态渲染、数据收集、验证和提交功能的低代码表单生成组件。支持6个UI框架,适配移动端,并且支持生成任何 Vue 组件。内置20种常用表单组件和自定义组件,再复杂的表单都可以轻松搞定。",
|
|
5
5
|
"main": "./dist/form-create.min.js",
|
|
6
6
|
"module": "./dist/form-create.esm.js",
|
package/src/core/maker.js
CHANGED
|
@@ -98,6 +98,10 @@ function useText(maker) {
|
|
|
98
98
|
maker.text = creatorFactory('text')
|
|
99
99
|
}
|
|
100
100
|
|
|
101
|
+
function useFlex(maker) {
|
|
102
|
+
maker.flex = creatorFactory('flex')
|
|
103
|
+
}
|
|
104
|
+
|
|
101
105
|
useAlias(maker)
|
|
102
106
|
useSlider(maker)
|
|
103
107
|
useFrame(maker)
|
|
@@ -106,5 +110,6 @@ useSelect(maker)
|
|
|
106
110
|
useCusStoreSelect(maker)
|
|
107
111
|
useCusUserSelect(maker)
|
|
108
112
|
useText(maker)
|
|
113
|
+
useFlex(maker)
|
|
109
114
|
|
|
110
115
|
export default maker
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
name: 'flex',
|
|
3
|
+
mergeProp(ctx) {
|
|
4
|
+
// 从 props 中读取 flex 布局配置
|
|
5
|
+
const props = ctx.rule.props || {}
|
|
6
|
+
|
|
7
|
+
// 获取 flex 布局相关配置
|
|
8
|
+
const flexDirection = props.flexDirection || ctx.rule.flexDirection || 'row'
|
|
9
|
+
const flexWrap = props.flexWrap || ctx.rule.flexWrap || 'nowrap'
|
|
10
|
+
const justifyContent =
|
|
11
|
+
props.justifyContent || ctx.rule.justifyContent || 'flex-start'
|
|
12
|
+
const alignItems = props.alignItems || ctx.rule.alignItems || 'flex-start'
|
|
13
|
+
const alignContent =
|
|
14
|
+
props.alignContent || ctx.rule.alignContent || 'flex-start'
|
|
15
|
+
|
|
16
|
+
// 将 flex 样式设置到 ctx.prop.props.style,而不是直接修改 ctx.rule.style
|
|
17
|
+
// 这样可以避免触发递归更新
|
|
18
|
+
if (!ctx.prop.props) {
|
|
19
|
+
ctx.prop.props = {}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// 获取现有的 style(来自 rule.style 或 prop.props.style)
|
|
23
|
+
const existingStyle = ctx.rule.style || ctx.prop.props.style || {}
|
|
24
|
+
|
|
25
|
+
// 合并 flex 样式和现有样式
|
|
26
|
+
const flexStyle = {
|
|
27
|
+
display: 'flex',
|
|
28
|
+
flexDirection,
|
|
29
|
+
flexWrap,
|
|
30
|
+
justifyContent,
|
|
31
|
+
alignItems,
|
|
32
|
+
alignContent,
|
|
33
|
+
...existingStyle
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// 设置到 prop.props.style,这样不会触发 rule 的响应式更新
|
|
37
|
+
ctx.prop.props.style = flexStyle
|
|
38
|
+
|
|
39
|
+
// 确保 children 存在
|
|
40
|
+
if (!ctx.rule.children) {
|
|
41
|
+
ctx.rule.children = []
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
render(children, ctx) {
|
|
45
|
+
// 复制 prop,避免修改原始对象
|
|
46
|
+
const prop = { ...ctx.prop }
|
|
47
|
+
|
|
48
|
+
// 确保 type 是 'div'
|
|
49
|
+
if (prop.type === 'flex') {
|
|
50
|
+
prop.type = 'div'
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// style 已经在 mergeProp 中设置到 prop.props.style 了,直接使用
|
|
54
|
+
// children 会通过 form-create 的机制自动渲染
|
|
55
|
+
const childrenNodes = children || []
|
|
56
|
+
|
|
57
|
+
return ctx.vNode.make('div', prop, childrenNodes)
|
|
58
|
+
}
|
|
59
|
+
}
|
package/src/parsers/index.js
CHANGED
|
@@ -13,6 +13,7 @@ import rangePicker from './rangePicker'
|
|
|
13
13
|
import timeRangePicker from './timeRangePicker'
|
|
14
14
|
import cusStoreSelect from './cusStoreSelect'
|
|
15
15
|
import cusUserSelect from './cusUserSelect'
|
|
16
|
+
import flex from './flex'
|
|
16
17
|
|
|
17
18
|
export default [
|
|
18
19
|
checkbox,
|
|
@@ -29,5 +30,6 @@ export default [
|
|
|
29
30
|
cascader,
|
|
30
31
|
row,
|
|
31
32
|
cusStoreSelect,
|
|
32
|
-
cusUserSelect
|
|
33
|
+
cusUserSelect,
|
|
34
|
+
flex
|
|
33
35
|
]
|
package/src/parsers/text.js
CHANGED
|
@@ -6,13 +6,6 @@ export default {
|
|
|
6
6
|
// 设置 loadChildren 为 false,避免 children 被当作子组件处理
|
|
7
7
|
// text 的 children 只是简单的文本内容,不需要作为子组件加载
|
|
8
8
|
loadChildren: false,
|
|
9
|
-
// 添加 init 方法,用于调试确认 parser 是否被使用
|
|
10
|
-
init(ctx) {
|
|
11
|
-
console.log(
|
|
12
|
-
'[Text Parser] Text parser initialized for rule:',
|
|
13
|
-
ctx.rule.field || ctx.rule.name || 'unnamed'
|
|
14
|
-
)
|
|
15
|
-
},
|
|
16
9
|
// 组件挂载后,手动触发一次 loadData 更新,确保表单数据准备好后再获取初始值
|
|
17
10
|
mounted(ctx) {
|
|
18
11
|
// 如果是动态绑定的 Text 组件,在挂载后手动解析模板并更新值
|
|
@@ -31,60 +24,29 @@ export default {
|
|
|
31
24
|
|
|
32
25
|
// 如果是模板模式,手动解析模板字符串
|
|
33
26
|
if (template) {
|
|
34
|
-
// 先获取所有表单数据,用于调试
|
|
35
27
|
const formData = ctx.$handle.api.formData()
|
|
36
|
-
console.log('[Text Parser] Current form data:', formData)
|
|
37
|
-
|
|
38
28
|
// 使用 loadStrVar 解析模板,传入一个 get 函数来获取表单数据
|
|
39
29
|
value = ctx.$handle.loadStrVar(
|
|
40
30
|
template,
|
|
41
31
|
(field) => {
|
|
42
32
|
// 使用 api.getValue 获取表单字段值
|
|
43
33
|
const val = ctx.$handle.api.getValue(field)
|
|
44
|
-
console.log(
|
|
45
|
-
'[Text Parser] Getting field value:',
|
|
46
|
-
field,
|
|
47
|
-
'=',
|
|
48
|
-
val,
|
|
49
|
-
'type:',
|
|
50
|
-
typeof val
|
|
51
|
-
)
|
|
52
34
|
// 如果 getValue 返回 undefined,尝试从 formData 直接获取
|
|
53
35
|
if (
|
|
54
36
|
val === undefined &&
|
|
55
37
|
formData &&
|
|
56
38
|
formData[field] !== undefined
|
|
57
39
|
) {
|
|
58
|
-
console.log(
|
|
59
|
-
'[Text Parser] Fallback to formData:',
|
|
60
|
-
field,
|
|
61
|
-
'=',
|
|
62
|
-
formData[field]
|
|
63
|
-
)
|
|
64
40
|
return formData[field]
|
|
65
41
|
}
|
|
66
42
|
return val
|
|
67
43
|
},
|
|
68
44
|
null
|
|
69
45
|
)
|
|
70
|
-
console.log(
|
|
71
|
-
'[Text Parser] Manually parsed template:',
|
|
72
|
-
template,
|
|
73
|
-
'result:',
|
|
74
|
-
value,
|
|
75
|
-
'type:',
|
|
76
|
-
typeof value
|
|
77
|
-
)
|
|
78
46
|
}
|
|
79
47
|
// 如果是字段绑定模式,直接获取字段值
|
|
80
48
|
else if (bindField) {
|
|
81
49
|
value = ctx.$handle.api.getValue(bindField) || ''
|
|
82
|
-
console.log(
|
|
83
|
-
'[Text Parser] Manually got field value:',
|
|
84
|
-
bindField,
|
|
85
|
-
'result:',
|
|
86
|
-
value
|
|
87
|
-
)
|
|
88
50
|
}
|
|
89
51
|
|
|
90
52
|
// 更新 rule.children(转换为字符串)
|
|
@@ -96,19 +58,9 @@ export default {
|
|
|
96
58
|
// 触发同步和刷新
|
|
97
59
|
ctx.$handle.api.sync(ctx.rule)
|
|
98
60
|
ctx.$handle.refresh()
|
|
99
|
-
console.log(
|
|
100
|
-
'[Text Parser] Updated rule.children to:',
|
|
101
|
-
ctx.rule.children,
|
|
102
|
-
'value:',
|
|
103
|
-
value
|
|
104
|
-
)
|
|
105
|
-
} else {
|
|
106
|
-
console.log(
|
|
107
|
-
'[Text Parser] Value is null/undefined, not updating children'
|
|
108
|
-
)
|
|
109
61
|
}
|
|
110
62
|
} catch (e) {
|
|
111
|
-
|
|
63
|
+
// 静默处理错误
|
|
112
64
|
}
|
|
113
65
|
}
|
|
114
66
|
}, 500) // 增加延迟,确保表单数据完全准备好
|
|
@@ -146,25 +98,11 @@ export default {
|
|
|
146
98
|
})
|
|
147
99
|
.join('')
|
|
148
100
|
|
|
149
|
-
// 添加调试日志,确认 renderChildren 是否被重新执行
|
|
150
|
-
console.log(
|
|
151
|
-
'[Text Parser] renderChildren default() called, text:',
|
|
152
|
-
text,
|
|
153
|
-
'for rule:',
|
|
154
|
-
ctx.rule.field || ctx.rule.name || 'unnamed'
|
|
155
|
-
)
|
|
156
|
-
|
|
157
101
|
return text || ''
|
|
158
102
|
}
|
|
159
103
|
}
|
|
160
104
|
},
|
|
161
105
|
mergeProp(ctx) {
|
|
162
|
-
console.log(
|
|
163
|
-
'[Text Parser] mergeProp called for rule:',
|
|
164
|
-
ctx.rule.field || ctx.rule.name || 'unnamed',
|
|
165
|
-
'type:',
|
|
166
|
-
ctx.rule.type
|
|
167
|
-
)
|
|
168
106
|
// 确保没有 field 的组件能正常显示
|
|
169
107
|
// 如果 prop.native 未设置,默认设置为 false,让组件被 makeWrap 包装(这样可以显示 title)
|
|
170
108
|
// 但如果需要直接渲染,可以设置 native: true
|
|
@@ -217,40 +155,15 @@ export default {
|
|
|
217
155
|
)
|
|
218
156
|
if (!exists) {
|
|
219
157
|
ctx.rule.effect.loadData.push(loadDataConfig)
|
|
220
|
-
console.log(
|
|
221
|
-
'[Text Parser] Added loadData config (field mode):',
|
|
222
|
-
loadDataConfig,
|
|
223
|
-
'to effect.loadData:',
|
|
224
|
-
ctx.rule.effect.loadData,
|
|
225
|
-
'rule effect:',
|
|
226
|
-
ctx.rule.effect,
|
|
227
|
-
'ctx:',
|
|
228
|
-
ctx
|
|
229
|
-
)
|
|
230
158
|
// 手动触发 effect 来确保 loadData provider 被调用
|
|
231
159
|
// 使用 effect 方法,它会正确设置 ctx 和 input
|
|
232
160
|
if (ctx.$handle && ctx.$handle.effect) {
|
|
233
|
-
console.log(
|
|
234
|
-
'[Text Parser] Manually calling effect(ctx, "loaded") for loadData (field)'
|
|
235
|
-
)
|
|
236
161
|
ctx.$handle.effect(ctx, 'loaded')
|
|
237
|
-
} else {
|
|
238
|
-
console.log(
|
|
239
|
-
'[Text Parser] ctx.$handle.effect not available:',
|
|
240
|
-
!!ctx.$handle,
|
|
241
|
-
!!ctx.$handle?.effect
|
|
242
|
-
)
|
|
243
162
|
}
|
|
244
163
|
}
|
|
245
164
|
}
|
|
246
165
|
// 如果配置了 template(模板字符串),支持多个字段绑定
|
|
247
166
|
else if (bindMode === 'template' && template) {
|
|
248
|
-
console.log(
|
|
249
|
-
'[Text Parser] Setting up template binding:',
|
|
250
|
-
template,
|
|
251
|
-
'for rule:',
|
|
252
|
-
ctx.rule.field || ctx.rule.name || 'unnamed'
|
|
253
|
-
)
|
|
254
167
|
const loadDataConfig = {
|
|
255
168
|
template: template,
|
|
256
169
|
to: 'child',
|
|
@@ -273,21 +186,8 @@ export default {
|
|
|
273
186
|
)
|
|
274
187
|
if (!exists) {
|
|
275
188
|
ctx.rule.effect.loadData.push(loadDataConfig)
|
|
276
|
-
console.log(
|
|
277
|
-
'[Text Parser] Added loadData config:',
|
|
278
|
-
loadDataConfig,
|
|
279
|
-
'to effect.loadData:',
|
|
280
|
-
ctx.rule.effect.loadData,
|
|
281
|
-
'rule effect:',
|
|
282
|
-
ctx.rule.effect,
|
|
283
|
-
'ctx:',
|
|
284
|
-
ctx
|
|
285
|
-
)
|
|
286
189
|
// 手动触发 effect 来确保 loadData provider 被调用
|
|
287
190
|
if (ctx.$handle && ctx.$handle.effect) {
|
|
288
|
-
console.log(
|
|
289
|
-
'[Text Parser] Manually calling effect(ctx, "loaded") for loadData (template)'
|
|
290
|
-
)
|
|
291
191
|
ctx.$handle.effect(ctx, 'loaded')
|
|
292
192
|
// 同时手动添加 watch,监听 effect.loadData 的变化
|
|
293
193
|
// 这样当 effect.loadData 被修改时,也会触发 provider
|
|
@@ -298,26 +198,13 @@ export default {
|
|
|
298
198
|
watch(
|
|
299
199
|
loadDataRef,
|
|
300
200
|
(newVal, oldVal) => {
|
|
301
|
-
console.log(
|
|
302
|
-
'[Text Parser] effect.loadData changed, triggering watch',
|
|
303
|
-
newVal,
|
|
304
|
-
oldVal
|
|
305
|
-
)
|
|
306
201
|
ctx.$handle.effect(ctx, 'watch', { loadData: newVal })
|
|
307
202
|
},
|
|
308
203
|
{ deep: true }
|
|
309
204
|
)
|
|
310
205
|
)
|
|
311
206
|
}
|
|
312
|
-
} else {
|
|
313
|
-
console.log(
|
|
314
|
-
'[Text Parser] ctx.$handle.effect not available:',
|
|
315
|
-
!!ctx.$handle,
|
|
316
|
-
!!ctx.$handle?.effect
|
|
317
|
-
)
|
|
318
207
|
}
|
|
319
|
-
} else {
|
|
320
|
-
console.log('[Text Parser] loadData config already exists, skipping')
|
|
321
208
|
}
|
|
322
209
|
}
|
|
323
210
|
// 静态模式:使用 formCreateChild 或 children 作为内容
|
|
@@ -356,27 +243,9 @@ export default {
|
|
|
356
243
|
ctx.rule.children = [' ']
|
|
357
244
|
}
|
|
358
245
|
}
|
|
359
|
-
console.log(
|
|
360
|
-
'[Text Parser] Initialized children for dynamic binding:',
|
|
361
|
-
ctx.rule.children,
|
|
362
|
-
'bindMode:',
|
|
363
|
-
bindMode
|
|
364
|
-
)
|
|
365
246
|
}
|
|
366
247
|
},
|
|
367
248
|
render(children, ctx) {
|
|
368
|
-
console.log(
|
|
369
|
-
'[Text Parser] render called for rule:',
|
|
370
|
-
ctx.rule.field || ctx.rule.name || 'unnamed',
|
|
371
|
-
'children:',
|
|
372
|
-
children,
|
|
373
|
-
'prop:',
|
|
374
|
-
ctx.prop,
|
|
375
|
-
'hidden:',
|
|
376
|
-
ctx.prop?.hidden,
|
|
377
|
-
'display:',
|
|
378
|
-
ctx.prop?.display
|
|
379
|
-
)
|
|
380
249
|
// text 组件使用 div 渲染,内容来自 children
|
|
381
250
|
// 使用 children.default() 获取响应式内容,参考 html parser 的实现
|
|
382
251
|
|
|
@@ -386,9 +255,7 @@ export default {
|
|
|
386
255
|
if (children && typeof children.default === 'function') {
|
|
387
256
|
try {
|
|
388
257
|
text = children.default() || ''
|
|
389
|
-
console.log('[Text Parser] text content:', text)
|
|
390
258
|
} catch (e) {
|
|
391
|
-
console.warn('Text component render children error:', e)
|
|
392
259
|
text = ''
|
|
393
260
|
}
|
|
394
261
|
}
|
|
@@ -416,7 +283,6 @@ export default {
|
|
|
416
283
|
// 直接使用 vNode.make 渲染 div,文本作为子节点
|
|
417
284
|
// 即使 text 为空,也传递 [text] 确保渲染出 div
|
|
418
285
|
const vnode = ctx.vNode.make('div', prop, [text])
|
|
419
|
-
console.log('[Text Parser] created vnode:', vnode)
|
|
420
286
|
return vnode
|
|
421
287
|
}
|
|
422
288
|
}
|