@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.
Files changed (137) hide show
  1. package/dist/es/Canvas.js +42 -46
  2. package/dist/es/Canvas.js.map +1 -1
  3. package/dist/es/Designer.js +121 -98
  4. package/dist/es/Designer.js.map +1 -1
  5. package/dist/es/DesignerContext.js +86 -73
  6. package/dist/es/DesignerContext.js.map +1 -1
  7. package/dist/es/Palette.js +3 -3
  8. package/dist/es/Palette.js.map +1 -1
  9. package/dist/es/PropertyPanel.js +97 -97
  10. package/dist/es/PropertyPanel.js.map +1 -1
  11. package/dist/es/catalog.js +19 -11
  12. package/dist/es/catalog.js.map +1 -1
  13. package/dist/es/designer-context.js +110 -0
  14. package/dist/es/designer-context.js.map +1 -0
  15. package/dist/es/history.js +73 -0
  16. package/dist/es/history.js.map +1 -0
  17. package/dist/es/index.js +3 -3
  18. package/dist/es/property/basic-property.js +6 -0
  19. package/dist/es/property/basic-property.js.map +1 -1
  20. package/dist/es/property-panel.js +294 -0
  21. package/dist/es/property-panel.js.map +1 -0
  22. package/dist/es/resizable-panel.js +103 -0
  23. package/dist/es/resizable-panel.js.map +1 -0
  24. package/dist/es/schema-utils.js +286 -0
  25. package/dist/es/schema-utils.js.map +1 -0
  26. package/dist/es/widgets/BindEditor.js +60 -49
  27. package/dist/es/widgets/BindEditor.js.map +1 -1
  28. package/dist/es/widgets/CodeEditor.js +41 -49
  29. package/dist/es/widgets/CodeEditor.js.map +1 -1
  30. package/dist/es/widgets/DefaultEditor.js +25 -30
  31. package/dist/es/widgets/DefaultEditor.js.map +1 -1
  32. package/dist/es/widgets/DependenciesEditor.js +21 -21
  33. package/dist/es/widgets/DependenciesEditor.js.map +1 -1
  34. package/dist/es/widgets/EnumEditor.js +25 -31
  35. package/dist/es/widgets/EnumEditor.js.map +1 -1
  36. package/dist/es/widgets/ExpressionSwitch.js +32 -30
  37. package/dist/es/widgets/ExpressionSwitch.js.map +1 -1
  38. package/dist/es/widgets/ReactionsEditor.js +103 -103
  39. package/dist/es/widgets/ReactionsEditor.js.map +1 -1
  40. package/dist/es/widgets/RemoteDataEditor.js +63 -63
  41. package/dist/es/widgets/RemoteDataEditor.js.map +1 -1
  42. package/dist/es/widgets/ValidateEditor.js +49 -49
  43. package/dist/es/widgets/ValidateEditor.js.map +1 -1
  44. package/dist/es/widgets/bind-editor.js +78 -0
  45. package/dist/es/widgets/bind-editor.js.map +1 -0
  46. package/dist/es/widgets/code-editor.js +76 -0
  47. package/dist/es/widgets/code-editor.js.map +1 -0
  48. package/dist/es/widgets/default-editor.js +50 -0
  49. package/dist/es/widgets/default-editor.js.map +1 -0
  50. package/dist/es/widgets/dependencies-editor.js +36 -0
  51. package/dist/es/widgets/dependencies-editor.js.map +1 -0
  52. package/dist/es/widgets/enum-editor.js +43 -0
  53. package/dist/es/widgets/enum-editor.js.map +1 -0
  54. package/dist/es/widgets/expression-builder.js +367 -0
  55. package/dist/es/widgets/expression-builder.js.map +1 -0
  56. package/dist/es/widgets/expression-model.js +340 -0
  57. package/dist/es/widgets/expression-model.js.map +1 -0
  58. package/dist/es/widgets/expression-switch.js +49 -0
  59. package/dist/es/widgets/expression-switch.js.map +1 -0
  60. package/dist/es/widgets/index.js +13 -13
  61. package/dist/es/widgets/index.js.map +1 -1
  62. package/dist/es/widgets/options-editor.js +102 -0
  63. package/dist/es/widgets/options-editor.js.map +1 -0
  64. package/dist/es/widgets/reactions-editor.js +401 -0
  65. package/dist/es/widgets/reactions-editor.js.map +1 -0
  66. package/dist/es/widgets/reactions-model.js +107 -0
  67. package/dist/es/widgets/reactions-model.js.map +1 -0
  68. package/dist/es/widgets/remote-data-editor.js +314 -0
  69. package/dist/es/widgets/remote-data-editor.js.map +1 -0
  70. package/dist/es/widgets/use-form-data-fields.js +16 -0
  71. package/dist/es/widgets/use-form-data-fields.js.map +1 -0
  72. package/dist/es/widgets/validate-editor.js +118 -0
  73. package/dist/es/widgets/validate-editor.js.map +1 -0
  74. package/package.json +4 -5
  75. package/dist/es/react/src/components/FormController.js +0 -154
  76. package/dist/es/react/src/components/FormController.js.map +0 -1
  77. package/dist/es/react/src/components/NexusField.js +0 -99
  78. package/dist/es/react/src/components/NexusField.js.map +0 -1
  79. package/dist/es/react/src/components/NexusForm.js +0 -121
  80. package/dist/es/react/src/components/NexusForm.js.map +0 -1
  81. package/dist/es/react/src/components/NexusFormProvider.js +0 -19
  82. package/dist/es/react/src/components/NexusFormProvider.js.map +0 -1
  83. package/dist/es/react/src/components/NexusLayout.js +0 -49
  84. package/dist/es/react/src/components/NexusLayout.js.map +0 -1
  85. package/dist/es/react/src/components/NexusObject.js +0 -65
  86. package/dist/es/react/src/components/NexusObject.js.map +0 -1
  87. package/dist/es/react/src/contexts/FieldInheritContext.js +0 -6
  88. package/dist/es/react/src/contexts/FieldInheritContext.js.map +0 -1
  89. package/dist/es/react/src/contexts/GridContext.js +0 -6
  90. package/dist/es/react/src/contexts/GridContext.js.map +0 -1
  91. package/dist/es/react/src/contexts/LayoutConfigContext.js +0 -6
  92. package/dist/es/react/src/contexts/LayoutConfigContext.js.map +0 -1
  93. package/dist/es/react/src/contexts/NexusContext.js +0 -13
  94. package/dist/es/react/src/contexts/NexusContext.js.map +0 -1
  95. package/dist/es/react/src/hooks/useForm.js +0 -10
  96. package/dist/es/react/src/hooks/useForm.js.map +0 -1
  97. package/dist/es/react/src/utils/renderTreeNode.js +0 -18
  98. package/dist/es/react/src/utils/renderTreeNode.js.map +0 -1
  99. package/dist/es/react/src/utils/resolveColSpan.js +0 -10
  100. package/dist/es/react/src/utils/resolveColSpan.js.map +0 -1
  101. package/dist/es/schemaUtils.test.js +0 -188
  102. package/dist/es/schemaUtils.test.js.map +0 -1
  103. package/dist/es/vite-env.d.js +0 -2
  104. package/dist/es/vite-env.d.js.map +0 -1
  105. package/dist/es/widgets/expressionModel.test.js +0 -193
  106. package/dist/es/widgets/expressionModel.test.js.map +0 -1
  107. package/src/Canvas.tsx +0 -1111
  108. package/src/Designer.css +0 -206
  109. package/src/Designer.tsx +0 -254
  110. package/src/DesignerContext.tsx +0 -192
  111. package/src/Palette.tsx +0 -261
  112. package/src/PropertyPanel.tsx +0 -486
  113. package/src/ResizablePanel.tsx +0 -210
  114. package/src/catalog.ts +0 -526
  115. package/src/index.ts +0 -25
  116. package/src/property/basic-property.ts +0 -126
  117. package/src/schemaUtils.test.ts +0 -261
  118. package/src/schemaUtils.ts +0 -627
  119. package/src/types.ts +0 -38
  120. package/src/vite-env.d.ts +0 -1
  121. package/src/widgets/BindEditor.tsx +0 -105
  122. package/src/widgets/CodeEditor.tsx +0 -114
  123. package/src/widgets/DefaultEditor.tsx +0 -73
  124. package/src/widgets/DependenciesEditor.tsx +0 -56
  125. package/src/widgets/EnumEditor.tsx +0 -66
  126. package/src/widgets/ExpressionBuilder.tsx +0 -509
  127. package/src/widgets/ExpressionSwitch.tsx +0 -62
  128. package/src/widgets/OptionsEditor.tsx +0 -141
  129. package/src/widgets/ReactionsEditor.tsx +0 -532
  130. package/src/widgets/RemoteDataEditor.tsx +0 -382
  131. package/src/widgets/ValidateEditor.tsx +0 -162
  132. package/src/widgets/expressionModel.test.ts +0 -262
  133. package/src/widgets/expressionModel.ts +0 -573
  134. package/src/widgets/index.ts +0 -45
  135. package/src/widgets/reactionsModel.ts +0 -190
  136. package/src/widgets/useFormDataFields.ts +0 -21
  137. /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 { 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";
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 O, cardToReaction as P, STATE_KEY_OPTIONS as V, PROPS_KEY as R, BOOLEAN_STATE_KEYS as F, parsePatchValue as $ } from "./reactionsModel.js";
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 K({
10
+ function F({
11
11
  fields: t,
12
12
  fieldOptions: e,
13
13
  depsCount: l,
14
- onInsert: s
14
+ onInsert: r
15
15
  }) {
16
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 })),
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 }, (r, u) => ({
20
- value: `$deps[${u}]`,
21
- label: `$deps[${u}]`
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: (r) => {
33
- r && s(r);
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 N({
40
+ function K({
41
41
  rowKey: t,
42
42
  value: e,
43
43
  onChange: l,
44
- fields: s,
45
- fieldOptions: h,
44
+ fields: r,
45
+ fieldOptions: f,
46
46
  depsCount: d
47
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: [
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: (f) => l(f),
56
- fields: s,
57
- fieldOptions: h,
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: (f) => l(f) }),
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 = (f) => {
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 g = e.trim().slice(2, -2).trim();
80
- l(`{{ ${g} ${f} }}`);
79
+ const a = e.trim().slice(2, -2).trim();
80
+ l(`{{ ${a} ${m} }}`);
81
81
  return;
82
82
  }
83
- l($(y ? `${y} ${f}` : f));
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: (f) => l($(f.target.value)),
91
+ onChange: (m) => l($(m.target.value)),
92
92
  style: { flex: 1 }
93
93
  }
94
94
  ),
95
95
  /* @__PURE__ */ i(
96
- K,
96
+ F,
97
97
  {
98
- fields: s,
99
- fieldOptions: h,
98
+ fields: r,
99
+ fieldOptions: f,
100
100
  depsCount: d,
101
101
  onInsert: o
102
102
  }
103
103
  )
104
104
  ] });
105
105
  }
106
- function Y({ value: t, onChange: e, title: l }) {
107
- const [s, h] = _(
106
+ function N({ value: t, onChange: e }) {
107
+ const [l, r] = I(
108
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)));
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 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,
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: O(),
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
- }, g = Array.isArray(t) ? t.filter(
137
- (m) => !!m && m._autoExpr === !0
136
+ }, y = Array.isArray(t) ? t.filter(
137
+ (a) => !!a && a._autoExpr === !0
138
138
  ).length : 0;
139
- return /* @__PURE__ */ c(I.Item, { layout: "vertical", label: l, style: { width: "100%" }, children: [
140
- g > 0 && /* @__PURE__ */ c(
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
- g,
154
+ y,
155
155
  " 条由 required / hidden / disabled / readOnly 表达式自动生成的联动(_autoExpr),请通过「通用属性 / 校验配置」编辑。"
156
156
  ]
157
157
  }
158
158
  ),
159
- s.map((m, n) => /* @__PURE__ */ i(
160
- q,
159
+ l.map((a, u) => /* @__PURE__ */ i(
160
+ Y,
161
161
  {
162
- card: m,
163
- index: n,
164
- onChange: o,
165
- onRemove: f
162
+ card: a,
163
+ index: u,
164
+ onChange: h,
165
+ onRemove: o
166
166
  },
167
- m.id
167
+ a.id
168
168
  )),
169
- /* @__PURE__ */ i(b, { size: "small", type: "dashed", block: !0, onClick: y, children: "+ 添加联动规则" }),
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 q({
173
+ function Y({
174
174
  card: t,
175
175
  index: e,
176
176
  onChange: l,
177
- onRemove: s
177
+ onRemove: r
178
178
  }) {
179
- const h = W(), d = j(), r = D(t.deps), u = t.deps.split(",").map((o) => o.trim()).filter(Boolean);
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: () => s(e), children: "删除" })
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: u,
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: h,
231
+ fields: f,
232
232
  fieldOptions: d,
233
- depsCount: r,
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: h,
246
+ fields: f,
247
247
  fieldOptions: d,
248
- depsCount: r,
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: h,
261
+ fields: f,
262
262
  fieldOptions: d,
263
- depsCount: r,
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: s,
278
- fields: h,
277
+ schemaText: r,
278
+ fields: f,
279
279
  fieldOptions: d,
280
- depsCount: r,
281
- onToggle: u,
280
+ depsCount: n,
281
+ onToggle: h,
282
282
  onRows: o,
283
- onSchema: f
283
+ onSchema: m
284
284
  }) {
285
- const y = (n, a) => {
286
- o(l.map((p, C) => C === n ? { ...p, ...a } : p));
287
- }, g = () => {
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
- }, m = (n) => {
290
- o(l.filter((a, p) => p !== n));
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: (n) => u(n) })
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((n, a) => /* @__PURE__ */ c(
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
- J,
320
+ q,
321
321
  {
322
- row: n,
323
- onChange: (p) => y(a, { key: p })
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
- N,
327
+ K,
328
328
  {
329
- rowKey: n.key,
330
- value: n.value,
331
- onChange: (p) => y(a, { value: p }),
332
- fields: h,
329
+ rowKey: s.key,
330
+ value: s.value,
331
+ onChange: (g) => y(p, { value: g }),
332
+ fields: f,
333
333
  fieldOptions: d,
334
- depsCount: r
334
+ depsCount: n
335
335
  }
336
336
  ) }),
337
- /* @__PURE__ */ i(b, { size: "small", onClick: () => m(a), children: "×" })
337
+ /* @__PURE__ */ i(b, { size: "small", onClick: () => u(p), children: "×" })
338
338
  ]
339
339
  },
340
- `${a}-${n.key}`
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: g,
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: s,
362
- onChange: (n) => f(n.target.value)
361
+ value: r,
362
+ onChange: (s) => m(s.target.value)
363
363
  }
364
364
  )
365
365
  ] })
366
366
  ] });
367
367
  }
368
- function J({
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: V,
380
- onChange: (s) => e(s === R ? "props." : s),
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: (s) => e(`props.${s.target.value}`),
390
+ onChange: (r) => e(`props.${r.target.value}`),
391
391
  style: { width: 96 }
392
392
  }
393
393
  )
394
394
  ] });
395
395
  }
396
- const X = Y;
396
+ const U = N;
397
397
  export {
398
- Y as ReactionsEditor,
399
- X as reactionsEditorWidget
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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"}