@formily-design/formily-antd 1.0.21 → 1.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm/components/Cascader/preview.js +82 -3
- package/esm/components/DatePicker/preview.js +15 -35
- package/esm/components/Field/valueMapping.d.ts +69 -36
- package/esm/components/Field/valueMapping.js +194 -84
- package/esm/locales/Cascader.d.ts +39 -0
- package/esm/locales/Cascader.js +39 -0
- package/esm/locales/DatePicker.js +6 -6
- package/esm/schemas/Cascader.js +5 -0
- package/lib/components/Cascader/preview.js +81 -2
- package/lib/components/DatePicker/preview.js +14 -34
- package/lib/components/Field/valueMapping.d.ts +69 -36
- package/lib/components/Field/valueMapping.js +195 -84
- package/lib/locales/Cascader.d.ts +39 -0
- package/lib/locales/Cascader.js +39 -0
- package/lib/locales/DatePicker.js +6 -6
- package/lib/schemas/Cascader.js +5 -0
- package/package.json +8 -8
|
@@ -7,6 +7,7 @@ export declare const Cascader: {
|
|
|
7
7
|
title: string;
|
|
8
8
|
tooltip: string;
|
|
9
9
|
};
|
|
10
|
+
multiple: string;
|
|
10
11
|
displayRender: {
|
|
11
12
|
title: string;
|
|
12
13
|
tooltip: string;
|
|
@@ -16,6 +17,18 @@ export declare const Cascader: {
|
|
|
16
17
|
tooltip: string;
|
|
17
18
|
};
|
|
18
19
|
};
|
|
20
|
+
'value-mapping-group': {
|
|
21
|
+
title: string;
|
|
22
|
+
fieldPath: string;
|
|
23
|
+
mappingPosition: string;
|
|
24
|
+
currentField: string;
|
|
25
|
+
siblingFields: string;
|
|
26
|
+
multipleOnlyCurrent: string;
|
|
27
|
+
empty: string;
|
|
28
|
+
incomplete: string;
|
|
29
|
+
duplicate: string;
|
|
30
|
+
invalid: string;
|
|
31
|
+
};
|
|
19
32
|
};
|
|
20
33
|
};
|
|
21
34
|
'en-US': {
|
|
@@ -26,6 +39,7 @@ export declare const Cascader: {
|
|
|
26
39
|
title: string;
|
|
27
40
|
tooltip: string;
|
|
28
41
|
};
|
|
42
|
+
multiple: string;
|
|
29
43
|
displayRender: {
|
|
30
44
|
title: string;
|
|
31
45
|
tooltip: string;
|
|
@@ -35,6 +49,18 @@ export declare const Cascader: {
|
|
|
35
49
|
tooltip: string;
|
|
36
50
|
};
|
|
37
51
|
};
|
|
52
|
+
'value-mapping-group': {
|
|
53
|
+
title: string;
|
|
54
|
+
fieldPath: string;
|
|
55
|
+
mappingPosition: string;
|
|
56
|
+
currentField: string;
|
|
57
|
+
siblingFields: string;
|
|
58
|
+
multipleOnlyCurrent: string;
|
|
59
|
+
empty: string;
|
|
60
|
+
incomplete: string;
|
|
61
|
+
duplicate: string;
|
|
62
|
+
invalid: string;
|
|
63
|
+
};
|
|
38
64
|
};
|
|
39
65
|
};
|
|
40
66
|
'ko-KR': {
|
|
@@ -45,6 +71,7 @@ export declare const Cascader: {
|
|
|
45
71
|
title: string;
|
|
46
72
|
tooltip: string;
|
|
47
73
|
};
|
|
74
|
+
multiple: string;
|
|
48
75
|
displayRender: {
|
|
49
76
|
title: string;
|
|
50
77
|
tooltip: string;
|
|
@@ -54,6 +81,18 @@ export declare const Cascader: {
|
|
|
54
81
|
tooltip: string;
|
|
55
82
|
};
|
|
56
83
|
};
|
|
84
|
+
'value-mapping-group': {
|
|
85
|
+
title: string;
|
|
86
|
+
fieldPath: string;
|
|
87
|
+
mappingPosition: string;
|
|
88
|
+
currentField: string;
|
|
89
|
+
siblingFields: string;
|
|
90
|
+
multipleOnlyCurrent: string;
|
|
91
|
+
empty: string;
|
|
92
|
+
incomplete: string;
|
|
93
|
+
duplicate: string;
|
|
94
|
+
invalid: string;
|
|
95
|
+
};
|
|
57
96
|
};
|
|
58
97
|
};
|
|
59
98
|
};
|
package/esm/locales/Cascader.js
CHANGED
|
@@ -7,6 +7,7 @@ export const Cascader = {
|
|
|
7
7
|
title: '选择时触发',
|
|
8
8
|
tooltip: '点选每级菜单选项值都会发生变化',
|
|
9
9
|
},
|
|
10
|
+
multiple: '多选',
|
|
10
11
|
displayRender: {
|
|
11
12
|
title: '渲染函数',
|
|
12
13
|
tooltip: '选择后展示的渲染函数,默认为label => label.join("/") ',
|
|
@@ -16,6 +17,18 @@ export const Cascader = {
|
|
|
16
17
|
tooltip: '默认值:{ label: "label", value: "value", children: "children" }',
|
|
17
18
|
},
|
|
18
19
|
},
|
|
20
|
+
'value-mapping-group': {
|
|
21
|
+
title: '数据映射',
|
|
22
|
+
fieldPath: '业务字段路径',
|
|
23
|
+
mappingPosition: '映射位置',
|
|
24
|
+
currentField: '当前字段',
|
|
25
|
+
siblingFields: '同级字段',
|
|
26
|
+
multipleOnlyCurrent: '多选模式仅支持映射到当前字段',
|
|
27
|
+
empty: '至少配置一个业务字段路径',
|
|
28
|
+
incomplete: '各级字段路径必须同时填写',
|
|
29
|
+
duplicate: '各级字段路径不能相同',
|
|
30
|
+
invalid: '请输入合法的相对字段路径',
|
|
31
|
+
},
|
|
19
32
|
},
|
|
20
33
|
},
|
|
21
34
|
'en-US': {
|
|
@@ -26,6 +39,7 @@ export const Cascader = {
|
|
|
26
39
|
title: 'Change On Select',
|
|
27
40
|
tooltip: 'Click on each level of menu option value will change',
|
|
28
41
|
},
|
|
42
|
+
multiple: 'Multiple',
|
|
29
43
|
displayRender: {
|
|
30
44
|
title: 'Display Render',
|
|
31
45
|
tooltip: 'The rendering function displayed after selection, the default is label => label.join("/") ',
|
|
@@ -35,6 +49,18 @@ export const Cascader = {
|
|
|
35
49
|
tooltip: 'Defaults:{ label: "label", value: "value", children: "children" }',
|
|
36
50
|
},
|
|
37
51
|
},
|
|
52
|
+
'value-mapping-group': {
|
|
53
|
+
title: 'Data Mapping',
|
|
54
|
+
fieldPath: 'Business field path',
|
|
55
|
+
mappingPosition: 'Mapping position',
|
|
56
|
+
currentField: 'Current field',
|
|
57
|
+
siblingFields: 'Sibling fields',
|
|
58
|
+
multipleOnlyCurrent: 'Multiple mode only supports mapping to the current field',
|
|
59
|
+
empty: 'Configure at least one business field path',
|
|
60
|
+
incomplete: 'All field paths are required',
|
|
61
|
+
duplicate: 'Field paths must be different',
|
|
62
|
+
invalid: 'Enter a valid relative field path',
|
|
63
|
+
},
|
|
38
64
|
},
|
|
39
65
|
},
|
|
40
66
|
'ko-KR': {
|
|
@@ -45,6 +71,7 @@ export const Cascader = {
|
|
|
45
71
|
title: '선택 시 변경',
|
|
46
72
|
tooltip: '메뉴 옵션 값의 레벨을 클릭하면 변경됩니다.',
|
|
47
73
|
},
|
|
74
|
+
multiple: '다중 선택',
|
|
48
75
|
displayRender: {
|
|
49
76
|
title: '디스플레이 렌더링',
|
|
50
77
|
tooltip: '선택 후 실행되는 렌더링 함수로 기본 값은 label => label.join("/") ',
|
|
@@ -54,6 +81,18 @@ export const Cascader = {
|
|
|
54
81
|
tooltip: '기본 값:{ label: "label", value: "value", children: "children" }',
|
|
55
82
|
},
|
|
56
83
|
},
|
|
84
|
+
'value-mapping-group': {
|
|
85
|
+
title: '데이터 매핑',
|
|
86
|
+
fieldPath: '업무 필드 경로',
|
|
87
|
+
mappingPosition: '매핑 위치',
|
|
88
|
+
currentField: '현재 필드',
|
|
89
|
+
siblingFields: '동급 필드',
|
|
90
|
+
multipleOnlyCurrent: '다중 선택 모드에서는 현재 필드 매핑만 지원됩니다',
|
|
91
|
+
empty: '하나 이상의 업무 필드 경로를 입력하세요',
|
|
92
|
+
incomplete: '모든 필드 경로를 입력하세요',
|
|
93
|
+
duplicate: '필드 경로는 달라야 합니다',
|
|
94
|
+
invalid: '올바른 상대 필드 경로를 입력하세요',
|
|
95
|
+
},
|
|
57
96
|
},
|
|
58
97
|
},
|
|
59
98
|
};
|
|
@@ -79,8 +79,8 @@ export const DateRangePicker = createLocales(DatePicker, {
|
|
|
79
79
|
settings: {
|
|
80
80
|
'value-mapping-group': {
|
|
81
81
|
title: '数据映射',
|
|
82
|
-
startPath: '
|
|
83
|
-
endPath: '
|
|
82
|
+
startPath: '开始字段路径',
|
|
83
|
+
endPath: '结束字段路径',
|
|
84
84
|
incomplete: '开始和结束字段路径必须同时填写',
|
|
85
85
|
duplicate: '开始和结束字段路径不能相同',
|
|
86
86
|
invalid: '请输入合法的相对字段路径',
|
|
@@ -92,8 +92,8 @@ export const DateRangePicker = createLocales(DatePicker, {
|
|
|
92
92
|
settings: {
|
|
93
93
|
'value-mapping-group': {
|
|
94
94
|
title: 'Data Mapping',
|
|
95
|
-
startPath: 'Start
|
|
96
|
-
endPath: 'End
|
|
95
|
+
startPath: 'Start field path',
|
|
96
|
+
endPath: 'End field path',
|
|
97
97
|
incomplete: 'Both start and end field paths are required',
|
|
98
98
|
duplicate: 'Start and end field paths must be different',
|
|
99
99
|
invalid: 'Enter a valid relative field path',
|
|
@@ -105,8 +105,8 @@ export const DateRangePicker = createLocales(DatePicker, {
|
|
|
105
105
|
settings: {
|
|
106
106
|
'value-mapping-group': {
|
|
107
107
|
title: '데이터 매핑',
|
|
108
|
-
startPath: '시작
|
|
109
|
-
endPath: '종료
|
|
108
|
+
startPath: '시작 필드 경로',
|
|
109
|
+
endPath: '종료 필드 경로',
|
|
110
110
|
incomplete: '시작 및 종료 필드 경로를 모두 입력하세요',
|
|
111
111
|
duplicate: '시작 및 종료 필드 경로는 달라야 합니다',
|
|
112
112
|
invalid: '올바른 상대 필드 경로를 입력하세요',
|
package/esm/schemas/Cascader.js
CHANGED
|
@@ -14,6 +14,11 @@ export const Cascader = {
|
|
|
14
14
|
'x-decorator': 'FormItem',
|
|
15
15
|
'x-component': 'Switch',
|
|
16
16
|
},
|
|
17
|
+
multiple: {
|
|
18
|
+
type: 'boolean',
|
|
19
|
+
'x-decorator': 'FormItem',
|
|
20
|
+
'x-component': 'Switch',
|
|
21
|
+
},
|
|
17
22
|
autoFocus: {
|
|
18
23
|
type: 'boolean',
|
|
19
24
|
'x-decorator': 'FormItem',
|
|
@@ -3,25 +3,104 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.Cascader = void 0;
|
|
4
4
|
const antd_v5_1 = require("@formily/antd-v5");
|
|
5
5
|
const core_1 = require("@formily-design/core");
|
|
6
|
-
const
|
|
6
|
+
const shared_1 = require("../Field/shared");
|
|
7
|
+
const valueMapping_1 = require("../Field/valueMapping");
|
|
7
8
|
const schemas_1 = require("../../schemas");
|
|
8
9
|
const locales_1 = require("../../locales");
|
|
10
|
+
// 这些路径同时被 value-mapping 公共 reaction 和映射位置设置项读取,避免组件配置各自维护协议路径。
|
|
11
|
+
const valueMappingFieldsPath = `${core_1.VALUE_MAPPING_SCHEMA_KEY}.target.fields`;
|
|
12
|
+
const valueMappingTargetTypePath = `${core_1.VALUE_MAPPING_SCHEMA_KEY}.target.type`;
|
|
13
|
+
const multiplePath = 'x-component-props.multiple';
|
|
14
|
+
/**
|
|
15
|
+
* Cascader 复用 tuple adapter;字段数量由动态 ArrayItems 管理,target 则根据 multiple
|
|
16
|
+
* 和映射位置设置在运行时解析,从而让公共 value-mapping helper 不依赖 Cascader 属性。
|
|
17
|
+
*/
|
|
18
|
+
const ValueMappingGroup = (0, valueMapping_1.createValueMappingGroup)({
|
|
19
|
+
adapter: 'tuple',
|
|
20
|
+
fields: {
|
|
21
|
+
type: 'dynamic',
|
|
22
|
+
path: valueMappingFieldsPath,
|
|
23
|
+
token: 'fieldPath',
|
|
24
|
+
},
|
|
25
|
+
cardinality: { path: multiplePath },
|
|
26
|
+
target: {
|
|
27
|
+
resolve: ({ form, cardinality }) => {
|
|
28
|
+
// 多选业务值必须是对象数组,因此强制使用当前字段 object/source。
|
|
29
|
+
if (cardinality === core_1.VALUE_MAPPING_CARDINALITY_MULTIPLE) {
|
|
30
|
+
return {
|
|
31
|
+
type: core_1.VALUE_MAPPING_TARGET_OBJECT,
|
|
32
|
+
scope: core_1.VALUE_MAPPING_SCOPE_SOURCE,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
// 单选允许在当前字段对象和同级字段之间切换,默认沿用当前字段。
|
|
36
|
+
return form.getValuesIn(valueMappingTargetTypePath) ===
|
|
37
|
+
core_1.VALUE_MAPPING_TARGET_FIELDS
|
|
38
|
+
? {
|
|
39
|
+
type: core_1.VALUE_MAPPING_TARGET_FIELDS,
|
|
40
|
+
scope: core_1.VALUE_MAPPING_SCOPE_RELATIVE,
|
|
41
|
+
includeSource: false,
|
|
42
|
+
}
|
|
43
|
+
: {
|
|
44
|
+
type: core_1.VALUE_MAPPING_TARGET_OBJECT,
|
|
45
|
+
scope: core_1.VALUE_MAPPING_SCOPE_SOURCE,
|
|
46
|
+
};
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
settingsProperties: {
|
|
50
|
+
// 映射位置是组件专属的设置 UI,最终只影响 target.type;scope/includeSource 由 resolver 固定。
|
|
51
|
+
[valueMappingTargetTypePath]: {
|
|
52
|
+
type: 'string',
|
|
53
|
+
title: '{{$node.getMessage("settings.value-mapping-group.mappingPosition")}}',
|
|
54
|
+
enum: [
|
|
55
|
+
{
|
|
56
|
+
value: core_1.VALUE_MAPPING_TARGET_OBJECT,
|
|
57
|
+
label: '{{$node.getMessage("settings.value-mapping-group.currentField")}}',
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
value: core_1.VALUE_MAPPING_TARGET_FIELDS,
|
|
61
|
+
label: '{{$node.getMessage("settings.value-mapping-group.siblingFields")}}',
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
'x-decorator': 'FormItem',
|
|
65
|
+
'x-decorator-props': {
|
|
66
|
+
tooltip: '{{$node.getMessage("settings.value-mapping-group.multipleOnlyCurrent")}}',
|
|
67
|
+
},
|
|
68
|
+
'x-component': 'Radio.Group',
|
|
69
|
+
'x-component-props': {
|
|
70
|
+
optionType: 'button',
|
|
71
|
+
defaultValue: core_1.VALUE_MAPPING_TARGET_OBJECT,
|
|
72
|
+
},
|
|
73
|
+
'x-reactions': (field) => {
|
|
74
|
+
const fields = field.form.getValuesIn(valueMappingFieldsPath);
|
|
75
|
+
const multiple = field.form.getValuesIn(multiplePath);
|
|
76
|
+
// 没有字段行时不显示位置选项;multiple 开启后位置只能是当前字段。
|
|
77
|
+
field.visible = Array.isArray(fields) && fields.length > 0;
|
|
78
|
+
field.disabled = multiple === true;
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
});
|
|
9
83
|
exports.Cascader = antd_v5_1.Cascader;
|
|
84
|
+
// 将 Cascader 注册为可选中的设计器行为,并挂载专属属性面板配置。
|
|
10
85
|
exports.Cascader.Behavior = (0, core_1.createBehavior)({
|
|
11
86
|
name: 'Cascader',
|
|
12
87
|
extends: ['Field'],
|
|
13
88
|
selector: (node) => node.props['x-component'] === 'Cascader',
|
|
14
89
|
designerProps: {
|
|
15
|
-
propsSchema: (0,
|
|
90
|
+
propsSchema: (0, shared_1.createFieldSchema)(schemas_1.AllSchemas.Cascader, undefined, {
|
|
91
|
+
'value-mapping-group': ValueMappingGroup,
|
|
92
|
+
}),
|
|
16
93
|
},
|
|
17
94
|
designerLocales: locales_1.AllLocales.Cascader,
|
|
18
95
|
});
|
|
96
|
+
// 将 Cascader 注册到资源面板,拖入画布时生成默认 Field Schema。
|
|
19
97
|
exports.Cascader.Resource = (0, core_1.createResource)({
|
|
20
98
|
icon: 'CascaderSource',
|
|
21
99
|
elements: [
|
|
22
100
|
{
|
|
23
101
|
componentName: 'Field',
|
|
24
102
|
props: {
|
|
103
|
+
type: 'array',
|
|
25
104
|
title: 'Cascader',
|
|
26
105
|
'x-decorator': 'FormItem',
|
|
27
106
|
'x-component': 'Cascader',
|
|
@@ -3,47 +3,27 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.DatePicker = void 0;
|
|
4
4
|
const antd_v5_1 = require("@formily/antd-v5");
|
|
5
5
|
const core_1 = require("@formily-design/core");
|
|
6
|
-
const core_2 = require("@formily-design/core");
|
|
7
6
|
const shared_1 = require("../Field/shared");
|
|
8
7
|
const valueMapping_1 = require("../Field/valueMapping");
|
|
9
8
|
const schemas_1 = require("../../schemas");
|
|
10
9
|
const locales_1 = require("../../locales");
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
// SettingsForm 默认不展示 feedback;映射路径需要即时呈现输入校验结果。
|
|
21
|
-
feedbackLayout: 'loose',
|
|
10
|
+
const ValueMappingGroup = (0, valueMapping_1.createValueMappingGroup)({
|
|
11
|
+
adapter: 'tuple',
|
|
12
|
+
fields: {
|
|
13
|
+
type: 'fixed',
|
|
14
|
+
paths: [
|
|
15
|
+
'x-value-mapping.target.fields.0.path',
|
|
16
|
+
'x-value-mapping.target.fields.1.path',
|
|
17
|
+
],
|
|
18
|
+
tokens: ['startPath', 'endPath'],
|
|
22
19
|
},
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
20
|
+
cardinality: 'single',
|
|
21
|
+
target: {
|
|
22
|
+
type: 'fields',
|
|
23
|
+
scope: 'relative',
|
|
24
|
+
includeSource: false,
|
|
26
25
|
},
|
|
27
26
|
});
|
|
28
|
-
const ValueMappingGroup = {
|
|
29
|
-
type: 'void',
|
|
30
|
-
'x-component': 'CollapseItem',
|
|
31
|
-
'x-component-props': { defaultExpand: false },
|
|
32
|
-
// 分组只挂一个 reaction,避免协议同步与反馈校验的两个 autorun 产生竞态。
|
|
33
|
-
'x-reactions': [
|
|
34
|
-
(0, valueMapping_1.createValueMappingSettingsReaction)({
|
|
35
|
-
adapter: 'tuple',
|
|
36
|
-
targetPaths: valueMappingTargetPaths,
|
|
37
|
-
scope: 'relative',
|
|
38
|
-
submitSource: false,
|
|
39
|
-
getMessage: (error, scope) => { var _a; return (_a = scope.$node) === null || _a === void 0 ? void 0 : _a.getMessage(`settings.value-mapping-group.${error}`); },
|
|
40
|
-
}),
|
|
41
|
-
],
|
|
42
|
-
properties: {
|
|
43
|
-
[valueMappingTargetPaths[0]]: createMappingPathSchema('startPath'),
|
|
44
|
-
[valueMappingTargetPaths[1]]: createMappingPathSchema('endPath'),
|
|
45
|
-
},
|
|
46
|
-
};
|
|
47
27
|
exports.DatePicker = antd_v5_1.DatePicker;
|
|
48
28
|
exports.DatePicker.Behavior = (0, core_1.createBehavior)({
|
|
49
29
|
name: 'DatePicker',
|
|
@@ -1,45 +1,78 @@
|
|
|
1
|
-
import type { IScopeContext, SchemaReaction } from '@formily/json-schema';
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
1
|
+
import type { ISchema, IScopeContext, SchemaReaction } from '@formily/json-schema';
|
|
2
|
+
import type { Form } from '@formily/core';
|
|
3
|
+
import { VALUE_MAPPING_TARGET_FIELDS, VALUE_MAPPING_TARGET_OBJECT, VALUE_MAPPING_SCOPE_RELATIVE, VALUE_MAPPING_SCOPE_SOURCE } from '@formily-design/core';
|
|
4
|
+
import type { ValueMappingCardinality, ValueMappingTargetValidationError } from '@formily-design/core';
|
|
4
5
|
export type { ValueMappingTargetValidationError } from '@formily-design/core';
|
|
6
|
+
/** 固定字段由组件属性直接提供;动态字段由设置器中的 ArrayItems 提供。 */
|
|
7
|
+
export type ValueMappingSettingsFieldSource = {
|
|
8
|
+
type: 'fixed';
|
|
9
|
+
paths: string[];
|
|
10
|
+
tokens: string[];
|
|
11
|
+
} | {
|
|
12
|
+
type: 'dynamic';
|
|
13
|
+
path: string;
|
|
14
|
+
token: string;
|
|
15
|
+
};
|
|
16
|
+
export type ValueMappingSettingsCardinality =
|
|
17
|
+
/** 固定 cardinality 适合 RangePicker 等属性已知的组件。 */
|
|
18
|
+
ValueMappingCardinality
|
|
19
|
+
/** 动态 cardinality 从组件属性路径读取,供 Cascader.multiple 等属性联动。 */
|
|
20
|
+
| {
|
|
21
|
+
path: string;
|
|
22
|
+
};
|
|
23
|
+
/** 设置器侧只描述 target 的选择项,具体 fields 由 reaction 在运行时补全。 */
|
|
24
|
+
export type ValueMappingSettingsTarget = {
|
|
25
|
+
type: typeof VALUE_MAPPING_TARGET_FIELDS;
|
|
26
|
+
scope: typeof VALUE_MAPPING_SCOPE_RELATIVE;
|
|
27
|
+
includeSource: boolean;
|
|
28
|
+
} | {
|
|
29
|
+
type: typeof VALUE_MAPPING_TARGET_OBJECT;
|
|
30
|
+
scope: typeof VALUE_MAPPING_SCOPE_SOURCE;
|
|
31
|
+
};
|
|
32
|
+
/** 根据当前设置表单状态解析 target,使公共 helper 不需要识别具体组件。 */
|
|
33
|
+
export type ValueMappingSettingsTargetResolver = {
|
|
34
|
+
resolve(context: {
|
|
35
|
+
form: Form;
|
|
36
|
+
cardinality: ValueMappingCardinality;
|
|
37
|
+
}): ValueMappingSettingsTarget;
|
|
38
|
+
};
|
|
39
|
+
export type ValueMappingSettingsTargetSource = ValueMappingSettingsTarget | ValueMappingSettingsTargetResolver;
|
|
5
40
|
export interface ICreateValueMappingSettingsReactionOptions {
|
|
6
|
-
/**
|
|
7
|
-
* 映射运行时使用的 adapter 名称,例如 tuple。
|
|
8
|
-
*/
|
|
41
|
+
/** adapter 名称写入协议,转换实现由 designer runtime 注册。 */
|
|
9
42
|
adapter: string;
|
|
10
|
-
/**
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
scope?: typeof VALUE_MAPPING_RELATIVE_SCOPE;
|
|
18
|
-
submitSource?: boolean;
|
|
19
|
-
/**
|
|
20
|
-
* 根据校验错误码返回当前语言的提示文案。scope 会透传 Formily
|
|
21
|
-
* reaction 的作用域,因此设置器可以使用 `$node.getMessage` 读取节点语言。
|
|
22
|
-
*/
|
|
43
|
+
/** 映射字段的来源及设置器字段路径。 */
|
|
44
|
+
fields: ValueMappingSettingsFieldSource;
|
|
45
|
+
/** 固定值或组件属性驱动的 cardinality。 */
|
|
46
|
+
cardinality: ValueMappingSettingsCardinality;
|
|
47
|
+
/** 静态 target 或依赖 form/cardinality 的 target resolver。 */
|
|
48
|
+
target: ValueMappingSettingsTargetSource;
|
|
49
|
+
/** 将协议校验错误转换为当前语言的设置器文案。 */
|
|
23
50
|
getMessage: (error: ValueMappingTargetValidationError, scope: IScopeContext) => string | undefined;
|
|
24
51
|
}
|
|
52
|
+
export interface IValueMappingGroupOptions extends Omit<ICreateValueMappingSettingsReactionOptions, 'getMessage'> {
|
|
53
|
+
/** value-mapping 分组使用的 locale 命名空间。 */
|
|
54
|
+
localeKey?: string;
|
|
55
|
+
/** 由具体组件追加的配置项,例如 Cascader 的映射位置单选框。 */
|
|
56
|
+
settingsProperties?: Record<string, ISchema>;
|
|
57
|
+
}
|
|
58
|
+
export declare const validateValueMappingTargetPaths: (paths: unknown[], allowEmpty?: boolean) => ValueMappingTargetValidationError | undefined;
|
|
25
59
|
/**
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
* 空数组表示尚未启用映射;一旦任意路径有值,所有 target 都必须填写、合法且唯一。
|
|
29
|
-
* 该方法与具体组件数量无关,日期范围、省市区等配置界面均可复用。
|
|
60
|
+
* 创建统一处理协议同步、动态字段和校验反馈的设置 reaction。
|
|
61
|
+
* reaction 先读取设置状态,再决定删除协议、反馈错误或写入 canonical v1 协议。
|
|
30
62
|
*/
|
|
31
|
-
export declare const
|
|
63
|
+
export declare const createValueMappingSettingsReaction: ({ adapter, fields, cardinality, target, getMessage, }: ICreateValueMappingSettingsReactionOptions) => SchemaReaction;
|
|
32
64
|
/**
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
* 协议和反馈必须由一个 autorun 编排。若分别挂两个 x-reactions,它们对同一
|
|
36
|
-
* 次 onInput 的调度顺序不稳定:协议 reaction 规范化数字路径时会再次写值,
|
|
37
|
-
* 校验 reaction 可能拿到中间快照,导致残留错误或覆盖刚写入的配置。本 reaction
|
|
38
|
-
* 先读取一次 targetValues,再同步反馈和协议,保证二者始终对应同一组输入。
|
|
39
|
-
*
|
|
40
|
-
* target 全空时先同步清除反馈,让界面立即恢复;父级协议延迟到当前 onInput/batch
|
|
41
|
-
* 结束后的 Promise 微任务再删除。微任务执行前会重新读取最新 target:若用户已快速
|
|
42
|
-
* 重新输入则跳过删除,避免旧 cleanup 误删。按 Form 隔离的 WeakSet 会合并同一 Form
|
|
43
|
-
* 的重复 cleanup,同时不会影响其它设置 Form。
|
|
65
|
+
* 创建组件属性面板中的新 v1 value-mapping 分组。
|
|
66
|
+
* 具体组件可通过 settingsProperties 注入额外设置,但协议同步仍由公共 reaction 负责。
|
|
44
67
|
*/
|
|
45
|
-
export declare const
|
|
68
|
+
export declare const createValueMappingGroup: ({ localeKey, settingsProperties, ...options }: IValueMappingGroupOptions) => {
|
|
69
|
+
type: string;
|
|
70
|
+
'x-component': string;
|
|
71
|
+
'x-component-props': {
|
|
72
|
+
defaultExpand: boolean;
|
|
73
|
+
};
|
|
74
|
+
'x-reactions': SchemaReaction[];
|
|
75
|
+
properties: {
|
|
76
|
+
[x: string]: any;
|
|
77
|
+
};
|
|
78
|
+
};
|