@dckj-npm/dc-material 0.1.377 → 0.1.379

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.
Files changed (43) hide show
  1. package/build/docs/colorful-button.html +3 -3
  2. package/build/docs/colorful-input.html +3 -3
  3. package/build/docs/custom-form/requirements.html +48 -0
  4. package/build/docs/custom-form.html +48 -0
  5. package/build/docs/index.html +3 -3
  6. package/build/docs/teletext-list.html +3 -3
  7. package/build/docs/umi.80bcbda5.js +1 -0
  8. package/build/docs/{umi.9770df27.css → umi.b31e14a3.css} +1 -1
  9. package/build/docs/~demos/colorful-button-demo.html +3 -3
  10. package/build/docs/~demos/colorful-input-demo.html +3 -3
  11. package/build/docs/~demos/teletext-list-demo-1.html +3 -3
  12. package/build/docs/~demos/teletext-list-demo.html +3 -3
  13. package/build/lowcode/assets-daily.json +13 -13
  14. package/build/lowcode/assets-dev.json +2 -2
  15. package/build/lowcode/assets-prod.json +13 -13
  16. package/build/lowcode/meta.design.js +1 -1
  17. package/build/lowcode/meta.js +1 -1
  18. package/build/lowcode/render/default/view.css +1 -1
  19. package/build/lowcode/render/default/view.js +1 -1
  20. package/build/lowcode/view.css +1 -1
  21. package/build/lowcode/view.js +1 -1
  22. package/dist/BizComps.css +1 -1
  23. package/dist/BizComps.js +2 -2
  24. package/dist/BizComps.js.map +1 -1
  25. package/es/components/custom-form/CUSTOM_FORM_OPERATION_MANUAL.md +284 -0
  26. package/es/components/custom-form/custom-form.d.ts +188 -2
  27. package/es/components/custom-form/custom-form.js +506 -26
  28. package/es/components/custom-form/index.d.ts +1 -1
  29. package/es/components/custom-form/index.scss +1 -1
  30. package/es/components/custom-form/schema.json +1374 -0
  31. package/lib/components/custom-form/CUSTOM_FORM_OPERATION_MANUAL.md +284 -0
  32. package/lib/components/custom-form/custom-form.d.ts +188 -2
  33. package/lib/components/custom-form/custom-form.js +511 -31
  34. package/lib/components/custom-form/index.d.ts +1 -1
  35. package/lib/components/custom-form/index.scss +1 -1
  36. package/lib/components/custom-form/schema.json +1374 -0
  37. package/lowcode/custom-form/meta.ts +1675 -116
  38. package/lowcode_es/custom-form/meta.js +2116 -141
  39. package/lowcode_es/meta.js +1 -1
  40. package/lowcode_lib/custom-form/meta.js +2116 -141
  41. package/lowcode_lib/meta.js +1 -1
  42. package/package.json +3 -3
  43. package/build/docs/umi.6f6bf535.js +0 -1
@@ -24,59 +24,203 @@ var CustomFormMeta = {
24
24
  component: {
25
25
  isContainer: true
26
26
  },
27
- props: [{
28
- title: '列数',
29
- name: 'columns',
30
- setter: {
31
- componentName: 'RadioGroupSetter',
32
- props: {
33
- dataSource: [{
34
- label: '一列',
35
- value: 1
36
- }, {
37
- label: '二列',
38
- value: 2
39
- }, {
40
- label: '三列',
41
- value: 3
42
- }, {
43
- label: '四列',
44
- value: 4
45
- }],
46
- options: [{
47
- label: '一列',
48
- value: 1
49
- }, {
50
- label: '二列',
51
- value: 2
52
- }, {
53
- label: '三列',
54
- value: 3
55
- }, {
56
- label: '四列',
57
- value: 4
58
- }]
27
+ props: [
28
+ // ─────────────────────────────────────────────────────────────────────
29
+ // 分组一:全局布局
30
+ // ─────────────────────────────────────────────────────────────────────
31
+ {
32
+ type: 'group',
33
+ title: '全局布局',
34
+ name: 'layoutGroup',
35
+ display: 'accordion',
36
+ items: [{
37
+ title: {
38
+ label: '列数',
39
+ tip: '表单的整体列数,所有表单项按此列数排列。\n单列适合简单表单,多列适合信息密集的编辑页面。'
59
40
  },
60
- initialValue: 1
61
- }
62
- }, {
63
- title: '间距',
64
- name: 'spacing',
65
- setter: {
66
- componentName: 'JsonSetter',
67
- isRequired: false,
68
- initialValue: [0, 16, 16, 0]
69
- }
70
- }, {
71
- title: '空态文案',
72
- name: 'emptyContent',
73
- setter: {
74
- componentName: 'StringSetter',
75
- isRequired: false,
76
- initialValue: '添加表单项'
77
- }
78
- }, {
79
- title: '表单项',
41
+ name: 'columns',
42
+ setter: {
43
+ componentName: 'RadioGroupSetter',
44
+ props: {
45
+ options: [{
46
+ title: '一列',
47
+ value: 1
48
+ }, {
49
+ title: '二列',
50
+ value: 2
51
+ }, {
52
+ title: '三列',
53
+ value: 3
54
+ }, {
55
+ title: '四列',
56
+ value: 4
57
+ }]
58
+ },
59
+ initialValue: 1
60
+ }
61
+ }, {
62
+ title: {
63
+ label: '标签位置',
64
+ tip: '表单标签相对于输入框的位置:\n· 顶部(top):标签在输入框上方,适合移动端或字段较多时\n· 左侧(left):标签在输入框左侧,传统表单样式,配合「标签宽度」使用\n· 内嵌(inset):标签显示在输入框内部,输入时标签浮动到上方'
65
+ },
66
+ name: 'labelAlign',
67
+ setter: {
68
+ componentName: 'RadioGroupSetter',
69
+ props: {
70
+ options: [{
71
+ title: '顶部',
72
+ value: 'top'
73
+ }, {
74
+ title: '左侧',
75
+ value: 'left'
76
+ }, {
77
+ title: '内嵌',
78
+ value: 'inset'
79
+ }]
80
+ },
81
+ initialValue: 'top'
82
+ },
83
+ extraProps: {
84
+ setValue: function setValue(target, value) {
85
+ if (value === 'left') {
86
+ target.getProps().setPropValue('labelCol', {
87
+ fixedSpan: 4
88
+ });
89
+ } else {
90
+ target.getProps().setPropValue('labelCol', null);
91
+ }
92
+ target.getProps().setPropValue('labelAlign', value);
93
+ }
94
+ }
95
+ }, {
96
+ title: {
97
+ label: '标签宽度',
98
+ tip: '当标签位置为「左侧」时,设置标签列的固定宽度(格宫列数,1~24)。\nJSON 示例:{ "fixedSpan": 6 } 意为标签占 6 格。\n不填则自动宽度。常用值:4(短标签)、6(中等标签)、8(长标签)'
99
+ },
100
+ name: 'labelCol.fixedSpan',
101
+ condition: function condition(target) {
102
+ return target.getProps().getPropValue('labelAlign') === 'left';
103
+ },
104
+ setter: {
105
+ componentName: 'NumberSetter',
106
+ props: {
107
+ min: 1,
108
+ max: 12
109
+ },
110
+ initialValue: 4
111
+ }
112
+ }, {
113
+ title: {
114
+ label: '行间距',
115
+ tip: '每行表单项之间的上下间距(像素)。\n默认 0。建议设为 8~16px 让表单更舒适。'
116
+ },
117
+ name: '!rowGap',
118
+ extraProps: {
119
+ getValue: function getValue(target) {
120
+ var _sp$;
121
+ var sp = target.getProps().getPropValue('spacing');
122
+ return Array.isArray(sp) ? (_sp$ = sp[0]) !== null && _sp$ !== void 0 ? _sp$ : 0 : 0;
123
+ },
124
+ setValue: function setValue(target, value) {
125
+ var _sp$2;
126
+ var sp = target.getProps().getPropValue('spacing');
127
+ var colGap = Array.isArray(sp) ? (_sp$2 = sp[1]) !== null && _sp$2 !== void 0 ? _sp$2 : 16 : 16;
128
+ target.getProps().setPropValue('spacing', [value, colGap]);
129
+ }
130
+ },
131
+ setter: {
132
+ componentName: 'NumberSetter',
133
+ props: {
134
+ min: 0,
135
+ max: 100
136
+ },
137
+ initialValue: 0
138
+ }
139
+ }, {
140
+ title: {
141
+ label: '列间距',
142
+ tip: '多列表单中各列之间的左右间距(像素)。\n默认 16px。单列表单中此设置无明显效果。'
143
+ },
144
+ name: '!colGap',
145
+ extraProps: {
146
+ getValue: function getValue(target) {
147
+ var _sp$3;
148
+ var sp = target.getProps().getPropValue('spacing');
149
+ return Array.isArray(sp) ? (_sp$3 = sp[1]) !== null && _sp$3 !== void 0 ? _sp$3 : 16 : 16;
150
+ },
151
+ setValue: function setValue(target, value) {
152
+ var _sp$4;
153
+ var sp = target.getProps().getPropValue('spacing');
154
+ var rowGap = Array.isArray(sp) ? (_sp$4 = sp[0]) !== null && _sp$4 !== void 0 ? _sp$4 : 0 : 0;
155
+ target.getProps().setPropValue('spacing', [rowGap, value]);
156
+ }
157
+ },
158
+ setter: {
159
+ componentName: 'NumberSetter',
160
+ props: {
161
+ min: 0,
162
+ max: 100
163
+ },
164
+ initialValue: 16
165
+ }
166
+ }, {
167
+ title: {
168
+ label: '组件宽度占满',
169
+ tip: '全局控制所有表单项的输入组件是否撑满容器宽度(100%)。\n开启后相当为每个表单项设置 fullWidth=true。\n单个表单项的「宽度占满」设置优先级更高,可覆盖此全局值。'
170
+ },
171
+ name: 'fullWidth',
172
+ setter: {
173
+ componentName: 'BoolSetter',
174
+ initialValue: true
175
+ }
176
+ }, {
177
+ title: {
178
+ label: '表单状态',
179
+ tip: '编辑态:正常填写表单。\n只读态:所有输入框变为纯文本显示,空值显示"—"。\n常用于"查看详情"场景,绑定变量可动态切换编辑/只读。'
180
+ },
181
+ name: '!status',
182
+ extraProps: {
183
+ getValue: function getValue(target) {
184
+ return target.getProps().getPropValue('isPreview') ? 'readonly' : 'editable';
185
+ },
186
+ setValue: function setValue(target, value) {
187
+ target.getProps().setPropValue('isPreview', value === 'readonly');
188
+ }
189
+ },
190
+ setter: {
191
+ componentName: 'RadioGroupSetter',
192
+ props: {
193
+ options: [{
194
+ title: '编辑',
195
+ value: 'editable'
196
+ }, {
197
+ title: '只读',
198
+ value: 'readonly'
199
+ }]
200
+ },
201
+ initialValue: 'editable'
202
+ }
203
+ }, {
204
+ title: {
205
+ label: '空态文案',
206
+ tip: '当没有任何表单项时展示的提示文字。'
207
+ },
208
+ name: 'emptyContent',
209
+ setter: {
210
+ componentName: 'StringSetter',
211
+ isRequired: false,
212
+ initialValue: '添加表单项'
213
+ }
214
+ }]
215
+ },
216
+ // ─────────────────────────────────────────────────────────────────────
217
+ // 分组二:表单项配置
218
+ // ─────────────────────────────────────────────────────────────────────
219
+ {
220
+ title: {
221
+ label: '表单项',
222
+ tip: '配置表单中每一行的字段。\n每个表单项需要填写「字段名」和「标题」,其余可选。\n字段名(field)是提交数据时的 key,需要与后端接口字段名保持一致。'
223
+ },
80
224
  name: 'formItems',
81
225
  setter: {
82
226
  componentName: 'ArraySetter',
@@ -85,8 +229,13 @@ var CustomFormMeta = {
85
229
  componentName: 'ObjectSetter',
86
230
  props: {
87
231
  config: {
88
- items: [{
89
- title: '字段名',
232
+ items: [
233
+ // ── 基础
234
+ {
235
+ title: {
236
+ label: '字段名',
237
+ tip: '必填。提交表单时该字段的 key 名称,需与后端接口字段名一致。\n例如:user_name、phone、banquet_date'
238
+ },
90
239
  name: 'field',
91
240
  setter: {
92
241
  componentName: 'StringSetter',
@@ -94,58 +243,131 @@ var CustomFormMeta = {
94
243
  initialValue: ''
95
244
  }
96
245
  }, {
97
- title: '标题',
246
+ title: {
247
+ label: '标题',
248
+ tip: '表单项左侧(或上方)显示的文字标签。\n例如:姓名、手机号、宴请日期'
249
+ },
98
250
  name: 'label',
251
+ important: true,
252
+ display: 'inline',
99
253
  setter: {
100
254
  componentName: 'StringSetter',
101
255
  isRequired: false,
102
256
  initialValue: ''
103
257
  }
104
258
  }, {
105
- title: '必填',
259
+ title: {
260
+ label: '必填',
261
+ tip: '开启后标题旁显示红色星号,并在提交时自动校验该字段不能为空。'
262
+ },
106
263
  name: 'required',
107
264
  setter: {
108
265
  componentName: 'BoolSetter',
109
266
  isRequired: false,
110
267
  initialValue: false
111
268
  }
112
- }, {
113
- title: '组件类型',
269
+ },
270
+ // ── 组件类型
271
+ {
272
+ title: {
273
+ label: '组件类型',
274
+ tip: '选择该字段使用哪种输入控件:\n· 输入框(Input):单行文本,最常用\n· 多行文本(TextArea):适合备注、描述\n· 下拉选择(Select):从预设选项中选一个\n· 单选组(RadioGroup):横排单选按钮\n· 复选组(CheckboxGroup):多选框\n· 数字输入(NumberPicker):带加减按钮的数字\n· 日期选择(DatePicker):日历弹出选日期\n· 上传(Upload):文件/图片上传'
275
+ },
114
276
  name: 'componentType',
277
+ important: true,
278
+ display: 'inline',
115
279
  setter: {
116
280
  componentName: 'SelectSetter',
117
281
  props: {
118
282
  options: [{
119
- label: '输入框',
283
+ label: '输入框 (Input)',
120
284
  value: 'Input'
121
285
  }, {
122
- label: '多行文本',
286
+ label: '多行文本 (TextArea)',
123
287
  value: 'TextArea'
124
288
  }, {
125
- label: '下拉选择',
289
+ label: '下拉选择 (Select)',
126
290
  value: 'Select'
127
291
  }, {
128
- label: '单选组',
292
+ label: '单选组 (RadioGroup)',
129
293
  value: 'RadioGroup'
130
294
  }, {
131
- label: '复选组',
295
+ label: '复选组 (CheckboxGroup)',
132
296
  value: 'CheckboxGroup'
133
297
  }, {
134
- label: '数字输入',
298
+ label: '数字输入 (NumberPicker)',
135
299
  value: 'NumberPicker'
136
300
  }, {
137
- label: '日期选择',
301
+ label: '日期选择 (DatePicker)',
138
302
  value: 'DatePicker'
139
303
  }, {
140
- label: '上传',
304
+ label: '日期时间 (DateTimePicker)',
305
+ value: 'DateTimePicker'
306
+ }, {
307
+ label: '上传 (Upload)',
141
308
  value: 'Upload'
142
309
  }]
143
310
  },
144
311
  initialValue: 'Input'
145
312
  }
146
- }, {
147
- title: '选项',
313
+ },
314
+ // ── 输入提示(仅对支持 placeholder 的组件显示)
315
+ {
316
+ title: {
317
+ label: '输入提示',
318
+ tip: '显示在输入框内的灰色提示文字(placeholder)。\n例如:请输入姓名、请选择日期'
319
+ },
320
+ name: 'placeholder',
321
+ condition: function condition(target) {
322
+ var _target$parent, _target$parent$getPro;
323
+ var t = ((_target$parent = target.parent) === null || _target$parent === void 0 ? void 0 : (_target$parent$getPro = _target$parent.getPropValue) === null || _target$parent$getPro === void 0 ? void 0 : _target$parent$getPro.call(_target$parent, 'componentType')) || 'Input';
324
+ return !['Upload', 'RadioGroup', 'CheckboxGroup'].includes(t);
325
+ },
326
+ setter: {
327
+ componentName: 'StringSetter',
328
+ isRequired: false,
329
+ initialValue: ''
330
+ }
331
+ },
332
+ // ── 默认值
333
+ {
334
+ title: {
335
+ label: '默认值',
336
+ tip: '该字段的初始默认值,表单打开时自动填入。\n· 文本类型填写字符串,例如:待处理\n· 数字类型填写数字,例如:0\n· 日期类型填写格式化字符串,例如:2026-01-01\n· 下拉/单选填写选项的 value 值,例如:male\n· 复选框填写数组,例如:["a","b"]\n\n优先级高于"全局初始值"(initialValues)中同名字段。'
337
+ },
338
+ name: 'initialValue',
339
+ setter: {
340
+ componentName: 'MixedSetter',
341
+ props: {
342
+ setters: [{
343
+ componentName: 'StringSetter',
344
+ title: '字符串'
345
+ }, {
346
+ componentName: 'NumberSetter',
347
+ title: '数字'
348
+ }, {
349
+ componentName: 'BoolSetter',
350
+ title: '布尔'
351
+ }, {
352
+ componentName: 'JsonSetter',
353
+ title: 'JSON(数组/对象)'
354
+ }]
355
+ },
356
+ isRequired: false
357
+ }
358
+ },
359
+ // ── 选项(下拉/单选/复选)
360
+ {
361
+ title: {
362
+ label: '选项列表',
363
+ tip: '仅在组件类型为「下拉选择」「单选组」「复选组」时生效。\n每个选项需配置:\n· 名称(label):界面上显示的文字,例如:男\n· 值(value):提交时实际传给后端的值,例如:male'
364
+ },
148
365
  name: 'options',
366
+ condition: function condition(target) {
367
+ var _target$parent2, _target$parent2$getPr, _target$parent3, _target$parent3$paren, _target$parent3$paren2;
368
+ var t = ((_target$parent2 = target.parent) === null || _target$parent2 === void 0 ? void 0 : (_target$parent2$getPr = _target$parent2.getPropValue) === null || _target$parent2$getPr === void 0 ? void 0 : _target$parent2$getPr.call(_target$parent2, 'componentType')) || ((_target$parent3 = target.parent) === null || _target$parent3 === void 0 ? void 0 : (_target$parent3$paren = _target$parent3.parent) === null || _target$parent3$paren === void 0 ? void 0 : (_target$parent3$paren2 = _target$parent3$paren.getPropValue) === null || _target$parent3$paren2 === void 0 ? void 0 : _target$parent3$paren2.call(_target$parent3$paren, 'componentType'));
369
+ return ['Select', 'RadioGroup', 'CheckboxGroup'].includes(t);
370
+ },
149
371
  setter: {
150
372
  componentName: 'ArraySetter',
151
373
  props: {
@@ -154,7 +376,10 @@ var CustomFormMeta = {
154
376
  props: {
155
377
  config: {
156
378
  items: [{
157
- title: '名称',
379
+ title: {
380
+ label: '名称',
381
+ tip: '选项显示的文字'
382
+ },
158
383
  name: 'label',
159
384
  setter: {
160
385
  componentName: 'StringSetter',
@@ -162,7 +387,10 @@ var CustomFormMeta = {
162
387
  initialValue: ''
163
388
  }
164
389
  }, {
165
- title: '值',
390
+ title: {
391
+ label: '值',
392
+ tip: '提交时传给后端的实际值'
393
+ },
166
394
  name: 'value',
167
395
  setter: {
168
396
  componentName: 'StringSetter',
@@ -176,129 +404,1876 @@ var CustomFormMeta = {
176
404
  },
177
405
  initialValue: []
178
406
  }
179
- }, {
180
- title: '列跨度',
407
+ },
408
+ // ── 动态选项绑定(阶段二)
409
+ {
410
+ title: {
411
+ label: '动态选项绑定',
412
+ tip: '仅在组件类型为「下拉选择」「单选组」「复选组」时生效。\n绑定后优先级高于上方「选项列表」(静态配置)。\n支持绑定页面变量或数据源返回的数组,数组格式为 [{label, value}, ...]。\n常见用法:将套餐列表、城市列表等接口数据直接绑定到选项。'
413
+ },
414
+ name: 'optionsBind',
415
+ condition: function condition(target) {
416
+ var _target$parent4, _target$parent4$getPr, _target$parent5, _target$parent5$paren, _target$parent5$paren2;
417
+ var t = ((_target$parent4 = target.parent) === null || _target$parent4 === void 0 ? void 0 : (_target$parent4$getPr = _target$parent4.getPropValue) === null || _target$parent4$getPr === void 0 ? void 0 : _target$parent4$getPr.call(_target$parent4, 'componentType')) || ((_target$parent5 = target.parent) === null || _target$parent5 === void 0 ? void 0 : (_target$parent5$paren = _target$parent5.parent) === null || _target$parent5$paren === void 0 ? void 0 : (_target$parent5$paren2 = _target$parent5$paren.getPropValue) === null || _target$parent5$paren2 === void 0 ? void 0 : _target$parent5$paren2.call(_target$parent5$paren, 'componentType'));
418
+ return ['Select', 'RadioGroup', 'CheckboxGroup'].includes(t);
419
+ },
420
+ setter: {
421
+ componentName: 'SetterFormVariable',
422
+ props: {
423
+ attributes: [{
424
+ label: '选项数据',
425
+ value: 'optionsBind',
426
+ children: [{
427
+ label: '显示文字',
428
+ isRequire: true,
429
+ value: 'label'
430
+ }, {
431
+ label: '选项值',
432
+ isRequire: true,
433
+ value: 'value'
434
+ }]
435
+ }]
436
+ }
437
+ }
438
+ },
439
+ // ── 布局
440
+ {
441
+ title: {
442
+ label: '列跨度',
443
+ tip: '该表单项横向占几列(不超过表单总列数)。\n例如总列数为 4,设置为 2 则占一半宽度,设置为 4 则独占一行。'
444
+ },
181
445
  name: 'columnSpan',
446
+ setter: {
447
+ componentName: 'RadioGroupSetter',
448
+ props: {
449
+ options: [{
450
+ title: '1格',
451
+ value: 1
452
+ }, {
453
+ title: '2格',
454
+ value: 2
455
+ }, {
456
+ title: '3格',
457
+ value: 3
458
+ }, {
459
+ title: '4格',
460
+ value: 4
461
+ }]
462
+ },
463
+ initialValue: 1
464
+ }
465
+ }, {
466
+ title: {
467
+ label: '尺寸',
468
+ tip: '单个表单项的组件尺寸,优先级高于表单全局 size。\n不设置时继承表单全局尺寸(默认 medium)。'
469
+ },
470
+ name: 'size',
471
+ setter: {
472
+ componentName: 'RadioGroupSetter',
473
+ props: {
474
+ options: [{
475
+ title: '小',
476
+ value: 'small'
477
+ }, {
478
+ title: '中',
479
+ value: 'medium'
480
+ }, {
481
+ title: '大',
482
+ value: 'large'
483
+ }]
484
+ }
485
+ }
486
+ }, {
487
+ title: {
488
+ label: '宽度占满',
489
+ tip: '开启后该表单项的输入组件宽度为 100%,撑满所在列的宽度。\n默认开启,通常不需要关闭。'
490
+ },
491
+ name: 'fullWidth',
492
+ setter: {
493
+ componentName: 'BoolSetter',
494
+ initialValue: true
495
+ }
496
+ },
497
+ // ── 提示信息
498
+ {
499
+ title: {
500
+ label: '错误提示',
501
+ tip: '校验失败时显示的自定义错误文字,涵盖必填为空与正则/格式不匹配两种情况。\n不填则由组件自动生成,例如"xxx 不能为空"或"格式不正确"。\n示例:请输入正确的 11 位手机号'
502
+ },
503
+ name: '!helpMsg',
504
+ extraProps: {
505
+ getValue: function getValue(target) {
506
+ var _target$parent6, _target$parent6$getPr, _target$parent7, _target$parent7$getPr, _target$parent7$getPr2;
507
+ return ((_target$parent6 = target.parent) === null || _target$parent6 === void 0 ? void 0 : (_target$parent6$getPr = _target$parent6.getPropValue) === null || _target$parent6$getPr === void 0 ? void 0 : _target$parent6$getPr.call(_target$parent6, 'help')) || ((_target$parent7 = target.parent) === null || _target$parent7 === void 0 ? void 0 : (_target$parent7$getPr = _target$parent7.getPropValue) === null || _target$parent7$getPr === void 0 ? void 0 : (_target$parent7$getPr2 = _target$parent7$getPr.call(_target$parent7, 'formItemProps')) === null || _target$parent7$getPr2 === void 0 ? void 0 : _target$parent7$getPr2.requiredMessage) || '';
508
+ },
509
+ setValue: function setValue(target, value) {
510
+ var _target$parent8, _target$parent8$setPr, _target$parent9, _target$parent9$getPr, _target$parent0, _target$parent0$setPr;
511
+ (_target$parent8 = target.parent) === null || _target$parent8 === void 0 ? void 0 : (_target$parent8$setPr = _target$parent8.setPropValue) === null || _target$parent8$setPr === void 0 ? void 0 : _target$parent8$setPr.call(_target$parent8, 'help', value || undefined);
512
+ var fp = (0, _extends2["default"])({}, ((_target$parent9 = target.parent) === null || _target$parent9 === void 0 ? void 0 : (_target$parent9$getPr = _target$parent9.getPropValue) === null || _target$parent9$getPr === void 0 ? void 0 : _target$parent9$getPr.call(_target$parent9, 'formItemProps')) || {});
513
+ if (!value) {
514
+ delete fp.requiredMessage;
515
+ } else {
516
+ fp.requiredMessage = value;
517
+ }
518
+ (_target$parent0 = target.parent) === null || _target$parent0 === void 0 ? void 0 : (_target$parent0$setPr = _target$parent0.setPropValue) === null || _target$parent0$setPr === void 0 ? void 0 : _target$parent0$setPr.call(_target$parent0, 'formItemProps', fp);
519
+ }
520
+ },
521
+ setter: {
522
+ componentName: 'StringSetter',
523
+ isRequired: false,
524
+ initialValue: ''
525
+ }
526
+ }, {
527
+ title: {
528
+ label: '补充说明',
529
+ tip: '始终显示在输入框下方的灰色提示文字,与错误提示共存,用于告知用户填写要求或格式。\n例如:手机号用于接收预订通知短信'
530
+ },
531
+ name: 'extra',
532
+ setter: {
533
+ componentName: 'StringSetter',
534
+ isRequired: false,
535
+ initialValue: ''
536
+ }
537
+ },
538
+ // ── 组件属性(结构化,按组件类型分组)
539
+ // ── 通用:禁用
540
+ {
541
+ title: {
542
+ label: '禁用',
543
+ tip: '开启后该输入组件变为禁用状态,用户无法编辑。'
544
+ },
545
+ name: '!disabled',
546
+ condition: function condition(target) {
547
+ var _target$parent1, _target$parent1$getPr;
548
+ var t = ((_target$parent1 = target.parent) === null || _target$parent1 === void 0 ? void 0 : (_target$parent1$getPr = _target$parent1.getPropValue) === null || _target$parent1$getPr === void 0 ? void 0 : _target$parent1$getPr.call(_target$parent1, 'componentType')) || 'Input';
549
+ return !['Upload'].includes(t);
550
+ },
551
+ extraProps: {
552
+ getValue: function getValue(target) {
553
+ var _target$parent10, _target$parent10$getP, _target$parent10$getP2;
554
+ return (_target$parent10 = target.parent) === null || _target$parent10 === void 0 ? void 0 : (_target$parent10$getP = _target$parent10.getPropValue) === null || _target$parent10$getP === void 0 ? void 0 : (_target$parent10$getP2 = _target$parent10$getP.call(_target$parent10, 'componentProps')) === null || _target$parent10$getP2 === void 0 ? void 0 : _target$parent10$getP2.disabled;
555
+ },
556
+ setValue: function setValue(target, value) {
557
+ var _target$parent11, _target$parent11$getP, _target$parent12, _target$parent12$setP;
558
+ var cp = (0, _extends2["default"])({}, ((_target$parent11 = target.parent) === null || _target$parent11 === void 0 ? void 0 : (_target$parent11$getP = _target$parent11.getPropValue) === null || _target$parent11$getP === void 0 ? void 0 : _target$parent11$getP.call(_target$parent11, 'componentProps')) || {});
559
+ cp.disabled = value;
560
+ (_target$parent12 = target.parent) === null || _target$parent12 === void 0 ? void 0 : (_target$parent12$setP = _target$parent12.setPropValue) === null || _target$parent12$setP === void 0 ? void 0 : _target$parent12$setP.call(_target$parent12, 'componentProps', cp);
561
+ }
562
+ },
563
+ setter: {
564
+ componentName: 'BoolSetter',
565
+ initialValue: false
566
+ }
567
+ },
568
+ // ── Input:最大字符数 / 只读
569
+ {
570
+ title: {
571
+ label: '最大字符数',
572
+ tip: '输入框最多允许输入的字符数。\n超出后无法继续输入。配合「显示计数」使用效果更好。'
573
+ },
574
+ name: '!maxLength',
575
+ condition: function condition(target) {
576
+ var _target$parent13, _target$parent13$getP;
577
+ var t = ((_target$parent13 = target.parent) === null || _target$parent13 === void 0 ? void 0 : (_target$parent13$getP = _target$parent13.getPropValue) === null || _target$parent13$getP === void 0 ? void 0 : _target$parent13$getP.call(_target$parent13, 'componentType')) || 'Input';
578
+ return ['Input', 'TextArea'].includes(t);
579
+ },
580
+ extraProps: {
581
+ getValue: function getValue(target) {
582
+ var _target$parent14, _target$parent14$getP, _target$parent14$getP2;
583
+ return (_target$parent14 = target.parent) === null || _target$parent14 === void 0 ? void 0 : (_target$parent14$getP = _target$parent14.getPropValue) === null || _target$parent14$getP === void 0 ? void 0 : (_target$parent14$getP2 = _target$parent14$getP.call(_target$parent14, 'componentProps')) === null || _target$parent14$getP2 === void 0 ? void 0 : _target$parent14$getP2.maxLength;
584
+ },
585
+ setValue: function setValue(target, value) {
586
+ var _target$parent15, _target$parent15$getP, _target$parent16, _target$parent16$setP;
587
+ var cp = (0, _extends2["default"])({}, ((_target$parent15 = target.parent) === null || _target$parent15 === void 0 ? void 0 : (_target$parent15$getP = _target$parent15.getPropValue) === null || _target$parent15$getP === void 0 ? void 0 : _target$parent15$getP.call(_target$parent15, 'componentProps')) || {});
588
+ if (value === undefined || value === null || value === '') {
589
+ delete cp.maxLength;
590
+ } else {
591
+ cp.maxLength = value;
592
+ }
593
+ (_target$parent16 = target.parent) === null || _target$parent16 === void 0 ? void 0 : (_target$parent16$setP = _target$parent16.setPropValue) === null || _target$parent16$setP === void 0 ? void 0 : _target$parent16$setP.call(_target$parent16, 'componentProps', cp);
594
+ }
595
+ },
596
+ setter: {
597
+ componentName: 'NumberSetter',
598
+ props: {
599
+ min: 1
600
+ }
601
+ }
602
+ }, {
603
+ title: {
604
+ label: '显示计数',
605
+ tip: '开启后在输入框右下角显示"已输入/最大字符数"计数器。\n需配合「最大字符数」使用。'
606
+ },
607
+ name: '!hasLimitHint',
608
+ condition: function condition(target) {
609
+ var _target$parent17, _target$parent17$getP;
610
+ var t = ((_target$parent17 = target.parent) === null || _target$parent17 === void 0 ? void 0 : (_target$parent17$getP = _target$parent17.getPropValue) === null || _target$parent17$getP === void 0 ? void 0 : _target$parent17$getP.call(_target$parent17, 'componentType')) || 'Input';
611
+ return ['Input', 'TextArea'].includes(t);
612
+ },
613
+ extraProps: {
614
+ getValue: function getValue(target) {
615
+ var _target$parent18, _target$parent18$getP, _target$parent18$getP2;
616
+ return (_target$parent18 = target.parent) === null || _target$parent18 === void 0 ? void 0 : (_target$parent18$getP = _target$parent18.getPropValue) === null || _target$parent18$getP === void 0 ? void 0 : (_target$parent18$getP2 = _target$parent18$getP.call(_target$parent18, 'componentProps')) === null || _target$parent18$getP2 === void 0 ? void 0 : _target$parent18$getP2.hasLimitHint;
617
+ },
618
+ setValue: function setValue(target, value) {
619
+ var _target$parent19, _target$parent19$getP, _target$parent20, _target$parent20$setP;
620
+ var cp = (0, _extends2["default"])({}, ((_target$parent19 = target.parent) === null || _target$parent19 === void 0 ? void 0 : (_target$parent19$getP = _target$parent19.getPropValue) === null || _target$parent19$getP === void 0 ? void 0 : _target$parent19$getP.call(_target$parent19, 'componentProps')) || {});
621
+ cp.hasLimitHint = value;
622
+ (_target$parent20 = target.parent) === null || _target$parent20 === void 0 ? void 0 : (_target$parent20$setP = _target$parent20.setPropValue) === null || _target$parent20$setP === void 0 ? void 0 : _target$parent20$setP.call(_target$parent20, 'componentProps', cp);
623
+ }
624
+ },
625
+ setter: {
626
+ componentName: 'BoolSetter',
627
+ initialValue: false
628
+ }
629
+ }, {
630
+ title: {
631
+ label: '只读',
632
+ tip: '开启后输入框内容不可编辑(与禁用不同,只读不改变样式)。\n常用于"自动计算填入"的字段,如套餐价格。'
633
+ },
634
+ name: '!readOnly',
635
+ condition: function condition(target) {
636
+ var _target$parent21, _target$parent21$getP;
637
+ var t = ((_target$parent21 = target.parent) === null || _target$parent21 === void 0 ? void 0 : (_target$parent21$getP = _target$parent21.getPropValue) === null || _target$parent21$getP === void 0 ? void 0 : _target$parent21$getP.call(_target$parent21, 'componentType')) || 'Input';
638
+ return ['Input', 'TextArea'].includes(t);
639
+ },
640
+ extraProps: {
641
+ getValue: function getValue(target) {
642
+ var _target$parent22, _target$parent22$getP, _target$parent22$getP2;
643
+ return (_target$parent22 = target.parent) === null || _target$parent22 === void 0 ? void 0 : (_target$parent22$getP = _target$parent22.getPropValue) === null || _target$parent22$getP === void 0 ? void 0 : (_target$parent22$getP2 = _target$parent22$getP.call(_target$parent22, 'componentProps')) === null || _target$parent22$getP2 === void 0 ? void 0 : _target$parent22$getP2.readOnly;
644
+ },
645
+ setValue: function setValue(target, value) {
646
+ var _target$parent23, _target$parent23$getP, _target$parent24, _target$parent24$setP;
647
+ var cp = (0, _extends2["default"])({}, ((_target$parent23 = target.parent) === null || _target$parent23 === void 0 ? void 0 : (_target$parent23$getP = _target$parent23.getPropValue) === null || _target$parent23$getP === void 0 ? void 0 : _target$parent23$getP.call(_target$parent23, 'componentProps')) || {});
648
+ cp.readOnly = value;
649
+ (_target$parent24 = target.parent) === null || _target$parent24 === void 0 ? void 0 : (_target$parent24$setP = _target$parent24.setPropValue) === null || _target$parent24$setP === void 0 ? void 0 : _target$parent24$setP.call(_target$parent24, 'componentProps', cp);
650
+ }
651
+ },
652
+ setter: {
653
+ componentName: 'BoolSetter',
654
+ initialValue: false
655
+ }
656
+ },
657
+ // ── TextArea:行数
658
+ {
659
+ title: {
660
+ label: '显示行数',
661
+ tip: '多行文本框默认显示的行数(高度)。默认 4 行。'
662
+ },
663
+ name: '!rows',
664
+ condition: function condition(target) {
665
+ var _target$parent25, _target$parent25$getP;
666
+ return ((_target$parent25 = target.parent) === null || _target$parent25 === void 0 ? void 0 : (_target$parent25$getP = _target$parent25.getPropValue) === null || _target$parent25$getP === void 0 ? void 0 : _target$parent25$getP.call(_target$parent25, 'componentType')) === 'TextArea';
667
+ },
668
+ extraProps: {
669
+ getValue: function getValue(target) {
670
+ var _target$parent26, _target$parent26$getP, _target$parent26$getP2;
671
+ return (_target$parent26 = target.parent) === null || _target$parent26 === void 0 ? void 0 : (_target$parent26$getP = _target$parent26.getPropValue) === null || _target$parent26$getP === void 0 ? void 0 : (_target$parent26$getP2 = _target$parent26$getP.call(_target$parent26, 'componentProps')) === null || _target$parent26$getP2 === void 0 ? void 0 : _target$parent26$getP2.rows;
672
+ },
673
+ setValue: function setValue(target, value) {
674
+ var _target$parent27, _target$parent27$getP, _target$parent28, _target$parent28$setP;
675
+ var cp = (0, _extends2["default"])({}, ((_target$parent27 = target.parent) === null || _target$parent27 === void 0 ? void 0 : (_target$parent27$getP = _target$parent27.getPropValue) === null || _target$parent27$getP === void 0 ? void 0 : _target$parent27$getP.call(_target$parent27, 'componentProps')) || {});
676
+ cp.rows = value;
677
+ (_target$parent28 = target.parent) === null || _target$parent28 === void 0 ? void 0 : (_target$parent28$setP = _target$parent28.setPropValue) === null || _target$parent28$setP === void 0 ? void 0 : _target$parent28$setP.call(_target$parent28, 'componentProps', cp);
678
+ }
679
+ },
182
680
  setter: {
183
681
  componentName: 'NumberSetter',
184
682
  props: {
185
683
  min: 1,
186
- max: 4
684
+ max: 20
685
+ },
686
+ initialValue: 4
687
+ }
688
+ },
689
+ // ── NumberPicker:范围 / 步长 / 精度
690
+ {
691
+ title: {
692
+ label: '最小值',
693
+ tip: '数字输入框允许输入的最小值。'
694
+ },
695
+ name: '!min',
696
+ condition: function condition(target) {
697
+ var _target$parent29, _target$parent29$getP;
698
+ return ((_target$parent29 = target.parent) === null || _target$parent29 === void 0 ? void 0 : (_target$parent29$getP = _target$parent29.getPropValue) === null || _target$parent29$getP === void 0 ? void 0 : _target$parent29$getP.call(_target$parent29, 'componentType')) === 'NumberPicker';
699
+ },
700
+ extraProps: {
701
+ getValue: function getValue(target) {
702
+ var _target$parent30, _target$parent30$getP, _target$parent30$getP2;
703
+ return (_target$parent30 = target.parent) === null || _target$parent30 === void 0 ? void 0 : (_target$parent30$getP = _target$parent30.getPropValue) === null || _target$parent30$getP === void 0 ? void 0 : (_target$parent30$getP2 = _target$parent30$getP.call(_target$parent30, 'componentProps')) === null || _target$parent30$getP2 === void 0 ? void 0 : _target$parent30$getP2.min;
704
+ },
705
+ setValue: function setValue(target, value) {
706
+ var _target$parent31, _target$parent31$getP, _target$parent32, _target$parent32$setP;
707
+ var cp = (0, _extends2["default"])({}, ((_target$parent31 = target.parent) === null || _target$parent31 === void 0 ? void 0 : (_target$parent31$getP = _target$parent31.getPropValue) === null || _target$parent31$getP === void 0 ? void 0 : _target$parent31$getP.call(_target$parent31, 'componentProps')) || {});
708
+ if (value === undefined || value === null || value === '') delete cp.min;else cp.min = value;
709
+ (_target$parent32 = target.parent) === null || _target$parent32 === void 0 ? void 0 : (_target$parent32$setP = _target$parent32.setPropValue) === null || _target$parent32$setP === void 0 ? void 0 : _target$parent32$setP.call(_target$parent32, 'componentProps', cp);
710
+ }
711
+ },
712
+ setter: {
713
+ componentName: 'NumberSetter'
714
+ }
715
+ }, {
716
+ title: {
717
+ label: '最大值',
718
+ tip: '数字输入框允许输入的最大值。'
719
+ },
720
+ name: '!max',
721
+ condition: function condition(target) {
722
+ var _target$parent33, _target$parent33$getP;
723
+ return ((_target$parent33 = target.parent) === null || _target$parent33 === void 0 ? void 0 : (_target$parent33$getP = _target$parent33.getPropValue) === null || _target$parent33$getP === void 0 ? void 0 : _target$parent33$getP.call(_target$parent33, 'componentType')) === 'NumberPicker';
724
+ },
725
+ extraProps: {
726
+ getValue: function getValue(target) {
727
+ var _target$parent34, _target$parent34$getP, _target$parent34$getP2;
728
+ return (_target$parent34 = target.parent) === null || _target$parent34 === void 0 ? void 0 : (_target$parent34$getP = _target$parent34.getPropValue) === null || _target$parent34$getP === void 0 ? void 0 : (_target$parent34$getP2 = _target$parent34$getP.call(_target$parent34, 'componentProps')) === null || _target$parent34$getP2 === void 0 ? void 0 : _target$parent34$getP2.max;
729
+ },
730
+ setValue: function setValue(target, value) {
731
+ var _target$parent35, _target$parent35$getP, _target$parent36, _target$parent36$setP;
732
+ var cp = (0, _extends2["default"])({}, ((_target$parent35 = target.parent) === null || _target$parent35 === void 0 ? void 0 : (_target$parent35$getP = _target$parent35.getPropValue) === null || _target$parent35$getP === void 0 ? void 0 : _target$parent35$getP.call(_target$parent35, 'componentProps')) || {});
733
+ if (value === undefined || value === null || value === '') delete cp.max;else cp.max = value;
734
+ (_target$parent36 = target.parent) === null || _target$parent36 === void 0 ? void 0 : (_target$parent36$setP = _target$parent36.setPropValue) === null || _target$parent36$setP === void 0 ? void 0 : _target$parent36$setP.call(_target$parent36, 'componentProps', cp);
735
+ }
736
+ },
737
+ setter: {
738
+ componentName: 'NumberSetter'
739
+ }
740
+ }, {
741
+ title: {
742
+ label: '步长',
743
+ tip: '每次点击加减按钮时变化的数量。默认 1。'
744
+ },
745
+ name: '!step',
746
+ condition: function condition(target) {
747
+ var _target$parent37, _target$parent37$getP;
748
+ return ((_target$parent37 = target.parent) === null || _target$parent37 === void 0 ? void 0 : (_target$parent37$getP = _target$parent37.getPropValue) === null || _target$parent37$getP === void 0 ? void 0 : _target$parent37$getP.call(_target$parent37, 'componentType')) === 'NumberPicker';
749
+ },
750
+ extraProps: {
751
+ getValue: function getValue(target) {
752
+ var _target$parent38, _target$parent38$getP, _target$parent38$getP2;
753
+ return (_target$parent38 = target.parent) === null || _target$parent38 === void 0 ? void 0 : (_target$parent38$getP = _target$parent38.getPropValue) === null || _target$parent38$getP === void 0 ? void 0 : (_target$parent38$getP2 = _target$parent38$getP.call(_target$parent38, 'componentProps')) === null || _target$parent38$getP2 === void 0 ? void 0 : _target$parent38$getP2.step;
754
+ },
755
+ setValue: function setValue(target, value) {
756
+ var _target$parent39, _target$parent39$getP, _target$parent40, _target$parent40$setP;
757
+ var cp = (0, _extends2["default"])({}, ((_target$parent39 = target.parent) === null || _target$parent39 === void 0 ? void 0 : (_target$parent39$getP = _target$parent39.getPropValue) === null || _target$parent39$getP === void 0 ? void 0 : _target$parent39$getP.call(_target$parent39, 'componentProps')) || {});
758
+ if (value === undefined || value === null || value === '') delete cp.step;else cp.step = value;
759
+ (_target$parent40 = target.parent) === null || _target$parent40 === void 0 ? void 0 : (_target$parent40$setP = _target$parent40.setPropValue) === null || _target$parent40$setP === void 0 ? void 0 : _target$parent40$setP.call(_target$parent40, 'componentProps', cp);
760
+ }
761
+ },
762
+ setter: {
763
+ componentName: 'NumberSetter',
764
+ props: {
765
+ min: 0
187
766
  },
188
767
  initialValue: 1
189
768
  }
190
769
  }, {
191
- title: '组件属性',
192
- name: 'componentProps',
770
+ title: {
771
+ label: '小数位数',
772
+ tip: '数字保留几位小数。默认不限制(整数)。'
773
+ },
774
+ name: '!precision',
775
+ condition: function condition(target) {
776
+ var _target$parent41, _target$parent41$getP;
777
+ return ((_target$parent41 = target.parent) === null || _target$parent41 === void 0 ? void 0 : (_target$parent41$getP = _target$parent41.getPropValue) === null || _target$parent41$getP === void 0 ? void 0 : _target$parent41$getP.call(_target$parent41, 'componentType')) === 'NumberPicker';
778
+ },
779
+ extraProps: {
780
+ getValue: function getValue(target) {
781
+ var _target$parent42, _target$parent42$getP, _target$parent42$getP2;
782
+ return (_target$parent42 = target.parent) === null || _target$parent42 === void 0 ? void 0 : (_target$parent42$getP = _target$parent42.getPropValue) === null || _target$parent42$getP === void 0 ? void 0 : (_target$parent42$getP2 = _target$parent42$getP.call(_target$parent42, 'componentProps')) === null || _target$parent42$getP2 === void 0 ? void 0 : _target$parent42$getP2.precision;
783
+ },
784
+ setValue: function setValue(target, value) {
785
+ var _target$parent43, _target$parent43$getP, _target$parent44, _target$parent44$setP;
786
+ var cp = (0, _extends2["default"])({}, ((_target$parent43 = target.parent) === null || _target$parent43 === void 0 ? void 0 : (_target$parent43$getP = _target$parent43.getPropValue) === null || _target$parent43$getP === void 0 ? void 0 : _target$parent43$getP.call(_target$parent43, 'componentProps')) || {});
787
+ if (value === undefined || value === null || value === '') delete cp.precision;else cp.precision = value;
788
+ (_target$parent44 = target.parent) === null || _target$parent44 === void 0 ? void 0 : (_target$parent44$setP = _target$parent44.setPropValue) === null || _target$parent44$setP === void 0 ? void 0 : _target$parent44$setP.call(_target$parent44, 'componentProps', cp);
789
+ }
790
+ },
193
791
  setter: {
194
- componentName: 'JsonSetter',
195
- isRequired: false
792
+ componentName: 'NumberSetter',
793
+ props: {
794
+ min: 0,
795
+ max: 10
796
+ }
797
+ }
798
+ },
799
+ // ── Select:可搜索 / 可清除 / 多选模式
800
+ {
801
+ title: {
802
+ label: '可搜索',
803
+ tip: '开启后下拉框支持输入关键字过滤选项。'
804
+ },
805
+ name: '!showSearch',
806
+ condition: function condition(target) {
807
+ var _target$parent45, _target$parent45$getP;
808
+ return ((_target$parent45 = target.parent) === null || _target$parent45 === void 0 ? void 0 : (_target$parent45$getP = _target$parent45.getPropValue) === null || _target$parent45$getP === void 0 ? void 0 : _target$parent45$getP.call(_target$parent45, 'componentType')) === 'Select';
809
+ },
810
+ extraProps: {
811
+ getValue: function getValue(target) {
812
+ var _target$parent46, _target$parent46$getP, _target$parent46$getP2;
813
+ return (_target$parent46 = target.parent) === null || _target$parent46 === void 0 ? void 0 : (_target$parent46$getP = _target$parent46.getPropValue) === null || _target$parent46$getP === void 0 ? void 0 : (_target$parent46$getP2 = _target$parent46$getP.call(_target$parent46, 'componentProps')) === null || _target$parent46$getP2 === void 0 ? void 0 : _target$parent46$getP2.showSearch;
814
+ },
815
+ setValue: function setValue(target, value) {
816
+ var _target$parent47, _target$parent47$getP, _target$parent48, _target$parent48$setP;
817
+ var cp = (0, _extends2["default"])({}, ((_target$parent47 = target.parent) === null || _target$parent47 === void 0 ? void 0 : (_target$parent47$getP = _target$parent47.getPropValue) === null || _target$parent47$getP === void 0 ? void 0 : _target$parent47$getP.call(_target$parent47, 'componentProps')) || {});
818
+ cp.showSearch = value;
819
+ (_target$parent48 = target.parent) === null || _target$parent48 === void 0 ? void 0 : (_target$parent48$setP = _target$parent48.setPropValue) === null || _target$parent48$setP === void 0 ? void 0 : _target$parent48$setP.call(_target$parent48, 'componentProps', cp);
820
+ }
821
+ },
822
+ setter: {
823
+ componentName: 'BoolSetter',
824
+ initialValue: false
196
825
  }
197
826
  }, {
198
- title: '表单项属性',
199
- name: 'formItemProps',
827
+ title: {
828
+ label: '可清除',
829
+ tip: '开启后选择框右侧显示清除图标,点击可清空已选值。'
830
+ },
831
+ name: '!hasClear',
832
+ condition: function condition(target) {
833
+ var _target$parent49, _target$parent49$getP;
834
+ var t = ((_target$parent49 = target.parent) === null || _target$parent49 === void 0 ? void 0 : (_target$parent49$getP = _target$parent49.getPropValue) === null || _target$parent49$getP === void 0 ? void 0 : _target$parent49$getP.call(_target$parent49, 'componentType')) || 'Input';
835
+ return ['Select', 'DatePicker', 'DateTimePicker'].includes(t);
836
+ },
837
+ extraProps: {
838
+ getValue: function getValue(target) {
839
+ var _target$parent50, _target$parent50$getP, _target$parent50$getP2;
840
+ return (_target$parent50 = target.parent) === null || _target$parent50 === void 0 ? void 0 : (_target$parent50$getP = _target$parent50.getPropValue) === null || _target$parent50$getP === void 0 ? void 0 : (_target$parent50$getP2 = _target$parent50$getP.call(_target$parent50, 'componentProps')) === null || _target$parent50$getP2 === void 0 ? void 0 : _target$parent50$getP2.hasClear;
841
+ },
842
+ setValue: function setValue(target, value) {
843
+ var _target$parent51, _target$parent51$getP, _target$parent52, _target$parent52$setP;
844
+ var cp = (0, _extends2["default"])({}, ((_target$parent51 = target.parent) === null || _target$parent51 === void 0 ? void 0 : (_target$parent51$getP = _target$parent51.getPropValue) === null || _target$parent51$getP === void 0 ? void 0 : _target$parent51$getP.call(_target$parent51, 'componentProps')) || {});
845
+ cp.hasClear = value;
846
+ (_target$parent52 = target.parent) === null || _target$parent52 === void 0 ? void 0 : (_target$parent52$setP = _target$parent52.setPropValue) === null || _target$parent52$setP === void 0 ? void 0 : _target$parent52$setP.call(_target$parent52, 'componentProps', cp);
847
+ }
848
+ },
200
849
  setter: {
201
- componentName: 'JsonSetter',
202
- isRequired: false
850
+ componentName: 'BoolSetter',
851
+ initialValue: false
203
852
  }
204
- }],
205
- extraSetter: {
206
- componentName: 'MixedSetter',
207
- isRequired: false,
208
- props: {}
209
- }
853
+ }, {
854
+ title: {
855
+ label: '多选模式',
856
+ tip: '设置下拉框的选择模式:\n· 单选(single):只能选一个选项(默认)\n· 多选(multiple):可以选多个,以标签形式展示\n· 标签输入(tag):可以选多个,也支持直接输入新标签'
857
+ },
858
+ name: '!mode',
859
+ condition: function condition(target) {
860
+ var _target$parent53, _target$parent53$getP;
861
+ return ((_target$parent53 = target.parent) === null || _target$parent53 === void 0 ? void 0 : (_target$parent53$getP = _target$parent53.getPropValue) === null || _target$parent53$getP === void 0 ? void 0 : _target$parent53$getP.call(_target$parent53, 'componentType')) === 'Select';
862
+ },
863
+ extraProps: {
864
+ getValue: function getValue(target) {
865
+ var _target$parent54, _target$parent54$getP, _target$parent54$getP2;
866
+ return ((_target$parent54 = target.parent) === null || _target$parent54 === void 0 ? void 0 : (_target$parent54$getP = _target$parent54.getPropValue) === null || _target$parent54$getP === void 0 ? void 0 : (_target$parent54$getP2 = _target$parent54$getP.call(_target$parent54, 'componentProps')) === null || _target$parent54$getP2 === void 0 ? void 0 : _target$parent54$getP2.mode) || 'single';
867
+ },
868
+ setValue: function setValue(target, value) {
869
+ var _target$parent55, _target$parent55$getP, _target$parent56, _target$parent56$setP;
870
+ var cp = (0, _extends2["default"])({}, ((_target$parent55 = target.parent) === null || _target$parent55 === void 0 ? void 0 : (_target$parent55$getP = _target$parent55.getPropValue) === null || _target$parent55$getP === void 0 ? void 0 : _target$parent55$getP.call(_target$parent55, 'componentProps')) || {});
871
+ cp.mode = value;
872
+ (_target$parent56 = target.parent) === null || _target$parent56 === void 0 ? void 0 : (_target$parent56$setP = _target$parent56.setPropValue) === null || _target$parent56$setP === void 0 ? void 0 : _target$parent56$setP.call(_target$parent56, 'componentProps', cp);
873
+ }
874
+ },
875
+ setter: {
876
+ componentName: 'RadioGroupSetter',
877
+ props: {
878
+ options: [{
879
+ title: '单选',
880
+ value: 'single'
881
+ }, {
882
+ title: '多选',
883
+ value: 'multiple'
884
+ }, {
885
+ title: '标签',
886
+ value: 'tag'
887
+ }]
888
+ },
889
+ initialValue: 'single'
890
+ }
891
+ },
892
+ // ── DatePicker / DateTimePicker:日期格式
893
+ {
894
+ title: {
895
+ label: '日期格式',
896
+ tip: '日期显示和提交的格式字符串。\n常用:\n· 仅日期:YYYY-MM-DD(默认)\n· 日期+时间:YYYY-MM-DD HH:mm\n· 年月:YYYY-MM'
897
+ },
898
+ name: '!dateFormat',
899
+ condition: function condition(target) {
900
+ var _target$parent57, _target$parent57$getP;
901
+ var t = ((_target$parent57 = target.parent) === null || _target$parent57 === void 0 ? void 0 : (_target$parent57$getP = _target$parent57.getPropValue) === null || _target$parent57$getP === void 0 ? void 0 : _target$parent57$getP.call(_target$parent57, 'componentType')) || 'Input';
902
+ return ['DatePicker', 'DateTimePicker'].includes(t);
903
+ },
904
+ extraProps: {
905
+ getValue: function getValue(target) {
906
+ var _target$parent58, _target$parent58$getP, _target$parent59, _target$parent59$getP, _target$parent59$getP2;
907
+ var t = (_target$parent58 = target.parent) === null || _target$parent58 === void 0 ? void 0 : (_target$parent58$getP = _target$parent58.getPropValue) === null || _target$parent58$getP === void 0 ? void 0 : _target$parent58$getP.call(_target$parent58, 'componentType');
908
+ return ((_target$parent59 = target.parent) === null || _target$parent59 === void 0 ? void 0 : (_target$parent59$getP = _target$parent59.getPropValue) === null || _target$parent59$getP === void 0 ? void 0 : (_target$parent59$getP2 = _target$parent59$getP.call(_target$parent59, 'componentProps')) === null || _target$parent59$getP2 === void 0 ? void 0 : _target$parent59$getP2.format) || (t === 'DateTimePicker' ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD');
909
+ },
910
+ setValue: function setValue(target, value) {
911
+ var _target$parent60, _target$parent60$getP, _target$parent61, _target$parent61$setP;
912
+ var cp = (0, _extends2["default"])({}, ((_target$parent60 = target.parent) === null || _target$parent60 === void 0 ? void 0 : (_target$parent60$getP = _target$parent60.getPropValue) === null || _target$parent60$getP === void 0 ? void 0 : _target$parent60$getP.call(_target$parent60, 'componentProps')) || {});
913
+ cp.format = value;
914
+ (_target$parent61 = target.parent) === null || _target$parent61 === void 0 ? void 0 : (_target$parent61$setP = _target$parent61.setPropValue) === null || _target$parent61$setP === void 0 ? void 0 : _target$parent61$setP.call(_target$parent61, 'componentProps', cp);
915
+ }
916
+ },
917
+ setter: {
918
+ componentName: 'StringSetter',
919
+ initialValue: 'YYYY-MM-DD'
920
+ }
921
+ },
922
+ // ── Upload:文件类型 / 数量限制
923
+ {
924
+ title: {
925
+ label: '允许的文件类型',
926
+ tip: '限制可上传的文件类型(传给 input[accept])。\n例如:image/* 只允许图片,.pdf 只允许 PDF,不填则不限制。'
927
+ },
928
+ name: '!accept',
929
+ condition: function condition(target) {
930
+ var _target$parent62, _target$parent62$getP;
931
+ return ((_target$parent62 = target.parent) === null || _target$parent62 === void 0 ? void 0 : (_target$parent62$getP = _target$parent62.getPropValue) === null || _target$parent62$getP === void 0 ? void 0 : _target$parent62$getP.call(_target$parent62, 'componentType')) === 'Upload';
932
+ },
933
+ extraProps: {
934
+ getValue: function getValue(target) {
935
+ var _target$parent63, _target$parent63$getP, _target$parent63$getP2;
936
+ return (_target$parent63 = target.parent) === null || _target$parent63 === void 0 ? void 0 : (_target$parent63$getP = _target$parent63.getPropValue) === null || _target$parent63$getP === void 0 ? void 0 : (_target$parent63$getP2 = _target$parent63$getP.call(_target$parent63, 'componentProps')) === null || _target$parent63$getP2 === void 0 ? void 0 : _target$parent63$getP2.accept;
937
+ },
938
+ setValue: function setValue(target, value) {
939
+ var _target$parent64, _target$parent64$getP, _target$parent65, _target$parent65$setP;
940
+ var cp = (0, _extends2["default"])({}, ((_target$parent64 = target.parent) === null || _target$parent64 === void 0 ? void 0 : (_target$parent64$getP = _target$parent64.getPropValue) === null || _target$parent64$getP === void 0 ? void 0 : _target$parent64$getP.call(_target$parent64, 'componentProps')) || {});
941
+ if (!value) delete cp.accept;else cp.accept = value;
942
+ (_target$parent65 = target.parent) === null || _target$parent65 === void 0 ? void 0 : (_target$parent65$setP = _target$parent65.setPropValue) === null || _target$parent65$setP === void 0 ? void 0 : _target$parent65$setP.call(_target$parent65, 'componentProps', cp);
943
+ }
944
+ },
945
+ setter: {
946
+ componentName: 'StringSetter'
947
+ }
948
+ }, {
949
+ title: {
950
+ label: '最多上传数量',
951
+ tip: '允许上传的最多文件数量,超出后禁止继续上传。不填则不限制。'
952
+ },
953
+ name: '!limit',
954
+ condition: function condition(target) {
955
+ var _target$parent66, _target$parent66$getP;
956
+ return ((_target$parent66 = target.parent) === null || _target$parent66 === void 0 ? void 0 : (_target$parent66$getP = _target$parent66.getPropValue) === null || _target$parent66$getP === void 0 ? void 0 : _target$parent66$getP.call(_target$parent66, 'componentType')) === 'Upload';
957
+ },
958
+ extraProps: {
959
+ getValue: function getValue(target) {
960
+ var _target$parent67, _target$parent67$getP, _target$parent67$getP2;
961
+ return (_target$parent67 = target.parent) === null || _target$parent67 === void 0 ? void 0 : (_target$parent67$getP = _target$parent67.getPropValue) === null || _target$parent67$getP === void 0 ? void 0 : (_target$parent67$getP2 = _target$parent67$getP.call(_target$parent67, 'componentProps')) === null || _target$parent67$getP2 === void 0 ? void 0 : _target$parent67$getP2.limit;
962
+ },
963
+ setValue: function setValue(target, value) {
964
+ var _target$parent68, _target$parent68$getP, _target$parent69, _target$parent69$setP;
965
+ var cp = (0, _extends2["default"])({}, ((_target$parent68 = target.parent) === null || _target$parent68 === void 0 ? void 0 : (_target$parent68$getP = _target$parent68.getPropValue) === null || _target$parent68$getP === void 0 ? void 0 : _target$parent68$getP.call(_target$parent68, 'componentProps')) || {});
966
+ if (value === undefined || value === null || value === '') delete cp.limit;else cp.limit = value;
967
+ (_target$parent69 = target.parent) === null || _target$parent69 === void 0 ? void 0 : (_target$parent69$setP = _target$parent69.setPropValue) === null || _target$parent69$setP === void 0 ? void 0 : _target$parent69$setP.call(_target$parent69, 'componentProps', cp);
968
+ }
969
+ },
970
+ setter: {
971
+ componentName: 'NumberSetter',
972
+ props: {
973
+ min: 1
974
+ }
975
+ }
976
+ },
977
+ // ── 表单项控制
978
+ {
979
+ title: {
980
+ label: '自动校验',
981
+ tip: '开启后每次字段值变化时自动触发校验,不需等到提交才验证。\n适合需要即时反馈的场景(如手机号格式)。'
982
+ },
983
+ name: '!autoValidate',
984
+ extraProps: {
985
+ getValue: function getValue(target) {
986
+ var _target$parent70, _target$parent70$getP, _target$parent70$getP2;
987
+ return (_target$parent70 = target.parent) === null || _target$parent70 === void 0 ? void 0 : (_target$parent70$getP = _target$parent70.getPropValue) === null || _target$parent70$getP === void 0 ? void 0 : (_target$parent70$getP2 = _target$parent70$getP.call(_target$parent70, 'formItemProps')) === null || _target$parent70$getP2 === void 0 ? void 0 : _target$parent70$getP2.autoValidate;
988
+ },
989
+ setValue: function setValue(target, value) {
990
+ var _target$parent71, _target$parent71$getP, _target$parent72, _target$parent72$setP;
991
+ var fp = (0, _extends2["default"])({}, ((_target$parent71 = target.parent) === null || _target$parent71 === void 0 ? void 0 : (_target$parent71$getP = _target$parent71.getPropValue) === null || _target$parent71$getP === void 0 ? void 0 : _target$parent71$getP.call(_target$parent71, 'formItemProps')) || {});
992
+ fp.autoValidate = value;
993
+ (_target$parent72 = target.parent) === null || _target$parent72 === void 0 ? void 0 : (_target$parent72$setP = _target$parent72.setPropValue) === null || _target$parent72$setP === void 0 ? void 0 : _target$parent72$setP.call(_target$parent72, 'formItemProps', fp);
994
+ }
995
+ },
996
+ setter: {
997
+ componentName: 'BoolSetter',
998
+ initialValue: false
999
+ }
1000
+ }, {
1001
+ title: {
1002
+ label: '隐藏冒号',
1003
+ tip: '开启后在标题文字后面不显示冒号。'
1004
+ },
1005
+ name: '!colon',
1006
+ extraProps: {
1007
+ getValue: function getValue(target) {
1008
+ var _target$parent73, _target$parent73$getP, _target$parent73$getP2;
1009
+ var v = (_target$parent73 = target.parent) === null || _target$parent73 === void 0 ? void 0 : (_target$parent73$getP = _target$parent73.getPropValue) === null || _target$parent73$getP === void 0 ? void 0 : (_target$parent73$getP2 = _target$parent73$getP.call(_target$parent73, 'formItemProps')) === null || _target$parent73$getP2 === void 0 ? void 0 : _target$parent73$getP2.colon;
1010
+ return v === false;
1011
+ },
1012
+ setValue: function setValue(target, value) {
1013
+ var _target$parent74, _target$parent74$getP, _target$parent75, _target$parent75$setP;
1014
+ var fp = (0, _extends2["default"])({}, ((_target$parent74 = target.parent) === null || _target$parent74 === void 0 ? void 0 : (_target$parent74$getP = _target$parent74.getPropValue) === null || _target$parent74$getP === void 0 ? void 0 : _target$parent74$getP.call(_target$parent74, 'formItemProps')) || {});
1015
+ fp.colon = !value;
1016
+ (_target$parent75 = target.parent) === null || _target$parent75 === void 0 ? void 0 : (_target$parent75$setP = _target$parent75.setPropValue) === null || _target$parent75$setP === void 0 ? void 0 : _target$parent75$setP.call(_target$parent75, 'formItemProps', fp);
1017
+ }
1018
+ },
1019
+ setter: {
1020
+ componentName: 'BoolSetter',
1021
+ initialValue: false
1022
+ }
1023
+ },
1024
+ // ── 表单校验
1025
+ // 最小长度(Input / TextArea / CheckboxGroup)
1026
+ {
1027
+ title: {
1028
+ label: '最少字符数',
1029
+ tip: 'Input/TextArea:输入字符不能少于此数量。\nCheckboxGroup:至少要选几项。'
1030
+ },
1031
+ name: '!minLength',
1032
+ condition: function condition(target) {
1033
+ var _target$parent76, _target$parent76$getP;
1034
+ var t = ((_target$parent76 = target.parent) === null || _target$parent76 === void 0 ? void 0 : (_target$parent76$getP = _target$parent76.getPropValue) === null || _target$parent76$getP === void 0 ? void 0 : _target$parent76$getP.call(_target$parent76, 'componentType')) || 'Input';
1035
+ return ['Input', 'TextArea', 'CheckboxGroup'].includes(t);
1036
+ },
1037
+ extraProps: {
1038
+ getValue: function getValue(target) {
1039
+ var _target$parent77, _target$parent77$getP, _target$parent77$getP2;
1040
+ return (_target$parent77 = target.parent) === null || _target$parent77 === void 0 ? void 0 : (_target$parent77$getP = _target$parent77.getPropValue) === null || _target$parent77$getP === void 0 ? void 0 : (_target$parent77$getP2 = _target$parent77$getP.call(_target$parent77, 'formItemProps')) === null || _target$parent77$getP2 === void 0 ? void 0 : _target$parent77$getP2.minLength;
1041
+ },
1042
+ setValue: function setValue(target, value) {
1043
+ var _target$parent78, _target$parent78$getP, _target$parent79, _target$parent79$setP;
1044
+ var fp = (0, _extends2["default"])({}, ((_target$parent78 = target.parent) === null || _target$parent78 === void 0 ? void 0 : (_target$parent78$getP = _target$parent78.getPropValue) === null || _target$parent78$getP === void 0 ? void 0 : _target$parent78$getP.call(_target$parent78, 'formItemProps')) || {});
1045
+ if (value === undefined || value === null || value === '') delete fp.minLength;else fp.minLength = value;
1046
+ (_target$parent79 = target.parent) === null || _target$parent79 === void 0 ? void 0 : (_target$parent79$setP = _target$parent79.setPropValue) === null || _target$parent79$setP === void 0 ? void 0 : _target$parent79$setP.call(_target$parent79, 'formItemProps', fp);
1047
+ }
1048
+ },
1049
+ setter: {
1050
+ componentName: 'NumberSetter',
1051
+ props: {
1052
+ min: 0
1053
+ }
1054
+ }
1055
+ },
1056
+ // 最大长度(Input / TextArea / CheckboxGroup / Select multiple)
1057
+ {
1058
+ title: {
1059
+ label: '最多字符数(校验)',
1060
+ tip: 'Input/TextArea:输入字符不能超过此数量(校验维度,与组件层的最大字符数独立)。\nCheckboxGroup:最多能选几项。'
1061
+ },
1062
+ name: '!maxLengthValidate',
1063
+ condition: function condition(target) {
1064
+ var _target$parent80, _target$parent80$getP;
1065
+ var t = ((_target$parent80 = target.parent) === null || _target$parent80 === void 0 ? void 0 : (_target$parent80$getP = _target$parent80.getPropValue) === null || _target$parent80$getP === void 0 ? void 0 : _target$parent80$getP.call(_target$parent80, 'componentType')) || 'Input';
1066
+ return ['Input', 'TextArea', 'CheckboxGroup'].includes(t);
1067
+ },
1068
+ extraProps: {
1069
+ getValue: function getValue(target) {
1070
+ var _target$parent81, _target$parent81$getP, _target$parent81$getP2;
1071
+ return (_target$parent81 = target.parent) === null || _target$parent81 === void 0 ? void 0 : (_target$parent81$getP = _target$parent81.getPropValue) === null || _target$parent81$getP === void 0 ? void 0 : (_target$parent81$getP2 = _target$parent81$getP.call(_target$parent81, 'formItemProps')) === null || _target$parent81$getP2 === void 0 ? void 0 : _target$parent81$getP2.maxLength;
1072
+ },
1073
+ setValue: function setValue(target, value) {
1074
+ var _target$parent82, _target$parent82$getP, _target$parent83, _target$parent83$setP;
1075
+ var fp = (0, _extends2["default"])({}, ((_target$parent82 = target.parent) === null || _target$parent82 === void 0 ? void 0 : (_target$parent82$getP = _target$parent82.getPropValue) === null || _target$parent82$getP === void 0 ? void 0 : _target$parent82$getP.call(_target$parent82, 'formItemProps')) || {});
1076
+ if (value === undefined || value === null || value === '') delete fp.maxLength;else fp.maxLength = value;
1077
+ (_target$parent83 = target.parent) === null || _target$parent83 === void 0 ? void 0 : (_target$parent83$setP = _target$parent83.setPropValue) === null || _target$parent83$setP === void 0 ? void 0 : _target$parent83$setP.call(_target$parent83, 'formItemProps', fp);
1078
+ }
1079
+ },
1080
+ setter: {
1081
+ componentName: 'NumberSetter',
1082
+ props: {
1083
+ min: 0
1084
+ }
1085
+ }
1086
+ },
1087
+ // 最小/最大值(NumberPicker)
1088
+ {
1089
+ title: {
1090
+ label: '最小数值(校验)',
1091
+ tip: '数字字段的最小合法值(校验维度)。'
1092
+ },
1093
+ name: '!minValue',
1094
+ condition: function condition(target) {
1095
+ var _target$parent84, _target$parent84$getP;
1096
+ return ((_target$parent84 = target.parent) === null || _target$parent84 === void 0 ? void 0 : (_target$parent84$getP = _target$parent84.getPropValue) === null || _target$parent84$getP === void 0 ? void 0 : _target$parent84$getP.call(_target$parent84, 'componentType')) === 'NumberPicker';
1097
+ },
1098
+ extraProps: {
1099
+ getValue: function getValue(target) {
1100
+ var _target$parent85, _target$parent85$getP, _target$parent85$getP2;
1101
+ return (_target$parent85 = target.parent) === null || _target$parent85 === void 0 ? void 0 : (_target$parent85$getP = _target$parent85.getPropValue) === null || _target$parent85$getP === void 0 ? void 0 : (_target$parent85$getP2 = _target$parent85$getP.call(_target$parent85, 'formItemProps')) === null || _target$parent85$getP2 === void 0 ? void 0 : _target$parent85$getP2.min;
1102
+ },
1103
+ setValue: function setValue(target, value) {
1104
+ var _target$parent86, _target$parent86$getP, _target$parent87, _target$parent87$setP;
1105
+ var fp = (0, _extends2["default"])({}, ((_target$parent86 = target.parent) === null || _target$parent86 === void 0 ? void 0 : (_target$parent86$getP = _target$parent86.getPropValue) === null || _target$parent86$getP === void 0 ? void 0 : _target$parent86$getP.call(_target$parent86, 'formItemProps')) || {});
1106
+ if (value === undefined || value === null || value === '') delete fp.min;else fp.min = value;
1107
+ (_target$parent87 = target.parent) === null || _target$parent87 === void 0 ? void 0 : (_target$parent87$setP = _target$parent87.setPropValue) === null || _target$parent87$setP === void 0 ? void 0 : _target$parent87$setP.call(_target$parent87, 'formItemProps', fp);
1108
+ }
1109
+ },
1110
+ setter: {
1111
+ componentName: 'NumberSetter'
1112
+ }
1113
+ }, {
1114
+ title: {
1115
+ label: '最大数值(校验)',
1116
+ tip: '数字字段的最大合法值(校验维度)。'
1117
+ },
1118
+ name: '!maxValue',
1119
+ condition: function condition(target) {
1120
+ var _target$parent88, _target$parent88$getP;
1121
+ return ((_target$parent88 = target.parent) === null || _target$parent88 === void 0 ? void 0 : (_target$parent88$getP = _target$parent88.getPropValue) === null || _target$parent88$getP === void 0 ? void 0 : _target$parent88$getP.call(_target$parent88, 'componentType')) === 'NumberPicker';
1122
+ },
1123
+ extraProps: {
1124
+ getValue: function getValue(target) {
1125
+ var _target$parent89, _target$parent89$getP, _target$parent89$getP2;
1126
+ return (_target$parent89 = target.parent) === null || _target$parent89 === void 0 ? void 0 : (_target$parent89$getP = _target$parent89.getPropValue) === null || _target$parent89$getP === void 0 ? void 0 : (_target$parent89$getP2 = _target$parent89$getP.call(_target$parent89, 'formItemProps')) === null || _target$parent89$getP2 === void 0 ? void 0 : _target$parent89$getP2.max;
1127
+ },
1128
+ setValue: function setValue(target, value) {
1129
+ var _target$parent90, _target$parent90$getP, _target$parent91, _target$parent91$setP;
1130
+ var fp = (0, _extends2["default"])({}, ((_target$parent90 = target.parent) === null || _target$parent90 === void 0 ? void 0 : (_target$parent90$getP = _target$parent90.getPropValue) === null || _target$parent90$getP === void 0 ? void 0 : _target$parent90$getP.call(_target$parent90, 'formItemProps')) || {});
1131
+ if (value === undefined || value === null || value === '') delete fp.max;else fp.max = value;
1132
+ (_target$parent91 = target.parent) === null || _target$parent91 === void 0 ? void 0 : (_target$parent91$setP = _target$parent91.setPropValue) === null || _target$parent91$setP === void 0 ? void 0 : _target$parent91$setP.call(_target$parent91, 'formItemProps', fp);
1133
+ }
1134
+ },
1135
+ setter: {
1136
+ componentName: 'NumberSetter'
1137
+ }
1138
+ },
1139
+ // 正则校验(Input / TextArea)—— 提供预置规则 + 自定义
1140
+ {
1141
+ title: {
1142
+ label: '正则校验',
1143
+ tip: '选择常用的格式校验规则,或选"自定义"后填写自己的正则表达式(无需前后加斜杠)。\n常用示例:\n· 手机号:^1[3-9]\\d{9}$\n· 邮箱:^[\\w.]+@[\\w.]+\\.[a-z]{2,}$\n· 正整数:^\\d+$\n· 身份证号:^\\d{17}[\\dXx]$'
1144
+ },
1145
+ name: '!patternPreset',
1146
+ condition: function condition(target) {
1147
+ var _target$parent92, _target$parent92$getP;
1148
+ var t = ((_target$parent92 = target.parent) === null || _target$parent92 === void 0 ? void 0 : (_target$parent92$getP = _target$parent92.getPropValue) === null || _target$parent92$getP === void 0 ? void 0 : _target$parent92$getP.call(_target$parent92, 'componentType')) || 'Input';
1149
+ return ['Input', 'TextArea'].includes(t);
1150
+ },
1151
+ extraProps: {
1152
+ getValue: function getValue(target) {
1153
+ var _target$parent93, _target$parent93$getP, _target$parent93$getP2;
1154
+ var pattern = (_target$parent93 = target.parent) === null || _target$parent93 === void 0 ? void 0 : (_target$parent93$getP = _target$parent93.getPropValue) === null || _target$parent93$getP === void 0 ? void 0 : (_target$parent93$getP2 = _target$parent93$getP.call(_target$parent93, 'formItemProps')) === null || _target$parent93$getP2 === void 0 ? void 0 : _target$parent93$getP2.pattern;
1155
+ var presets = {
1156
+ '^1[3-9]\\d{9}$': 'phone',
1157
+ '^[\\w.+-]+@[\\w-]+\\.[a-z]{2,}$': 'email',
1158
+ '^\\d+$': 'integer',
1159
+ '^\\d+(\\.\\d+)?$': 'number',
1160
+ '^\\d{17}[\\dXx]$': 'idcard',
1161
+ "^[\\u4e00-\\u9fa5]+$": 'chinese'
1162
+ };
1163
+ return pattern ? presets[pattern] || '__custom__' : '';
1164
+ },
1165
+ setValue: function setValue(target, value) {
1166
+ var _target$parent94, _target$parent94$getP, _target$parent95, _target$parent95$setP;
1167
+ var patternMap = {
1168
+ phone: '^1[3-9]\\d{9}$',
1169
+ email: '^[\\w.+-]+@[\\w-]+\\.[a-z]{2,}$',
1170
+ integer: '^\\d+$',
1171
+ number: '^\\d+(\\.\\d+)?$',
1172
+ idcard: '^\\d{17}[\\dXx]$',
1173
+ chinese: "^[\\u4e00-\\u9fa5]+$"
1174
+ };
1175
+ var fp = (0, _extends2["default"])({}, ((_target$parent94 = target.parent) === null || _target$parent94 === void 0 ? void 0 : (_target$parent94$getP = _target$parent94.getPropValue) === null || _target$parent94$getP === void 0 ? void 0 : _target$parent94$getP.call(_target$parent94, 'formItemProps')) || {});
1176
+ if (!value || value === '__none__') {
1177
+ delete fp.pattern;
1178
+ } else if (value === '__custom__') {
1179
+ // 自定义时不修改 pattern,等用户在下方输入框填写
1180
+ } else {
1181
+ fp.pattern = patternMap[value];
1182
+ }
1183
+ (_target$parent95 = target.parent) === null || _target$parent95 === void 0 ? void 0 : (_target$parent95$setP = _target$parent95.setPropValue) === null || _target$parent95$setP === void 0 ? void 0 : _target$parent95$setP.call(_target$parent95, 'formItemProps', fp);
1184
+ }
1185
+ },
1186
+ setter: {
1187
+ componentName: 'SelectSetter',
1188
+ props: {
1189
+ options: [{
1190
+ label: '不校验',
1191
+ value: '__none__'
1192
+ }, {
1193
+ label: '手机号(11位)',
1194
+ value: 'phone'
1195
+ }, {
1196
+ label: '邮箱地址',
1197
+ value: 'email'
1198
+ }, {
1199
+ label: '整数',
1200
+ value: 'integer'
1201
+ }, {
1202
+ label: '数字(含小数)',
1203
+ value: 'number'
1204
+ }, {
1205
+ label: '身份证号(15/18位)',
1206
+ value: 'idcard'
1207
+ }, {
1208
+ label: '纯中文',
1209
+ value: 'chinese'
1210
+ }, {
1211
+ label: '自定义正则…',
1212
+ value: '__custom__'
1213
+ }]
1214
+ },
1215
+ initialValue: '__none__'
1216
+ }
1217
+ }, {
1218
+ title: {
1219
+ label: '自定义正则',
1220
+ tip: '填写自定义正则表达式(无需前后加斜杠),例如:^1[3-9]\\d{9}$'
1221
+ },
1222
+ name: '!pattern',
1223
+ condition: function condition(target) {
1224
+ var _target$parent96, _target$parent96$getP, _target$parent97, _target$parent97$getP, _target$parent97$getP2, _target$parent98, _target$parent98$getP, _target$parent98$getP2;
1225
+ var t = ((_target$parent96 = target.parent) === null || _target$parent96 === void 0 ? void 0 : (_target$parent96$getP = _target$parent96.getPropValue) === null || _target$parent96$getP === void 0 ? void 0 : _target$parent96$getP.call(_target$parent96, 'componentType')) || 'Input';
1226
+ if (!['Input', 'TextArea'].includes(t)) return false;
1227
+ var preset = (_target$parent97 = target.parent) === null || _target$parent97 === void 0 ? void 0 : (_target$parent97$getP = _target$parent97.getPropValue) === null || _target$parent97$getP === void 0 ? void 0 : (_target$parent97$getP2 = _target$parent97$getP.call(_target$parent97, 'formItemProps')) === null || _target$parent97$getP2 === void 0 ? void 0 : _target$parent97$getP2.__patternPreset;
1228
+ // 当预置选择了"自定义"时显示,或者 pattern 已有值但不匹配任何预置时也显示
1229
+ var pattern = (_target$parent98 = target.parent) === null || _target$parent98 === void 0 ? void 0 : (_target$parent98$getP = _target$parent98.getPropValue) === null || _target$parent98$getP === void 0 ? void 0 : (_target$parent98$getP2 = _target$parent98$getP.call(_target$parent98, 'formItemProps')) === null || _target$parent98$getP2 === void 0 ? void 0 : _target$parent98$getP2.pattern;
1230
+ var builtinPatterns = ['^1[3-9]\\d{9}$', '^[\\w.+-]+@[\\w-]+\\.[a-z]{2,}$', '^\\d+$', '^\\d+(\\.\\d+)?$', '^\\d{17}[\\dXx]$', "^[\\u4e00-\\u9fa5]+$"];
1231
+ return preset === '__custom__' || !!pattern && !builtinPatterns.includes(pattern);
1232
+ },
1233
+ extraProps: {
1234
+ getValue: function getValue(target) {
1235
+ var _target$parent99, _target$parent99$getP, _target$parent99$getP2;
1236
+ return (_target$parent99 = target.parent) === null || _target$parent99 === void 0 ? void 0 : (_target$parent99$getP = _target$parent99.getPropValue) === null || _target$parent99$getP === void 0 ? void 0 : (_target$parent99$getP2 = _target$parent99$getP.call(_target$parent99, 'formItemProps')) === null || _target$parent99$getP2 === void 0 ? void 0 : _target$parent99$getP2.pattern;
1237
+ },
1238
+ setValue: function setValue(target, value) {
1239
+ var _target$parent100, _target$parent100$get, _target$parent101, _target$parent101$set;
1240
+ var fp = (0, _extends2["default"])({}, ((_target$parent100 = target.parent) === null || _target$parent100 === void 0 ? void 0 : (_target$parent100$get = _target$parent100.getPropValue) === null || _target$parent100$get === void 0 ? void 0 : _target$parent100$get.call(_target$parent100, 'formItemProps')) || {});
1241
+ if (!value) delete fp.pattern;else fp.pattern = value;
1242
+ (_target$parent101 = target.parent) === null || _target$parent101 === void 0 ? void 0 : (_target$parent101$set = _target$parent101.setPropValue) === null || _target$parent101$set === void 0 ? void 0 : _target$parent101$set.call(_target$parent101, 'formItemProps', fp);
1243
+ }
1244
+ },
1245
+ setter: {
1246
+ componentName: 'StringSetter'
1247
+ }
1248
+ }, {
1249
+ title: {
1250
+ label: '正则校验失败提示',
1251
+ tip: '正则不匹配时显示的错误提示文字。'
1252
+ },
1253
+ name: '!patternMessage',
1254
+ condition: function condition(target) {
1255
+ var _target$parent102, _target$parent102$get, _target$parent103, _target$parent103$get, _target$parent103$get2;
1256
+ var t = ((_target$parent102 = target.parent) === null || _target$parent102 === void 0 ? void 0 : (_target$parent102$get = _target$parent102.getPropValue) === null || _target$parent102$get === void 0 ? void 0 : _target$parent102$get.call(_target$parent102, 'componentType')) || 'Input';
1257
+ return ['Input', 'TextArea'].includes(t) && !!((_target$parent103 = target.parent) !== null && _target$parent103 !== void 0 && (_target$parent103$get = _target$parent103.getPropValue) !== null && _target$parent103$get !== void 0 && (_target$parent103$get2 = _target$parent103$get.call(_target$parent103, 'formItemProps')) !== null && _target$parent103$get2 !== void 0 && _target$parent103$get2.pattern);
1258
+ },
1259
+ extraProps: {
1260
+ getValue: function getValue(target) {
1261
+ var _target$parent104, _target$parent104$get, _target$parent104$get2;
1262
+ return (_target$parent104 = target.parent) === null || _target$parent104 === void 0 ? void 0 : (_target$parent104$get = _target$parent104.getPropValue) === null || _target$parent104$get === void 0 ? void 0 : (_target$parent104$get2 = _target$parent104$get.call(_target$parent104, 'formItemProps')) === null || _target$parent104$get2 === void 0 ? void 0 : _target$parent104$get2.patternMessage;
1263
+ },
1264
+ setValue: function setValue(target, value) {
1265
+ var _target$parent105, _target$parent105$get, _target$parent106, _target$parent106$set;
1266
+ var fp = (0, _extends2["default"])({}, ((_target$parent105 = target.parent) === null || _target$parent105 === void 0 ? void 0 : (_target$parent105$get = _target$parent105.getPropValue) === null || _target$parent105$get === void 0 ? void 0 : _target$parent105$get.call(_target$parent105, 'formItemProps')) || {});
1267
+ if (!value) delete fp.patternMessage;else fp.patternMessage = value;
1268
+ (_target$parent106 = target.parent) === null || _target$parent106 === void 0 ? void 0 : (_target$parent106$set = _target$parent106.setPropValue) === null || _target$parent106$set === void 0 ? void 0 : _target$parent106$set.call(_target$parent106, 'formItemProps', fp);
1269
+ }
1270
+ },
1271
+ setter: {
1272
+ componentName: 'StringSetter'
1273
+ }
1274
+ },
1275
+ // 格式校验(仅 Input)
1276
+ {
1277
+ title: {
1278
+ label: '格式校验',
1279
+ tip: '快速选择常用格式进行校验:\n· number:必须是数字\n· email:必须是邮箱格式\n· url:必须是网址格式\n· tel:必须是电话格式'
1280
+ },
1281
+ name: '!format',
1282
+ condition: function condition(target) {
1283
+ var _target$parent107, _target$parent107$get;
1284
+ return ((_target$parent107 = target.parent) === null || _target$parent107 === void 0 ? void 0 : (_target$parent107$get = _target$parent107.getPropValue) === null || _target$parent107$get === void 0 ? void 0 : _target$parent107$get.call(_target$parent107, 'componentType')) === 'Input';
1285
+ },
1286
+ extraProps: {
1287
+ getValue: function getValue(target) {
1288
+ var _target$parent108, _target$parent108$get, _target$parent108$get2;
1289
+ return (_target$parent108 = target.parent) === null || _target$parent108 === void 0 ? void 0 : (_target$parent108$get = _target$parent108.getPropValue) === null || _target$parent108$get === void 0 ? void 0 : (_target$parent108$get2 = _target$parent108$get.call(_target$parent108, 'formItemProps')) === null || _target$parent108$get2 === void 0 ? void 0 : _target$parent108$get2.format;
1290
+ },
1291
+ setValue: function setValue(target, value) {
1292
+ var _target$parent109, _target$parent109$get, _target$parent110, _target$parent110$set;
1293
+ var fp = (0, _extends2["default"])({}, ((_target$parent109 = target.parent) === null || _target$parent109 === void 0 ? void 0 : (_target$parent109$get = _target$parent109.getPropValue) === null || _target$parent109$get === void 0 ? void 0 : _target$parent109$get.call(_target$parent109, 'formItemProps')) || {});
1294
+ if (!value) delete fp.format;else fp.format = value;
1295
+ (_target$parent110 = target.parent) === null || _target$parent110 === void 0 ? void 0 : (_target$parent110$set = _target$parent110.setPropValue) === null || _target$parent110$set === void 0 ? void 0 : _target$parent110$set.call(_target$parent110, 'formItemProps', fp);
1296
+ }
1297
+ },
1298
+ setter: {
1299
+ componentName: 'SelectSetter',
1300
+ props: {
1301
+ options: [{
1302
+ label: '不限制',
1303
+ value: ''
1304
+ }, {
1305
+ label: '数字 (number)',
1306
+ value: 'number'
1307
+ }, {
1308
+ label: '邮箱 (email)',
1309
+ value: 'email'
1310
+ }, {
1311
+ label: '网址 (url)',
1312
+ value: 'url'
1313
+ }, {
1314
+ label: '电话 (tel)',
1315
+ value: 'tel'
1316
+ }]
1317
+ },
1318
+ initialValue: ''
1319
+ }
1320
+ }]
210
1321
  }
211
1322
  }
212
1323
  }
213
1324
  },
214
1325
  initialValue: []
215
1326
  }
216
- }, {
217
- title: '显示提交按钮',
218
- name: 'showSubmit',
1327
+ },
1328
+ // ─────────────────────────────────────────────────────────────────────
1329
+ // 字段初始化
1330
+ // ─────────────────────────────────────────────────────────────────────
1331
+ {
1332
+ title: {
1333
+ label: '字段初始化',
1334
+ tip: '批量配置表单字段的初始值。\n\n· 字段名:与「表单项」中的「字段名」保持一致,例如 guest_count、user_name\n· 值类型:\n 固定值 — 直接填写静态默认值(字符串/数字/布尔/JSON)\n 变量绑定 — 绑定页面 state 或接口返回的动态变量\n\n💡 设置单个字段默认值时,也可在「表单项」列表中直接配置「默认值」,更快捷。'
1335
+ },
1336
+ name: 'initialValues',
1337
+ extraProps: {
1338
+ getValue: function getValue(target) {
1339
+ var iv = target.getProps().getPropValue('initialValues');
1340
+ if (!iv) return [];
1341
+ if (Array.isArray(iv)) {
1342
+ return iv.map(function (row) {
1343
+ var field = typeof (row === null || row === void 0 ? void 0 : row.field) === 'string' ? row.field.trim() : '';
1344
+ if (!field) return null;
1345
+ var valueType = (row === null || row === void 0 ? void 0 : row.valueType) === 'variable' ? 'variable' : 'fixed';
1346
+ return {
1347
+ field: field,
1348
+ valueType: valueType,
1349
+ value: row === null || row === void 0 ? void 0 : row.value
1350
+ };
1351
+ }).filter(Boolean);
1352
+ }
1353
+ return Object.entries(iv).map(function (_ref) {
1354
+ var field = _ref[0],
1355
+ value = _ref[1];
1356
+ return {
1357
+ field: String(field).trim(),
1358
+ valueType: 'fixed',
1359
+ value: value
1360
+ };
1361
+ }).filter(function (row) {
1362
+ return row.field;
1363
+ });
1364
+ },
1365
+ setValue: function setValue(target, rows) {
1366
+ if (!Array.isArray(rows)) return;
1367
+ var cleanedRows = rows.map(function (row) {
1368
+ var field = typeof (row === null || row === void 0 ? void 0 : row.field) === 'string' ? row.field.trim() : '';
1369
+ if (!field) return null;
1370
+ var valueType = (row === null || row === void 0 ? void 0 : row.valueType) === 'variable' ? 'variable' : 'fixed';
1371
+ return {
1372
+ field: field,
1373
+ valueType: valueType,
1374
+ value: row === null || row === void 0 ? void 0 : row.value
1375
+ };
1376
+ }).filter(Boolean);
1377
+ target.getProps().setPropValue('initialValues', cleanedRows);
1378
+ }
1379
+ },
219
1380
  setter: {
220
- componentName: 'BoolSetter',
221
- initialValue: true
1381
+ componentName: 'ArraySetter',
1382
+ props: {
1383
+ itemSetter: {
1384
+ componentName: 'ObjectSetter',
1385
+ props: {
1386
+ config: {
1387
+ items: [{
1388
+ title: {
1389
+ label: '字段名',
1390
+ tip: '与「表单项」中的「字段名」保持一致,例如:guest_count、user_name'
1391
+ },
1392
+ name: 'field',
1393
+ important: true,
1394
+ display: 'inline',
1395
+ setter: {
1396
+ componentName: 'StringSetter',
1397
+ isRequired: true,
1398
+ initialValue: ''
1399
+ }
1400
+ }, {
1401
+ title: {
1402
+ label: '值类型',
1403
+ tip: '· 固定值:静态初始值,例如"待处理"、10、true\n· 变量绑定:绑定页面 state 或动态数据,表单打开时从变量取值'
1404
+ },
1405
+ name: 'valueType',
1406
+ setter: {
1407
+ componentName: 'RadioGroupSetter',
1408
+ props: {
1409
+ options: [{
1410
+ title: '固定值',
1411
+ value: 'fixed'
1412
+ }, {
1413
+ title: '变量绑定',
1414
+ value: 'variable'
1415
+ }]
1416
+ },
1417
+ initialValue: 'fixed'
1418
+ }
1419
+ }, {
1420
+ title: {
1421
+ label: '初始值',
1422
+ tip: '该字段的默认值。\n· 文本类填字符串,例如:待处理\n· 数字类填数字,例如:10\n· 下拉/单选填选项的 value 值,例如:male\n· 复选框填 JSON 数组,例如:["a","b"]'
1423
+ },
1424
+ name: 'value',
1425
+ condition: function condition(target) {
1426
+ var _target$parent111, _target$parent111$get;
1427
+ return (((_target$parent111 = target.parent) === null || _target$parent111 === void 0 ? void 0 : (_target$parent111$get = _target$parent111.getPropValue) === null || _target$parent111$get === void 0 ? void 0 : _target$parent111$get.call(_target$parent111, 'valueType')) || 'fixed') === 'fixed';
1428
+ },
1429
+ setter: {
1430
+ componentName: 'MixedSetter',
1431
+ props: {
1432
+ setters: [{
1433
+ componentName: 'StringSetter',
1434
+ title: '字符串'
1435
+ }, {
1436
+ componentName: 'NumberSetter',
1437
+ title: '数字'
1438
+ }, {
1439
+ componentName: 'BoolSetter',
1440
+ title: '布尔'
1441
+ }, {
1442
+ componentName: 'JsonSetter',
1443
+ title: 'JSON(数组/对象)'
1444
+ }]
1445
+ }
1446
+ }
1447
+ }, {
1448
+ title: {
1449
+ label: '变量绑定',
1450
+ tip: '绑定页面 state 或外部传入的变量,表单打开时从该变量读取初始值。\n例如:绑定 state.selectedPackage 可将上一步选择的套餐自动填入。'
1451
+ },
1452
+ name: 'value',
1453
+ condition: function condition(target) {
1454
+ var _target$parent112, _target$parent112$get;
1455
+ return ((_target$parent112 = target.parent) === null || _target$parent112 === void 0 ? void 0 : (_target$parent112$get = _target$parent112.getPropValue) === null || _target$parent112$get === void 0 ? void 0 : _target$parent112$get.call(_target$parent112, 'valueType')) === 'variable';
1456
+ },
1457
+ setter: {
1458
+ componentName: 'VariableSetter'
1459
+ },
1460
+ extraProps: {
1461
+ supportVariable: true
1462
+ }
1463
+ }]
1464
+ }
1465
+ },
1466
+ initialValue: function initialValue() {
1467
+ return {
1468
+ field: '',
1469
+ valueType: 'fixed',
1470
+ value: ''
1471
+ };
1472
+ }
1473
+ }
1474
+ },
1475
+ initialValue: []
222
1476
  }
223
- }, {
224
- title: '提交按钮文字',
225
- name: 'submitText',
1477
+ },
1478
+ // ─────────────────────────────────────────────────────────────────────
1479
+ // 计算字段
1480
+ // ─────────────────────────────────────────────────────────────────────
1481
+ {
1482
+ title: {
1483
+ label: '计算字段',
1484
+ tip: '声明由多个表单字段自动拼接/计算出的衍生字段,每行一条规则。\n\n工作原理:每次任意字段值变化时自动重新计算,结果写入目标字段,提交时自动携带。\n\n表达式写法:用 {字段名} 引用表单中其他字段的当前值\n 例如:{package_name},{package_price}元,预约日期:{banquet_date}\n\n配置步骤:\n ① 目标字段名 = 要写入的字段名,例如:order_desc\n ② 表达式 = 输入模板文字,用 {字段名} 插入字段值\n ③ 保存后切换套餐/填值即可看到目标字段自动更新\n\n无需编写任何 JS 逻辑,配置即生效。'
1485
+ },
1486
+ name: 'computedFields',
1487
+ extraProps: {
1488
+ getValue: function getValue(target) {
1489
+ var cf = target.getProps().getPropValue('computedFields');
1490
+ if (!cf) return [];
1491
+ if (Array.isArray(cf)) return cf;
1492
+ return Object.entries(cf).map(function (_ref2) {
1493
+ var targetField = _ref2[0],
1494
+ template = _ref2[1];
1495
+ return {
1496
+ targetField: targetField,
1497
+ template: template
1498
+ };
1499
+ });
1500
+ },
1501
+ setValue: function setValue(target, value) {
1502
+ if (!Array.isArray(value)) return;
1503
+ target.getProps().setPropValue('computedFields', value.filter(Boolean));
1504
+ }
1505
+ },
226
1506
  setter: {
227
- componentName: 'StringSetter',
228
- initialValue: '提交'
1507
+ componentName: 'ArraySetter',
1508
+ props: {
1509
+ itemSetter: {
1510
+ componentName: 'ObjectSetter',
1511
+ props: {
1512
+ config: {
1513
+ items: [{
1514
+ title: {
1515
+ label: '目标字段名',
1516
+ tip: '计算结果写入的字段名,提交时携带此字段。\n建议取语义化名称,例如:order_desc、booking_summary\n该字段不需要出现在上方「表单项」中,提交时会自动追加到表单值里。'
1517
+ },
1518
+ name: 'targetField',
1519
+ important: true,
1520
+ display: 'inline',
1521
+ setter: {
1522
+ componentName: 'StringSetter',
1523
+ isRequired: true,
1524
+ initialValue: ''
1525
+ }
1526
+ }, {
1527
+ title: {
1528
+ label: '表达式',
1529
+ tip: '用 {字段名} 引用表单字段的当前值,支持任意文字拼接。\n\n示例:{package_name},{guest_count}人,预订日期:{banquet_date}\n\n操作:先查看「表单项」中的字段名,在此处输入拼接模板,用 {字段名} 插入对应字段值,固定文字直接输入。'
1530
+ },
1531
+ name: 'template',
1532
+ setter: {
1533
+ componentName: 'StringSetter',
1534
+ isRequired: true,
1535
+ initialValue: ''
1536
+ }
1537
+ }]
1538
+ }
1539
+ },
1540
+ initialValue: function initialValue() {
1541
+ return {
1542
+ targetField: '',
1543
+ template: ''
1544
+ };
1545
+ }
1546
+ }
1547
+ },
1548
+ initialValue: []
229
1549
  }
230
- }, {
231
- title: '提交时校验',
232
- name: 'submitValidate',
1550
+ },
1551
+ // ─────────────────────────────────────────────────────────────────────
1552
+ // 字段联动
1553
+ // ─────────────────────────────────────────────────────────────────────
1554
+ {
1555
+ title: {
1556
+ label: '字段联动',
1557
+ tip: '配置"某字段变化 → 自动回填其他字段"的联动规则。\n\n【简单模式】适用于:选某个值 → 直接回填固定值或绑定变量\n 例如:选"豪华套餐" → 回填价格=9800\n · 监听字段:值发生变化时触发检查,填字段名,例如 package_name\n · 触发值:留空=任何变化都触发;填具体值=精确匹配才触发\n · 回填字段:要被自动填入值的目标字段名\n · 回填方式:固定值 或 变量(从 state 中选取)\n\n【数据源模式】适用于:根据所选值从一个列表中查找匹配项,自动回填该项的多个字段\n 典型场景:下拉框绑定了 state.packages(含 name/price/count),选择套餐名后自动回填价格和人数\n 监听字段 = package_name\n 数据源 = state.packages(与 package_name 下拉框的动态选项相同)\n 匹配字段 = value(Select 存储的是选项的 value 字段)\n 回填映射 = {"package_price":"price","guest_count":"count"}(JSON 格式)\n 注意:数据源中的每个对象需要有 matchKey 字段(用于匹配监听字段的值)以及各回填字段对应的属性。'
1558
+ },
1559
+ name: 'fieldLinkage',
233
1560
  setter: {
234
- componentName: 'BoolSetter',
235
- initialValue: true
1561
+ componentName: 'ArraySetter',
1562
+ props: {
1563
+ itemSetter: {
1564
+ componentName: 'ObjectSetter',
1565
+ props: {
1566
+ config: {
1567
+ items: [
1568
+ // ── 通用:监听字段 ──────────────────────────────────────
1569
+ {
1570
+ title: {
1571
+ label: '监听字段',
1572
+ tip: '当此字段值变化时触发联动检查,填表单项的字段名(field),例如:package_name\n可从上方「表单项」列表中查看各字段名。'
1573
+ },
1574
+ name: 'watchField',
1575
+ important: true,
1576
+ display: 'inline',
1577
+ setter: {
1578
+ componentName: 'StringSetter',
1579
+ isRequired: true,
1580
+ initialValue: ''
1581
+ }
1582
+ },
1583
+ // ── 模式切换 ────────────────────────────────────────────
1584
+ {
1585
+ title: {
1586
+ label: '联动模式',
1587
+ tip: '· 简单:监听字段变化 → 直接设置某个字段的值(固定值或变量)\n· 数据源:监听字段变化 → 在指定数据源中查找匹配项 → 批量回填多个字段\n (适合"选套餐 → 联动回填价格、人数"等场景)'
1588
+ },
1589
+ name: 'linkageMode',
1590
+ setter: {
1591
+ componentName: 'RadioGroupSetter',
1592
+ props: {
1593
+ options: [{
1594
+ title: '简单',
1595
+ value: 'simple'
1596
+ }, {
1597
+ title: '数据源',
1598
+ value: 'dataSource'
1599
+ }]
1600
+ },
1601
+ initialValue: 'simple'
1602
+ }
1603
+ },
1604
+ // ── 简单模式:触发值 ────────────────────────────────────
1605
+ {
1606
+ title: {
1607
+ label: '触发值',
1608
+ tip: '监听字段的值等于此值时才触发回填。\n· 留空 = 该字段任何变化都触发\n· 填具体值 = 精确匹配后触发,例如:豪华套餐、1、true\n\n多个触发值:添加多条相同监听字段的规则,每条配置不同触发值。'
1609
+ },
1610
+ name: 'matchValue',
1611
+ condition: function condition(target) {
1612
+ var _target$parent113, _target$parent113$get;
1613
+ return (((_target$parent113 = target.parent) === null || _target$parent113 === void 0 ? void 0 : (_target$parent113$get = _target$parent113.getPropValue) === null || _target$parent113$get === void 0 ? void 0 : _target$parent113$get.call(_target$parent113, 'linkageMode')) || 'simple') === 'simple';
1614
+ },
1615
+ setter: {
1616
+ componentName: 'StringSetter',
1617
+ initialValue: ''
1618
+ }
1619
+ },
1620
+ // ── 简单模式:回填字段 ──────────────────────────────────
1621
+ {
1622
+ title: {
1623
+ label: '回填字段',
1624
+ tip: '触发条件满足后,自动填入值的目标字段名(field),例如:package_price\n可从上方「表单项」列表中查看各字段名。'
1625
+ },
1626
+ name: 'fillField',
1627
+ condition: function condition(target) {
1628
+ var _target$parent114, _target$parent114$get;
1629
+ return (((_target$parent114 = target.parent) === null || _target$parent114 === void 0 ? void 0 : (_target$parent114$get = _target$parent114.getPropValue) === null || _target$parent114$get === void 0 ? void 0 : _target$parent114$get.call(_target$parent114, 'linkageMode')) || 'simple') === 'simple';
1630
+ },
1631
+ setter: {
1632
+ componentName: 'StringSetter',
1633
+ initialValue: ''
1634
+ }
1635
+ },
1636
+ // ── 简单模式:回填方式 ──────────────────────────────────
1637
+ {
1638
+ title: {
1639
+ label: '回填方式',
1640
+ tip: '· 固定值:直接填写静态回填值,例如 9800、"待处理"\n· 变量:回填值来自页面 state(适合动态数据场景)'
1641
+ },
1642
+ name: 'fillValueType',
1643
+ condition: function condition(target) {
1644
+ var _target$parent115, _target$parent115$get;
1645
+ return (((_target$parent115 = target.parent) === null || _target$parent115 === void 0 ? void 0 : (_target$parent115$get = _target$parent115.getPropValue) === null || _target$parent115$get === void 0 ? void 0 : _target$parent115$get.call(_target$parent115, 'linkageMode')) || 'simple') === 'simple';
1646
+ },
1647
+ setter: {
1648
+ componentName: 'RadioGroupSetter',
1649
+ props: {
1650
+ options: [{
1651
+ title: '固定值',
1652
+ value: 'fixed'
1653
+ }, {
1654
+ title: '变量',
1655
+ value: 'variable'
1656
+ }]
1657
+ },
1658
+ initialValue: 'fixed'
1659
+ }
1660
+ },
1661
+ // ── 简单模式:回填值(固定)────────────────────────────
1662
+ {
1663
+ title: {
1664
+ label: '回填值',
1665
+ tip: '触发条件满足后填入「回填字段」的具体值。\n· 字符串示例:豪华套餐、待处理\n· 数字示例:9800、10\n如需动态值,请将「回填方式」切换为「变量」。'
1666
+ },
1667
+ name: 'fillValue',
1668
+ condition: function condition(target) {
1669
+ var _target$parent116, _target$parent116$get, _target$parent117, _target$parent117$get;
1670
+ return (((_target$parent116 = target.parent) === null || _target$parent116 === void 0 ? void 0 : (_target$parent116$get = _target$parent116.getPropValue) === null || _target$parent116$get === void 0 ? void 0 : _target$parent116$get.call(_target$parent116, 'linkageMode')) || 'simple') === 'simple' && (((_target$parent117 = target.parent) === null || _target$parent117 === void 0 ? void 0 : (_target$parent117$get = _target$parent117.getPropValue) === null || _target$parent117$get === void 0 ? void 0 : _target$parent117$get.call(_target$parent117, 'fillValueType')) || 'fixed') === 'fixed';
1671
+ },
1672
+ setter: {
1673
+ componentName: 'MixedSetter',
1674
+ props: {
1675
+ setters: [{
1676
+ componentName: 'StringSetter',
1677
+ title: '字符串'
1678
+ }, {
1679
+ componentName: 'NumberSetter',
1680
+ title: '数字'
1681
+ }, {
1682
+ componentName: 'BoolSetter',
1683
+ title: '布尔'
1684
+ }]
1685
+ }
1686
+ }
1687
+ },
1688
+ // ── 简单模式:回填值(变量)────────────────────────────
1689
+ {
1690
+ title: {
1691
+ label: '回填变量',
1692
+ tip: '从页面 state 中选取变量作为回填值,表单联动时实时取该变量的当前值填入目标字段。\n\n如果 state 中没有现成变量,但回填值需要来自某个下拉框选项对象的字段(如选套餐后取价格),请改用「数据源」模式。'
1693
+ },
1694
+ name: 'fillValue',
1695
+ condition: function condition(target) {
1696
+ var _target$parent118, _target$parent118$get, _target$parent119, _target$parent119$get;
1697
+ return (((_target$parent118 = target.parent) === null || _target$parent118 === void 0 ? void 0 : (_target$parent118$get = _target$parent118.getPropValue) === null || _target$parent118$get === void 0 ? void 0 : _target$parent118$get.call(_target$parent118, 'linkageMode')) || 'simple') === 'simple' && ((_target$parent119 = target.parent) === null || _target$parent119 === void 0 ? void 0 : (_target$parent119$get = _target$parent119.getPropValue) === null || _target$parent119$get === void 0 ? void 0 : _target$parent119$get.call(_target$parent119, 'fillValueType')) === 'variable';
1698
+ },
1699
+ setter: {
1700
+ componentName: 'VariableSetter'
1701
+ },
1702
+ extraProps: {
1703
+ supportVariable: true
1704
+ }
1705
+ },
1706
+ // ── 数据源模式:数据源 ──────────────────────────────────
1707
+ {
1708
+ title: {
1709
+ label: '数据源',
1710
+ tip: '从 state 中选取一个数组变量作为查找来源。\n\n典型配置:将 package_name 字段的「动态选项绑定」绑定到 state.packages,然后此处同样选择 state.packages。\n\n这样当 package_name 变化时,会在 state.packages 中找到匹配的项,再按「回填映射」将各字段值填入表单。'
1711
+ },
1712
+ name: 'dataSource',
1713
+ condition: function condition(target) {
1714
+ var _target$parent120, _target$parent120$get;
1715
+ return ((_target$parent120 = target.parent) === null || _target$parent120 === void 0 ? void 0 : (_target$parent120$get = _target$parent120.getPropValue) === null || _target$parent120$get === void 0 ? void 0 : _target$parent120$get.call(_target$parent120, 'linkageMode')) === 'dataSource';
1716
+ },
1717
+ setter: {
1718
+ componentName: 'VariableSetter'
1719
+ },
1720
+ extraProps: {
1721
+ supportVariable: true
1722
+ }
1723
+ },
1724
+ // ── 数据源模式:匹配字段 ────────────────────────────────
1725
+ {
1726
+ title: {
1727
+ label: '匹配字段',
1728
+ tip: '在数据源的每个对象中,用哪个字段的值与监听字段的当前值进行比对。\n\n下拉框(Select)默认存储选项的 value 字段,此处填 value 即可。\n如果下拉框存储的是 label(名称),则填 label。\n\n示例:state.packages = [{value:"A", label:"豪华套餐", price:9800, count:10}, ...]\n则此处填 value(与 package_name 字段存储的选项 value 对应)。'
1729
+ },
1730
+ name: 'matchKey',
1731
+ condition: function condition(target) {
1732
+ var _target$parent121, _target$parent121$get;
1733
+ return ((_target$parent121 = target.parent) === null || _target$parent121 === void 0 ? void 0 : (_target$parent121$get = _target$parent121.getPropValue) === null || _target$parent121$get === void 0 ? void 0 : _target$parent121$get.call(_target$parent121, 'linkageMode')) === 'dataSource';
1734
+ },
1735
+ setter: {
1736
+ componentName: 'StringSetter',
1737
+ initialValue: 'value'
1738
+ }
1739
+ },
1740
+ // ── 数据源模式:回填映射 ────────────────────────────────
1741
+ {
1742
+ title: {
1743
+ label: '回填映射',
1744
+ tip: '找到匹配项后,将数据源对象中的哪些字段值填入表单的哪些字段。\n\nJSON 格式:{ "表单字段名": "数据源字段名", ... }\n\n示例(state.packages 中每项有 price 和 count 属性):\n {"package_price":"price","guest_count":"count"}\n\n效果:匹配到套餐后,自动将 price 回填到 package_price 字段,count 回填到 guest_count 字段。'
1745
+ },
1746
+ name: 'fillFields',
1747
+ condition: function condition(target) {
1748
+ var _target$parent122, _target$parent122$get;
1749
+ return ((_target$parent122 = target.parent) === null || _target$parent122 === void 0 ? void 0 : (_target$parent122$get = _target$parent122.getPropValue) === null || _target$parent122$get === void 0 ? void 0 : _target$parent122$get.call(_target$parent122, 'linkageMode')) === 'dataSource';
1750
+ },
1751
+ setter: {
1752
+ componentName: 'JsonSetter',
1753
+ initialValue: {}
1754
+ }
1755
+ }]
1756
+ }
1757
+ },
1758
+ initialValue: function initialValue() {
1759
+ return {
1760
+ watchField: '',
1761
+ linkageMode: 'simple',
1762
+ matchValue: '',
1763
+ fillField: '',
1764
+ fillValueType: 'fixed',
1765
+ fillValue: ''
1766
+ };
1767
+ }
1768
+ }
1769
+ },
1770
+ initialValue: []
236
1771
  }
237
- }, {
238
- title: '提交数据源',
239
- name: 'submitDataSource',
1772
+ },
1773
+ // ─────────────────────────────────────────────────────────────────────
1774
+ // 提交参数配置
1775
+ // ─────────────────────────────────────────────────────────────────────
1776
+ {
1777
+ title: {
1778
+ label: '提交参数配置',
1779
+ tip: '控制表单提交时如何将字段值构建为请求参数,支持三种模式:\n\n① 直接透传(passthrough,默认)\n字段名与接口参数名完全一致时无需配置——表单字段值直接作为请求 body,零配置即可工作。\n\n② 字段重命名(rename)\n表单字段名与接口参数名不一致时使用,按规则将指定字段重命名,其余字段仍按原名透传。\n例如:表单字段 user_name → 接口参数 username\n\n③ 动态表单格式(itemList)\n后端接口接收 itemList:[{columnName,columnValue},...] 格式时使用,适合 /dynamicFormTableRecord/ 等接口。\n例如:{user_name:"张三"} → [{columnName:"user_name",columnValue:"张三"}]'
1780
+ },
1781
+ name: 'submitMapping',
240
1782
  setter: {
241
- componentName: 'SetterFormVariable',
1783
+ componentName: 'ObjectSetter',
242
1784
  props: {
243
- showAttributesPanel: false
1785
+ config: {
1786
+ items: [
1787
+ // ── 模式选择 ──────────────────────────────────────────────
1788
+ {
1789
+ title: {
1790
+ label: '参数构建模式',
1791
+ tip: '选择提交时参数的构建方式:\n· 直接透传:字段名与接口参数名一致,直接发送;最简单,首选。\n· 字段重命名:字段名与接口参数名不一致,在下方按需配置重命名规则即可。\n· 动态表单格式:接口接收 itemList:[{columnName,columnValue}] 格式,需完整配置字段映射列表。'
1792
+ },
1793
+ name: 'mode',
1794
+ setter: {
1795
+ componentName: 'SelectSetter',
1796
+ props: {
1797
+ options: [{
1798
+ label: '① 直接透传(字段名与接口参数名一致)',
1799
+ value: 'passthrough'
1800
+ }, {
1801
+ label: '② 字段重命名(字段名与接口参数名不一致)',
1802
+ value: 'rename'
1803
+ }, {
1804
+ label: '③ 动态表单格式(itemList 格式)',
1805
+ value: 'itemList'
1806
+ }]
1807
+ },
1808
+ initialValue: 'passthrough'
1809
+ }
1810
+ },
1811
+ // ── rename 模式:字段重命名映射 ───────────────────────────
1812
+ {
1813
+ title: {
1814
+ label: '字段重命名规则',
1815
+ tip: '每行配置一条重命名规则,将表单字段名映射到接口参数名。\n· 来源字段(表单字段名):填写表单项中 field 的值,例如 user_name\n· 目标参数名(接口参数名):接口实际接收的参数名,例如 username\n\n未在此处列出的字段,将按原名透传到请求参数中。\n不需要填写表单中所有字段,只填需要重命名的字段即可。'
1816
+ },
1817
+ name: 'fieldRenameMap',
1818
+ condition: function condition(target) {
1819
+ var _target$parent123, _target$parent123$get;
1820
+ return ((_target$parent123 = target.parent) === null || _target$parent123 === void 0 ? void 0 : (_target$parent123$get = _target$parent123.getPropValue) === null || _target$parent123$get === void 0 ? void 0 : _target$parent123$get.call(_target$parent123, 'mode')) === 'rename';
1821
+ },
1822
+ setter: {
1823
+ componentName: 'ArraySetter',
1824
+ props: {
1825
+ itemSetter: {
1826
+ componentName: 'ObjectSetter',
1827
+ props: {
1828
+ config: {
1829
+ items: [{
1830
+ title: {
1831
+ label: '来源字段(表单字段名)',
1832
+ tip: '表单项中 field 的值,即当前使用的字段名,例如:user_name'
1833
+ },
1834
+ name: 'fromField',
1835
+ important: true,
1836
+ display: 'inline',
1837
+ setter: {
1838
+ componentName: 'StringSetter',
1839
+ isRequired: true,
1840
+ initialValue: ''
1841
+ }
1842
+ }, {
1843
+ title: {
1844
+ label: '目标参数名(接口参数名)',
1845
+ tip: '接口实际接收的参数名,例如:username'
1846
+ },
1847
+ name: 'toField',
1848
+ important: true,
1849
+ display: 'inline',
1850
+ setter: {
1851
+ componentName: 'StringSetter',
1852
+ isRequired: true,
1853
+ initialValue: ''
1854
+ }
1855
+ }]
1856
+ }
1857
+ },
1858
+ initialValue: function initialValue() {
1859
+ return {
1860
+ fromField: '',
1861
+ toField: ''
1862
+ };
1863
+ }
1864
+ }
1865
+ },
1866
+ initialValue: []
1867
+ }
1868
+ },
1869
+ // ── itemList 模式:目标字段名 ──────────────────────────────
1870
+ {
1871
+ title: {
1872
+ label: '目标字段名(itemList 写入位置)',
1873
+ tip: '组装后的 [{columnName,columnValue},...] 数组写入 finalValues 的字段名,默认 itemList。\n需与数据源静态 options.params 中预设的字段名一致,提交时该值会被组装结果覆盖。\n通常保持默认值 itemList 即可。'
1874
+ },
1875
+ name: 'targetField',
1876
+ condition: function condition(target) {
1877
+ var _target$parent124, _target$parent124$get;
1878
+ return ((_target$parent124 = target.parent) === null || _target$parent124 === void 0 ? void 0 : (_target$parent124$get = _target$parent124.getPropValue) === null || _target$parent124$get === void 0 ? void 0 : _target$parent124$get.call(_target$parent124, 'mode')) === 'itemList';
1879
+ },
1880
+ setter: {
1881
+ componentName: 'StringSetter',
1882
+ initialValue: 'itemList'
1883
+ }
1884
+ },
1885
+ // ── itemList 模式:字段映射列表 ────────────────────────────
1886
+ {
1887
+ title: {
1888
+ label: '字段映射列表',
1889
+ tip: '每行定义一条映射规则,决定哪些字段进入 itemList,以及每项的 columnName。\n\n· 接口字段名(columnName):dynamicFormTableRecord 表的字段标识,与后端 schema 一致。\n· 来源字段(field):从哪个表单字段取值,填写表单项的 field 名,例如 user_name。\n· 模板(template):用 {字段名} 引用并拼接多个表单字段,与 field 二选一。\n 例如:{banquet_date} {banquet_time} → "2026-03-12 18:00"(将日期和时间合并为一个值)\n\n来源字段与模板只需填一项,两者都填时 field 优先。\n未在此处列出的表单字段不会进入 itemList(也不会出现在请求参数里)。'
1890
+ },
1891
+ name: 'items',
1892
+ condition: function condition(target) {
1893
+ var _target$parent125, _target$parent125$get;
1894
+ return ((_target$parent125 = target.parent) === null || _target$parent125 === void 0 ? void 0 : (_target$parent125$get = _target$parent125.getPropValue) === null || _target$parent125$get === void 0 ? void 0 : _target$parent125$get.call(_target$parent125, 'mode')) === 'itemList';
1895
+ },
1896
+ setter: {
1897
+ componentName: 'ArraySetter',
1898
+ props: {
1899
+ itemSetter: {
1900
+ componentName: 'ObjectSetter',
1901
+ props: {
1902
+ config: {
1903
+ items: [{
1904
+ title: {
1905
+ label: '接口字段名(columnName)',
1906
+ tip: 'dynamicFormTableRecord 中的字段标识,例如:user_name、banquet_time、guest_count'
1907
+ },
1908
+ name: 'columnName',
1909
+ important: true,
1910
+ display: 'inline',
1911
+ setter: {
1912
+ componentName: 'StringSetter',
1913
+ isRequired: true,
1914
+ initialValue: ''
1915
+ }
1916
+ }, {
1917
+ title: {
1918
+ label: '来源字段',
1919
+ tip: '从哪个表单字段取值,填写表单项的 field 名,例如:user_name\n与「模板」二选一,只需填一项。'
1920
+ },
1921
+ name: 'field',
1922
+ setter: {
1923
+ componentName: 'StringSetter',
1924
+ initialValue: ''
1925
+ }
1926
+ }, {
1927
+ title: {
1928
+ label: '模板',
1929
+ tip: '用 {字段名} 引用并拼接多个字段值,例如:{banquet_date} {banquet_time}\n与「来源字段」二选一,只需填一项。'
1930
+ },
1931
+ name: 'template',
1932
+ setter: {
1933
+ componentName: 'StringSetter',
1934
+ initialValue: ''
1935
+ }
1936
+ }]
1937
+ }
1938
+ },
1939
+ initialValue: function initialValue() {
1940
+ return {
1941
+ columnName: '',
1942
+ field: ''
1943
+ };
1944
+ }
1945
+ }
1946
+ },
1947
+ initialValue: []
1948
+ }
1949
+ }]
1950
+ }
244
1951
  }
245
1952
  }
246
- }, {
247
- title: '显示重置按钮',
248
- name: 'showReset',
249
- setter: {
250
- componentName: 'BoolSetter',
251
- initialValue: false
252
- }
253
- }, {
254
- title: '重置按钮文字',
255
- name: 'resetText',
256
- setter: {
257
- componentName: 'StringSetter',
258
- initialValue: '重置'
259
- }
1953
+ },
1954
+ // ─────────────────────────────────────────────────────────────────────
1955
+ // 分组六:操作按钮
1956
+ // ─────────────────────────────────────────────────────────────────────
1957
+ {
1958
+ type: 'group',
1959
+ title: '操作按钮',
1960
+ name: 'actionGroup',
1961
+ display: 'accordion',
1962
+ items: [
1963
+ // ── 对齐方式 ──────────────────────────────────────────────────────
1964
+ {
1965
+ title: {
1966
+ label: '对齐方式',
1967
+ tip: '表单底部操作按钮区域的水平对齐方式。\n· 居左:按钮靠左排列\n· 居中:按钮居中排列(默认)\n· 居右:按钮靠右排列'
1968
+ },
1969
+ name: 'operationAlign',
1970
+ setter: {
1971
+ componentName: 'RadioGroupSetter',
1972
+ props: {
1973
+ options: [{
1974
+ title: '居左',
1975
+ value: 'left'
1976
+ }, {
1977
+ title: '居中',
1978
+ value: 'center'
1979
+ }, {
1980
+ title: '居右',
1981
+ value: 'right'
1982
+ }]
1983
+ },
1984
+ initialValue: 'center'
1985
+ }
1986
+ },
1987
+ // ── 按钮列表 ──────────────────────────────────────────────────────
1988
+ {
1989
+ title: {
1990
+ label: '按钮列表',
1991
+ tip: '配置表单底部的操作按钮。\n\n默认包含「立即预订」(提交,primary 样式)和「重置」(重置,normal 样式)两个按钮,可按需增删改。\n\n字段说明:\n· 按钮文字:按钮显示的文字,例如:立即预订、保存草稿、取消\n· 操作类型:\n 提交表单 → 校验通过后收集字段值 → 调用「提交数据源(Fetch)」接口 → 触发 onSubmit 事件\n 重置表单 → 清空所有字段值,触发 onReset 事件\n 自定义 → 直接触发「点击事件」,不操作表单\n· 按钮样式:主要(primary 蓝色)/ 次要(secondary)/ 普通(normal 灰色)\n· 提交数据源(Fetch):仅「提交表单」类型生效。点击后弹出 Fetch 数据源配置面板,选择接口地址和请求参数,请求参数支持绑定到表单字段值,提交时自动携带表单数据发起请求。\n· 提交时校验:关闭后跳过必填校验直接提交(适合草稿保存)\n· 点击事件:仅「自定义」类型生效\n\n不配置任何按钮时表单不显示按钮区域。'
1992
+ },
1993
+ name: 'operations',
1994
+ setter: {
1995
+ componentName: 'ArraySetter',
1996
+ props: {
1997
+ itemSetter: {
1998
+ componentName: 'ObjectSetter',
1999
+ props: {
2000
+ config: {
2001
+ items: [
2002
+ // ── 按钮文字
2003
+ {
2004
+ title: {
2005
+ label: '按钮文字',
2006
+ tip: '按钮上显示的文字,例如:立即预订、保存草稿、取消'
2007
+ },
2008
+ name: 'text',
2009
+ important: true,
2010
+ display: 'inline',
2011
+ setter: {
2012
+ componentName: 'StringSetter',
2013
+ isRequired: true,
2014
+ initialValue: '立即预订'
2015
+ }
2016
+ },
2017
+ // ── 操作类型
2018
+ {
2019
+ title: {
2020
+ label: '操作类型',
2021
+ tip: '· 提交表单:校验 → 收集字段值 → 调用「提交数据源(Fetch)」 → 触发 onSubmit 事件\n· 重置表单:清空所有字段,触发 onReset 事件\n· 自定义:直接调用「点击事件」函数,不涉及表单操作'
2022
+ },
2023
+ name: 'action',
2024
+ important: true,
2025
+ display: 'inline',
2026
+ setter: {
2027
+ componentName: 'SelectSetter',
2028
+ props: {
2029
+ options: [{
2030
+ label: '提交表单',
2031
+ value: 'submit'
2032
+ }, {
2033
+ label: '重置表单',
2034
+ value: 'reset'
2035
+ }, {
2036
+ label: '自定义',
2037
+ value: 'custom'
2038
+ }]
2039
+ },
2040
+ initialValue: 'submit'
2041
+ },
2042
+ extraProps: {
2043
+ setValue: function setValue(target, value) {
2044
+ var _target$parent126, _target$parent126$get, _target$parent128, _target$parent128$get, _target$parent130, _target$parent130$set;
2045
+ // 根据操作类型自动填充默认文字(仅当文字为空时)
2046
+ var textMap = {
2047
+ submit: '立即预订',
2048
+ reset: '重置',
2049
+ custom: '按钮'
2050
+ };
2051
+ if (!((_target$parent126 = target.parent) !== null && _target$parent126 !== void 0 && (_target$parent126$get = _target$parent126.getPropValue) !== null && _target$parent126$get !== void 0 && _target$parent126$get.call(_target$parent126, 'text'))) {
2052
+ var _target$parent127, _target$parent127$set;
2053
+ (_target$parent127 = target.parent) === null || _target$parent127 === void 0 ? void 0 : (_target$parent127$set = _target$parent127.setPropValue) === null || _target$parent127$set === void 0 ? void 0 : _target$parent127$set.call(_target$parent127, 'text', textMap[value] || '按钮');
2054
+ }
2055
+ // 根据操作类型自动设置默认样式
2056
+ if (!((_target$parent128 = target.parent) !== null && _target$parent128 !== void 0 && (_target$parent128$get = _target$parent128.getPropValue) !== null && _target$parent128$get !== void 0 && _target$parent128$get.call(_target$parent128, 'type'))) {
2057
+ var _target$parent129, _target$parent129$set;
2058
+ var typeMap = {
2059
+ submit: 'primary',
2060
+ reset: 'normal',
2061
+ custom: 'normal'
2062
+ };
2063
+ (_target$parent129 = target.parent) === null || _target$parent129 === void 0 ? void 0 : (_target$parent129$set = _target$parent129.setPropValue) === null || _target$parent129$set === void 0 ? void 0 : _target$parent129$set.call(_target$parent129, 'type', typeMap[value] || 'normal');
2064
+ }
2065
+ (_target$parent130 = target.parent) === null || _target$parent130 === void 0 ? void 0 : (_target$parent130$set = _target$parent130.setPropValue) === null || _target$parent130$set === void 0 ? void 0 : _target$parent130$set.call(_target$parent130, 'action', value);
2066
+ }
2067
+ }
2068
+ },
2069
+ // ── 按钮样式
2070
+ {
2071
+ title: {
2072
+ label: '按钮样式',
2073
+ tip: '· 主要(primary):蓝色高亮,适合提交等主操作\n· 次要(secondary):灰白色,适合次要操作\n· 普通(normal):普通灰色样式,适合重置等辅助操作'
2074
+ },
2075
+ name: 'type',
2076
+ setter: {
2077
+ componentName: 'SelectSetter',
2078
+ props: {
2079
+ options: [{
2080
+ label: '主要 (primary)',
2081
+ value: 'primary'
2082
+ }, {
2083
+ label: '次要 (secondary)',
2084
+ value: 'secondary'
2085
+ }, {
2086
+ label: '普通 (normal)',
2087
+ value: 'normal'
2088
+ }]
2089
+ },
2090
+ initialValue: 'normal'
2091
+ }
2092
+ },
2093
+ // ── 提交时校验(仅 submit)
2094
+ {
2095
+ title: {
2096
+ label: '提交时校验',
2097
+ tip: '开启后点击此按钮时先执行必填校验,校验不通过则不触发提交。\n关闭后跳过校验,直接提交(适合"草稿保存"等场景)。\n仅对「提交表单」类型按钮生效。'
2098
+ },
2099
+ name: 'submitValidate',
2100
+ condition: function condition(target) {
2101
+ var _target$parent131, _target$parent131$get;
2102
+ return ((_target$parent131 = target.parent) === null || _target$parent131 === void 0 ? void 0 : (_target$parent131$get = _target$parent131.getPropValue) === null || _target$parent131$get === void 0 ? void 0 : _target$parent131$get.call(_target$parent131, 'action')) === 'submit';
2103
+ },
2104
+ setter: {
2105
+ componentName: 'BoolSetter',
2106
+ initialValue: true
2107
+ }
2108
+ },
2109
+ // ── 提交数据源(Fetch,仅 submit)
2110
+ {
2111
+ title: {
2112
+ label: '提交数据源(Fetch)',
2113
+ tip: '绑定页面级 Fetch 数据源,点击提交按钮校验通过后自动调用该数据源发起请求。\n\n【配置步骤】\n1. 在页面左侧「数据源」面板新建一个 fetch 类型数据源\n · 填写接口地址(URI)、请求方式(POST/PUT)、鉴权 Headers\n · isInit 设为 false(提交时才触发,不需要页面初始化时自动加载)\n2. 在此处点击「变量」按钮,选择 this.dataSourceMap.<数据源ID>\n\n【参数说明】\n表单提交时会将所有字段值(含 computedFields / submitMapping 处理后的 itemList)\n作为覆盖参数传入 .load(values),与数据源静态 params 合并,无需手写 onSubmit。\n\n【多按钮场景】\n每个「提交表单」按钮可绑定独立的数据源,如"保存草稿"绑定草稿接口,"正式提交"绑定提交接口。\n\n仅对「提交表单」类型按钮生效。'
2114
+ },
2115
+ name: 'dataSource',
2116
+ condition: function condition(target) {
2117
+ var _target$parent132, _target$parent132$get;
2118
+ return ((_target$parent132 = target.parent) === null || _target$parent132 === void 0 ? void 0 : (_target$parent132$get = _target$parent132.getPropValue) === null || _target$parent132$get === void 0 ? void 0 : _target$parent132$get.call(_target$parent132, 'action')) === 'submit';
2119
+ },
2120
+ setter: {
2121
+ componentName: 'MixedSetter',
2122
+ props: {
2123
+ setters: [{
2124
+ componentName: 'VariableSetter',
2125
+ title: '绑定数据源变量'
2126
+ }, {
2127
+ componentName: 'ExpressionSetter',
2128
+ title: '表达式'
2129
+ }]
2130
+ }
2131
+ }
2132
+ },
2133
+ // ── 点击事件(仅 custom)
2134
+ {
2135
+ title: {
2136
+ label: '点击事件',
2137
+ tip: '自定义按钮被点击时调用的函数,例如:跳转页面、打开弹窗。\n仅对「自定义」类型按钮生效。'
2138
+ },
2139
+ name: 'onClick',
2140
+ condition: function condition(target) {
2141
+ var _target$parent133, _target$parent133$get;
2142
+ return ((_target$parent133 = target.parent) === null || _target$parent133 === void 0 ? void 0 : (_target$parent133$get = _target$parent133.getPropValue) === null || _target$parent133$get === void 0 ? void 0 : _target$parent133$get.call(_target$parent133, 'action')) === 'custom';
2143
+ },
2144
+ setter: {
2145
+ componentName: 'FunctionSetter'
2146
+ },
2147
+ extraProps: {
2148
+ supportVariable: true
2149
+ }
2150
+ }]
2151
+ }
2152
+ },
2153
+ initialValue: function initialValue() {
2154
+ return {
2155
+ text: '立即预订',
2156
+ action: 'submit',
2157
+ type: 'primary',
2158
+ submitValidate: true
2159
+ };
2160
+ }
2161
+ }
2162
+ },
2163
+ initialValue: [{
2164
+ text: '立即预订',
2165
+ action: 'submit',
2166
+ type: 'primary',
2167
+ submitValidate: true
2168
+ }, {
2169
+ text: '重置',
2170
+ action: 'reset',
2171
+ type: 'normal'
2172
+ }]
2173
+ }
2174
+ }]
260
2175
  }],
261
2176
  supports: {
262
2177
  style: true,
263
2178
  events: [{
2179
+ name: 'onReset',
2180
+ template: "onReset(${extParams}){\n// \u70B9\u51FB\u91CD\u7F6E\u6309\u94AE\u540E\u89E6\u53D1\n// \u53EF\u5728\u6B64\u5904\u540C\u6B65\u9875\u9762 state \u6216\u6267\u884C\u5176\u4ED6\u6E05\u7A7A\u903B\u8F91\nconsole.log('[CustomForm] onReset');\n}"
2181
+ }, {
2182
+ name: 'onChange',
2183
+ template: "onChange(field, value, allValues,\${extParams}){\n// 任意字段值变化时触发\n// field = 变化的字段名(字符串)\n// value = 该字段的最新值\n// allValues = 当前所有字段值(含 computedFields 计算字段)\n// 常见用法:将字段值同步到页面 state\n// this.setState({ [field]: value })\nconsole.log('[CustomForm] onChange', field, value, allValues);\n}"
2184
+ }, {
264
2185
  name: 'onSubmit',
265
- template: "onSubmit(values, errors, field,${extParams}){\n// 提交成功(无校验错误)\nconsole.log('onSubmit', values, errors, field);\n}"
2186
+ template: "onSubmit(values, errors, field,\${extParams}){\n// 提交成功(校验通过)时触发\n// values = 所有字段的当前值(含 computedFields 计算字段)\n// 无需再手动组装字段,直接使用 values 对象即可\nconsole.log('[CustomForm] onSubmit', values);\n}"
266
2187
  }, {
267
2188
  name: 'onSubmitFailed',
268
- template: "onSubmitFailed(values, errors, field,${extParams}){\n// 提交失败(校验错误)\nconsole.log('onSubmitFailed', values, errors, field);\n}"
2189
+ template: "onSubmitFailed(values, errors, field,\${extParams}){\n// 提交失败(校验未通过)时触发\n// errors = 校验错误信息对象,key 为字段名\nconsole.log('[CustomForm] onSubmitFailed', errors);\n}"
269
2190
  }]
270
2191
  }
271
2192
  }
272
2193
  };
273
2194
  var snippets = [{
274
- title: '自定义表单',
2195
+ title: '自定义表单(完整示例)',
275
2196
  screenshot: '',
276
2197
  schema: {
277
2198
  componentName: 'CustomForm',
278
2199
  props: {
279
- columns: 1,
2200
+ columns: 2,
2201
+ initialValues: [{
2202
+ field: 'guest_count',
2203
+ valueType: 'fixed',
2204
+ value: 10
2205
+ }],
2206
+ computedFields: [{
2207
+ targetField: 'order_desc',
2208
+ template: '{package_name},{package_price}元,预订日期:{banquet_date},人数:{guest_count}人'
2209
+ }],
280
2210
  formItems: [{
281
- field: 'name',
282
- label: '姓名',
2211
+ field: 'banquet_date',
2212
+ label: '宴请日期',
283
2213
  required: true,
284
- componentType: 'Input',
2214
+ placeholder: '请选择日期时间',
2215
+ componentType: 'DateTimePicker',
285
2216
  componentProps: {
286
- placeholder: '请输入姓名'
2217
+ format: 'YYYY-MM-DD HH:mm'
287
2218
  }
288
2219
  }, {
289
- field: 'gender',
290
- label: '性别',
291
- componentType: 'RadioGroup',
292
- options: [{
293
- label: '',
294
- value: 'male'
295
- }, {
296
- label: '',
297
- value: 'female'
298
- }]
2220
+ field: 'guest_count',
2221
+ label: '宴请人数',
2222
+ required: true,
2223
+ placeholder: '请输入人数',
2224
+ componentType: 'NumberPicker'
2225
+ }, {
2226
+ field: 'package_name',
2227
+ label: '套餐名称',
2228
+ required: true,
2229
+ componentType: 'Select',
2230
+ placeholder: '请选择套餐',
2231
+ options: []
2232
+ }, {
2233
+ field: 'package_price',
2234
+ label: '套餐价格',
2235
+ componentType: 'Input',
2236
+ componentProps: {
2237
+ readOnly: true
2238
+ },
2239
+ extra: '选择套餐后自动填入'
2240
+ }, {
2241
+ field: 'user_name',
2242
+ label: '预订人姓名',
2243
+ required: true,
2244
+ placeholder: '请输入姓名',
2245
+ componentType: 'Input'
2246
+ }, {
2247
+ field: 'user_mobile',
2248
+ label: '联系方式',
2249
+ required: true,
2250
+ placeholder: '请输入手机号',
2251
+ componentType: 'Input'
2252
+ }, {
2253
+ field: 'memo',
2254
+ label: '备注',
2255
+ placeholder: '请输入备注(选填)',
2256
+ componentType: 'TextArea',
2257
+ columnSpan: 2
299
2258
  }],
300
- showSubmit: true,
301
- submitText: '提交'
2259
+ fieldLinkage: [{
2260
+ watchField: 'package_name',
2261
+ linkageMode: 'simple',
2262
+ matchValue: '豪华套餐',
2263
+ fillField: 'package_price',
2264
+ fillValueType: 'fixed',
2265
+ fillValue: 9800
2266
+ }],
2267
+ operations: [{
2268
+ text: '立即预订',
2269
+ action: 'submit',
2270
+ type: 'primary',
2271
+ submitValidate: true
2272
+ }, {
2273
+ text: '重置',
2274
+ action: 'reset',
2275
+ type: 'normal'
2276
+ }]
302
2277
  }
303
2278
  }
304
2279
  }];