@xbeeant/form-engine-designer 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/es/Canvas.js +42 -47
- package/dist/es/Canvas.js.map +1 -1
- package/dist/es/Designer.js +121 -98
- package/dist/es/Designer.js.map +1 -1
- package/dist/es/DesignerContext.js +86 -73
- package/dist/es/DesignerContext.js.map +1 -1
- package/dist/es/Palette.js +3 -3
- package/dist/es/Palette.js.map +1 -1
- package/dist/es/PropertyPanel.js +99 -100
- package/dist/es/PropertyPanel.js.map +1 -1
- package/dist/es/catalog.js +17 -10
- package/dist/es/catalog.js.map +1 -1
- package/dist/es/designer-context.js +110 -0
- package/dist/es/designer-context.js.map +1 -0
- package/dist/es/history.js +73 -0
- package/dist/es/history.js.map +1 -0
- package/dist/es/index.css +1 -1
- package/dist/es/index.js +3 -3
- package/dist/es/property/basic-property.js +6 -0
- package/dist/es/property/basic-property.js.map +1 -1
- package/dist/es/property-panel.js +294 -0
- package/dist/es/property-panel.js.map +1 -0
- package/dist/es/resizable-panel.js +103 -0
- package/dist/es/resizable-panel.js.map +1 -0
- package/dist/es/schema-utils.js +286 -0
- package/dist/es/schema-utils.js.map +1 -0
- package/dist/es/widgets/BindEditor.js +60 -49
- package/dist/es/widgets/BindEditor.js.map +1 -1
- package/dist/es/widgets/CodeEditor.js +41 -49
- package/dist/es/widgets/CodeEditor.js.map +1 -1
- package/dist/es/widgets/DefaultEditor.js +25 -30
- package/dist/es/widgets/DefaultEditor.js.map +1 -1
- package/dist/es/widgets/DependenciesEditor.js +21 -21
- package/dist/es/widgets/DependenciesEditor.js.map +1 -1
- package/dist/es/widgets/EnumEditor.js +25 -31
- package/dist/es/widgets/EnumEditor.js.map +1 -1
- package/dist/es/widgets/ExpressionSwitch.js +32 -30
- package/dist/es/widgets/ExpressionSwitch.js.map +1 -1
- package/dist/es/widgets/ReactionsEditor.js +103 -103
- package/dist/es/widgets/ReactionsEditor.js.map +1 -1
- package/dist/es/widgets/RemoteDataEditor.js +63 -63
- package/dist/es/widgets/RemoteDataEditor.js.map +1 -1
- package/dist/es/widgets/ValidateEditor.js +49 -49
- package/dist/es/widgets/ValidateEditor.js.map +1 -1
- package/dist/es/widgets/bind-editor.js +78 -0
- package/dist/es/widgets/bind-editor.js.map +1 -0
- package/dist/es/widgets/code-editor.js +76 -0
- package/dist/es/widgets/code-editor.js.map +1 -0
- package/dist/es/widgets/default-editor.js +50 -0
- package/dist/es/widgets/default-editor.js.map +1 -0
- package/dist/es/widgets/dependencies-editor.js +36 -0
- package/dist/es/widgets/dependencies-editor.js.map +1 -0
- package/dist/es/widgets/enum-editor.js +43 -0
- package/dist/es/widgets/enum-editor.js.map +1 -0
- package/dist/es/widgets/expression-builder.js +367 -0
- package/dist/es/widgets/expression-builder.js.map +1 -0
- package/dist/es/widgets/expression-model.js +340 -0
- package/dist/es/widgets/expression-model.js.map +1 -0
- package/dist/es/widgets/expression-switch.js +49 -0
- package/dist/es/widgets/expression-switch.js.map +1 -0
- package/dist/es/widgets/index.js +13 -13
- package/dist/es/widgets/index.js.map +1 -1
- package/dist/es/widgets/options-editor.js +102 -0
- package/dist/es/widgets/options-editor.js.map +1 -0
- package/dist/es/widgets/reactions-editor.js +401 -0
- package/dist/es/widgets/reactions-editor.js.map +1 -0
- package/dist/es/widgets/reactions-model.js +107 -0
- package/dist/es/widgets/reactions-model.js.map +1 -0
- package/dist/es/widgets/remote-data-editor.js +314 -0
- package/dist/es/widgets/remote-data-editor.js.map +1 -0
- package/dist/es/widgets/use-form-data-fields.js +16 -0
- package/dist/es/widgets/use-form-data-fields.js.map +1 -0
- package/dist/es/widgets/validate-editor.js +118 -0
- package/dist/es/widgets/validate-editor.js.map +1 -0
- package/package.json +4 -5
- package/dist/es/react/src/components/FormController.js +0 -160
- package/dist/es/react/src/components/FormController.js.map +0 -1
- package/dist/es/react/src/components/NexusField.js +0 -98
- package/dist/es/react/src/components/NexusField.js.map +0 -1
- package/dist/es/react/src/components/NexusForm.js +0 -128
- package/dist/es/react/src/components/NexusForm.js.map +0 -1
- package/dist/es/react/src/components/NexusFormProvider.js +0 -19
- package/dist/es/react/src/components/NexusFormProvider.js.map +0 -1
- package/dist/es/react/src/components/NexusLayout.js +0 -49
- package/dist/es/react/src/components/NexusLayout.js.map +0 -1
- package/dist/es/react/src/components/NexusObject.js +0 -65
- package/dist/es/react/src/components/NexusObject.js.map +0 -1
- package/dist/es/react/src/contexts/FieldInheritContext.js +0 -6
- package/dist/es/react/src/contexts/FieldInheritContext.js.map +0 -1
- package/dist/es/react/src/contexts/GridContext.js +0 -6
- package/dist/es/react/src/contexts/GridContext.js.map +0 -1
- package/dist/es/react/src/contexts/LayoutConfigContext.js +0 -6
- package/dist/es/react/src/contexts/LayoutConfigContext.js.map +0 -1
- package/dist/es/react/src/contexts/NexusContext.js +0 -13
- package/dist/es/react/src/contexts/NexusContext.js.map +0 -1
- package/dist/es/react/src/hooks/useForm.js +0 -13
- package/dist/es/react/src/hooks/useForm.js.map +0 -1
- package/dist/es/react/src/utils/renderTreeNode.js +0 -18
- package/dist/es/react/src/utils/renderTreeNode.js.map +0 -1
- package/dist/es/react/src/utils/resolveColSpan.js +0 -10
- package/dist/es/react/src/utils/resolveColSpan.js.map +0 -1
- package/src/Canvas.tsx +0 -1111
- package/src/Designer.css +0 -206
- package/src/Designer.tsx +0 -254
- package/src/DesignerContext.tsx +0 -192
- package/src/Palette.tsx +0 -261
- package/src/PropertyPanel.tsx +0 -486
- package/src/ResizablePanel.tsx +0 -210
- package/src/catalog.ts +0 -527
- package/src/index.ts +0 -25
- package/src/property/basic-property.ts +0 -126
- package/src/schemaUtils.test.ts +0 -261
- package/src/schemaUtils.ts +0 -627
- package/src/types.ts +0 -38
- package/src/vite-env.d.ts +0 -1
- package/src/widgets/BindEditor.tsx +0 -105
- package/src/widgets/CodeEditor.tsx +0 -114
- package/src/widgets/DefaultEditor.tsx +0 -73
- package/src/widgets/DependenciesEditor.tsx +0 -56
- package/src/widgets/EnumEditor.tsx +0 -66
- package/src/widgets/ExpressionBuilder.tsx +0 -509
- package/src/widgets/ExpressionSwitch.tsx +0 -62
- package/src/widgets/OptionsEditor.tsx +0 -141
- package/src/widgets/ReactionsEditor.tsx +0 -532
- package/src/widgets/RemoteDataEditor.tsx +0 -382
- package/src/widgets/ValidateEditor.tsx +0 -162
- package/src/widgets/expressionModel.test.ts +0 -262
- package/src/widgets/expressionModel.ts +0 -573
- package/src/widgets/index.ts +0 -45
- package/src/widgets/reactionsModel.ts +0 -190
- package/src/widgets/useFormDataFields.ts +0 -21
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
import { jsxs as c, jsx as i, Fragment as T } from "react/jsx-runtime";
|
|
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
|
+
import { ExpressionBuilder as k } from "./expression-builder.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 "./reactions-model.js";
|
|
6
|
+
import { useFormDataFields as W, useFormDataFieldOptions as j } from "./use-form-data-fields.js";
|
|
7
|
+
function D(t) {
|
|
8
|
+
return t.split(",").map((e) => e.trim()).filter(Boolean).length;
|
|
9
|
+
}
|
|
10
|
+
function F({
|
|
11
|
+
fields: t,
|
|
12
|
+
fieldOptions: e,
|
|
13
|
+
depsCount: l,
|
|
14
|
+
onInsert: r
|
|
15
|
+
}) {
|
|
16
|
+
const d = [
|
|
17
|
+
...(e && e.length > 0 ? e : t.map((n) => ({ value: n, label: n }))).map((n) => ({ value: `formData.${n.value}`, label: n.label })),
|
|
18
|
+
{ value: "$self.value", label: "$self.value" },
|
|
19
|
+
...l > 0 ? Array.from({ length: l }, (n, h) => ({
|
|
20
|
+
value: `$deps[${h}]`,
|
|
21
|
+
label: `$deps[${h}]`
|
|
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: (n) => {
|
|
33
|
+
n && r(n);
|
|
34
|
+
},
|
|
35
|
+
options: d,
|
|
36
|
+
style: { width: 104 }
|
|
37
|
+
}
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
function K({
|
|
41
|
+
rowKey: t,
|
|
42
|
+
value: e,
|
|
43
|
+
onChange: l,
|
|
44
|
+
fields: r,
|
|
45
|
+
fieldOptions: f,
|
|
46
|
+
depsCount: d
|
|
47
|
+
}) {
|
|
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
|
+
/* @__PURE__ */ i(
|
|
52
|
+
k,
|
|
53
|
+
{
|
|
54
|
+
value: e,
|
|
55
|
+
onChange: (m) => l(m),
|
|
56
|
+
fields: r,
|
|
57
|
+
fieldOptions: f,
|
|
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: (m) => l(m) }),
|
|
74
|
+
/* @__PURE__ */ i(b, { size: "small", onClick: () => l("{{ }}"), children: "表达式" })
|
|
75
|
+
] });
|
|
76
|
+
const o = (m) => {
|
|
77
|
+
const y = String(e ?? "").trim();
|
|
78
|
+
if (typeof e == "string" && e.trim().startsWith("{{") && e.trim().endsWith("}}")) {
|
|
79
|
+
const a = e.trim().slice(2, -2).trim();
|
|
80
|
+
l(`{{ ${a} ${m} }}`);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
l($(y ? `${y} ${m}` : m));
|
|
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: (m) => l($(m.target.value)),
|
|
92
|
+
style: { flex: 1 }
|
|
93
|
+
}
|
|
94
|
+
),
|
|
95
|
+
/* @__PURE__ */ i(
|
|
96
|
+
F,
|
|
97
|
+
{
|
|
98
|
+
fields: r,
|
|
99
|
+
fieldOptions: f,
|
|
100
|
+
depsCount: d,
|
|
101
|
+
onInsert: o
|
|
102
|
+
}
|
|
103
|
+
)
|
|
104
|
+
] });
|
|
105
|
+
}
|
|
106
|
+
function N({ value: t, onChange: e }) {
|
|
107
|
+
const [l, r] = I(
|
|
108
|
+
() => 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
|
+
}, [t]);
|
|
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
|
+
{
|
|
125
|
+
id: A(),
|
|
126
|
+
deps: "",
|
|
127
|
+
when: "",
|
|
128
|
+
fulfillEnabled: !0,
|
|
129
|
+
fulfillRows: [],
|
|
130
|
+
fulfillSchema: "",
|
|
131
|
+
otherwiseEnabled: !1,
|
|
132
|
+
otherwiseRows: [],
|
|
133
|
+
otherwiseSchema: ""
|
|
134
|
+
}
|
|
135
|
+
]);
|
|
136
|
+
}, y = Array.isArray(t) ? t.filter(
|
|
137
|
+
(a) => !!a && a._autoExpr === !0
|
|
138
|
+
).length : 0;
|
|
139
|
+
return /* @__PURE__ */ c("div", { style: { width: "100%" }, children: [
|
|
140
|
+
y > 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
|
+
y,
|
|
155
|
+
" 条由 required / hidden / disabled / readOnly 表达式自动生成的联动(_autoExpr),请通过「通用属性 / 校验配置」编辑。"
|
|
156
|
+
]
|
|
157
|
+
}
|
|
158
|
+
),
|
|
159
|
+
l.map((a, u) => /* @__PURE__ */ i(
|
|
160
|
+
Y,
|
|
161
|
+
{
|
|
162
|
+
card: a,
|
|
163
|
+
index: u,
|
|
164
|
+
onChange: h,
|
|
165
|
+
onRemove: o
|
|
166
|
+
},
|
|
167
|
+
a.id
|
|
168
|
+
)),
|
|
169
|
+
/* @__PURE__ */ i(b, { size: "small", type: "dashed", block: !0, onClick: m, 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 Y({
|
|
174
|
+
card: t,
|
|
175
|
+
index: e,
|
|
176
|
+
onChange: l,
|
|
177
|
+
onRemove: r
|
|
178
|
+
}) {
|
|
179
|
+
const f = W(), d = j(), n = D(t.deps), h = 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: () => r(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: h,
|
|
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: f,
|
|
232
|
+
fieldOptions: d,
|
|
233
|
+
depsCount: n,
|
|
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: f,
|
|
247
|
+
fieldOptions: d,
|
|
248
|
+
depsCount: n,
|
|
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: f,
|
|
262
|
+
fieldOptions: d,
|
|
263
|
+
depsCount: n,
|
|
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: r,
|
|
278
|
+
fields: f,
|
|
279
|
+
fieldOptions: d,
|
|
280
|
+
depsCount: n,
|
|
281
|
+
onToggle: h,
|
|
282
|
+
onRows: o,
|
|
283
|
+
onSchema: m
|
|
284
|
+
}) {
|
|
285
|
+
const y = (s, p) => {
|
|
286
|
+
o(l.map((g, C) => C === s ? { ...g, ...p } : g));
|
|
287
|
+
}, a = () => {
|
|
288
|
+
o([...l, { key: "required", value: !0 }]);
|
|
289
|
+
}, u = (s) => {
|
|
290
|
+
o(l.filter((p, g) => g !== s));
|
|
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: (s) => h(s) })
|
|
305
|
+
]
|
|
306
|
+
}
|
|
307
|
+
),
|
|
308
|
+
e && /* @__PURE__ */ c(T, { children: [
|
|
309
|
+
l.map((s, p) => /* @__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
|
+
q,
|
|
321
|
+
{
|
|
322
|
+
row: s,
|
|
323
|
+
onChange: (g) => y(p, { key: g })
|
|
324
|
+
}
|
|
325
|
+
),
|
|
326
|
+
/* @__PURE__ */ i("div", { style: { flex: 1 }, children: /* @__PURE__ */ i(
|
|
327
|
+
K,
|
|
328
|
+
{
|
|
329
|
+
rowKey: s.key,
|
|
330
|
+
value: s.value,
|
|
331
|
+
onChange: (g) => y(p, { value: g }),
|
|
332
|
+
fields: f,
|
|
333
|
+
fieldOptions: d,
|
|
334
|
+
depsCount: n
|
|
335
|
+
}
|
|
336
|
+
) }),
|
|
337
|
+
/* @__PURE__ */ i(b, { size: "small", onClick: () => u(p), children: "×" })
|
|
338
|
+
]
|
|
339
|
+
},
|
|
340
|
+
`${p}-${s.key}`
|
|
341
|
+
)),
|
|
342
|
+
/* @__PURE__ */ i(
|
|
343
|
+
b,
|
|
344
|
+
{
|
|
345
|
+
size: "small",
|
|
346
|
+
block: !0,
|
|
347
|
+
style: { marginBottom: 4 },
|
|
348
|
+
onClick: a,
|
|
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: r,
|
|
362
|
+
onChange: (s) => m(s.target.value)
|
|
363
|
+
}
|
|
364
|
+
)
|
|
365
|
+
] })
|
|
366
|
+
] });
|
|
367
|
+
}
|
|
368
|
+
function q({
|
|
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: P,
|
|
380
|
+
onChange: (r) => e(r === R ? "props." : r),
|
|
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: (r) => e(`props.${r.target.value}`),
|
|
391
|
+
style: { width: 96 }
|
|
392
|
+
}
|
|
393
|
+
)
|
|
394
|
+
] });
|
|
395
|
+
}
|
|
396
|
+
const U = N;
|
|
397
|
+
export {
|
|
398
|
+
N as ReactionsEditor,
|
|
399
|
+
U as reactionsEditorWidget
|
|
400
|
+
};
|
|
401
|
+
//# sourceMappingURL=reactions-editor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactions-editor.js","sources":["../../../src/widgets/reactions-editor.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 './expression-builder';\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 './reactions-model';\nimport {\n useFormDataFieldOptions,\n useFormDataFields,\n} from './use-form-data-fields';\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":";;;;;;AA8BA,SAASA,EAAYC,GAAsB;AACzC,SAAOA,EACJ,MAAM,GAAG,EACT,IAAI,CAACC,MAAMA,EAAE,KAAA,CAAM,EACnB,OAAO,OAAO,EAAE;AACrB;AAMA,SAASC,EAAqB;AAAA,EAC5B,QAAAC;AAAA,EACA,cAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AACF,GAKG;AAKD,QAAMC,IAAU;AAAA,IACd,IAJAH,KAAgBA,EAAa,SAAS,IAClCA,IACAD,EAAO,IAAI,CAACK,OAAO,EAAE,OAAOA,GAAG,OAAOA,IAAI,GAEtC,IAAI,CAACC,OAAO,EAAE,OAAO,YAAYA,EAAE,KAAK,IAAI,OAAOA,EAAE,QAAQ;AAAA,IACrE,EAAE,OAAO,eAAe,OAAO,cAAA;AAAA,IAC/B,GAAIJ,IAAY,IACZ,MAAM,KAAK,EAAE,QAAQA,EAAA,GAAa,CAACK,GAAGC,OAAO;AAAA,MAC3C,OAAO,SAASA,CAAC;AAAA,MACjB,OAAO,SAASA,CAAC;AAAA,IAAA,EACjB,IACF,CAAA;AAAA,IACJ,EAAE,OAAO,UAAU,OAAO,SAAA;AAAA,IAC1B,EAAE,OAAO,aAAa,OAAO,YAAA;AAAA,EAAY;AAE3C,SACE,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,aAAY;AAAA,MACZ,OAAO;AAAA,MACP,UAAU,CAACC,MAAM;AACf,QAAIA,KACFR,EAASQ,CAAW;AAAA,MAExB;AAAA,MACA,SAAAP;AAAA,MACA,OAAO,EAAE,OAAO,IAAA;AAAA,IAAI;AAAA,EAAA;AAG1B;AAOA,SAASQ,EAAgB;AAAA,EACvB,QAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,QAAAf;AAAA,EACA,cAAAC;AAAA,EACA,WAAAC;AACF,GAOG;AACD,QAAMc,IAAaC,EAAmB,IAAIJ,CAAM,GAC1CK,IAAS,OAAOJ,KAAU,YAAYA,EAAM,KAAA,EAAO,WAAW,IAAI;AAExE,MAAIE;AACF,WAAIE,IAEA,gBAAAC,EAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,EAAA,GAC3D,UAAA;AAAA,MAAA,gBAAAV;AAAA,QAACW;AAAA,QAAA;AAAA,UACC,OAAAN;AAAA,UACA,UAAU,CAAChB,MAAMiB,EAASjB,CAAC;AAAA,UAC3B,QAAAE;AAAA,UACA,cAAAC;AAAA,UACA,WAAAC;AAAA,UACA,WAAU;AAAA,QAAA;AAAA,MAAA;AAAA,wBAEX,OAAA,EACC,UAAA,gBAAAO;AAAA,QAACY;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,MAAK;AAAA,UACL,SAAS,MAAMN,EAAS,EAAK;AAAA,UAC7B,OAAO,EAAE,UAAU,IAAI,SAAS,SAAS,QAAQ,OAAA;AAAA,UAClD,UAAA;AAAA,QAAA;AAAA,MAAA,EAED,CACF;AAAA,IAAA,GACF,IAIF,gBAAAI,EAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,GAAG,YAAY,SAAA,GACjD,UAAA;AAAA,MAAA,gBAAAV,EAACa,GAAA,EAAO,SAAS,CAAC,CAACR,GAAO,UAAU,CAACH,MAAMI,EAASJ,CAAC,EAAA,CAAG;AAAA,MACxD,gBAAAF,EAACY,KAAO,MAAK,SAAQ,SAAS,MAAMN,EAAS,QAAQ,GAAG,UAAA,MAAA,CAExD;AAAA,IAAA,GACF;AAIJ,QAAMQ,IAAiB,CAACZ,MAAc;AACpC,UAAMa,IAAU,OAAOV,KAAS,EAAE,EAAE,KAAA;AACpC,QACE,OAAOA,KAAU,YACjBA,EAAM,OAAO,WAAW,IAAI,KAC5BA,EAAM,KAAA,EAAO,SAAS,IAAI,GAC1B;AACA,YAAMW,IAAQX,EAAM,KAAA,EAAO,MAAM,GAAG,EAAE,EAAE,KAAA;AACxC,MAAAC,EAAS,MAAMU,CAAK,IAAId,CAAC,KAAK;AAC9B;AAAA,IACF;AACA,IAAAI,EAASW,EAAgBF,IAAU,GAAGA,CAAO,IAAIb,CAAC,KAAKA,CAAC,CAAC;AAAA,EAC3D;AAEA,SACE,gBAAAQ,EAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,GAAG,YAAY,UAAU,MAAM,EAAA,GACjE,UAAA;AAAA,IAAA,gBAAAV;AAAA,MAACkB;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,OAAO,OAAOb,KAAS,EAAE;AAAA,QACzB,UAAU,CAACc,MAAMb,EAASW,EAAgBE,EAAE,OAAO,KAAK,CAAC;AAAA,QACzD,OAAO,EAAE,MAAM,EAAA;AAAA,MAAE;AAAA,IAAA;AAAA,IAEnB,gBAAAnB;AAAA,MAACV;AAAA,MAAA;AAAA,QACC,QAAAC;AAAA,QACA,cAAAC;AAAA,QACA,WAAAC;AAAA,QACA,UAAUqB;AAAA,MAAA;AAAA,IAAA;AAAA,EACZ,GACF;AAEJ;AAMO,SAASM,EAAgB,EAAE,OAAAf,GAAO,UAAAC,KAAyB;AAChE,QAAM,CAACe,GAAOC,CAAQ,IAAIC;AAAA,IAAiB,MACzCC,EAAkBnB,CAAK,EAAE,IAAIoB,CAAc;AAAA,EAAA,GAEvCC,IAAeC,EAAOtB,CAAK,GAI3BuB,IAAiBD,EAAgBtB,CAAK;AAG5C,EAAAwB,EAAU,MAAM;AACd,IAAIH,EAAa,YAAYrB,MAC3BqB,EAAa,UAAUrB,GACnBA,MAAUuB,EAAe,WAC3BN,EAASE,EAAkBnB,CAAK,EAAE,IAAIoB,CAAc,CAAC;AAAA,EAG3D,GAAG,CAACpB,CAAK,CAAC;AAEV,QAAMyB,IAAS,CAACC,MAAiB;AAC/B,IAAAT,EAASS,CAAI;AACb,UAAMC,IAAYD,EACf,IAAIE,CAAc,EAClB,OAAO,CAACC,MAAMA,EAAE,aAAa,SAAS,KAAKA,EAAE,WAAWA,EAAE,SAAS,GAChEC,IAAUH,EAAU,SAAS,IAAIA,IAAY,CAAA;AACnD,IAAAJ,EAAe,UAAUO,GACzB7B,EAAS6B,CAAO;AAAA,EAClB,GAEMC,IAAa,CAACC,GAAeC,MAAyB;AAC1D,IAAAR,EAAOT,EAAM,IAAI,CAACkB,GAAGxC,MAAOA,MAAMsC,IAAQ,EAAE,GAAGE,GAAG,GAAGD,EAAA,IAAUC,CAAE,CAAC;AAAA,EACpE,GAEMC,IAAa,CAACH,MAAkB;AACpC,IAAAP,EAAOT,EAAM,OAAO,CAACvB,GAAGC,MAAMA,MAAMsC,CAAK,CAAC;AAAA,EAC5C,GAEMI,IAAU,MAAM;AACpB,IAAAX,EAAO;AAAA,MACL,GAAGT;AAAA,MACH;AAAA,QACE,IAAIqB,EAAA;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,gBAAgB;AAAA,QAChB,aAAa,CAAA;AAAA,QACb,eAAe;AAAA,QACf,kBAAkB;AAAA,QAClB,eAAe,CAAA;AAAA,QACf,iBAAiB;AAAA,MAAA;AAAA,IACnB,CACD;AAAA,EACH,GAEMC,IAAgB,MAAM,QAAQtC,CAAK,IACrCA,EAAM;AAAA,IACJ,CAAC6B,MAAM,CAAC,CAACA,KAAMA,EAA8B,cAAc;AAAA,EAAA,EAC3D,SACF;AAEJ,2BACG,OAAA,EAAI,OAAO,EAAE,OAAO,UAClB,UAAA;AAAA,IAAAS,IAAgB,KACf,gBAAAjC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,OAAO;AAAA,UACP,cAAc;AAAA,UACd,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,SAAS;AAAA,QAAA;AAAA,QAEZ,UAAA;AAAA,UAAA;AAAA,UACKiC;AAAA,UAAc;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAKrBtB,EAAM,IAAI,CAACuB,GAAMC,MAChB,gBAAA7C;AAAA,MAAC8C;AAAA,MAAA;AAAA,QAEC,MAAAF;AAAA,QACA,OAAOC;AAAA,QACP,UAAUT;AAAA,QACV,UAAUI;AAAA,MAAA;AAAA,MAJLI,EAAK;AAAA,IAAA,CAMb;AAAA,IAED,gBAAA5C,EAACY,GAAA,EAAO,MAAK,SAAQ,MAAK,UAAS,OAAK,IAAC,SAAS6B,GAAS,UAAA,WAAA,CAE3D;AAAA,IACA,gBAAAzC,EAAC,OAAA,EAAI,OAAO,EAAE,UAAU,IAAI,OAAO,QAAQ,WAAW,KAAK,UAAA,yGAAA,CAI3D;AAAA,EAAA,GACF;AAEJ;AAMA,SAAS8C,EAAa;AAAA,EACpB,MAAAF;AAAA,EACA,OAAAP;AAAA,EACA,UAAA/B;AAAA,EACA,UAAAyC;AACF,GAKG;AACD,QAAMxD,IAASyD,EAAA,GACTxD,IAAeyD,EAAA,GACfxD,IAAYN,EAAYyD,EAAK,IAAI,GACjCM,IAAWN,EAAK,KACnB,MAAM,GAAG,EACT,IAAI,CAACvD,MAAMA,EAAE,KAAA,CAAM,EACnB,OAAO,OAAO;AAEjB,SACE,gBAAAqB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,MAAA;AAAA,MAGd,UAAA;AAAA,QAAA,gBAAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,cAAc;AAAA,YAAA;AAAA,YAGhB,UAAA;AAAA,cAAA,gBAAAA,EAAC,QAAA,EAAK,OAAO,EAAE,UAAU,IAAI,YAAY,KAAK,OAAO,OAAA,GAAU,UAAA;AAAA,gBAAA;AAAA,gBACzD2B,IAAQ;AAAA,cAAA,GACd;AAAA,cACA,gBAAArC,EAACY,GAAA,EAAO,MAAK,SAAQ,QAAM,IAAC,SAAS,MAAMmC,EAASV,CAAK,GAAG,UAAA,KAAA,CAE5D;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,0BAGD,OAAA,EAAI,OAAO,EAAE,cAAc,KAC1B,UAAA;AAAA,UAAA,gBAAArC,EAAC,OAAA,EAAI,OAAO,EAAE,UAAU,IAAI,OAAO,QAAQ,cAAc,EAAA,GAAK,UAAA,qBAAA,CAE9D;AAAA,UACA,gBAAAA;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,MAAK;AAAA,cACL,OAAOiD;AAAA,cACP,UAAU,CAACC,MAAS7C,EAAS+B,GAAO,EAAE,MAAMc,EAAK,KAAK,IAAI,GAAG;AAAA,cAC7D,SAAS3D;AAAA,cACT,aAAY;AAAA,cACZ,OAAO,EAAE,OAAO,OAAA;AAAA,YAAO;AAAA,UAAA;AAAA,QACzB,GACF;AAAA,0BAEC,OAAA,EAAI,OAAO,EAAE,cAAc,KAC1B,UAAA;AAAA,UAAA,gBAAAQ,EAAC,OAAA,EAAI,OAAO,EAAE,UAAU,IAAI,OAAO,QAAQ,cAAc,EAAA,GAAK,UAAA,cAAA,CAE9D;AAAA,UACA,gBAAAA;AAAA,YAACW;AAAA,YAAA;AAAA,cACC,OAAOiC,EAAK;AAAA,cACZ,UAAU,CAACvD,MAAMiB,EAAS+B,GAAO,EAAE,MAAMhD,GAAG;AAAA,cAC5C,QAAAE;AAAA,cACA,cAAAC;AAAA,cACA,WAAAC;AAAA,cACA,WAAU;AAAA,cACV,aAAY;AAAA,YAAA;AAAA,UAAA;AAAA,QACd,GACF;AAAA,QAEA,gBAAAO;AAAA,UAACoD;AAAA,UAAA;AAAA,YACC,OAAM;AAAA,YACN,SAASR,EAAK;AAAA,YACd,MAAMA,EAAK;AAAA,YACX,YAAYA,EAAK;AAAA,YACjB,QAAArD;AAAA,YACA,cAAAC;AAAA,YACA,WAAAC;AAAA,YACA,UAAU,CAACS,MAAMI,EAAS+B,GAAO,EAAE,gBAAgBnC,GAAG;AAAA,YACtD,QAAQ,CAACmD,MAAS/C,EAAS+B,GAAO,EAAE,aAAagB,GAAM;AAAA,YACvD,UAAU,CAACC,MAAMhD,EAAS+B,GAAO,EAAE,eAAeiB,GAAG;AAAA,UAAA;AAAA,QAAA;AAAA,QAGvD,gBAAAtD;AAAA,UAACoD;AAAA,UAAA;AAAA,YACC,OAAM;AAAA,YACN,SAASR,EAAK;AAAA,YACd,MAAMA,EAAK;AAAA,YACX,YAAYA,EAAK;AAAA,YACjB,QAAArD;AAAA,YACA,cAAAC;AAAA,YACA,WAAAC;AAAA,YACA,UAAU,CAACS,MAAMI,EAAS+B,GAAO,EAAE,kBAAkBnC,GAAG;AAAA,YACxD,QAAQ,CAACmD,MAAS/C,EAAS+B,GAAO,EAAE,eAAegB,GAAM;AAAA,YACzD,UAAU,CAACC,MAAMhD,EAAS+B,GAAO,EAAE,iBAAiBiB,GAAG;AAAA,UAAA;AAAA,QAAA;AAAA,MACzD;AAAA,IAAA;AAAA,EAAA;AAGN;AAMA,SAASF,EAAa;AAAA,EACpB,OAAAG;AAAA,EACA,SAAAC;AAAA,EACA,MAAAH;AAAA,EACA,YAAAI;AAAA,EACA,QAAAlE;AAAA,EACA,cAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAiE;AAAA,EACA,QAAAC;AAAA,EACA,UAAAC;AACF,GAWG;AACD,QAAMC,IAAY,CAACC,GAAaxB,MAA6B;AAC3D,IAAAqB,EAAON,EAAK,IAAI,CAACnB,GAAGnC,MAAOA,MAAM+D,IAAM,EAAE,GAAG5B,GAAG,GAAGI,EAAA,IAAUJ,CAAE,CAAC;AAAA,EACjE,GAEM6B,IAAS,MAAM;AACnB,IAAAJ,EAAO,CAAC,GAAGN,GAAM,EAAE,KAAK,YAAY,OAAO,GAAA,CAAM,CAAC;AAAA,EACpD,GAEMW,IAAY,CAACF,MAAgB;AACjC,IAAAH,EAAON,EAAK,OAAO,CAACvD,GAAGC,MAAMA,MAAM+D,CAAG,CAAC;AAAA,EACzC;AAEA,2BACG,OAAA,EAAI,OAAO,EAAE,cAAc,KAC1B,UAAA;AAAA,IAAA,gBAAApD;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,gBAAgB;AAAA,UAChB,cAAc;AAAA,QAAA;AAAA,QAGhB,UAAA;AAAA,UAAA,gBAAAV,EAAC,QAAA,EAAK,OAAO,EAAE,UAAU,IAAI,OAAO,OAAA,GAAW,UAAAuD,EAAA,CAAM;AAAA,UACrD,gBAAAvD,EAACa,GAAA,EAAO,MAAK,SAAQ,SAAS2C,GAAS,UAAU,CAACtD,MAAMwD,EAASxD,CAAC,EAAA,CAAG;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAGtEsD,KACC,gBAAA9C,EAAAuD,GAAA,EACG,UAAA;AAAA,MAAAZ,EAAK,IAAI,CAACa,GAAKJ,MACd,gBAAApD;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,OAAO;AAAA,YACL,SAAS;AAAA,YACT,KAAK;AAAA,YACL,YAAY;AAAA,YACZ,cAAc;AAAA,UAAA;AAAA,UAGhB,UAAA;AAAA,YAAA,gBAAAV;AAAA,cAACmE;AAAA,cAAA;AAAA,gBACC,KAAAD;AAAA,gBACA,UAAU,CAACE,MAAQP,EAAUC,GAAK,EAAE,KAAAM,GAAK;AAAA,cAAA;AAAA,YAAA;AAAA,8BAE1C,OAAA,EAAI,OAAO,EAAE,MAAM,KAClB,UAAA,gBAAApE;AAAA,cAACG;AAAA,cAAA;AAAA,gBACC,QAAQ+D,EAAI;AAAA,gBACZ,OAAOA,EAAI;AAAA,gBACX,UAAU,CAAChE,MAAM2D,EAAUC,GAAK,EAAE,OAAO5D,GAAG;AAAA,gBAC5C,QAAAX;AAAA,gBACA,cAAAC;AAAA,gBACA,WAAAC;AAAA,cAAA;AAAA,YAAA,GAEJ;AAAA,YACA,gBAAAO,EAACY,KAAO,MAAK,SAAQ,SAAS,MAAMoD,EAAUF,CAAG,GAAG,UAAA,IAAA,CAEpD;AAAA,UAAA;AAAA,QAAA;AAAA,QAxBK,GAAGA,CAAG,IAAII,EAAI,GAAG;AAAA,MAAA,CA0BzB;AAAA,MACD,gBAAAlE;AAAA,QAACY;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,OAAK;AAAA,UACL,OAAO,EAAE,cAAc,EAAA;AAAA,UACvB,SAASmD;AAAA,UACV,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAID,gBAAA/D,EAAC,OAAA,EAAI,OAAO,EAAE,UAAU,IAAI,OAAO,QAAQ,cAAc,EAAA,GAAK,UAAA,uBAAA,CAE9D;AAAA,MACA,gBAAAA;AAAA,QAACkB,EAAM;AAAA,QAAN;AAAA,UACC,MAAK;AAAA,UACL,MAAM;AAAA,UACN,aAAa;AAAA;AAAA;AAAA,UACb,OAAOuC;AAAA,UACP,UAAU,CAACtC,MAAMyC,EAASzC,EAAE,OAAO,KAAK;AAAA,QAAA;AAAA,MAAA;AAAA,IAC1C,EAAA,CACF;AAAA,EAAA,GAEJ;AAEJ;AAMA,SAASgD,EAAe;AAAA,EACtB,KAAAD;AAAA,EACA,UAAA5D;AACF,GAGG;AACD,QAAM+D,IAAUH,EAAI,IAAI,WAAW,QAAQ;AAC3C,SACE,gBAAAxD,EAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,KAClC,UAAA;AAAA,IAAA,gBAAAV;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,OAAOoE,IAAUC,IAAYJ,EAAI;AAAA,QACjC,SAASK;AAAA,QACT,UAAU,CAACC,MAAMlE,EAASkE,MAAMF,IAAY,WAAWE,CAAC;AAAA,QACxD,OAAO,EAAE,OAAO,IAAA;AAAA,MAAI;AAAA,IAAA;AAAA,IAErBH,KACC,gBAAArE;AAAA,MAACkB;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,aAAY;AAAA,QACZ,OAAOgD,EAAI,IAAI,MAAM,CAAe;AAAA,QACpC,UAAU,CAAC/C,MAAMb,EAAS,SAASa,EAAE,OAAO,KAAK,EAAE;AAAA,QACnD,OAAO,EAAE,OAAO,GAAA;AAAA,MAAG;AAAA,IAAA;AAAA,EACrB,GAEJ;AAEJ;AAEO,MAAMsD,IAAwBrD;"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
const v = /* @__PURE__ */ new Set([
|
|
2
|
+
"visible",
|
|
3
|
+
"hidden",
|
|
4
|
+
"disabled",
|
|
5
|
+
"readOnly",
|
|
6
|
+
"required",
|
|
7
|
+
"loading"
|
|
8
|
+
]), f = "__props", b = [
|
|
9
|
+
{ label: "计算值(value)", value: "value" },
|
|
10
|
+
{ label: "显示(visible)", value: "visible" },
|
|
11
|
+
{ label: "隐藏(hidden)", value: "hidden" },
|
|
12
|
+
{ label: "禁用(disabled)", value: "disabled" },
|
|
13
|
+
{ label: "只读(readOnly)", value: "readOnly" },
|
|
14
|
+
{ label: "必填(required)", value: "required" },
|
|
15
|
+
{ label: "加载中(loading)", value: "loading" },
|
|
16
|
+
{ label: "标题(title)", value: "title" },
|
|
17
|
+
{ label: "描述(description)", value: "description" },
|
|
18
|
+
{ label: "组件属性(props.*)", value: f }
|
|
19
|
+
];
|
|
20
|
+
function c() {
|
|
21
|
+
return Math.random().toString(36).slice(2, 8);
|
|
22
|
+
}
|
|
23
|
+
function w(e) {
|
|
24
|
+
const t = e.trim();
|
|
25
|
+
return t === "true" ? !0 : t === "false" ? !1 : /^-?\d+(\.\d+)?$/.test(t) ? Number(t) : e;
|
|
26
|
+
}
|
|
27
|
+
function d(e) {
|
|
28
|
+
const t = {};
|
|
29
|
+
for (const l of e) {
|
|
30
|
+
const i = l.key.trim();
|
|
31
|
+
i && (l.value === void 0 || l.value === "" || (t[i] = l.value));
|
|
32
|
+
}
|
|
33
|
+
return Object.keys(t).length > 0 ? t : void 0;
|
|
34
|
+
}
|
|
35
|
+
function s(e) {
|
|
36
|
+
return e ? Object.entries(e).map(([t, l]) => ({ key: t, value: l })) : [];
|
|
37
|
+
}
|
|
38
|
+
function h(e) {
|
|
39
|
+
const t = e.trim();
|
|
40
|
+
if (t)
|
|
41
|
+
try {
|
|
42
|
+
const l = JSON.parse(t);
|
|
43
|
+
if (l && typeof l == "object" && !Array.isArray(l))
|
|
44
|
+
return l;
|
|
45
|
+
} catch {
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function u(e) {
|
|
49
|
+
if (!e || Object.keys(e).length === 0)
|
|
50
|
+
return "";
|
|
51
|
+
try {
|
|
52
|
+
return JSON.stringify(e, null, 2);
|
|
53
|
+
} catch {
|
|
54
|
+
return "";
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function p(e) {
|
|
58
|
+
return {
|
|
59
|
+
id: c(),
|
|
60
|
+
deps: (e.dependencies ?? []).join(", "),
|
|
61
|
+
when: e.when ?? "",
|
|
62
|
+
fulfillEnabled: !!e.fulfill,
|
|
63
|
+
fulfillRows: s(e.fulfill?.state),
|
|
64
|
+
fulfillSchema: u(e.fulfill?.schema),
|
|
65
|
+
otherwiseEnabled: !!e.otherwise,
|
|
66
|
+
otherwiseRows: s(e.otherwise?.state),
|
|
67
|
+
otherwiseSchema: u(e.otherwise?.schema)
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
function a(e, t) {
|
|
71
|
+
if (!(t === "fulfill" ? e.fulfillEnabled : e.otherwiseEnabled))
|
|
72
|
+
return;
|
|
73
|
+
const i = t === "fulfill" ? e.fulfillRows : e.otherwiseRows, o = t === "fulfill" ? e.fulfillSchema : e.otherwiseSchema, n = d(i), r = h(o);
|
|
74
|
+
if (!(n === void 0 && r === void 0))
|
|
75
|
+
return {
|
|
76
|
+
...n !== void 0 ? { state: n } : {},
|
|
77
|
+
...r !== void 0 ? { schema: r } : {}
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function m(e) {
|
|
81
|
+
const t = {
|
|
82
|
+
dependencies: e.deps.split(",").map((n) => n.trim()).filter(Boolean)
|
|
83
|
+
}, l = e.when.trim();
|
|
84
|
+
l && (t.when = l);
|
|
85
|
+
const i = a(e, "fulfill"), o = a(e, "otherwise");
|
|
86
|
+
return i && (t.fulfill = i), o && (t.otherwise = o), t;
|
|
87
|
+
}
|
|
88
|
+
function y(e) {
|
|
89
|
+
return Array.isArray(e) ? e.filter(
|
|
90
|
+
(t) => !!t && t._autoExpr !== !0
|
|
91
|
+
) : [];
|
|
92
|
+
}
|
|
93
|
+
export {
|
|
94
|
+
v as BOOLEAN_STATE_KEYS,
|
|
95
|
+
f as PROPS_KEY,
|
|
96
|
+
b as STATE_KEY_OPTIONS,
|
|
97
|
+
m as cardToReaction,
|
|
98
|
+
c as genId,
|
|
99
|
+
w as parsePatchValue,
|
|
100
|
+
h as parseSchemaText,
|
|
101
|
+
p as reactionToCard,
|
|
102
|
+
d as rowsToState,
|
|
103
|
+
u as schemaToText,
|
|
104
|
+
s as stateToRows,
|
|
105
|
+
y as toManualReactions
|
|
106
|
+
};
|
|
107
|
+
//# sourceMappingURL=reactions-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactions-model.js","sources":["../../../src/widgets/reactions-model.ts"],"sourcesContent":["// ============================================================================\n// reactionsModel — ReactionsEditor 的纯数据模型(无 React / DOM 依赖)\n// Reaction ↔ 可编辑卡片(Card)之间的双向转换,以及补丁值解析\n// ============================================================================\n\nimport type { Reaction } from '@xbeeant/form-engine';\n\nexport const BOOLEAN_STATE_KEYS = new Set([\n 'visible',\n 'hidden',\n 'disabled',\n 'readOnly',\n 'required',\n 'loading',\n]);\n\nexport const PROPS_KEY = '__props';\n\nexport const STATE_KEY_OPTIONS: Array<{ label: string; value: string }> = [\n { label: '计算值(value)', value: 'value' },\n { label: '显示(visible)', value: 'visible' },\n { label: '隐藏(hidden)', value: 'hidden' },\n { label: '禁用(disabled)', value: 'disabled' },\n { label: '只读(readOnly)', value: 'readOnly' },\n { label: '必填(required)', value: 'required' },\n { label: '加载中(loading)', value: 'loading' },\n { label: '标题(title)', value: 'title' },\n { label: '描述(description)', value: 'description' },\n { label: '组件属性(props.*)', value: PROPS_KEY },\n];\n\nexport interface PatchRow {\n key: string;\n value: unknown;\n}\n\nexport interface Card {\n id: string;\n deps: string;\n when: string;\n fulfillEnabled: boolean;\n fulfillRows: PatchRow[];\n fulfillSchema: string;\n otherwiseEnabled: boolean;\n otherwiseRows: PatchRow[];\n otherwiseSchema: string;\n}\n\nexport function genId(): string {\n return Math.random().toString(36).slice(2, 8);\n}\n\n/** 文本 → 补丁值:true/false 转布尔、数字转 number,其余(含 {{ }} 表达式)保留字符串 */\nexport function parsePatchValue(text: string): unknown {\n const t = text.trim();\n if (t === 'true') {\n return true;\n }\n if (t === 'false') {\n return false;\n }\n if (/^-?\\d+(\\.\\d+)?$/.test(t)) {\n return Number(t);\n }\n return text;\n}\n\nexport function rowsToState(\n rows: PatchRow[],\n): Record<string, unknown> | undefined {\n const state: Record<string, unknown> = {};\n for (const r of rows) {\n const key = r.key.trim();\n if (!key) {\n continue;\n }\n if (r.value === undefined || r.value === '') {\n continue;\n }\n state[key] = r.value;\n }\n return Object.keys(state).length > 0 ? state : undefined;\n}\n\nexport function stateToRows(state: object | undefined): PatchRow[] {\n return state\n ? Object.entries(state).map(([key, value]) => ({ key, value }))\n : [];\n}\n\nexport function parseSchemaText(\n text: string,\n): Record<string, unknown> | undefined {\n const t = text.trim();\n if (!t) {\n return undefined;\n }\n try {\n const parsed = JSON.parse(t) as unknown;\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n } catch {\n // 非法 JSON:忽略本次提交,等待用户修正\n }\n return undefined;\n}\n\nexport function schemaToText(\n schema: Record<string, unknown> | undefined,\n): string {\n if (!schema || Object.keys(schema).length === 0) {\n return '';\n }\n try {\n return JSON.stringify(schema, null, 2);\n } catch {\n return '';\n }\n}\n\nexport function reactionToCard(r: Reaction): Card {\n return {\n id: genId(),\n deps: (r.dependencies ?? []).join(', '),\n when: r.when ?? '',\n fulfillEnabled: !!r.fulfill,\n fulfillRows: stateToRows(r.fulfill?.state),\n fulfillSchema: schemaToText(r.fulfill?.schema),\n otherwiseEnabled: !!r.otherwise,\n otherwiseRows: stateToRows(r.otherwise?.state),\n otherwiseSchema: schemaToText(r.otherwise?.schema),\n };\n}\n\nfunction buildBranch(\n card: Card,\n branch: 'fulfill' | 'otherwise',\n):\n | { state?: Record<string, unknown>; schema?: Record<string, unknown> }\n | undefined {\n const enabled =\n branch === 'fulfill' ? card.fulfillEnabled : card.otherwiseEnabled;\n if (!enabled) {\n return undefined;\n }\n const rows = branch === 'fulfill' ? card.fulfillRows : card.otherwiseRows;\n const schemaText =\n branch === 'fulfill' ? card.fulfillSchema : card.otherwiseSchema;\n const state = rowsToState(rows);\n const schema = parseSchemaText(schemaText);\n if (state === undefined && schema === undefined) {\n return undefined;\n }\n return {\n ...(state !== undefined ? { state } : {}),\n ...(schema !== undefined ? { schema } : {}),\n };\n}\n\nexport function cardToReaction(card: Card): Reaction {\n const reaction: Reaction = {\n dependencies: card.deps\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean),\n };\n const when = card.when.trim();\n if (when) {\n reaction.when = when;\n }\n const fulfill = buildBranch(card, 'fulfill');\n const otherwise = buildBranch(card, 'otherwise');\n if (fulfill) {\n reaction.fulfill = fulfill;\n }\n if (otherwise) {\n reaction.otherwise = otherwise;\n }\n return reaction;\n}\n\nexport function toManualReactions(value: unknown): Reaction[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.filter(\n (r): r is Reaction => !!r && (r as Reaction)._autoExpr !== true,\n );\n}\n"],"names":["BOOLEAN_STATE_KEYS","PROPS_KEY","STATE_KEY_OPTIONS","genId","parsePatchValue","text","rowsToState","rows","state","r","key","stateToRows","value","parseSchemaText","parsed","schemaToText","schema","reactionToCard","buildBranch","card","branch","schemaText","cardToReaction","reaction","s","when","fulfill","otherwise","toManualReactions"],"mappings":"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"}
|