@xbeeant/form-engine-designer 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/README.md +69 -0
  2. package/dist/es/Canvas.js +636 -0
  3. package/dist/es/Canvas.js.map +1 -0
  4. package/dist/es/Designer.js +162 -0
  5. package/dist/es/Designer.js.map +1 -0
  6. package/dist/es/DesignerContext.js +97 -0
  7. package/dist/es/DesignerContext.js.map +1 -0
  8. package/dist/es/Palette.js +148 -0
  9. package/dist/es/Palette.js.map +1 -0
  10. package/dist/es/PropertyPanel.js +294 -0
  11. package/dist/es/PropertyPanel.js.map +1 -0
  12. package/dist/es/ResizablePanel.js +103 -0
  13. package/dist/es/ResizablePanel.js.map +1 -0
  14. package/dist/es/catalog.js +514 -0
  15. package/dist/es/catalog.js.map +1 -0
  16. package/dist/es/form-engine-designer.css +1 -0
  17. package/dist/es/index.js +20 -0
  18. package/dist/es/index.js.map +1 -0
  19. package/dist/es/property/basic-property.js +115 -0
  20. package/dist/es/property/basic-property.js.map +1 -0
  21. package/dist/es/react/src/components/FormController.js +154 -0
  22. package/dist/es/react/src/components/FormController.js.map +1 -0
  23. package/dist/es/react/src/components/NexusField.js +99 -0
  24. package/dist/es/react/src/components/NexusField.js.map +1 -0
  25. package/dist/es/react/src/components/NexusForm.js +121 -0
  26. package/dist/es/react/src/components/NexusForm.js.map +1 -0
  27. package/dist/es/react/src/components/NexusFormProvider.js +19 -0
  28. package/dist/es/react/src/components/NexusFormProvider.js.map +1 -0
  29. package/dist/es/react/src/components/NexusLayout.js +49 -0
  30. package/dist/es/react/src/components/NexusLayout.js.map +1 -0
  31. package/dist/es/react/src/components/NexusObject.js +65 -0
  32. package/dist/es/react/src/components/NexusObject.js.map +1 -0
  33. package/dist/es/react/src/contexts/FieldInheritContext.js +6 -0
  34. package/dist/es/react/src/contexts/FieldInheritContext.js.map +1 -0
  35. package/dist/es/react/src/contexts/GridContext.js +6 -0
  36. package/dist/es/react/src/contexts/GridContext.js.map +1 -0
  37. package/dist/es/react/src/contexts/LayoutConfigContext.js +6 -0
  38. package/dist/es/react/src/contexts/LayoutConfigContext.js.map +1 -0
  39. package/dist/es/react/src/contexts/NexusContext.js +13 -0
  40. package/dist/es/react/src/contexts/NexusContext.js.map +1 -0
  41. package/dist/es/react/src/hooks/useForm.js +10 -0
  42. package/dist/es/react/src/hooks/useForm.js.map +1 -0
  43. package/dist/es/react/src/utils/renderTreeNode.js +18 -0
  44. package/dist/es/react/src/utils/renderTreeNode.js.map +1 -0
  45. package/dist/es/react/src/utils/resolveColSpan.js +10 -0
  46. package/dist/es/react/src/utils/resolveColSpan.js.map +1 -0
  47. package/dist/es/schemaUtils.js +286 -0
  48. package/dist/es/schemaUtils.js.map +1 -0
  49. package/dist/es/schemaUtils.test.js +188 -0
  50. package/dist/es/schemaUtils.test.js.map +1 -0
  51. package/dist/es/types.js +2 -0
  52. package/dist/es/types.js.map +1 -0
  53. package/dist/es/vite-env.d.js +2 -0
  54. package/dist/es/vite-env.d.js.map +1 -0
  55. package/dist/es/widgets/BindEditor.js +67 -0
  56. package/dist/es/widgets/BindEditor.js.map +1 -0
  57. package/dist/es/widgets/CodeEditor.js +84 -0
  58. package/dist/es/widgets/CodeEditor.js.map +1 -0
  59. package/dist/es/widgets/DefaultEditor.js +55 -0
  60. package/dist/es/widgets/DefaultEditor.js.map +1 -0
  61. package/dist/es/widgets/DependenciesEditor.js +36 -0
  62. package/dist/es/widgets/DependenciesEditor.js.map +1 -0
  63. package/dist/es/widgets/EnumEditor.js +49 -0
  64. package/dist/es/widgets/EnumEditor.js.map +1 -0
  65. package/dist/es/widgets/ExpressionBuilder.js +367 -0
  66. package/dist/es/widgets/ExpressionBuilder.js.map +1 -0
  67. package/dist/es/widgets/ExpressionSwitch.js +47 -0
  68. package/dist/es/widgets/ExpressionSwitch.js.map +1 -0
  69. package/dist/es/widgets/OptionsEditor.js +102 -0
  70. package/dist/es/widgets/OptionsEditor.js.map +1 -0
  71. package/dist/es/widgets/ReactionsEditor.js +401 -0
  72. package/dist/es/widgets/ReactionsEditor.js.map +1 -0
  73. package/dist/es/widgets/RemoteDataEditor.js +314 -0
  74. package/dist/es/widgets/RemoteDataEditor.js.map +1 -0
  75. package/dist/es/widgets/ValidateEditor.js +118 -0
  76. package/dist/es/widgets/ValidateEditor.js.map +1 -0
  77. package/dist/es/widgets/expressionModel.js +340 -0
  78. package/dist/es/widgets/expressionModel.js.map +1 -0
  79. package/dist/es/widgets/expressionModel.test.js +193 -0
  80. package/dist/es/widgets/expressionModel.test.js.map +1 -0
  81. package/dist/es/widgets/index.js +57 -0
  82. package/dist/es/widgets/index.js.map +1 -0
  83. package/dist/es/widgets/reactionsModel.js +107 -0
  84. package/dist/es/widgets/reactionsModel.js.map +1 -0
  85. package/dist/es/widgets/useFormDataFields.js +16 -0
  86. package/dist/es/widgets/useFormDataFields.js.map +1 -0
  87. package/package.json +62 -0
  88. package/src/Canvas.tsx +1111 -0
  89. package/src/Designer.css +206 -0
  90. package/src/Designer.tsx +254 -0
  91. package/src/DesignerContext.tsx +192 -0
  92. package/src/Palette.tsx +261 -0
  93. package/src/PropertyPanel.tsx +486 -0
  94. package/src/ResizablePanel.tsx +210 -0
  95. package/src/catalog.ts +526 -0
  96. package/src/index.ts +25 -0
  97. package/src/property/basic-property.ts +126 -0
  98. package/src/schemaUtils.test.ts +261 -0
  99. package/src/schemaUtils.ts +627 -0
  100. package/src/types.ts +38 -0
  101. package/src/vite-env.d.ts +1 -0
  102. package/src/widgets/BindEditor.tsx +105 -0
  103. package/src/widgets/CodeEditor.tsx +114 -0
  104. package/src/widgets/DefaultEditor.tsx +73 -0
  105. package/src/widgets/DependenciesEditor.tsx +56 -0
  106. package/src/widgets/EnumEditor.tsx +66 -0
  107. package/src/widgets/ExpressionBuilder.tsx +509 -0
  108. package/src/widgets/ExpressionSwitch.tsx +62 -0
  109. package/src/widgets/OptionsEditor.tsx +141 -0
  110. package/src/widgets/ReactionsEditor.tsx +532 -0
  111. package/src/widgets/RemoteDataEditor.tsx +382 -0
  112. package/src/widgets/ValidateEditor.tsx +162 -0
  113. package/src/widgets/expressionModel.test.ts +262 -0
  114. package/src/widgets/expressionModel.ts +573 -0
  115. package/src/widgets/index.ts +45 -0
  116. package/src/widgets/reactionsModel.ts +190 -0
  117. package/src/widgets/useFormDataFields.ts +21 -0
@@ -0,0 +1,401 @@
1
+ import { jsxs as c, jsx as i, Fragment as T } from "react/jsx-runtime";
2
+ import { Form as I, Button as b, Select as w, Switch as B, Input as S } from "antd";
3
+ import { useState as _, useRef as v, useEffect as A } from "react";
4
+ import { ExpressionBuilder as k } from "./ExpressionBuilder.js";
5
+ import { toManualReactions as E, reactionToCard as z, genId as O, cardToReaction as P, STATE_KEY_OPTIONS as V, PROPS_KEY as R, BOOLEAN_STATE_KEYS as F, parsePatchValue as $ } from "./reactionsModel.js";
6
+ import { useFormDataFields as W, useFormDataFieldOptions as j } from "./useFormDataFields.js";
7
+ function D(t) {
8
+ return t.split(",").map((e) => e.trim()).filter(Boolean).length;
9
+ }
10
+ function K({
11
+ fields: t,
12
+ fieldOptions: e,
13
+ depsCount: l,
14
+ onInsert: s
15
+ }) {
16
+ const d = [
17
+ ...(e && e.length > 0 ? e : t.map((r) => ({ value: r, label: r }))).map((r) => ({ value: `formData.${r.value}`, label: r.label })),
18
+ { value: "$self.value", label: "$self.value" },
19
+ ...l > 0 ? Array.from({ length: l }, (r, u) => ({
20
+ value: `$deps[${u}]`,
21
+ label: `$deps[${u}]`
22
+ })) : [],
23
+ { value: "$index", label: "$index" },
24
+ { value: "rootValue", label: "rootValue" }
25
+ ];
26
+ return /* @__PURE__ */ i(
27
+ w,
28
+ {
29
+ size: "small",
30
+ placeholder: "插入变量",
31
+ value: void 0,
32
+ onChange: (r) => {
33
+ r && s(r);
34
+ },
35
+ options: d,
36
+ style: { width: 104 }
37
+ }
38
+ );
39
+ }
40
+ function N({
41
+ rowKey: t,
42
+ value: e,
43
+ onChange: l,
44
+ fields: s,
45
+ fieldOptions: h,
46
+ depsCount: d
47
+ }) {
48
+ const r = F.has(t), u = typeof e == "string" && e.trim().startsWith("{{");
49
+ if (r)
50
+ return u ? /* @__PURE__ */ c("div", { style: { display: "flex", flexDirection: "column", gap: 4 }, children: [
51
+ /* @__PURE__ */ i(
52
+ k,
53
+ {
54
+ value: e,
55
+ onChange: (f) => l(f),
56
+ fields: s,
57
+ fieldOptions: h,
58
+ depsCount: d,
59
+ emitEmpty: "empty"
60
+ }
61
+ ),
62
+ /* @__PURE__ */ i("div", { children: /* @__PURE__ */ i(
63
+ b,
64
+ {
65
+ size: "small",
66
+ type: "text",
67
+ onClick: () => l(!1),
68
+ style: { fontSize: 11, padding: "0 4px", height: "auto" },
69
+ children: "改为静态"
70
+ }
71
+ ) })
72
+ ] }) : /* @__PURE__ */ c("div", { style: { display: "flex", gap: 4, alignItems: "center" }, children: [
73
+ /* @__PURE__ */ i(B, { checked: !!e, onChange: (f) => l(f) }),
74
+ /* @__PURE__ */ i(b, { size: "small", onClick: () => l("{{ }}"), children: "表达式" })
75
+ ] });
76
+ const o = (f) => {
77
+ const y = String(e ?? "").trim();
78
+ if (typeof e == "string" && e.trim().startsWith("{{") && e.trim().endsWith("}}")) {
79
+ const g = e.trim().slice(2, -2).trim();
80
+ l(`{{ ${g} ${f} }}`);
81
+ return;
82
+ }
83
+ l($(y ? `${y} ${f}` : f));
84
+ };
85
+ return /* @__PURE__ */ c("div", { style: { display: "flex", gap: 4, alignItems: "center", flex: 1 }, children: [
86
+ /* @__PURE__ */ i(
87
+ S,
88
+ {
89
+ size: "small",
90
+ value: String(e ?? ""),
91
+ onChange: (f) => l($(f.target.value)),
92
+ style: { flex: 1 }
93
+ }
94
+ ),
95
+ /* @__PURE__ */ i(
96
+ K,
97
+ {
98
+ fields: s,
99
+ fieldOptions: h,
100
+ depsCount: d,
101
+ onInsert: o
102
+ }
103
+ )
104
+ ] });
105
+ }
106
+ function Y({ value: t, onChange: e, title: l }) {
107
+ const [s, h] = _(
108
+ () => E(t).map(z)
109
+ ), d = v(t), r = v(t);
110
+ A(() => {
111
+ d.current !== t && (d.current = t, t !== r.current && h(E(t).map(z)));
112
+ }, [t]);
113
+ const u = (m) => {
114
+ h(m);
115
+ const n = m.map(P).filter((p) => p.dependencies.length > 0 || p.fulfill || p.otherwise), a = n.length > 0 ? n : [];
116
+ r.current = a, e(a);
117
+ }, o = (m, n) => {
118
+ u(s.map((a, p) => p === m ? { ...a, ...n } : a));
119
+ }, f = (m) => {
120
+ u(s.filter((n, a) => a !== m));
121
+ }, y = () => {
122
+ u([
123
+ ...s,
124
+ {
125
+ id: O(),
126
+ deps: "",
127
+ when: "",
128
+ fulfillEnabled: !0,
129
+ fulfillRows: [],
130
+ fulfillSchema: "",
131
+ otherwiseEnabled: !1,
132
+ otherwiseRows: [],
133
+ otherwiseSchema: ""
134
+ }
135
+ ]);
136
+ }, g = Array.isArray(t) ? t.filter(
137
+ (m) => !!m && m._autoExpr === !0
138
+ ).length : 0;
139
+ return /* @__PURE__ */ c(I.Item, { layout: "vertical", label: l, style: { width: "100%" }, children: [
140
+ g > 0 && /* @__PURE__ */ c(
141
+ "div",
142
+ {
143
+ style: {
144
+ fontSize: 11,
145
+ color: "#999",
146
+ marginBottom: 8,
147
+ background: "#fafafa",
148
+ border: "1px solid #f0f0f0",
149
+ borderRadius: 6,
150
+ padding: "4px 8px"
151
+ },
152
+ children: [
153
+ "另有 ",
154
+ g,
155
+ " 条由 required / hidden / disabled / readOnly 表达式自动生成的联动(_autoExpr),请通过「通用属性 / 校验配置」编辑。"
156
+ ]
157
+ }
158
+ ),
159
+ s.map((m, n) => /* @__PURE__ */ i(
160
+ q,
161
+ {
162
+ card: m,
163
+ index: n,
164
+ onChange: o,
165
+ onRemove: f
166
+ },
167
+ m.id
168
+ )),
169
+ /* @__PURE__ */ i(b, { size: "small", type: "dashed", block: !0, onClick: y, children: "+ 添加联动规则" }),
170
+ /* @__PURE__ */ i("div", { style: { fontSize: 11, color: "#999", marginTop: 4 }, children: "依赖字段值变化时触发本规则。可用变量:$deps(按 dependencies 顺序)、$self.value、formData。满足 when(可选)执行 fulfill,否则执行 otherwise。" })
171
+ ] });
172
+ }
173
+ function q({
174
+ card: t,
175
+ index: e,
176
+ onChange: l,
177
+ onRemove: s
178
+ }) {
179
+ const h = W(), d = j(), r = D(t.deps), u = t.deps.split(",").map((o) => o.trim()).filter(Boolean);
180
+ return /* @__PURE__ */ c(
181
+ "div",
182
+ {
183
+ style: {
184
+ border: "1px solid #e8e8e8",
185
+ borderRadius: 8,
186
+ padding: 8,
187
+ marginBottom: 8,
188
+ background: "#fff"
189
+ },
190
+ children: [
191
+ /* @__PURE__ */ c(
192
+ "div",
193
+ {
194
+ style: {
195
+ display: "flex",
196
+ alignItems: "center",
197
+ justifyContent: "space-between",
198
+ marginBottom: 6
199
+ },
200
+ children: [
201
+ /* @__PURE__ */ c("span", { style: { fontSize: 12, fontWeight: 600, color: "#333" }, children: [
202
+ "联动 ",
203
+ e + 1
204
+ ] }),
205
+ /* @__PURE__ */ i(b, { size: "small", danger: !0, onClick: () => s(e), children: "删除" })
206
+ ]
207
+ }
208
+ ),
209
+ /* @__PURE__ */ c("div", { style: { marginBottom: 6 }, children: [
210
+ /* @__PURE__ */ i("div", { style: { fontSize: 11, color: "#666", marginBottom: 2 }, children: "依赖字段(dependencies)" }),
211
+ /* @__PURE__ */ i(
212
+ w,
213
+ {
214
+ size: "small",
215
+ mode: "tags",
216
+ value: u,
217
+ onChange: (o) => l(e, { deps: o.join(", ") }),
218
+ options: d,
219
+ placeholder: "选择或输入依赖字段",
220
+ style: { width: "100%" }
221
+ }
222
+ )
223
+ ] }),
224
+ /* @__PURE__ */ c("div", { style: { marginBottom: 6 }, children: [
225
+ /* @__PURE__ */ i("div", { style: { fontSize: 11, color: "#666", marginBottom: 2 }, children: "条件(when,可选)" }),
226
+ /* @__PURE__ */ i(
227
+ k,
228
+ {
229
+ value: t.when,
230
+ onChange: (o) => l(e, { when: o }),
231
+ fields: h,
232
+ fieldOptions: d,
233
+ depsCount: r,
234
+ emitEmpty: "empty",
235
+ placeholder: "{{ $deps[0] === true }}"
236
+ }
237
+ )
238
+ ] }),
239
+ /* @__PURE__ */ i(
240
+ x,
241
+ {
242
+ title: "满足时(fulfill)",
243
+ enabled: t.fulfillEnabled,
244
+ rows: t.fulfillRows,
245
+ schemaText: t.fulfillSchema,
246
+ fields: h,
247
+ fieldOptions: d,
248
+ depsCount: r,
249
+ onToggle: (o) => l(e, { fulfillEnabled: o }),
250
+ onRows: (o) => l(e, { fulfillRows: o }),
251
+ onSchema: (o) => l(e, { fulfillSchema: o })
252
+ }
253
+ ),
254
+ /* @__PURE__ */ i(
255
+ x,
256
+ {
257
+ title: "不满足时(otherwise)",
258
+ enabled: t.otherwiseEnabled,
259
+ rows: t.otherwiseRows,
260
+ schemaText: t.otherwiseSchema,
261
+ fields: h,
262
+ fieldOptions: d,
263
+ depsCount: r,
264
+ onToggle: (o) => l(e, { otherwiseEnabled: o }),
265
+ onRows: (o) => l(e, { otherwiseRows: o }),
266
+ onSchema: (o) => l(e, { otherwiseSchema: o })
267
+ }
268
+ )
269
+ ]
270
+ }
271
+ );
272
+ }
273
+ function x({
274
+ title: t,
275
+ enabled: e,
276
+ rows: l,
277
+ schemaText: s,
278
+ fields: h,
279
+ fieldOptions: d,
280
+ depsCount: r,
281
+ onToggle: u,
282
+ onRows: o,
283
+ onSchema: f
284
+ }) {
285
+ const y = (n, a) => {
286
+ o(l.map((p, C) => C === n ? { ...p, ...a } : p));
287
+ }, g = () => {
288
+ o([...l, { key: "required", value: !0 }]);
289
+ }, m = (n) => {
290
+ o(l.filter((a, p) => p !== n));
291
+ };
292
+ return /* @__PURE__ */ c("div", { style: { marginBottom: 6 }, children: [
293
+ /* @__PURE__ */ c(
294
+ "div",
295
+ {
296
+ style: {
297
+ display: "flex",
298
+ alignItems: "center",
299
+ justifyContent: "space-between",
300
+ marginBottom: 4
301
+ },
302
+ children: [
303
+ /* @__PURE__ */ i("span", { style: { fontSize: 11, color: "#666" }, children: t }),
304
+ /* @__PURE__ */ i(B, { size: "small", checked: e, onChange: (n) => u(n) })
305
+ ]
306
+ }
307
+ ),
308
+ e && /* @__PURE__ */ c(T, { children: [
309
+ l.map((n, a) => /* @__PURE__ */ c(
310
+ "div",
311
+ {
312
+ style: {
313
+ display: "flex",
314
+ gap: 4,
315
+ alignItems: "center",
316
+ marginBottom: 4
317
+ },
318
+ children: [
319
+ /* @__PURE__ */ i(
320
+ J,
321
+ {
322
+ row: n,
323
+ onChange: (p) => y(a, { key: p })
324
+ }
325
+ ),
326
+ /* @__PURE__ */ i("div", { style: { flex: 1 }, children: /* @__PURE__ */ i(
327
+ N,
328
+ {
329
+ rowKey: n.key,
330
+ value: n.value,
331
+ onChange: (p) => y(a, { value: p }),
332
+ fields: h,
333
+ fieldOptions: d,
334
+ depsCount: r
335
+ }
336
+ ) }),
337
+ /* @__PURE__ */ i(b, { size: "small", onClick: () => m(a), children: "×" })
338
+ ]
339
+ },
340
+ `${a}-${n.key}`
341
+ )),
342
+ /* @__PURE__ */ i(
343
+ b,
344
+ {
345
+ size: "small",
346
+ block: !0,
347
+ style: { marginBottom: 4 },
348
+ onClick: g,
349
+ children: "+ 添加状态项"
350
+ }
351
+ ),
352
+ /* @__PURE__ */ i("div", { style: { fontSize: 11, color: "#666", marginBottom: 2 }, children: "属性补丁(schema,JSON,可选)" }),
353
+ /* @__PURE__ */ i(
354
+ S.TextArea,
355
+ {
356
+ size: "small",
357
+ rows: 2,
358
+ placeholder: `{
359
+ "props.options": [...]
360
+ }`,
361
+ value: s,
362
+ onChange: (n) => f(n.target.value)
363
+ }
364
+ )
365
+ ] })
366
+ ] });
367
+ }
368
+ function J({
369
+ row: t,
370
+ onChange: e
371
+ }) {
372
+ const l = t.key.startsWith("props.");
373
+ return /* @__PURE__ */ c("div", { style: { display: "flex", gap: 4 }, children: [
374
+ /* @__PURE__ */ i(
375
+ w,
376
+ {
377
+ size: "small",
378
+ value: l ? R : t.key,
379
+ options: V,
380
+ onChange: (s) => e(s === R ? "props." : s),
381
+ style: { width: 132 }
382
+ }
383
+ ),
384
+ l && /* @__PURE__ */ i(
385
+ S,
386
+ {
387
+ size: "small",
388
+ placeholder: "如 options",
389
+ value: t.key.slice(6),
390
+ onChange: (s) => e(`props.${s.target.value}`),
391
+ style: { width: 96 }
392
+ }
393
+ )
394
+ ] });
395
+ }
396
+ const X = Y;
397
+ export {
398
+ Y as ReactionsEditor,
399
+ X as reactionsEditorWidget
400
+ };
401
+ //# sourceMappingURL=ReactionsEditor.js.map
@@ -0,0 +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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"}