@xbeeant/form-engine-designer 0.0.2 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/es/Canvas.js +42 -46
- package/dist/es/Canvas.js.map +1 -1
- package/dist/es/Designer.js +121 -98
- package/dist/es/Designer.js.map +1 -1
- package/dist/es/DesignerContext.js +86 -73
- package/dist/es/DesignerContext.js.map +1 -1
- package/dist/es/Palette.js +3 -3
- package/dist/es/Palette.js.map +1 -1
- package/dist/es/PropertyPanel.js +97 -97
- package/dist/es/PropertyPanel.js.map +1 -1
- package/dist/es/catalog.js +19 -11
- package/dist/es/catalog.js.map +1 -1
- package/dist/es/designer-context.js +110 -0
- package/dist/es/designer-context.js.map +1 -0
- package/dist/es/history.js +73 -0
- package/dist/es/history.js.map +1 -0
- package/dist/es/index.js +3 -3
- package/dist/es/property/basic-property.js +6 -0
- package/dist/es/property/basic-property.js.map +1 -1
- package/dist/es/property-panel.js +294 -0
- package/dist/es/property-panel.js.map +1 -0
- package/dist/es/resizable-panel.js +103 -0
- package/dist/es/resizable-panel.js.map +1 -0
- package/dist/es/schema-utils.js +286 -0
- package/dist/es/schema-utils.js.map +1 -0
- package/dist/es/widgets/BindEditor.js +60 -49
- package/dist/es/widgets/BindEditor.js.map +1 -1
- package/dist/es/widgets/CodeEditor.js +41 -49
- package/dist/es/widgets/CodeEditor.js.map +1 -1
- package/dist/es/widgets/DefaultEditor.js +25 -30
- package/dist/es/widgets/DefaultEditor.js.map +1 -1
- package/dist/es/widgets/DependenciesEditor.js +21 -21
- package/dist/es/widgets/DependenciesEditor.js.map +1 -1
- package/dist/es/widgets/EnumEditor.js +25 -31
- package/dist/es/widgets/EnumEditor.js.map +1 -1
- package/dist/es/widgets/ExpressionSwitch.js +32 -30
- package/dist/es/widgets/ExpressionSwitch.js.map +1 -1
- package/dist/es/widgets/ReactionsEditor.js +103 -103
- package/dist/es/widgets/ReactionsEditor.js.map +1 -1
- package/dist/es/widgets/RemoteDataEditor.js +63 -63
- package/dist/es/widgets/RemoteDataEditor.js.map +1 -1
- package/dist/es/widgets/ValidateEditor.js +49 -49
- package/dist/es/widgets/ValidateEditor.js.map +1 -1
- package/dist/es/widgets/bind-editor.js +78 -0
- package/dist/es/widgets/bind-editor.js.map +1 -0
- package/dist/es/widgets/code-editor.js +76 -0
- package/dist/es/widgets/code-editor.js.map +1 -0
- package/dist/es/widgets/default-editor.js +50 -0
- package/dist/es/widgets/default-editor.js.map +1 -0
- package/dist/es/widgets/dependencies-editor.js +36 -0
- package/dist/es/widgets/dependencies-editor.js.map +1 -0
- package/dist/es/widgets/enum-editor.js +43 -0
- package/dist/es/widgets/enum-editor.js.map +1 -0
- package/dist/es/widgets/expression-builder.js +367 -0
- package/dist/es/widgets/expression-builder.js.map +1 -0
- package/dist/es/widgets/expression-model.js +340 -0
- package/dist/es/widgets/expression-model.js.map +1 -0
- package/dist/es/widgets/expression-switch.js +49 -0
- package/dist/es/widgets/expression-switch.js.map +1 -0
- package/dist/es/widgets/index.js +13 -13
- package/dist/es/widgets/index.js.map +1 -1
- package/dist/es/widgets/options-editor.js +102 -0
- package/dist/es/widgets/options-editor.js.map +1 -0
- package/dist/es/widgets/reactions-editor.js +401 -0
- package/dist/es/widgets/reactions-editor.js.map +1 -0
- package/dist/es/widgets/reactions-model.js +107 -0
- package/dist/es/widgets/reactions-model.js.map +1 -0
- package/dist/es/widgets/remote-data-editor.js +314 -0
- package/dist/es/widgets/remote-data-editor.js.map +1 -0
- package/dist/es/widgets/use-form-data-fields.js +16 -0
- package/dist/es/widgets/use-form-data-fields.js.map +1 -0
- package/dist/es/widgets/validate-editor.js +118 -0
- package/dist/es/widgets/validate-editor.js.map +1 -0
- package/package.json +4 -5
- package/dist/es/react/src/components/FormController.js +0 -154
- package/dist/es/react/src/components/FormController.js.map +0 -1
- package/dist/es/react/src/components/NexusField.js +0 -99
- package/dist/es/react/src/components/NexusField.js.map +0 -1
- package/dist/es/react/src/components/NexusForm.js +0 -121
- package/dist/es/react/src/components/NexusForm.js.map +0 -1
- package/dist/es/react/src/components/NexusFormProvider.js +0 -19
- package/dist/es/react/src/components/NexusFormProvider.js.map +0 -1
- package/dist/es/react/src/components/NexusLayout.js +0 -49
- package/dist/es/react/src/components/NexusLayout.js.map +0 -1
- package/dist/es/react/src/components/NexusObject.js +0 -65
- package/dist/es/react/src/components/NexusObject.js.map +0 -1
- package/dist/es/react/src/contexts/FieldInheritContext.js +0 -6
- package/dist/es/react/src/contexts/FieldInheritContext.js.map +0 -1
- package/dist/es/react/src/contexts/GridContext.js +0 -6
- package/dist/es/react/src/contexts/GridContext.js.map +0 -1
- package/dist/es/react/src/contexts/LayoutConfigContext.js +0 -6
- package/dist/es/react/src/contexts/LayoutConfigContext.js.map +0 -1
- package/dist/es/react/src/contexts/NexusContext.js +0 -13
- package/dist/es/react/src/contexts/NexusContext.js.map +0 -1
- package/dist/es/react/src/hooks/useForm.js +0 -10
- package/dist/es/react/src/hooks/useForm.js.map +0 -1
- package/dist/es/react/src/utils/renderTreeNode.js +0 -18
- package/dist/es/react/src/utils/renderTreeNode.js.map +0 -1
- package/dist/es/react/src/utils/resolveColSpan.js +0 -10
- package/dist/es/react/src/utils/resolveColSpan.js.map +0 -1
- package/dist/es/schemaUtils.test.js +0 -188
- package/dist/es/schemaUtils.test.js.map +0 -1
- package/dist/es/vite-env.d.js +0 -2
- package/dist/es/vite-env.d.js.map +0 -1
- package/dist/es/widgets/expressionModel.test.js +0 -193
- package/dist/es/widgets/expressionModel.test.js.map +0 -1
- package/src/Canvas.tsx +0 -1111
- package/src/Designer.css +0 -206
- package/src/Designer.tsx +0 -254
- package/src/DesignerContext.tsx +0 -192
- package/src/Palette.tsx +0 -261
- package/src/PropertyPanel.tsx +0 -486
- package/src/ResizablePanel.tsx +0 -210
- package/src/catalog.ts +0 -526
- package/src/index.ts +0 -25
- package/src/property/basic-property.ts +0 -126
- package/src/schemaUtils.test.ts +0 -261
- package/src/schemaUtils.ts +0 -627
- package/src/types.ts +0 -38
- package/src/vite-env.d.ts +0 -1
- package/src/widgets/BindEditor.tsx +0 -105
- package/src/widgets/CodeEditor.tsx +0 -114
- package/src/widgets/DefaultEditor.tsx +0 -73
- package/src/widgets/DependenciesEditor.tsx +0 -56
- package/src/widgets/EnumEditor.tsx +0 -66
- package/src/widgets/ExpressionBuilder.tsx +0 -509
- package/src/widgets/ExpressionSwitch.tsx +0 -62
- package/src/widgets/OptionsEditor.tsx +0 -141
- package/src/widgets/ReactionsEditor.tsx +0 -532
- package/src/widgets/RemoteDataEditor.tsx +0 -382
- package/src/widgets/ValidateEditor.tsx +0 -162
- package/src/widgets/expressionModel.test.ts +0 -262
- package/src/widgets/expressionModel.ts +0 -573
- package/src/widgets/index.ts +0 -45
- package/src/widgets/reactionsModel.ts +0 -190
- package/src/widgets/useFormDataFields.ts +0 -21
- /package/dist/es/{form-engine-designer.css → index.css} +0 -0
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
import { jsxs as c, jsx as i, Fragment as T } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
3
|
-
import { useState as
|
|
2
|
+
import { Button as b, Select as w, Switch as B, Input as S } from "antd";
|
|
3
|
+
import { useState as I, useRef as v, useEffect as _ } from "react";
|
|
4
4
|
import { ExpressionBuilder as k } from "./ExpressionBuilder.js";
|
|
5
|
-
import { toManualReactions as E, reactionToCard as z, genId as
|
|
5
|
+
import { toManualReactions as E, reactionToCard as z, genId as A, cardToReaction as O, STATE_KEY_OPTIONS as P, PROPS_KEY as R, BOOLEAN_STATE_KEYS as V, parsePatchValue as $ } from "./reactionsModel.js";
|
|
6
6
|
import { useFormDataFields as W, useFormDataFieldOptions as j } from "./useFormDataFields.js";
|
|
7
7
|
function D(t) {
|
|
8
8
|
return t.split(",").map((e) => e.trim()).filter(Boolean).length;
|
|
9
9
|
}
|
|
10
|
-
function
|
|
10
|
+
function F({
|
|
11
11
|
fields: t,
|
|
12
12
|
fieldOptions: e,
|
|
13
13
|
depsCount: l,
|
|
14
|
-
onInsert:
|
|
14
|
+
onInsert: r
|
|
15
15
|
}) {
|
|
16
16
|
const d = [
|
|
17
|
-
...(e && e.length > 0 ? e : t.map((
|
|
17
|
+
...(e && e.length > 0 ? e : t.map((n) => ({ value: n, label: n }))).map((n) => ({ value: `formData.${n.value}`, label: n.label })),
|
|
18
18
|
{ value: "$self.value", label: "$self.value" },
|
|
19
|
-
...l > 0 ? Array.from({ length: l }, (
|
|
20
|
-
value: `$deps[${
|
|
21
|
-
label: `$deps[${
|
|
19
|
+
...l > 0 ? Array.from({ length: l }, (n, h) => ({
|
|
20
|
+
value: `$deps[${h}]`,
|
|
21
|
+
label: `$deps[${h}]`
|
|
22
22
|
})) : [],
|
|
23
23
|
{ value: "$index", label: "$index" },
|
|
24
24
|
{ value: "rootValue", label: "rootValue" }
|
|
@@ -29,32 +29,32 @@ function K({
|
|
|
29
29
|
size: "small",
|
|
30
30
|
placeholder: "插入变量",
|
|
31
31
|
value: void 0,
|
|
32
|
-
onChange: (
|
|
33
|
-
|
|
32
|
+
onChange: (n) => {
|
|
33
|
+
n && r(n);
|
|
34
34
|
},
|
|
35
35
|
options: d,
|
|
36
36
|
style: { width: 104 }
|
|
37
37
|
}
|
|
38
38
|
);
|
|
39
39
|
}
|
|
40
|
-
function
|
|
40
|
+
function K({
|
|
41
41
|
rowKey: t,
|
|
42
42
|
value: e,
|
|
43
43
|
onChange: l,
|
|
44
|
-
fields:
|
|
45
|
-
fieldOptions:
|
|
44
|
+
fields: r,
|
|
45
|
+
fieldOptions: f,
|
|
46
46
|
depsCount: d
|
|
47
47
|
}) {
|
|
48
|
-
const
|
|
49
|
-
if (
|
|
50
|
-
return
|
|
48
|
+
const n = V.has(t), h = typeof e == "string" && e.trim().startsWith("{{");
|
|
49
|
+
if (n)
|
|
50
|
+
return h ? /* @__PURE__ */ c("div", { style: { display: "flex", flexDirection: "column", gap: 4 }, children: [
|
|
51
51
|
/* @__PURE__ */ i(
|
|
52
52
|
k,
|
|
53
53
|
{
|
|
54
54
|
value: e,
|
|
55
|
-
onChange: (
|
|
56
|
-
fields:
|
|
57
|
-
fieldOptions:
|
|
55
|
+
onChange: (m) => l(m),
|
|
56
|
+
fields: r,
|
|
57
|
+
fieldOptions: f,
|
|
58
58
|
depsCount: d,
|
|
59
59
|
emitEmpty: "empty"
|
|
60
60
|
}
|
|
@@ -70,17 +70,17 @@ function N({
|
|
|
70
70
|
}
|
|
71
71
|
) })
|
|
72
72
|
] }) : /* @__PURE__ */ c("div", { style: { display: "flex", gap: 4, alignItems: "center" }, children: [
|
|
73
|
-
/* @__PURE__ */ i(B, { checked: !!e, onChange: (
|
|
73
|
+
/* @__PURE__ */ i(B, { checked: !!e, onChange: (m) => l(m) }),
|
|
74
74
|
/* @__PURE__ */ i(b, { size: "small", onClick: () => l("{{ }}"), children: "表达式" })
|
|
75
75
|
] });
|
|
76
|
-
const o = (
|
|
76
|
+
const o = (m) => {
|
|
77
77
|
const y = String(e ?? "").trim();
|
|
78
78
|
if (typeof e == "string" && e.trim().startsWith("{{") && e.trim().endsWith("}}")) {
|
|
79
|
-
const
|
|
80
|
-
l(`{{ ${
|
|
79
|
+
const a = e.trim().slice(2, -2).trim();
|
|
80
|
+
l(`{{ ${a} ${m} }}`);
|
|
81
81
|
return;
|
|
82
82
|
}
|
|
83
|
-
l($(y ? `${y} ${
|
|
83
|
+
l($(y ? `${y} ${m}` : m));
|
|
84
84
|
};
|
|
85
85
|
return /* @__PURE__ */ c("div", { style: { display: "flex", gap: 4, alignItems: "center", flex: 1 }, children: [
|
|
86
86
|
/* @__PURE__ */ i(
|
|
@@ -88,41 +88,41 @@ function N({
|
|
|
88
88
|
{
|
|
89
89
|
size: "small",
|
|
90
90
|
value: String(e ?? ""),
|
|
91
|
-
onChange: (
|
|
91
|
+
onChange: (m) => l($(m.target.value)),
|
|
92
92
|
style: { flex: 1 }
|
|
93
93
|
}
|
|
94
94
|
),
|
|
95
95
|
/* @__PURE__ */ i(
|
|
96
|
-
|
|
96
|
+
F,
|
|
97
97
|
{
|
|
98
|
-
fields:
|
|
99
|
-
fieldOptions:
|
|
98
|
+
fields: r,
|
|
99
|
+
fieldOptions: f,
|
|
100
100
|
depsCount: d,
|
|
101
101
|
onInsert: o
|
|
102
102
|
}
|
|
103
103
|
)
|
|
104
104
|
] });
|
|
105
105
|
}
|
|
106
|
-
function
|
|
107
|
-
const [
|
|
106
|
+
function N({ value: t, onChange: e }) {
|
|
107
|
+
const [l, r] = I(
|
|
108
108
|
() => E(t).map(z)
|
|
109
|
-
),
|
|
110
|
-
|
|
111
|
-
|
|
109
|
+
), f = v(t), d = v(t);
|
|
110
|
+
_(() => {
|
|
111
|
+
f.current !== t && (f.current = t, t !== d.current && r(E(t).map(z)));
|
|
112
112
|
}, [t]);
|
|
113
|
-
const
|
|
114
|
-
|
|
115
|
-
const
|
|
116
|
-
|
|
117
|
-
},
|
|
118
|
-
|
|
119
|
-
},
|
|
120
|
-
|
|
121
|
-
},
|
|
122
|
-
|
|
123
|
-
...
|
|
113
|
+
const n = (a) => {
|
|
114
|
+
r(a);
|
|
115
|
+
const u = a.map(O).filter((p) => p.dependencies.length > 0 || p.fulfill || p.otherwise), s = u.length > 0 ? u : [];
|
|
116
|
+
d.current = s, e(s);
|
|
117
|
+
}, h = (a, u) => {
|
|
118
|
+
n(l.map((s, p) => p === a ? { ...s, ...u } : s));
|
|
119
|
+
}, o = (a) => {
|
|
120
|
+
n(l.filter((u, s) => s !== a));
|
|
121
|
+
}, m = () => {
|
|
122
|
+
n([
|
|
123
|
+
...l,
|
|
124
124
|
{
|
|
125
|
-
id:
|
|
125
|
+
id: A(),
|
|
126
126
|
deps: "",
|
|
127
127
|
when: "",
|
|
128
128
|
fulfillEnabled: !0,
|
|
@@ -133,11 +133,11 @@ function Y({ value: t, onChange: e, title: l }) {
|
|
|
133
133
|
otherwiseSchema: ""
|
|
134
134
|
}
|
|
135
135
|
]);
|
|
136
|
-
},
|
|
137
|
-
(
|
|
136
|
+
}, y = Array.isArray(t) ? t.filter(
|
|
137
|
+
(a) => !!a && a._autoExpr === !0
|
|
138
138
|
).length : 0;
|
|
139
|
-
return /* @__PURE__ */ c(
|
|
140
|
-
|
|
139
|
+
return /* @__PURE__ */ c("div", { style: { width: "100%" }, children: [
|
|
140
|
+
y > 0 && /* @__PURE__ */ c(
|
|
141
141
|
"div",
|
|
142
142
|
{
|
|
143
143
|
style: {
|
|
@@ -151,32 +151,32 @@ function Y({ value: t, onChange: e, title: l }) {
|
|
|
151
151
|
},
|
|
152
152
|
children: [
|
|
153
153
|
"另有 ",
|
|
154
|
-
|
|
154
|
+
y,
|
|
155
155
|
" 条由 required / hidden / disabled / readOnly 表达式自动生成的联动(_autoExpr),请通过「通用属性 / 校验配置」编辑。"
|
|
156
156
|
]
|
|
157
157
|
}
|
|
158
158
|
),
|
|
159
|
-
|
|
160
|
-
|
|
159
|
+
l.map((a, u) => /* @__PURE__ */ i(
|
|
160
|
+
Y,
|
|
161
161
|
{
|
|
162
|
-
card:
|
|
163
|
-
index:
|
|
164
|
-
onChange:
|
|
165
|
-
onRemove:
|
|
162
|
+
card: a,
|
|
163
|
+
index: u,
|
|
164
|
+
onChange: h,
|
|
165
|
+
onRemove: o
|
|
166
166
|
},
|
|
167
|
-
|
|
167
|
+
a.id
|
|
168
168
|
)),
|
|
169
|
-
/* @__PURE__ */ i(b, { size: "small", type: "dashed", block: !0, onClick:
|
|
169
|
+
/* @__PURE__ */ i(b, { size: "small", type: "dashed", block: !0, onClick: m, children: "+ 添加联动规则" }),
|
|
170
170
|
/* @__PURE__ */ i("div", { style: { fontSize: 11, color: "#999", marginTop: 4 }, children: "依赖字段值变化时触发本规则。可用变量:$deps(按 dependencies 顺序)、$self.value、formData。满足 when(可选)执行 fulfill,否则执行 otherwise。" })
|
|
171
171
|
] });
|
|
172
172
|
}
|
|
173
|
-
function
|
|
173
|
+
function Y({
|
|
174
174
|
card: t,
|
|
175
175
|
index: e,
|
|
176
176
|
onChange: l,
|
|
177
|
-
onRemove:
|
|
177
|
+
onRemove: r
|
|
178
178
|
}) {
|
|
179
|
-
const
|
|
179
|
+
const f = W(), d = j(), n = D(t.deps), h = t.deps.split(",").map((o) => o.trim()).filter(Boolean);
|
|
180
180
|
return /* @__PURE__ */ c(
|
|
181
181
|
"div",
|
|
182
182
|
{
|
|
@@ -202,7 +202,7 @@ function q({
|
|
|
202
202
|
"联动 ",
|
|
203
203
|
e + 1
|
|
204
204
|
] }),
|
|
205
|
-
/* @__PURE__ */ i(b, { size: "small", danger: !0, onClick: () =>
|
|
205
|
+
/* @__PURE__ */ i(b, { size: "small", danger: !0, onClick: () => r(e), children: "删除" })
|
|
206
206
|
]
|
|
207
207
|
}
|
|
208
208
|
),
|
|
@@ -213,7 +213,7 @@ function q({
|
|
|
213
213
|
{
|
|
214
214
|
size: "small",
|
|
215
215
|
mode: "tags",
|
|
216
|
-
value:
|
|
216
|
+
value: h,
|
|
217
217
|
onChange: (o) => l(e, { deps: o.join(", ") }),
|
|
218
218
|
options: d,
|
|
219
219
|
placeholder: "选择或输入依赖字段",
|
|
@@ -228,9 +228,9 @@ function q({
|
|
|
228
228
|
{
|
|
229
229
|
value: t.when,
|
|
230
230
|
onChange: (o) => l(e, { when: o }),
|
|
231
|
-
fields:
|
|
231
|
+
fields: f,
|
|
232
232
|
fieldOptions: d,
|
|
233
|
-
depsCount:
|
|
233
|
+
depsCount: n,
|
|
234
234
|
emitEmpty: "empty",
|
|
235
235
|
placeholder: "{{ $deps[0] === true }}"
|
|
236
236
|
}
|
|
@@ -243,9 +243,9 @@ function q({
|
|
|
243
243
|
enabled: t.fulfillEnabled,
|
|
244
244
|
rows: t.fulfillRows,
|
|
245
245
|
schemaText: t.fulfillSchema,
|
|
246
|
-
fields:
|
|
246
|
+
fields: f,
|
|
247
247
|
fieldOptions: d,
|
|
248
|
-
depsCount:
|
|
248
|
+
depsCount: n,
|
|
249
249
|
onToggle: (o) => l(e, { fulfillEnabled: o }),
|
|
250
250
|
onRows: (o) => l(e, { fulfillRows: o }),
|
|
251
251
|
onSchema: (o) => l(e, { fulfillSchema: o })
|
|
@@ -258,9 +258,9 @@ function q({
|
|
|
258
258
|
enabled: t.otherwiseEnabled,
|
|
259
259
|
rows: t.otherwiseRows,
|
|
260
260
|
schemaText: t.otherwiseSchema,
|
|
261
|
-
fields:
|
|
261
|
+
fields: f,
|
|
262
262
|
fieldOptions: d,
|
|
263
|
-
depsCount:
|
|
263
|
+
depsCount: n,
|
|
264
264
|
onToggle: (o) => l(e, { otherwiseEnabled: o }),
|
|
265
265
|
onRows: (o) => l(e, { otherwiseRows: o }),
|
|
266
266
|
onSchema: (o) => l(e, { otherwiseSchema: o })
|
|
@@ -274,20 +274,20 @@ function x({
|
|
|
274
274
|
title: t,
|
|
275
275
|
enabled: e,
|
|
276
276
|
rows: l,
|
|
277
|
-
schemaText:
|
|
278
|
-
fields:
|
|
277
|
+
schemaText: r,
|
|
278
|
+
fields: f,
|
|
279
279
|
fieldOptions: d,
|
|
280
|
-
depsCount:
|
|
281
|
-
onToggle:
|
|
280
|
+
depsCount: n,
|
|
281
|
+
onToggle: h,
|
|
282
282
|
onRows: o,
|
|
283
|
-
onSchema:
|
|
283
|
+
onSchema: m
|
|
284
284
|
}) {
|
|
285
|
-
const y = (
|
|
286
|
-
o(l.map((
|
|
287
|
-
},
|
|
285
|
+
const y = (s, p) => {
|
|
286
|
+
o(l.map((g, C) => C === s ? { ...g, ...p } : g));
|
|
287
|
+
}, a = () => {
|
|
288
288
|
o([...l, { key: "required", value: !0 }]);
|
|
289
|
-
},
|
|
290
|
-
o(l.filter((
|
|
289
|
+
}, u = (s) => {
|
|
290
|
+
o(l.filter((p, g) => g !== s));
|
|
291
291
|
};
|
|
292
292
|
return /* @__PURE__ */ c("div", { style: { marginBottom: 6 }, children: [
|
|
293
293
|
/* @__PURE__ */ c(
|
|
@@ -301,12 +301,12 @@ function x({
|
|
|
301
301
|
},
|
|
302
302
|
children: [
|
|
303
303
|
/* @__PURE__ */ i("span", { style: { fontSize: 11, color: "#666" }, children: t }),
|
|
304
|
-
/* @__PURE__ */ i(B, { size: "small", checked: e, onChange: (
|
|
304
|
+
/* @__PURE__ */ i(B, { size: "small", checked: e, onChange: (s) => h(s) })
|
|
305
305
|
]
|
|
306
306
|
}
|
|
307
307
|
),
|
|
308
308
|
e && /* @__PURE__ */ c(T, { children: [
|
|
309
|
-
l.map((
|
|
309
|
+
l.map((s, p) => /* @__PURE__ */ c(
|
|
310
310
|
"div",
|
|
311
311
|
{
|
|
312
312
|
style: {
|
|
@@ -317,27 +317,27 @@ function x({
|
|
|
317
317
|
},
|
|
318
318
|
children: [
|
|
319
319
|
/* @__PURE__ */ i(
|
|
320
|
-
|
|
320
|
+
q,
|
|
321
321
|
{
|
|
322
|
-
row:
|
|
323
|
-
onChange: (
|
|
322
|
+
row: s,
|
|
323
|
+
onChange: (g) => y(p, { key: g })
|
|
324
324
|
}
|
|
325
325
|
),
|
|
326
326
|
/* @__PURE__ */ i("div", { style: { flex: 1 }, children: /* @__PURE__ */ i(
|
|
327
|
-
|
|
327
|
+
K,
|
|
328
328
|
{
|
|
329
|
-
rowKey:
|
|
330
|
-
value:
|
|
331
|
-
onChange: (
|
|
332
|
-
fields:
|
|
329
|
+
rowKey: s.key,
|
|
330
|
+
value: s.value,
|
|
331
|
+
onChange: (g) => y(p, { value: g }),
|
|
332
|
+
fields: f,
|
|
333
333
|
fieldOptions: d,
|
|
334
|
-
depsCount:
|
|
334
|
+
depsCount: n
|
|
335
335
|
}
|
|
336
336
|
) }),
|
|
337
|
-
/* @__PURE__ */ i(b, { size: "small", onClick: () =>
|
|
337
|
+
/* @__PURE__ */ i(b, { size: "small", onClick: () => u(p), children: "×" })
|
|
338
338
|
]
|
|
339
339
|
},
|
|
340
|
-
`${
|
|
340
|
+
`${p}-${s.key}`
|
|
341
341
|
)),
|
|
342
342
|
/* @__PURE__ */ i(
|
|
343
343
|
b,
|
|
@@ -345,7 +345,7 @@ function x({
|
|
|
345
345
|
size: "small",
|
|
346
346
|
block: !0,
|
|
347
347
|
style: { marginBottom: 4 },
|
|
348
|
-
onClick:
|
|
348
|
+
onClick: a,
|
|
349
349
|
children: "+ 添加状态项"
|
|
350
350
|
}
|
|
351
351
|
),
|
|
@@ -358,14 +358,14 @@ function x({
|
|
|
358
358
|
placeholder: `{
|
|
359
359
|
"props.options": [...]
|
|
360
360
|
}`,
|
|
361
|
-
value:
|
|
362
|
-
onChange: (
|
|
361
|
+
value: r,
|
|
362
|
+
onChange: (s) => m(s.target.value)
|
|
363
363
|
}
|
|
364
364
|
)
|
|
365
365
|
] })
|
|
366
366
|
] });
|
|
367
367
|
}
|
|
368
|
-
function
|
|
368
|
+
function q({
|
|
369
369
|
row: t,
|
|
370
370
|
onChange: e
|
|
371
371
|
}) {
|
|
@@ -376,8 +376,8 @@ function J({
|
|
|
376
376
|
{
|
|
377
377
|
size: "small",
|
|
378
378
|
value: l ? R : t.key,
|
|
379
|
-
options:
|
|
380
|
-
onChange: (
|
|
379
|
+
options: P,
|
|
380
|
+
onChange: (r) => e(r === R ? "props." : r),
|
|
381
381
|
style: { width: 132 }
|
|
382
382
|
}
|
|
383
383
|
),
|
|
@@ -387,15 +387,15 @@ function J({
|
|
|
387
387
|
size: "small",
|
|
388
388
|
placeholder: "如 options",
|
|
389
389
|
value: t.key.slice(6),
|
|
390
|
-
onChange: (
|
|
390
|
+
onChange: (r) => e(`props.${r.target.value}`),
|
|
391
391
|
style: { width: 96 }
|
|
392
392
|
}
|
|
393
393
|
)
|
|
394
394
|
] });
|
|
395
395
|
}
|
|
396
|
-
const
|
|
396
|
+
const U = N;
|
|
397
397
|
export {
|
|
398
|
-
|
|
399
|
-
|
|
398
|
+
N as ReactionsEditor,
|
|
399
|
+
U as reactionsEditorWidget
|
|
400
400
|
};
|
|
401
401
|
//# sourceMappingURL=ReactionsEditor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReactionsEditor.js","sources":["../../../src/widgets/ReactionsEditor.tsx"],"sourcesContent":["// ============================================================================\n// ReactionsEditor — 可视化编辑 reactions 联动规则\n// 对应 schema 节点的 reactions 数组(Reaction 协议,见 core/types/schema.ts):\n// { dependencies, when?, fulfill?: { state?, schema? }, otherwise?: { state?, schema? } }\n// - _autoExpr 自动生成的 reaction(来自 required/hidden/disabled/readOnly 表达式)\n// 不可在此编辑(解析时会自动重建),仅展示数量提示\n// - 纯数据转换在 ./reactionsModel 中(可单测)\n// ============================================================================\n\nimport type { WidgetProps } from '@xbeeant/form-engine-ui';\nimport { Button, Form, Input, Select, Switch } from 'antd';\nimport { useEffect, useRef, useState } from 'react';\nimport { ExpressionBuilder } from './ExpressionBuilder';\nimport {\n BOOLEAN_STATE_KEYS,\n type Card,\n cardToReaction,\n genId,\n type PatchRow,\n PROPS_KEY,\n parsePatchValue,\n reactionToCard,\n STATE_KEY_OPTIONS,\n toManualReactions,\n} from './reactionsModel';\nimport {\n useFormDataFieldOptions,\n useFormDataFields,\n} from './useFormDataFields';\n\nfunction depsCountOf(deps: string): number {\n return deps\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean).length;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// InsertVariableSelect — 向文本中追加一个变量表达式(用于值型补丁)\n// ────────────────────────────────────────────────────────────────────────────\n\nfunction InsertVariableSelect({\n fields,\n fieldOptions,\n depsCount,\n onInsert,\n}: {\n fields: string[];\n fieldOptions?: Array<{ value: string; label: string }>;\n depsCount: number;\n onInsert: (text: string) => void;\n}) {\n const base =\n fieldOptions && fieldOptions.length > 0\n ? fieldOptions\n : fields.map((f) => ({ value: f, label: f }));\n const options = [\n ...base.map((o) => ({ value: `formData.${o.value}`, label: o.label })),\n { value: '$self.value', label: '$self.value' },\n ...(depsCount > 0\n ? Array.from({ length: depsCount }, (_, i) => ({\n value: `$deps[${i}]`,\n label: `$deps[${i}]`,\n }))\n : []),\n { value: '$index', label: '$index' },\n { value: 'rootValue', label: 'rootValue' },\n ];\n return (\n <Select\n size='small'\n placeholder='插入变量'\n value={undefined}\n onChange={(v) => {\n if (v) {\n onInsert(v as string);\n }\n }}\n options={options}\n style={{ width: 104 }}\n />\n );\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// PatchValueInput — 单条状态补丁的值编辑器\n// 布尔型状态 key:静态 Switch ⇄ 表达式 Input;其余 key:文本 Input\n// ────────────────────────────────────────────────────────────────────────────\n\nfunction PatchValueInput({\n rowKey,\n value,\n onChange,\n fields,\n fieldOptions,\n depsCount,\n}: {\n rowKey: string;\n value: unknown;\n onChange: (v: unknown) => void;\n fields: string[];\n fieldOptions?: Array<{ value: string; label: string }>;\n depsCount: number;\n}) {\n const booleanish = BOOLEAN_STATE_KEYS.has(rowKey);\n const isExpr = typeof value === 'string' && value.trim().startsWith('{{');\n\n if (booleanish) {\n if (isExpr) {\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4 }}>\n <ExpressionBuilder\n value={value as string}\n onChange={(s) => onChange(s)}\n fields={fields}\n fieldOptions={fieldOptions}\n depsCount={depsCount}\n emitEmpty='empty'\n />\n <div>\n <Button\n size='small'\n type='text'\n onClick={() => onChange(false)}\n style={{ fontSize: 11, padding: '0 4px', height: 'auto' }}\n >\n 改为静态\n </Button>\n </div>\n </div>\n );\n }\n return (\n <div style={{ display: 'flex', gap: 4, alignItems: 'center' }}>\n <Switch checked={!!value} onChange={(v) => onChange(v)} />\n <Button size='small' onClick={() => onChange('{{ }}')}>\n 表达式\n </Button>\n </div>\n );\n }\n\n const insertVariable = (v: string) => {\n const trimmed = String(value ?? '').trim();\n if (\n typeof value === 'string' &&\n value.trim().startsWith('{{') &&\n value.trim().endsWith('}}')\n ) {\n const inner = value.trim().slice(2, -2).trim();\n onChange(`{{ ${inner} ${v} }}`);\n return;\n }\n onChange(parsePatchValue(trimmed ? `${trimmed} ${v}` : v));\n };\n\n return (\n <div style={{ display: 'flex', gap: 4, alignItems: 'center', flex: 1 }}>\n <Input\n size='small'\n value={String(value ?? '')}\n onChange={(e) => onChange(parsePatchValue(e.target.value))}\n style={{ flex: 1 }}\n />\n <InsertVariableSelect\n fields={fields}\n fieldOptions={fieldOptions}\n depsCount={depsCount}\n onInsert={insertVariable}\n />\n </div>\n );\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// ReactionsEditor — 主组件(本地工作副本 + 每次编辑提交,避免受控重置)\n// ────────────────────────────────────────────────────────────────────────────\n\nexport function ReactionsEditor({ value, onChange, title }: WidgetProps) {\n const [cards, setCards] = useState<Card[]>(() =>\n toManualReactions(value).map(reactionToCard),\n );\n const prevValueRef = useRef(value);\n // 记录最近一次由本组件 emit 出去的值:自身 onChange 引发的 value 回传\n // (引擎值更新 → value prop 更新)不应触发「外部 value 变化重置」,\n // 否则点击「添加联动规则」后,undefined → [] 的值变化会立刻清空本地卡片。\n const lastEmittedRef = useRef<unknown>(value);\n\n // 外部 value 变化(切换节点 / 属性表单重新初始化)时重置工作副本\n useEffect(() => {\n if (prevValueRef.current !== value) {\n prevValueRef.current = value;\n if (value !== lastEmittedRef.current) {\n setCards(toManualReactions(value).map(reactionToCard));\n }\n }\n }, [value]);\n\n const commit = (next: Card[]) => {\n setCards(next);\n const reactions = next\n .map(cardToReaction)\n .filter((r) => r.dependencies.length > 0 || r.fulfill || r.otherwise);\n const emitted = reactions.length > 0 ? reactions : [];\n lastEmittedRef.current = emitted;\n onChange(emitted);\n };\n\n const updateCard = (index: number, patch: Partial<Card>) => {\n commit(cards.map((c, i) => (i === index ? { ...c, ...patch } : c)));\n };\n\n const removeCard = (index: number) => {\n commit(cards.filter((_, i) => i !== index));\n };\n\n const addCard = () => {\n commit([\n ...cards,\n {\n id: genId(),\n deps: '',\n when: '',\n fulfillEnabled: true,\n fulfillRows: [],\n fulfillSchema: '',\n otherwiseEnabled: false,\n otherwiseRows: [],\n otherwiseSchema: '',\n },\n ]);\n };\n\n const autoExprCount = Array.isArray(value)\n ? value.filter(\n (r) => !!r && (r as { _autoExpr?: boolean })._autoExpr === true,\n ).length\n : 0;\n\n return (\n <Form.Item layout={'vertical'} label={title} style={{ width: '100%' }}>\n {autoExprCount > 0 && (\n <div\n style={{\n fontSize: 11,\n color: '#999',\n marginBottom: 8,\n background: '#fafafa',\n border: '1px solid #f0f0f0',\n borderRadius: 6,\n padding: '4px 8px',\n }}\n >\n 另有 {autoExprCount} 条由 required / hidden / disabled / readOnly\n 表达式自动生成的联动(_autoExpr),请通过「通用属性 / 校验配置」编辑。\n </div>\n )}\n\n {cards.map((card, cardIndex) => (\n <ReactionCard\n key={card.id}\n card={card}\n index={cardIndex}\n onChange={updateCard}\n onRemove={removeCard}\n />\n ))}\n\n <Button size='small' type='dashed' block onClick={addCard}>\n + 添加联动规则\n </Button>\n <div style={{ fontSize: 11, color: '#999', marginTop: 4 }}>\n 依赖字段值变化时触发本规则。可用变量:$deps(按 dependencies\n 顺序)、$self.value、formData。满足 when(可选)执行 fulfill,否则执行\n otherwise。\n </div>\n </Form.Item>\n );\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// ReactionCard — 单条联动规则\n// ────────────────────────────────────────────────────────────────────────────\n\nfunction ReactionCard({\n card,\n index,\n onChange,\n onRemove,\n}: {\n card: Card;\n index: number;\n onChange: (index: number, patch: Partial<Card>) => void;\n onRemove: (index: number) => void;\n}) {\n const fields = useFormDataFields();\n const fieldOptions = useFormDataFieldOptions();\n const depsCount = depsCountOf(card.deps);\n const depsTags = card.deps\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n\n return (\n <div\n style={{\n border: '1px solid #e8e8e8',\n borderRadius: 8,\n padding: 8,\n marginBottom: 8,\n background: '#fff',\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 6,\n }}\n >\n <span style={{ fontSize: 12, fontWeight: 600, color: '#333' }}>\n 联动 {index + 1}\n </span>\n <Button size='small' danger onClick={() => onRemove(index)}>\n 删除\n </Button>\n </div>\n\n <div style={{ marginBottom: 6 }}>\n <div style={{ fontSize: 11, color: '#666', marginBottom: 2 }}>\n 依赖字段(dependencies)\n </div>\n <Select\n size='small'\n mode='tags'\n value={depsTags}\n onChange={(tags) => onChange(index, { deps: tags.join(', ') })}\n options={fieldOptions}\n placeholder='选择或输入依赖字段'\n style={{ width: '100%' }}\n />\n </div>\n\n <div style={{ marginBottom: 6 }}>\n <div style={{ fontSize: 11, color: '#666', marginBottom: 2 }}>\n 条件(when,可选)\n </div>\n <ExpressionBuilder\n value={card.when}\n onChange={(s) => onChange(index, { when: s })}\n fields={fields}\n fieldOptions={fieldOptions}\n depsCount={depsCount}\n emitEmpty='empty'\n placeholder='{{ $deps[0] === true }}'\n />\n </div>\n\n <BranchEditor\n title='满足时(fulfill)'\n enabled={card.fulfillEnabled}\n rows={card.fulfillRows}\n schemaText={card.fulfillSchema}\n fields={fields}\n fieldOptions={fieldOptions}\n depsCount={depsCount}\n onToggle={(v) => onChange(index, { fulfillEnabled: v })}\n onRows={(rows) => onChange(index, { fulfillRows: rows })}\n onSchema={(t) => onChange(index, { fulfillSchema: t })}\n />\n\n <BranchEditor\n title='不满足时(otherwise)'\n enabled={card.otherwiseEnabled}\n rows={card.otherwiseRows}\n schemaText={card.otherwiseSchema}\n fields={fields}\n fieldOptions={fieldOptions}\n depsCount={depsCount}\n onToggle={(v) => onChange(index, { otherwiseEnabled: v })}\n onRows={(rows) => onChange(index, { otherwiseRows: rows })}\n onSchema={(t) => onChange(index, { otherwiseSchema: t })}\n />\n </div>\n );\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// BranchEditor — fulfill / otherwise 分支:状态补丁 + 属性补丁\n// ────────────────────────────────────────────────────────────────────────────\n\nfunction BranchEditor({\n title,\n enabled,\n rows,\n schemaText,\n fields,\n fieldOptions,\n depsCount,\n onToggle,\n onRows,\n onSchema,\n}: {\n title: string;\n enabled: boolean;\n rows: PatchRow[];\n schemaText: string;\n fields: string[];\n fieldOptions?: Array<{ value: string; label: string }>;\n depsCount: number;\n onToggle: (enabled: boolean) => void;\n onRows: (rows: PatchRow[]) => void;\n onSchema: (text: string) => void;\n}) {\n const updateRow = (idx: number, patch: Partial<PatchRow>) => {\n onRows(rows.map((r, i) => (i === idx ? { ...r, ...patch } : r)));\n };\n\n const addRow = () => {\n onRows([...rows, { key: 'required', value: true }]);\n };\n\n const removeRow = (idx: number) => {\n onRows(rows.filter((_, i) => i !== idx));\n };\n\n return (\n <div style={{ marginBottom: 6 }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 4,\n }}\n >\n <span style={{ fontSize: 11, color: '#666' }}>{title}</span>\n <Switch size='small' checked={enabled} onChange={(v) => onToggle(v)} />\n </div>\n\n {enabled && (\n <>\n {rows.map((row, idx) => (\n <div\n key={`${idx}-${row.key}`}\n style={{\n display: 'flex',\n gap: 4,\n alignItems: 'center',\n marginBottom: 4,\n }}\n >\n <PatchKeySelect\n row={row}\n onChange={(key) => updateRow(idx, { key })}\n />\n <div style={{ flex: 1 }}>\n <PatchValueInput\n rowKey={row.key}\n value={row.value}\n onChange={(v) => updateRow(idx, { value: v })}\n fields={fields}\n fieldOptions={fieldOptions}\n depsCount={depsCount}\n />\n </div>\n <Button size='small' onClick={() => removeRow(idx)}>\n ×\n </Button>\n </div>\n ))}\n <Button\n size='small'\n block\n style={{ marginBottom: 4 }}\n onClick={addRow}\n >\n + 添加状态项\n </Button>\n\n <div style={{ fontSize: 11, color: '#666', marginBottom: 2 }}>\n 属性补丁(schema,JSON,可选)\n </div>\n <Input.TextArea\n size='small'\n rows={2}\n placeholder={'{\\n \"props.options\": [...]\\n}'}\n value={schemaText}\n onChange={(e) => onSchema(e.target.value)}\n />\n </>\n )}\n </div>\n );\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// PatchKeySelect — 状态补丁的 key 选择器(含 props.* 自定义路径)\n// ────────────────────────────────────────────────────────────────────────────\n\nfunction PatchKeySelect({\n row,\n onChange,\n}: {\n row: PatchRow;\n onChange: (key: string) => void;\n}) {\n const isProps = row.key.startsWith('props.');\n return (\n <div style={{ display: 'flex', gap: 4 }}>\n <Select\n size='small'\n value={isProps ? PROPS_KEY : row.key}\n options={STATE_KEY_OPTIONS}\n onChange={(k) => onChange(k === PROPS_KEY ? 'props.' : k)}\n style={{ width: 132 }}\n />\n {isProps && (\n <Input\n size='small'\n placeholder='如 options'\n value={row.key.slice('props.'.length)}\n onChange={(e) => onChange(`props.${e.target.value}`)}\n style={{ width: 96 }}\n />\n )}\n </div>\n );\n}\n\nexport const reactionsEditorWidget = ReactionsEditor;\n"],"names":["depsCountOf","deps","s","InsertVariableSelect","fields","fieldOptions","depsCount","onInsert","options","f","o","_","i","jsx","Select","v","PatchValueInput","rowKey","value","onChange","booleanish","BOOLEAN_STATE_KEYS","isExpr","jsxs","ExpressionBuilder","Button","Switch","insertVariable","trimmed","inner","parsePatchValue","Input","e","ReactionsEditor","title","cards","setCards","useState","toManualReactions","reactionToCard","prevValueRef","useRef","lastEmittedRef","useEffect","commit","next","reactions","cardToReaction","r","emitted","updateCard","index","patch","c","removeCard","addCard","genId","autoExprCount","Form","card","cardIndex","ReactionCard","onRemove","useFormDataFields","useFormDataFieldOptions","depsTags","tags","BranchEditor","rows","t","enabled","schemaText","onToggle","onRows","onSchema","updateRow","idx","addRow","removeRow","Fragment","row","PatchKeySelect","key","isProps","PROPS_KEY","STATE_KEY_OPTIONS","k","reactionsEditorWidget"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ReactionsEditor.js","sources":["../../../src/widgets/ReactionsEditor.tsx"],"sourcesContent":["// ============================================================================\n// ReactionsEditor — 可视化编辑 reactions 联动规则\n// 对应 schema 节点的 reactions 数组(Reaction 协议,见 core/types/schema.ts):\n// { dependencies, when?, fulfill?: { state?, schema? }, otherwise?: { state?, schema? } }\n// - _autoExpr 自动生成的 reaction(来自 required/hidden/disabled/readOnly 表达式)\n// 不可在此编辑(解析时会自动重建),仅展示数量提示\n// - 纯数据转换在 ./reactionsModel 中(可单测)\n// ============================================================================\n\nimport type { WidgetProps } from '@xbeeant/form-engine-ui';\nimport { Button, Input, Select, Switch } from 'antd';\nimport { useEffect, useRef, useState } from 'react';\nimport { ExpressionBuilder } from './ExpressionBuilder';\nimport {\n BOOLEAN_STATE_KEYS,\n type Card,\n cardToReaction,\n genId,\n type PatchRow,\n PROPS_KEY,\n parsePatchValue,\n reactionToCard,\n STATE_KEY_OPTIONS,\n toManualReactions,\n} from './reactionsModel';\nimport {\n useFormDataFieldOptions,\n useFormDataFields,\n} from './useFormDataFields';\n\nfunction depsCountOf(deps: string): number {\n return deps\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean).length;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// InsertVariableSelect — 向文本中追加一个变量表达式(用于值型补丁)\n// ────────────────────────────────────────────────────────────────────────────\n\nfunction InsertVariableSelect({\n fields,\n fieldOptions,\n depsCount,\n onInsert,\n}: {\n fields: string[];\n fieldOptions?: Array<{ value: string; label: string }>;\n depsCount: number;\n onInsert: (text: string) => void;\n}) {\n const base =\n fieldOptions && fieldOptions.length > 0\n ? fieldOptions\n : fields.map((f) => ({ value: f, label: f }));\n const options = [\n ...base.map((o) => ({ value: `formData.${o.value}`, label: o.label })),\n { value: '$self.value', label: '$self.value' },\n ...(depsCount > 0\n ? Array.from({ length: depsCount }, (_, i) => ({\n value: `$deps[${i}]`,\n label: `$deps[${i}]`,\n }))\n : []),\n { value: '$index', label: '$index' },\n { value: 'rootValue', label: 'rootValue' },\n ];\n return (\n <Select\n size='small'\n placeholder='插入变量'\n value={undefined}\n onChange={(v) => {\n if (v) {\n onInsert(v as string);\n }\n }}\n options={options}\n style={{ width: 104 }}\n />\n );\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// PatchValueInput — 单条状态补丁的值编辑器\n// 布尔型状态 key:静态 Switch ⇄ 表达式 Input;其余 key:文本 Input\n// ────────────────────────────────────────────────────────────────────────────\n\nfunction PatchValueInput({\n rowKey,\n value,\n onChange,\n fields,\n fieldOptions,\n depsCount,\n}: {\n rowKey: string;\n value: unknown;\n onChange: (v: unknown) => void;\n fields: string[];\n fieldOptions?: Array<{ value: string; label: string }>;\n depsCount: number;\n}) {\n const booleanish = BOOLEAN_STATE_KEYS.has(rowKey);\n const isExpr = typeof value === 'string' && value.trim().startsWith('{{');\n\n if (booleanish) {\n if (isExpr) {\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4 }}>\n <ExpressionBuilder\n value={value as string}\n onChange={(s) => onChange(s)}\n fields={fields}\n fieldOptions={fieldOptions}\n depsCount={depsCount}\n emitEmpty='empty'\n />\n <div>\n <Button\n size='small'\n type='text'\n onClick={() => onChange(false)}\n style={{ fontSize: 11, padding: '0 4px', height: 'auto' }}\n >\n 改为静态\n </Button>\n </div>\n </div>\n );\n }\n return (\n <div style={{ display: 'flex', gap: 4, alignItems: 'center' }}>\n <Switch checked={!!value} onChange={(v) => onChange(v)} />\n <Button size='small' onClick={() => onChange('{{ }}')}>\n 表达式\n </Button>\n </div>\n );\n }\n\n const insertVariable = (v: string) => {\n const trimmed = String(value ?? '').trim();\n if (\n typeof value === 'string' &&\n value.trim().startsWith('{{') &&\n value.trim().endsWith('}}')\n ) {\n const inner = value.trim().slice(2, -2).trim();\n onChange(`{{ ${inner} ${v} }}`);\n return;\n }\n onChange(parsePatchValue(trimmed ? `${trimmed} ${v}` : v));\n };\n\n return (\n <div style={{ display: 'flex', gap: 4, alignItems: 'center', flex: 1 }}>\n <Input\n size='small'\n value={String(value ?? '')}\n onChange={(e) => onChange(parsePatchValue(e.target.value))}\n style={{ flex: 1 }}\n />\n <InsertVariableSelect\n fields={fields}\n fieldOptions={fieldOptions}\n depsCount={depsCount}\n onInsert={insertVariable}\n />\n </div>\n );\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// ReactionsEditor — 主组件(本地工作副本 + 每次编辑提交,避免受控重置)\n// ────────────────────────────────────────────────────────────────────────────\n\nexport function ReactionsEditor({ value, onChange }: WidgetProps) {\n const [cards, setCards] = useState<Card[]>(() =>\n toManualReactions(value).map(reactionToCard),\n );\n const prevValueRef = useRef(value);\n // 记录最近一次由本组件 emit 出去的值:自身 onChange 引发的 value 回传\n // (引擎值更新 → value prop 更新)不应触发「外部 value 变化重置」,\n // 否则点击「添加联动规则」后,undefined → [] 的值变化会立刻清空本地卡片。\n const lastEmittedRef = useRef<unknown>(value);\n\n // 外部 value 变化(切换节点 / 属性表单重新初始化)时重置工作副本\n useEffect(() => {\n if (prevValueRef.current !== value) {\n prevValueRef.current = value;\n if (value !== lastEmittedRef.current) {\n setCards(toManualReactions(value).map(reactionToCard));\n }\n }\n }, [value]);\n\n const commit = (next: Card[]) => {\n setCards(next);\n const reactions = next\n .map(cardToReaction)\n .filter((r) => r.dependencies.length > 0 || r.fulfill || r.otherwise);\n const emitted = reactions.length > 0 ? reactions : [];\n lastEmittedRef.current = emitted;\n onChange(emitted);\n };\n\n const updateCard = (index: number, patch: Partial<Card>) => {\n commit(cards.map((c, i) => (i === index ? { ...c, ...patch } : c)));\n };\n\n const removeCard = (index: number) => {\n commit(cards.filter((_, i) => i !== index));\n };\n\n const addCard = () => {\n commit([\n ...cards,\n {\n id: genId(),\n deps: '',\n when: '',\n fulfillEnabled: true,\n fulfillRows: [],\n fulfillSchema: '',\n otherwiseEnabled: false,\n otherwiseRows: [],\n otherwiseSchema: '',\n },\n ]);\n };\n\n const autoExprCount = Array.isArray(value)\n ? value.filter(\n (r) => !!r && (r as { _autoExpr?: boolean })._autoExpr === true,\n ).length\n : 0;\n\n return (\n <div style={{ width: '100%' }}>\n {autoExprCount > 0 && (\n <div\n style={{\n fontSize: 11,\n color: '#999',\n marginBottom: 8,\n background: '#fafafa',\n border: '1px solid #f0f0f0',\n borderRadius: 6,\n padding: '4px 8px',\n }}\n >\n 另有 {autoExprCount} 条由 required / hidden / disabled / readOnly\n 表达式自动生成的联动(_autoExpr),请通过「通用属性 / 校验配置」编辑。\n </div>\n )}\n\n {cards.map((card, cardIndex) => (\n <ReactionCard\n key={card.id}\n card={card}\n index={cardIndex}\n onChange={updateCard}\n onRemove={removeCard}\n />\n ))}\n\n <Button size='small' type='dashed' block onClick={addCard}>\n + 添加联动规则\n </Button>\n <div style={{ fontSize: 11, color: '#999', marginTop: 4 }}>\n 依赖字段值变化时触发本规则。可用变量:$deps(按 dependencies\n 顺序)、$self.value、formData。满足 when(可选)执行 fulfill,否则执行\n otherwise。\n </div>\n </div>\n );\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// ReactionCard — 单条联动规则\n// ────────────────────────────────────────────────────────────────────────────\n\nfunction ReactionCard({\n card,\n index,\n onChange,\n onRemove,\n}: {\n card: Card;\n index: number;\n onChange: (index: number, patch: Partial<Card>) => void;\n onRemove: (index: number) => void;\n}) {\n const fields = useFormDataFields();\n const fieldOptions = useFormDataFieldOptions();\n const depsCount = depsCountOf(card.deps);\n const depsTags = card.deps\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n\n return (\n <div\n style={{\n border: '1px solid #e8e8e8',\n borderRadius: 8,\n padding: 8,\n marginBottom: 8,\n background: '#fff',\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 6,\n }}\n >\n <span style={{ fontSize: 12, fontWeight: 600, color: '#333' }}>\n 联动 {index + 1}\n </span>\n <Button size='small' danger onClick={() => onRemove(index)}>\n 删除\n </Button>\n </div>\n\n <div style={{ marginBottom: 6 }}>\n <div style={{ fontSize: 11, color: '#666', marginBottom: 2 }}>\n 依赖字段(dependencies)\n </div>\n <Select\n size='small'\n mode='tags'\n value={depsTags}\n onChange={(tags) => onChange(index, { deps: tags.join(', ') })}\n options={fieldOptions}\n placeholder='选择或输入依赖字段'\n style={{ width: '100%' }}\n />\n </div>\n\n <div style={{ marginBottom: 6 }}>\n <div style={{ fontSize: 11, color: '#666', marginBottom: 2 }}>\n 条件(when,可选)\n </div>\n <ExpressionBuilder\n value={card.when}\n onChange={(s) => onChange(index, { when: s })}\n fields={fields}\n fieldOptions={fieldOptions}\n depsCount={depsCount}\n emitEmpty='empty'\n placeholder='{{ $deps[0] === true }}'\n />\n </div>\n\n <BranchEditor\n title='满足时(fulfill)'\n enabled={card.fulfillEnabled}\n rows={card.fulfillRows}\n schemaText={card.fulfillSchema}\n fields={fields}\n fieldOptions={fieldOptions}\n depsCount={depsCount}\n onToggle={(v) => onChange(index, { fulfillEnabled: v })}\n onRows={(rows) => onChange(index, { fulfillRows: rows })}\n onSchema={(t) => onChange(index, { fulfillSchema: t })}\n />\n\n <BranchEditor\n title='不满足时(otherwise)'\n enabled={card.otherwiseEnabled}\n rows={card.otherwiseRows}\n schemaText={card.otherwiseSchema}\n fields={fields}\n fieldOptions={fieldOptions}\n depsCount={depsCount}\n onToggle={(v) => onChange(index, { otherwiseEnabled: v })}\n onRows={(rows) => onChange(index, { otherwiseRows: rows })}\n onSchema={(t) => onChange(index, { otherwiseSchema: t })}\n />\n </div>\n );\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// BranchEditor — fulfill / otherwise 分支:状态补丁 + 属性补丁\n// ────────────────────────────────────────────────────────────────────────────\n\nfunction BranchEditor({\n title,\n enabled,\n rows,\n schemaText,\n fields,\n fieldOptions,\n depsCount,\n onToggle,\n onRows,\n onSchema,\n}: {\n title: string;\n enabled: boolean;\n rows: PatchRow[];\n schemaText: string;\n fields: string[];\n fieldOptions?: Array<{ value: string; label: string }>;\n depsCount: number;\n onToggle: (enabled: boolean) => void;\n onRows: (rows: PatchRow[]) => void;\n onSchema: (text: string) => void;\n}) {\n const updateRow = (idx: number, patch: Partial<PatchRow>) => {\n onRows(rows.map((r, i) => (i === idx ? { ...r, ...patch } : r)));\n };\n\n const addRow = () => {\n onRows([...rows, { key: 'required', value: true }]);\n };\n\n const removeRow = (idx: number) => {\n onRows(rows.filter((_, i) => i !== idx));\n };\n\n return (\n <div style={{ marginBottom: 6 }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 4,\n }}\n >\n <span style={{ fontSize: 11, color: '#666' }}>{title}</span>\n <Switch size='small' checked={enabled} onChange={(v) => onToggle(v)} />\n </div>\n\n {enabled && (\n <>\n {rows.map((row, idx) => (\n <div\n key={`${idx}-${row.key}`}\n style={{\n display: 'flex',\n gap: 4,\n alignItems: 'center',\n marginBottom: 4,\n }}\n >\n <PatchKeySelect\n row={row}\n onChange={(key) => updateRow(idx, { key })}\n />\n <div style={{ flex: 1 }}>\n <PatchValueInput\n rowKey={row.key}\n value={row.value}\n onChange={(v) => updateRow(idx, { value: v })}\n fields={fields}\n fieldOptions={fieldOptions}\n depsCount={depsCount}\n />\n </div>\n <Button size='small' onClick={() => removeRow(idx)}>\n ×\n </Button>\n </div>\n ))}\n <Button\n size='small'\n block\n style={{ marginBottom: 4 }}\n onClick={addRow}\n >\n + 添加状态项\n </Button>\n\n <div style={{ fontSize: 11, color: '#666', marginBottom: 2 }}>\n 属性补丁(schema,JSON,可选)\n </div>\n <Input.TextArea\n size='small'\n rows={2}\n placeholder={'{\\n \"props.options\": [...]\\n}'}\n value={schemaText}\n onChange={(e) => onSchema(e.target.value)}\n />\n </>\n )}\n </div>\n );\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// PatchKeySelect — 状态补丁的 key 选择器(含 props.* 自定义路径)\n// ────────────────────────────────────────────────────────────────────────────\n\nfunction PatchKeySelect({\n row,\n onChange,\n}: {\n row: PatchRow;\n onChange: (key: string) => void;\n}) {\n const isProps = row.key.startsWith('props.');\n return (\n <div style={{ display: 'flex', gap: 4 }}>\n <Select\n size='small'\n value={isProps ? PROPS_KEY : row.key}\n options={STATE_KEY_OPTIONS}\n onChange={(k) => onChange(k === PROPS_KEY ? 'props.' : k)}\n style={{ width: 132 }}\n />\n {isProps && (\n <Input\n size='small'\n placeholder='如 options'\n value={row.key.slice('props.'.length)}\n onChange={(e) => onChange(`props.${e.target.value}`)}\n style={{ width: 96 }}\n />\n )}\n </div>\n );\n}\n\nexport const reactionsEditorWidget = ReactionsEditor;\n"],"names":["depsCountOf","deps","s","InsertVariableSelect","fields","fieldOptions","depsCount","onInsert","options","f","o","_","i","jsx","Select","v","PatchValueInput","rowKey","value","onChange","booleanish","BOOLEAN_STATE_KEYS","isExpr","jsxs","ExpressionBuilder","Button","Switch","insertVariable","trimmed","inner","parsePatchValue","Input","e","ReactionsEditor","cards","setCards","useState","toManualReactions","reactionToCard","prevValueRef","useRef","lastEmittedRef","useEffect","commit","next","reactions","cardToReaction","r","emitted","updateCard","index","patch","c","removeCard","addCard","genId","autoExprCount","card","cardIndex","ReactionCard","onRemove","useFormDataFields","useFormDataFieldOptions","depsTags","tags","BranchEditor","rows","t","title","enabled","schemaText","onToggle","onRows","onSchema","updateRow","idx","addRow","removeRow","Fragment","row","PatchKeySelect","key","isProps","PROPS_KEY","STATE_KEY_OPTIONS","k","reactionsEditorWidget"],"mappings":"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"}
|