@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
@@ -0,0 +1,367 @@
1
+ import { jsx as i, jsxs as g, Fragment as k } from "react/jsx-runtime";
2
+ import { Button as z, Input as E, Select as y, InputNumber as _ } from "antd";
3
+ import { useState as $, useRef as D, useEffect as F, useMemo as j } from "react";
4
+ import { parseExpression as b, stripBraces as I, NO_RIGHT_OPERATORS as T, parseVariable as A, variableToString as G, OPERATOR_OPTIONS as H, RIGHT_MODE_OPTIONS as L, createCondition as q, buildExpression as J } from "./expression-model.js";
5
+ function O({
6
+ value: e,
7
+ onChange: n,
8
+ fields: s,
9
+ fieldOptions: a,
10
+ depsCount: p,
11
+ showSelf: u,
12
+ placeholder: d
13
+ }) {
14
+ const o = j(() => {
15
+ const c = (a && a.length > 0 ? a : s.map((r) => ({ value: r, label: r }))).map((r) => ({
16
+ value: `formData.${r.value}`,
17
+ label: r.label
18
+ })), l = [];
19
+ if (u && l.push({
20
+ value: "$self.value",
21
+ label: "当前字段值($self.value)"
22
+ }), p > 0)
23
+ for (let r = 0; r < p; r++)
24
+ l.push({
25
+ value: `$deps[${r}]`,
26
+ label: `依赖 ${r + 1}($deps[${r}])`
27
+ });
28
+ return l.push({ value: "$index", label: "列表下标($index)" }), l.push({ value: "rootValue", label: "根值(rootValue)" }), [
29
+ ...c.length > 0 ? [{ label: "表单字段", options: c }] : [],
30
+ ...l.length > 0 ? [{ label: "快捷变量", options: l }] : []
31
+ ];
32
+ }, [s, a, p, u]);
33
+ return /* @__PURE__ */ i(
34
+ y,
35
+ {
36
+ size: "small",
37
+ showSearch: !0,
38
+ allowClear: !0,
39
+ value: e || void 0,
40
+ placeholder: d ?? "选择变量",
41
+ onChange: (h) => n(h || ""),
42
+ options: o,
43
+ filterOption: (h, c) => (c?.label || "").toLowerCase().includes(h.toLowerCase()),
44
+ style: { width: "100%" }
45
+ }
46
+ );
47
+ }
48
+ function K({
49
+ mode: e,
50
+ value: n,
51
+ onChange: s,
52
+ fields: a,
53
+ fieldOptions: p,
54
+ depsCount: u,
55
+ showSelf: d
56
+ }) {
57
+ return e === "boolean" ? /* @__PURE__ */ i(
58
+ y,
59
+ {
60
+ size: "small",
61
+ value: n === "true" ? "true" : "false",
62
+ onChange: (o) => s(o || "false"),
63
+ options: [
64
+ { value: "true", label: "true" },
65
+ { value: "false", label: "false" }
66
+ ],
67
+ style: { width: 72 }
68
+ }
69
+ ) : e === "variable" ? /* @__PURE__ */ i("div", { style: { flex: 1, minWidth: 100 }, children: /* @__PURE__ */ i(
70
+ O,
71
+ {
72
+ value: n,
73
+ onChange: s,
74
+ fields: a,
75
+ fieldOptions: p,
76
+ depsCount: u,
77
+ showSelf: d,
78
+ placeholder: "选择值变量"
79
+ }
80
+ ) }) : e === "number" ? /* @__PURE__ */ i(
81
+ _,
82
+ {
83
+ size: "small",
84
+ value: n === "" ? void 0 : Number(n),
85
+ onChange: (o) => s(o == null ? "" : String(o)),
86
+ placeholder: "数字",
87
+ style: { flex: 1, minWidth: 80 }
88
+ }
89
+ ) : /* @__PURE__ */ i(
90
+ E,
91
+ {
92
+ size: "small",
93
+ value: n,
94
+ onChange: (o) => s(o.target.value),
95
+ placeholder: "文本",
96
+ style: { flex: 1, minWidth: 80 }
97
+ }
98
+ );
99
+ }
100
+ function Q({
101
+ condition: e,
102
+ isFirst: n,
103
+ fields: s,
104
+ fieldOptions: a,
105
+ depsCount: p,
106
+ showSelf: u,
107
+ onChange: d,
108
+ onRemove: o
109
+ }) {
110
+ const h = !T.has(e.operator), c = (l) => {
111
+ d({
112
+ operator: l,
113
+ ...T.has(l) ? { right: "" } : {}
114
+ });
115
+ };
116
+ return /* @__PURE__ */ g(
117
+ "div",
118
+ {
119
+ style: {
120
+ display: "flex",
121
+ alignItems: "center",
122
+ gap: 4,
123
+ marginBottom: 4,
124
+ flexWrap: "wrap"
125
+ },
126
+ children: [
127
+ n ? /* @__PURE__ */ i(
128
+ "span",
129
+ {
130
+ style: {
131
+ width: 44,
132
+ fontSize: 11,
133
+ color: "#999",
134
+ flexShrink: 0,
135
+ textAlign: "center"
136
+ },
137
+ children: "当"
138
+ }
139
+ ) : /* @__PURE__ */ i(
140
+ y,
141
+ {
142
+ size: "small",
143
+ value: e.logic,
144
+ onChange: (l) => d({ logic: l }),
145
+ options: [
146
+ { value: "and", label: "且" },
147
+ { value: "or", label: "或" }
148
+ ],
149
+ style: { width: 44, flexShrink: 0 }
150
+ }
151
+ ),
152
+ /* @__PURE__ */ i("div", { style: { flex: "1 1 110px", minWidth: 110 }, children: /* @__PURE__ */ i(
153
+ O,
154
+ {
155
+ value: G(e.variable),
156
+ onChange: (l) => d({ variable: A(l) }),
157
+ fields: s,
158
+ fieldOptions: a,
159
+ depsCount: p,
160
+ showSelf: u
161
+ }
162
+ ) }),
163
+ /* @__PURE__ */ i(
164
+ y,
165
+ {
166
+ size: "small",
167
+ value: e.operator,
168
+ onChange: c,
169
+ options: H,
170
+ style: { width: 92, flexShrink: 0 }
171
+ }
172
+ ),
173
+ h && /* @__PURE__ */ g(k, { children: [
174
+ /* @__PURE__ */ i(
175
+ y,
176
+ {
177
+ size: "small",
178
+ value: e.rightMode,
179
+ onChange: (l) => d({ rightMode: l }),
180
+ options: L,
181
+ style: { width: 56, flexShrink: 0 }
182
+ }
183
+ ),
184
+ /* @__PURE__ */ i("div", { style: { flex: "1 1 80px", minWidth: 80 }, children: /* @__PURE__ */ i(
185
+ K,
186
+ {
187
+ mode: e.rightMode,
188
+ value: e.right,
189
+ onChange: (l) => d({ right: l }),
190
+ fields: s,
191
+ fieldOptions: a,
192
+ depsCount: p,
193
+ showSelf: u
194
+ }
195
+ ) })
196
+ ] }),
197
+ /* @__PURE__ */ i(
198
+ z,
199
+ {
200
+ size: "small",
201
+ type: "text",
202
+ onClick: o,
203
+ style: { flexShrink: 0, color: "#bbb" },
204
+ title: "删除条件",
205
+ children: "×"
206
+ }
207
+ )
208
+ ]
209
+ }
210
+ );
211
+ }
212
+ function U(e) {
213
+ return typeof e != "string" || !e.trim() ? "builder" : b(e) === null ? "raw" : "builder";
214
+ }
215
+ function X(e) {
216
+ if (typeof e != "string" || !e.trim())
217
+ return [];
218
+ const n = b(e);
219
+ return n === null ? [] : n;
220
+ }
221
+ function Y(e) {
222
+ return typeof e == "string" ? I(e) : "";
223
+ }
224
+ function le({
225
+ value: e,
226
+ onChange: n,
227
+ fields: s = [],
228
+ fieldOptions: a,
229
+ depsCount: p = 0,
230
+ showSelf: u = !0,
231
+ emitEmpty: d = "template",
232
+ allowAdvanced: o = !0,
233
+ placeholder: h = "{{ formData.xxx == 'yyy' }}"
234
+ }) {
235
+ const [c, l] = $(() => U(e)), [r, S] = $(
236
+ () => X(e)
237
+ ), [x, R] = $(() => Y(e)), w = D(typeof e == "string" ? e : "");
238
+ F(() => {
239
+ if (e !== w.current) {
240
+ w.current = typeof e == "string" ? e : "";
241
+ const t = typeof e == "string" ? b(e) : [];
242
+ S(t === null ? [] : t), l(t === null ? "raw" : "builder"), R(typeof e == "string" ? I(e) : "");
243
+ }
244
+ }, [e]);
245
+ const v = (t) => {
246
+ S(t);
247
+ const f = J(t), m = f === "{{ }}" && d === "empty" ? "" : f;
248
+ w.current = m, n(m);
249
+ }, B = (t) => {
250
+ R(t), w.current = t, n(t);
251
+ }, M = () => {
252
+ R(typeof e == "string" ? I(e) : ""), l("raw");
253
+ }, V = () => {
254
+ const t = b(x);
255
+ t !== null && (S(t), l("builder"));
256
+ }, W = (t, f) => {
257
+ v(r.map((m) => m.id === t ? { ...m, ...f } : m));
258
+ }, N = (t) => {
259
+ v(r.filter((f) => f.id !== t));
260
+ }, P = () => {
261
+ v([...r, q()]);
262
+ }, C = c === "raw" && x.trim() !== "" && b(x) === null;
263
+ return /* @__PURE__ */ i("div", { style: { width: "100%" }, children: c === "builder" ? /* @__PURE__ */ g(k, { children: [
264
+ r.length === 0 ? /* @__PURE__ */ i(
265
+ "div",
266
+ {
267
+ style: {
268
+ fontSize: 11,
269
+ color: "#999",
270
+ background: "#fafafa",
271
+ border: "1px dashed #e0e0e0",
272
+ borderRadius: 6,
273
+ padding: "6px 8px",
274
+ marginBottom: 4
275
+ },
276
+ children: "点击下方「添加条件」组合 变量 / 操作符 / 值 生成表达式。"
277
+ }
278
+ ) : r.map((t, f) => /* @__PURE__ */ i(
279
+ Q,
280
+ {
281
+ condition: t,
282
+ isFirst: f === 0,
283
+ fields: s,
284
+ fieldOptions: a,
285
+ depsCount: p,
286
+ showSelf: u,
287
+ onChange: (m) => W(t.id, m),
288
+ onRemove: () => N(t.id)
289
+ },
290
+ t.id
291
+ )),
292
+ /* @__PURE__ */ g(
293
+ "div",
294
+ {
295
+ style: {
296
+ display: "flex",
297
+ alignItems: "center",
298
+ gap: 4,
299
+ marginTop: 2
300
+ },
301
+ children: [
302
+ /* @__PURE__ */ i(z, { size: "small", type: "dashed", onClick: P, children: "+ 添加条件" }),
303
+ o && /* @__PURE__ */ i(
304
+ z,
305
+ {
306
+ size: "small",
307
+ type: "link",
308
+ onClick: M,
309
+ style: { padding: "0 4px", height: "auto", fontSize: 11 },
310
+ children: "高级表达式"
311
+ }
312
+ )
313
+ ]
314
+ }
315
+ )
316
+ ] }) : /* @__PURE__ */ g(k, { children: [
317
+ /* @__PURE__ */ i(
318
+ E.TextArea,
319
+ {
320
+ rows: 2,
321
+ size: "small",
322
+ value: x,
323
+ onChange: (t) => B(t.target.value),
324
+ placeholder: h,
325
+ style: { fontFamily: "monospace", fontSize: 12 }
326
+ }
327
+ ),
328
+ /* @__PURE__ */ g(
329
+ "div",
330
+ {
331
+ style: {
332
+ display: "flex",
333
+ alignItems: "center",
334
+ justifyContent: "space-between",
335
+ marginTop: 2
336
+ },
337
+ children: [
338
+ /* @__PURE__ */ i(
339
+ "span",
340
+ {
341
+ style: {
342
+ fontSize: 11,
343
+ color: C ? "#ff4d4f" : "#999"
344
+ },
345
+ children: C ? "当前表达式无法结构化,可继续手动编辑或点击返回" : "表达式需返回 boolean,变量仅限 $deps / $self / $form / $index / formData / rootValue"
346
+ }
347
+ ),
348
+ o && /* @__PURE__ */ i(
349
+ z,
350
+ {
351
+ size: "small",
352
+ type: "link",
353
+ onClick: V,
354
+ style: { padding: "0 4px", height: "auto", fontSize: 11 },
355
+ disabled: C,
356
+ children: "返回可视化"
357
+ }
358
+ )
359
+ ]
360
+ }
361
+ )
362
+ ] }) });
363
+ }
364
+ export {
365
+ le as ExpressionBuilder
366
+ };
367
+ //# sourceMappingURL=expression-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression-builder.js","sources":["../../../src/widgets/expression-builder.tsx"],"sourcesContent":["// ============================================================================\n// ExpressionBuilder — 可视化表达式构建器\n// 通过「变量 + 操作符 + 值」的条件行交互生成 `{{ ... }}` 布尔表达式,\n// 避免手写表达式。保留「高级表达式」原始编辑回退(解析失败时自动进入)。\n//\n// 状态策略:本地工作副本(conditions/raw)为唯一编辑源,每次编辑即提交;\n// 用 lastEmittedRef 跳过「自身 onChange → 引擎值回传」造成的受控重置,\n// 外部 value 变化(切换节点等)才重建工作副本。\n// ============================================================================\n\nimport { Button, Input, InputNumber, Select } from 'antd';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport {\n buildExpression,\n type ConditionOperator,\n createCondition,\n type ExprCondition,\n NO_RIGHT_OPERATORS,\n OPERATOR_OPTIONS,\n parseExpression,\n parseVariable,\n RIGHT_MODE_OPTIONS,\n type RightMode,\n stripBraces,\n variableToString,\n} from './expression-model';\n\n// ────────────────────────────────────────────────────────────────────────────\n// VariableSelect — 变量选择器(表单字段 + 快捷变量)\n// ────────────────────────────────────────────────────────────────────────────\n\ninterface VariableSelectProps {\n value: string;\n onChange: (text: string) => void;\n fields: string[];\n /** 可选字段标题列表(显示 title,值为路径 key);缺省时退化为 path 即 label */\n fieldOptions?: Array<{ value: string; label: string }>;\n depsCount: number;\n showSelf: boolean;\n placeholder?: string;\n}\n\nfunction VariableSelect({\n value,\n onChange,\n fields,\n fieldOptions,\n depsCount,\n showSelf,\n placeholder,\n}: VariableSelectProps) {\n const groups = useMemo(() => {\n const base =\n fieldOptions && fieldOptions.length > 0\n ? fieldOptions\n : fields.map((f) => ({ value: f, label: f }));\n const fieldOptions2 = base.map((o) => ({\n value: `formData.${o.value}`,\n label: o.label,\n }));\n const special: Array<{ value: string; label: string }> = [];\n if (showSelf) {\n special.push({\n value: '$self.value',\n label: '当前字段值($self.value)',\n });\n }\n if (depsCount > 0) {\n for (let i = 0; i < depsCount; i++) {\n special.push({\n value: `$deps[${i}]`,\n label: `依赖 ${i + 1}($deps[${i}])`,\n });\n }\n }\n special.push({ value: '$index', label: '列表下标($index)' });\n special.push({ value: 'rootValue', label: '根值(rootValue)' });\n return [\n ...(fieldOptions2.length > 0\n ? [{ label: '表单字段', options: fieldOptions2 }]\n : []),\n ...(special.length > 0 ? [{ label: '快捷变量', options: special }] : []),\n ];\n }, [fields, fieldOptions, depsCount, showSelf]);\n\n return (\n <Select\n size='small'\n showSearch\n allowClear\n value={value || undefined}\n placeholder={placeholder ?? '选择变量'}\n onChange={(v) => onChange((v as string) || '')}\n options={groups}\n filterOption={(input, option) =>\n ((option?.label as string) || '')\n .toLowerCase()\n .includes(input.toLowerCase())\n }\n style={{ width: '100%' }}\n />\n );\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// 条件行编辑\n// ────────────────────────────────────────────────────────────────────────────\n\nfunction RightValueEditor({\n mode,\n value,\n onChange,\n fields,\n fieldOptions,\n depsCount,\n showSelf,\n}: {\n mode: RightMode;\n value: string;\n onChange: (right: string) => void;\n fields: string[];\n fieldOptions?: Array<{ value: string; label: string }>;\n depsCount: number;\n showSelf: boolean;\n}) {\n if (mode === 'boolean') {\n return (\n <Select\n size='small'\n value={value === 'true' ? 'true' : 'false'}\n onChange={(v) => onChange((v as string) || 'false')}\n options={[\n { value: 'true', label: 'true' },\n { value: 'false', label: 'false' },\n ]}\n style={{ width: 72 }}\n />\n );\n }\n if (mode === 'variable') {\n return (\n <div style={{ flex: 1, minWidth: 100 }}>\n <VariableSelect\n value={value}\n onChange={onChange}\n fields={fields}\n fieldOptions={fieldOptions}\n depsCount={depsCount}\n showSelf={showSelf}\n placeholder='选择值变量'\n />\n </div>\n );\n }\n if (mode === 'number') {\n return (\n <InputNumber\n size='small'\n value={value === '' ? undefined : Number(value)}\n onChange={(v) => onChange(v == null ? '' : String(v))}\n placeholder='数字'\n style={{ flex: 1, minWidth: 80 }}\n />\n );\n }\n return (\n <Input\n size='small'\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder='文本'\n style={{ flex: 1, minWidth: 80 }}\n />\n );\n}\n\nfunction ConditionRow({\n condition,\n isFirst,\n fields,\n fieldOptions,\n depsCount,\n showSelf,\n onChange,\n onRemove,\n}: {\n condition: ExprCondition;\n isFirst: boolean;\n fields: string[];\n fieldOptions?: Array<{ value: string; label: string }>;\n depsCount: number;\n showSelf: boolean;\n onChange: (patch: Partial<ExprCondition>) => void;\n onRemove: () => void;\n}) {\n const needRight = !NO_RIGHT_OPERATORS.has(condition.operator);\n\n const handleOperator = (op: ConditionOperator) => {\n onChange({\n operator: op,\n ...(NO_RIGHT_OPERATORS.has(op) ? { right: '' } : {}),\n });\n };\n\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n marginBottom: 4,\n flexWrap: 'wrap',\n }}\n >\n {isFirst ? (\n <span\n style={{\n width: 44,\n fontSize: 11,\n color: '#999',\n flexShrink: 0,\n textAlign: 'center',\n }}\n >\n 当\n </span>\n ) : (\n <Select\n size='small'\n value={condition.logic}\n onChange={(v) => onChange({ logic: v as 'and' | 'or' })}\n options={[\n { value: 'and', label: '且' },\n { value: 'or', label: '或' },\n ]}\n style={{ width: 44, flexShrink: 0 }}\n />\n )}\n\n <div style={{ flex: '1 1 110px', minWidth: 110 }}>\n <VariableSelect\n value={variableToString(condition.variable)}\n onChange={(text) => onChange({ variable: parseVariable(text) })}\n fields={fields}\n fieldOptions={fieldOptions}\n depsCount={depsCount}\n showSelf={showSelf}\n />\n </div>\n\n <Select\n size='small'\n value={condition.operator}\n onChange={handleOperator}\n options={OPERATOR_OPTIONS}\n style={{ width: 92, flexShrink: 0 }}\n />\n\n {needRight && (\n <>\n <Select\n size='small'\n value={condition.rightMode}\n onChange={(v) => onChange({ rightMode: v as RightMode })}\n options={RIGHT_MODE_OPTIONS}\n style={{ width: 56, flexShrink: 0 }}\n />\n <div style={{ flex: '1 1 80px', minWidth: 80 }}>\n <RightValueEditor\n mode={condition.rightMode}\n value={condition.right}\n onChange={(right) => onChange({ right })}\n fields={fields}\n fieldOptions={fieldOptions}\n depsCount={depsCount}\n showSelf={showSelf}\n />\n </div>\n </>\n )}\n\n <Button\n size='small'\n type='text'\n onClick={onRemove}\n style={{ flexShrink: 0, color: '#bbb' }}\n title='删除条件'\n >\n ×\n </Button>\n </div>\n );\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// ExpressionBuilder — 主组件\n// ────────────────────────────────────────────────────────────────────────────\n\nexport interface ExpressionBuilderProps {\n value?: string;\n onChange: (next: string) => void;\n /** 可选表单字段路径(formData.<path>) */\n fields?: string[];\n /** 可选字段标题列表(显示 title,值为路径 key);缺省时表单字段退化为 path 即 label */\n fieldOptions?: Array<{ value: string; label: string }>;\n /** 渲染 $deps[0..depsCount-1] 快捷变量 */\n depsCount?: number;\n showSelf?: boolean;\n /** 条件全部移除时的提交值:template=保持表达式模式({{ }}),empty=清空('') */\n emitEmpty?: 'template' | 'empty';\n /** 是否显示「高级表达式」原始编辑入口 */\n allowAdvanced?: boolean;\n placeholder?: string;\n}\n\nfunction getInitMode(value: string | undefined): 'builder' | 'raw' {\n if (typeof value !== 'string' || !value.trim()) {\n return 'builder';\n }\n return parseExpression(value) === null ? 'raw' : 'builder';\n}\n\nfunction getInitConditions(value: string | undefined): ExprCondition[] {\n if (typeof value !== 'string' || !value.trim()) {\n return [];\n }\n const parsed = parseExpression(value);\n return parsed === null ? [] : parsed;\n}\n\nfunction getInitRaw(value: string | undefined): string {\n return typeof value === 'string' ? stripBraces(value) : '';\n}\n\nexport function ExpressionBuilder({\n value,\n onChange,\n fields = [],\n fieldOptions,\n depsCount = 0,\n showSelf = true,\n emitEmpty = 'template',\n allowAdvanced = true,\n placeholder = \"{{ formData.xxx == 'yyy' }}\",\n}: ExpressionBuilderProps) {\n const [mode, setMode] = useState<'builder' | 'raw'>(() => getInitMode(value));\n const [conditions, setConditions] = useState<ExprCondition[]>(() =>\n getInitConditions(value),\n );\n const [raw, setRaw] = useState<string>(() => getInitRaw(value));\n const lastEmittedRef = useRef<string>(typeof value === 'string' ? value : '');\n\n // 外部 value 变化(切换节点 / 属性表单重新初始化)时重建工作副本;\n // 自身 onChange 引起的值回传不重置(lastEmittedRef 相等时跳过)\n useEffect(() => {\n if (value !== lastEmittedRef.current) {\n lastEmittedRef.current = typeof value === 'string' ? value : '';\n const parsed = typeof value === 'string' ? parseExpression(value) : [];\n setConditions(parsed === null ? [] : parsed);\n setMode(parsed === null ? 'raw' : 'builder');\n setRaw(typeof value === 'string' ? stripBraces(value) : '');\n }\n }, [value]);\n\n const emitBuilder = (next: ExprCondition[]) => {\n setConditions(next);\n const expr = buildExpression(next);\n const out = expr === '{{ }}' && emitEmpty === 'empty' ? '' : expr;\n lastEmittedRef.current = out;\n onChange(out);\n };\n\n const emitRaw = (text: string) => {\n setRaw(text);\n lastEmittedRef.current = text;\n onChange(text);\n };\n\n const switchToRaw = () => {\n setRaw(typeof value === 'string' ? stripBraces(value) : '');\n setMode('raw');\n };\n\n const switchToBuilder = () => {\n const parsed = parseExpression(raw);\n if (parsed === null) {\n return;\n }\n setConditions(parsed);\n setMode('builder');\n };\n\n const updateCondition = (id: string, patch: Partial<ExprCondition>) => {\n emitBuilder(conditions.map((c) => (c.id === id ? { ...c, ...patch } : c)));\n };\n\n const removeCondition = (id: string) => {\n emitBuilder(conditions.filter((c) => c.id !== id));\n };\n\n const addCondition = () => {\n emitBuilder([...conditions, createCondition()]);\n };\n\n const rawParseFailed =\n mode === 'raw' && raw.trim() !== '' && parseExpression(raw) === null;\n\n return (\n <div style={{ width: '100%' }}>\n {mode === 'builder' ? (\n <>\n {conditions.length === 0 ? (\n <div\n style={{\n fontSize: 11,\n color: '#999',\n background: '#fafafa',\n border: '1px dashed #e0e0e0',\n borderRadius: 6,\n padding: '6px 8px',\n marginBottom: 4,\n }}\n >\n 点击下方「添加条件」组合 变量 / 操作符 / 值 生成表达式。\n </div>\n ) : (\n conditions.map((c, i) => (\n <ConditionRow\n key={c.id}\n condition={c}\n isFirst={i === 0}\n fields={fields}\n fieldOptions={fieldOptions}\n depsCount={depsCount}\n showSelf={showSelf}\n onChange={(patch) => updateCondition(c.id, patch)}\n onRemove={() => removeCondition(c.id)}\n />\n ))\n )}\n\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n marginTop: 2,\n }}\n >\n <Button size='small' type='dashed' onClick={addCondition}>\n + 添加条件\n </Button>\n {allowAdvanced && (\n <Button\n size='small'\n type='link'\n onClick={switchToRaw}\n style={{ padding: '0 4px', height: 'auto', fontSize: 11 }}\n >\n 高级表达式\n </Button>\n )}\n </div>\n </>\n ) : (\n <>\n <Input.TextArea\n rows={2}\n size='small'\n value={raw}\n onChange={(e) => emitRaw(e.target.value)}\n placeholder={placeholder}\n style={{ fontFamily: 'monospace', fontSize: 12 }}\n />\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginTop: 2,\n }}\n >\n <span\n style={{\n fontSize: 11,\n color: rawParseFailed ? '#ff4d4f' : '#999',\n }}\n >\n {rawParseFailed\n ? '当前表达式无法结构化,可继续手动编辑或点击返回'\n : '表达式需返回 boolean,变量仅限 $deps / $self / $form / $index / formData / rootValue'}\n </span>\n {allowAdvanced && (\n <Button\n size='small'\n type='link'\n onClick={switchToBuilder}\n style={{ padding: '0 4px', height: 'auto', fontSize: 11 }}\n disabled={rawParseFailed}\n >\n 返回可视化\n </Button>\n )}\n </div>\n </>\n )}\n </div>\n );\n}\n"],"names":["VariableSelect","value","onChange","fields","fieldOptions","depsCount","showSelf","placeholder","groups","useMemo","fieldOptions2","f","o","special","i","jsx","Select","v","input","option","RightValueEditor","mode","InputNumber","Input","e","ConditionRow","condition","isFirst","onRemove","needRight","NO_RIGHT_OPERATORS","handleOperator","op","jsxs","variableToString","text","parseVariable","OPERATOR_OPTIONS","Fragment","RIGHT_MODE_OPTIONS","right","Button","getInitMode","parseExpression","getInitConditions","parsed","getInitRaw","stripBraces","ExpressionBuilder","emitEmpty","allowAdvanced","setMode","useState","conditions","setConditions","raw","setRaw","lastEmittedRef","useRef","useEffect","emitBuilder","next","expr","buildExpression","out","emitRaw","switchToRaw","switchToBuilder","updateCondition","id","patch","c","removeCondition","addCondition","createCondition","rawParseFailed"],"mappings":"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"}