@xbeeant/form-engine-react 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 (145) hide show
  1. package/dist/cjs/components/FormController.cjs +1 -1
  2. package/dist/cjs/components/NexusField.cjs +1 -1
  3. package/dist/cjs/components/NexusForm.cjs +1 -1
  4. package/dist/cjs/components/form-controller.cjs +1 -0
  5. package/dist/cjs/components/nexus-field.cjs +1 -0
  6. package/dist/cjs/components/nexus-form-provider.cjs +1 -0
  7. package/dist/cjs/components/nexus-form.cjs +1 -0
  8. package/dist/cjs/components/nexus-layout.cjs +1 -0
  9. package/dist/cjs/components/nexus-object.cjs +1 -0
  10. package/dist/cjs/contexts/field-inherit-context.cjs +1 -0
  11. package/dist/cjs/contexts/grid-context.cjs +1 -0
  12. package/dist/cjs/contexts/layout-config-context.cjs +1 -0
  13. package/dist/cjs/contexts/nexus-context.cjs +1 -0
  14. package/dist/cjs/hooks/index.cjs +1 -1
  15. package/dist/cjs/hooks/use-engine.cjs +1 -0
  16. package/dist/cjs/hooks/use-field-state.cjs +1 -0
  17. package/dist/cjs/hooks/use-field-validator.cjs +1 -0
  18. package/dist/cjs/hooks/use-field-value.cjs +1 -0
  19. package/dist/cjs/hooks/use-form-config.cjs +1 -0
  20. package/dist/cjs/hooks/use-form-data.cjs +1 -0
  21. package/dist/cjs/hooks/use-form-submitting.cjs +1 -0
  22. package/dist/cjs/hooks/use-form.cjs +1 -0
  23. package/dist/cjs/hooks/use-nexus-context.cjs +1 -0
  24. package/dist/cjs/hooks/use-watch-all.cjs +1 -0
  25. package/dist/cjs/hooks/use-watch-multiple.cjs +1 -0
  26. package/dist/cjs/hooks/use-watch-state.cjs +1 -0
  27. package/dist/cjs/hooks/use-watch.cjs +1 -0
  28. package/dist/cjs/hooks/useForm.cjs +1 -1
  29. package/dist/cjs/hooks/useFormData.cjs +1 -1
  30. package/dist/cjs/hooks/useFormSubmitting.cjs +1 -0
  31. package/dist/cjs/index.cjs +1 -1
  32. package/dist/cjs/styles.css +1 -0
  33. package/dist/cjs/utils/omit-nil.cjs +1 -0
  34. package/dist/cjs/utils/omitNil.cjs +1 -0
  35. package/dist/cjs/utils/persist.cjs +1 -0
  36. package/dist/cjs/utils/render-tree-node.cjs +1 -0
  37. package/dist/cjs/utils/resolve-col-span.cjs +1 -0
  38. package/dist/es/components/FormController.d.ts +76 -18
  39. package/dist/es/components/FormController.js +227 -70
  40. package/dist/es/components/NexusField.js +63 -60
  41. package/dist/es/components/NexusForm.d.ts +40 -3
  42. package/dist/es/components/NexusForm.js +143 -89
  43. package/dist/es/components/form-controller.d.ts +129 -0
  44. package/dist/es/components/form-controller.js +310 -0
  45. package/dist/es/components/nexus-field.d.ts +9 -0
  46. package/dist/es/components/nexus-field.js +131 -0
  47. package/dist/es/components/nexus-form-provider.d.ts +12 -0
  48. package/dist/es/components/nexus-form-provider.js +18 -0
  49. package/dist/es/components/nexus-form.d.ts +114 -0
  50. package/dist/es/components/nexus-form.js +174 -0
  51. package/dist/es/components/nexus-layout.d.ts +9 -0
  52. package/dist/es/components/nexus-layout.js +48 -0
  53. package/dist/es/components/nexus-object.d.ts +16 -0
  54. package/dist/es/components/nexus-object.js +64 -0
  55. package/dist/es/contexts/NexusContext.d.ts +2 -0
  56. package/dist/es/contexts/field-inherit-context.d.ts +18 -0
  57. package/dist/es/contexts/field-inherit-context.js +5 -0
  58. package/dist/es/contexts/grid-context.d.ts +5 -0
  59. package/dist/es/contexts/grid-context.js +5 -0
  60. package/dist/es/contexts/layout-config-context.d.ts +4 -0
  61. package/dist/es/contexts/layout-config-context.js +5 -0
  62. package/dist/es/contexts/nexus-context.d.ts +29 -0
  63. package/dist/es/contexts/nexus-context.js +12 -0
  64. package/dist/es/hooks/index.d.ts +12 -11
  65. package/dist/es/hooks/index.js +20 -18
  66. package/dist/es/hooks/use-engine.d.ts +2 -0
  67. package/dist/es/hooks/use-engine.js +8 -0
  68. package/dist/es/hooks/use-field-state.d.ts +7 -0
  69. package/dist/es/hooks/use-field-state.js +13 -0
  70. package/dist/es/hooks/use-field-validator.d.ts +40 -0
  71. package/dist/es/hooks/use-field-validator.js +35 -0
  72. package/dist/es/hooks/use-field-value.d.ts +6 -0
  73. package/dist/es/hooks/use-field-value.js +13 -0
  74. package/dist/es/hooks/use-form-config.d.ts +5 -0
  75. package/dist/es/hooks/use-form-config.js +8 -0
  76. package/dist/es/hooks/use-form-data.d.ts +6 -0
  77. package/dist/es/hooks/use-form-data.js +13 -0
  78. package/dist/es/hooks/use-form-submitting.d.ts +7 -0
  79. package/dist/es/hooks/use-form-submitting.js +11 -0
  80. package/dist/es/hooks/use-form.d.ts +22 -0
  81. package/dist/es/hooks/use-form.js +12 -0
  82. package/dist/es/hooks/use-nexus-context.d.ts +11 -0
  83. package/dist/es/hooks/use-nexus-context.js +12 -0
  84. package/dist/es/hooks/use-watch-all.d.ts +19 -0
  85. package/dist/es/hooks/use-watch-all.js +29 -0
  86. package/dist/es/hooks/use-watch-multiple.d.ts +20 -0
  87. package/dist/es/hooks/use-watch-multiple.js +29 -0
  88. package/dist/es/hooks/use-watch-state.d.ts +18 -0
  89. package/dist/es/hooks/use-watch-state.js +19 -0
  90. package/dist/es/hooks/use-watch.d.ts +25 -0
  91. package/dist/es/hooks/use-watch.js +20 -0
  92. package/dist/es/hooks/useForm.d.ts +17 -1
  93. package/dist/es/hooks/useForm.js +9 -6
  94. package/dist/es/hooks/useFormData.js +9 -9
  95. package/dist/es/hooks/useFormSubmitting.d.ts +7 -0
  96. package/dist/es/hooks/useFormSubmitting.js +11 -0
  97. package/dist/es/index.d.ts +26 -24
  98. package/dist/es/index.js +43 -38
  99. package/dist/es/styles.css +1 -0
  100. package/dist/es/utils/omit-nil.d.ts +9 -0
  101. package/dist/es/utils/omit-nil.js +14 -0
  102. package/dist/es/utils/omitNil.d.ts +9 -0
  103. package/dist/es/utils/omitNil.js +14 -0
  104. package/dist/es/utils/persist.d.ts +24 -0
  105. package/dist/es/utils/persist.js +43 -0
  106. package/dist/es/utils/render-tree-node.d.ts +6 -0
  107. package/dist/es/utils/render-tree-node.js +17 -0
  108. package/dist/es/utils/resolve-col-span.d.ts +5 -0
  109. package/dist/es/utils/resolve-col-span.js +9 -0
  110. package/dist/umd/index.css +1 -0
  111. package/dist/umd/index.umd.cjs +1 -1
  112. package/package.json +5 -4
  113. package/src/components/form-controller.ts +584 -0
  114. package/src/components/{NexusField.tsx → nexus-field.tsx} +108 -31
  115. package/src/components/{NexusFormProvider.tsx → nexus-form-provider.tsx} +3 -3
  116. package/src/components/{NexusForm.tsx → nexus-form.tsx} +159 -18
  117. package/src/components/{NexusLayout.tsx → nexus-layout.tsx} +5 -5
  118. package/src/components/{NexusObject.tsx → nexus-object.tsx} +3 -3
  119. package/src/contexts/{NexusContext.ts → nexus-context.ts} +3 -1
  120. package/src/hooks/index.ts +12 -11
  121. package/src/hooks/{useEngine.ts → use-engine.ts} +1 -1
  122. package/src/hooks/{useFieldState.ts → use-field-state.ts} +1 -1
  123. package/src/hooks/{useFieldValidator.ts → use-field-validator.ts} +1 -1
  124. package/src/hooks/{useFieldValue.ts → use-field-value.ts} +1 -1
  125. package/src/hooks/{useFormConfig.ts → use-form-config.ts} +2 -2
  126. package/src/hooks/{useFormData.ts → use-form-data.ts} +4 -4
  127. package/src/hooks/use-form-submitting.ts +16 -0
  128. package/src/hooks/use-form.ts +36 -0
  129. package/src/hooks/{useNexusContext.ts → use-nexus-context.ts} +2 -2
  130. package/src/index.ts +28 -24
  131. package/src/styles.css +6 -0
  132. package/src/utils/omit-nil.ts +24 -0
  133. package/src/utils/persist.ts +88 -0
  134. package/src/utils/{renderTreeNode.tsx → render-tree-node.tsx} +3 -3
  135. package/src/utils/{resolveColSpan.ts → resolve-col-span.ts} +1 -1
  136. package/src/vite-env.d.ts +1 -0
  137. package/src/components/FormController.ts +0 -271
  138. package/src/hooks/useForm.ts +0 -15
  139. /package/src/contexts/{FieldInheritContext.ts → field-inherit-context.ts} +0 -0
  140. /package/src/contexts/{GridContext.ts → grid-context.ts} +0 -0
  141. /package/src/contexts/{LayoutConfigContext.ts → layout-config-context.ts} +0 -0
  142. /package/src/hooks/{useWatchAll.ts → use-watch-all.ts} +0 -0
  143. /package/src/hooks/{useWatchMultiple.ts → use-watch-multiple.ts} +0 -0
  144. /package/src/hooks/{useWatchState.ts → use-watch-state.ts} +0 -0
  145. /package/src/hooks/{useWatch.ts → use-watch.ts} +0 -0
@@ -1,120 +1,174 @@
1
- import { jsx as b, jsxs as L } from "react/jsx-runtime";
2
- import { useRef as l, useEffect as o, useSyncExternalStore as Q, useMemo as y, useCallback as W } from "react";
3
- import { renderTreeNode as U } from "../utils/renderTreeNode.js";
4
- import { NexusFormProvider as X } from "./NexusFormProvider.js";
5
- function s() {
1
+ import { jsx as S, jsxs as A } from "react/jsx-runtime";
2
+ import { useId as de, useMemo as f, useRef as i, useEffect as u, useSyncExternalStore as fe, useCallback as B } from "react";
3
+ import "../contexts/NexusContext.js";
4
+ import "@xbeeant/form-engine";
5
+ import { useFormSubmitting as pe } from "../hooks/useFormSubmitting.js";
6
+ import { loadPersisted as be, savePersisted as ge, clearPersisted as ye } from "../utils/persist.js";
7
+ import { renderTreeNode as me } from "../utils/renderTreeNode.js";
8
+ import { NexusFormProvider as Re } from "./NexusFormProvider.js";
9
+ function T() {
6
10
  }
7
- function ne({
8
- form: n,
9
- schema: t,
10
- initialValues: _,
11
- widgets: u,
12
- layouts: c,
13
- onFinish: j,
14
- onFinishFailed: k,
15
- footer: a = !1,
16
- className: D,
17
- style: O,
18
- children: V,
19
- labelCol: f,
20
- labelWidth: $,
21
- colon: I,
22
- label: M,
23
- displayType: P,
24
- readOnly: g,
25
- column: q,
26
- watch: m,
27
- removeHiddenData: R = !0
11
+ function je({
12
+ form: o,
13
+ schema: n,
14
+ initialValues: G,
15
+ widgets: p,
16
+ layouts: b,
17
+ fieldWrapper: g,
18
+ onFinish: J,
19
+ onFinishFailed: Q,
20
+ onMount: x,
21
+ footer: y = !1,
22
+ className: U,
23
+ style: X,
24
+ children: Y,
25
+ labelCol: m,
26
+ labelWidth: Z,
27
+ colon: H,
28
+ label: ee,
29
+ displayType: te,
30
+ readOnly: C,
31
+ column: ne,
32
+ watch: v,
33
+ onValuesChange: L,
34
+ removeHiddenData: h = !0,
35
+ omitNil: j = !1,
36
+ locale: re,
37
+ persist: c
28
38
  }) {
29
- const e = n._getEngine(), x = l(null), F = P ?? t?.displayType ?? "row", C = M ?? t?.label ?? !0, S = I ?? t?.colon, r = $ ?? t?.labelWidth, T = g ?? t?.readOnly ?? !1, i = q ?? t?.column;
30
- o(() => {
31
- u && e.registerWidgets(u), c && e.registerLayouts(c);
32
- }, [e, u, c]);
33
- const h = l(!0), w = l(_);
34
- o(() => {
35
- t && (h.current ? (e.init(t, w.current), h.current = !1) : e.init(t, e.getFormData()));
36
- }, [e, t]);
37
- const N = l(s), v = l(s);
38
- N.current = j ?? s, v.current = k ?? s, o(() => {
39
- n._bind(
40
- x.current,
41
- () => N.current,
42
- () => v.current
39
+ const l = de(), e = f(
40
+ () => o._useInstance(l),
41
+ [o, l]
42
+ ), k = i(null), a = i(c);
43
+ a.current = c;
44
+ const E = te ?? n?.displayType ?? "row", I = ee ?? n?.label ?? !0, N = H ?? n?.colon, s = Z ?? n?.labelWidth, O = C ?? n?.readOnly ?? !1, d = ne ?? n?.column, P = re ?? n?.locale ?? e.getLocale();
45
+ u(() => {
46
+ p && e.registerWidgets(p), g && e.registerFieldWrapper(g), b && e.registerLayouts(b);
47
+ }, [e, p, b, g]);
48
+ const _ = i(!0), oe = i(G);
49
+ u(() => {
50
+ if (n)
51
+ if (_.current) {
52
+ const t = a.current ? be(a.current) : void 0;
53
+ e.init(n, t ?? oe.current), _.current = !1;
54
+ } else
55
+ e.init(n, e.getFormData());
56
+ }, [e, n]);
57
+ const $ = c ? `${c.storage ?? "localStorage"}:${c.key}` : null;
58
+ u(() => {
59
+ const t = $ ? a.current : void 0;
60
+ if (!t)
61
+ return;
62
+ let r = null;
63
+ const F = t.debounce ?? 300, ae = e.subscribeStore(() => {
64
+ r && clearTimeout(r), r = setTimeout(() => {
65
+ ge(t, e.getFormData());
66
+ }, F);
67
+ });
68
+ return () => {
69
+ r && clearTimeout(r), ae();
70
+ };
71
+ }, [e, $]);
72
+ const D = i(x);
73
+ D.current = x;
74
+ const V = i(!1), W = !n || typeof n == "object" && Object.keys(n).length === 0;
75
+ u(() => {
76
+ V.current || W || (V.current = !0, D.current?.());
77
+ }, [W]);
78
+ const M = i(T), K = i(T);
79
+ M.current = (t) => {
80
+ const r = a.current;
81
+ return r && r.clearOnSubmit !== !1 && ye(r), J?.(t);
82
+ }, K.current = Q ?? T, u(() => {
83
+ o._bind(
84
+ l,
85
+ k.current,
86
+ () => M.current,
87
+ () => K.current
43
88
  );
44
- }, [n]), o(() => {
45
- n._syncConfig({ removeHiddenData: R, watch: m });
46
- }, [n, R, m]);
47
- const z = Q(
48
- e.subscribeStore,
49
- e.getSnapshot,
50
- e.getSnapshot
51
- ), A = y(() => e.getRenderTree(), [e, z]), B = W(
52
- async (p) => {
53
- p.preventDefault(), await n.submit();
89
+ }, [o, l]);
90
+ const q = i(L);
91
+ q.current = L, u(() => {
92
+ o._syncConfig(l, {
93
+ removeHiddenData: h,
94
+ omitNil: j,
95
+ watch: v,
96
+ onValuesChange: (t, r, F) => q.current?.(t, r, F)
97
+ });
98
+ }, [o, l, h, j, v]);
99
+ const ie = fe(
100
+ (t) => e.subscribeRender(t),
101
+ () => e.getRenderSnapshot(),
102
+ () => e.getRenderSnapshot()
103
+ ), se = f(() => e.getRenderTree(), [e, ie]), le = B(
104
+ async (t) => {
105
+ t.preventDefault(), await o.submit();
54
106
  },
55
- [n]
56
- ), G = W(() => {
57
- n.resetFields();
58
- }, [n]);
59
- let d = null;
60
- a === !0 ? d = /* @__PURE__ */ L("div", { className: "mt-4", children: [
61
- /* @__PURE__ */ b("button", { type: "submit", children: "提交" }),
107
+ [o]
108
+ ), ue = B(() => {
109
+ o.resetFields();
110
+ }, [o]), w = pe(o);
111
+ let R = null;
112
+ y === !0 ? R = /* @__PURE__ */ A("div", { className: "mt-4", children: [
113
+ /* @__PURE__ */ S("button", { type: "submit", disabled: w, children: w ? "提交中..." : "提交" }),
62
114
  " ",
63
- /* @__PURE__ */ b("button", { type: "button", onClick: G, children: "重置" })
64
- ] }) : a && (d = a);
65
- const E = y(() => {
66
- if (f)
67
- return f;
68
- if (r)
115
+ /* @__PURE__ */ S("button", { type: "button", onClick: ue, children: "重置" })
116
+ ] }) : y && (R = y);
117
+ const z = f(() => {
118
+ if (m)
119
+ return m;
120
+ if (s)
69
121
  return {
70
122
  style: {
71
- width: typeof r == "number" ? `${r}px` : r
123
+ width: typeof s == "number" ? `${s}px` : s
72
124
  }
73
125
  };
74
- }, [f, r]), J = y(
126
+ }, [m, s]), ce = f(
75
127
  () => ({
76
- labelCol: E,
77
- labelWidth: r,
78
- colon: S,
79
- label: C,
80
- displayType: F,
81
- readOnly: T,
82
- column: i
128
+ labelCol: z,
129
+ labelWidth: s,
130
+ colon: N,
131
+ label: I,
132
+ displayType: E,
133
+ readOnly: O,
134
+ column: d,
135
+ locale: P
83
136
  }),
84
137
  [
138
+ z,
139
+ s,
140
+ N,
141
+ I,
85
142
  E,
86
- r,
87
- S,
88
- C,
89
- F,
90
- T,
91
- i
143
+ O,
144
+ d,
145
+ P
92
146
  ]
93
147
  );
94
- return /* @__PURE__ */ b(X, { engine: e, config: J, form: n, children: /* @__PURE__ */ L(
148
+ return /* @__PURE__ */ S(Re, { engine: e, config: ce, form: o, children: /* @__PURE__ */ A(
95
149
  "form",
96
150
  {
97
- ref: x,
98
- onSubmit: B,
99
- className: D,
151
+ ref: k,
152
+ onSubmit: le,
153
+ className: U,
100
154
  style: {
101
- ...O,
155
+ ...X,
102
156
  // 当配置了 column 时,使用 CSS Grid 布局
103
- ...i && i > 1 ? {
157
+ ...d && d > 1 ? {
104
158
  display: "grid",
105
- gridTemplateColumns: `repeat(${i}, 1fr)`,
159
+ gridTemplateColumns: `repeat(${d}, 1fr)`,
106
160
  gap: "0 16px"
107
161
  } : {}
108
162
  },
109
163
  noValidate: !0,
110
164
  children: [
111
- A.map((p, K) => U(p, K)),
112
- !g && d,
113
- V
165
+ se.map((t, r) => me(t, r)),
166
+ !C && R,
167
+ Y
114
168
  ]
115
169
  }
116
170
  ) });
117
171
  }
118
172
  export {
119
- ne as NexusForm
173
+ je as NexusForm
120
174
  };
@@ -0,0 +1,129 @@
1
+ import { FieldState, NexusFormInstance, NexusSchema, NexusEngine } from '@xbeeant/form-engine';
2
+ /**
3
+ * FormController — 包裹引擎宿主,暴露 Form 实例 API
4
+ *
5
+ * 一个 form 可承载多个 NexusForm 挂载(每个挂载一份 schema,schema 与状态互相独立)。
6
+ * 实例标识由 NexusForm 内部生成(React useId),用户侧不感知任何 instanceId:
7
+ * - 同一 form 引用 = 同一引擎宿主:插件/组件注册/跨表单联动等引擎级能力共享
8
+ * - 每个 NexusForm 挂载自动获得独立实例:schema/值/校验/订阅互不影响
9
+ * - form 的 API(getValues/setValues/submit/resetFields...)聚合作用于全部实例
10
+ * - 引擎本身是独立实体,可单独创建或跨 form 复用(useForm(formId, engine))
11
+ */
12
+ export declare class FormController implements NexusFormInstance {
13
+ private engine;
14
+ /** 提交中状态(校验 + onFinish 全流程,formily submitting 对齐) */
15
+ private submitting;
16
+ /** 提交状态监听器(供 useSyncExternalStore 消费) */
17
+ private submittingListeners;
18
+ /** 实例标识(内部)→ 实例视图引擎(同一 form 挂载的多个 NexusForm 各自独立) */
19
+ private views;
20
+ /** 实例标识 → 该实例的 DOM / 回调绑定(onFinish/onFinishFailed 按实例独立) */
21
+ private instanceBindings;
22
+ /** 实例标识 → watch / removeHiddenData / onValuesChange / omitNil 配置(按实例独立) */
23
+ private instanceConfigs;
24
+ constructor(engine?: NexusEngine);
25
+ /**
26
+ * 获取(或创建)指定实例的引擎视图
27
+ *
28
+ * 同一 form 挂载多个 NexusForm 时各自独立:schema/值/订阅互不影响。
29
+ * 实例标识由 NexusForm 内部分配(React useId),用户不感知。
30
+ *
31
+ * @param instanceId - 实例标识(内部)
32
+ * @returns 定向到该实例的引擎视图
33
+ */
34
+ _useInstance(instanceId: string): NexusEngine;
35
+ /**
36
+ * 内部:解析方法作用的目标实例视图(聚合全部实例,无实例时回退宿主引擎)
37
+ */
38
+ private resolveViews;
39
+ /** 内部:首次绑定的实例 DOM(兼容既有 scrollToPath/focusFirstError 单实例行为) */
40
+ private getPrimaryFormEl;
41
+ /**
42
+ * 内部:绑定实例 DOM + 回调 getter(由 NexusForm 在挂载时按实例调用)
43
+ * 回调以 getter 传入:submit 时读取最新闭包,而非绑定时刻的快照
44
+ */
45
+ _bind(instanceId: string, formEl: HTMLFormElement | null, getOnFinish: () => (data: Record<string, unknown>) => void | Promise<void>, getOnFinishFailed: () => (errors: Map<string, string[]>) => void): void;
46
+ /** 内部:同步 watch / removeHiddenData / onValuesChange 配置(由 NexusForm 在它们变化时按实例调用) */
47
+ _syncConfig(instanceId: string, config: {
48
+ removeHiddenData?: boolean;
49
+ /** 提交/取值时递归移除空值(undefined/null/'',ProForm omitNil 对齐) */
50
+ omitNil?: boolean;
51
+ watch?: {
52
+ [path: string]: (value: unknown, allValues: Record<string, unknown>, changedPath?: string) => void;
53
+ };
54
+ onValuesChange?: (changedValue: unknown, allValues: Record<string, unknown>, changedPath: string) => void;
55
+ }): void;
56
+ /** 内部:值变更时调用(由 Engine 通知,携带实例标识路由到对应实例的 watcher) */
57
+ _onFieldValueChange(instanceId: string, path: string, value: unknown): void;
58
+ /** 内部:获取引擎宿主实例 */
59
+ _getEngine(): NexusEngine;
60
+ /**
61
+ * 获取底层引擎宿主实例(用于跨表单联动:linkForm / setFormId / registerAntdUI 等;
62
+ * 宿主上的组件/插件注册对全部实例生效)
63
+ */
64
+ getEngine(): NexusEngine;
65
+ submit(options?: {
66
+ validateFirst?: boolean;
67
+ omitNil?: boolean;
68
+ }): Promise<void>;
69
+ /** 提交中状态(formily submitting 对齐,供提交按钮 loading) */
70
+ getSubmitting(): boolean;
71
+ /** 订阅提交状态变化(返回取消订阅函数,供 useSyncExternalStore 使用) */
72
+ onSubmittingChange(callback: () => void): () => void;
73
+ private setSubmitting;
74
+ private runSubmit;
75
+ /** 内部:反查实例视图对应的实例标识 */
76
+ private findInstanceId;
77
+ /**
78
+ * 定位到第一个校验失败的字段:按 DOM 渲染顺序查找(保证视觉上的"第一个"),
79
+ * 滚动入视并聚焦其内部可交互控件。
80
+ */
81
+ private focusFirstError;
82
+ resetFields(): void;
83
+ setErrorFields(errors: Array<{
84
+ path: string;
85
+ errors: string[];
86
+ }>): void;
87
+ setValues(values: Record<string, unknown>): void;
88
+ setValueByPath(path: string, value: unknown): void;
89
+ setSchemaByPath(path: string, patch: Record<string, unknown>): void;
90
+ setSchema(schema: NexusSchema): void;
91
+ getValues(paths?: string[], options?: {
92
+ omitNil?: boolean;
93
+ }): Record<string, unknown>;
94
+ getHiddenValues(): Record<string, unknown>;
95
+ /** 获取所有字段值(含 hidden) */
96
+ getAllValues(): Record<string, unknown>;
97
+ getValueByPath(path: string): unknown;
98
+ /**
99
+ * 注册字段校验逻辑
100
+ * @param path 字段路径(如 'username')
101
+ * @param validator 校验函数,返回错误消息数组(空数组表示通过)
102
+ */
103
+ registerValidator(path: string, validator: (value: unknown, formData: Record<string, unknown>) => string[] | Promise<string[]>): void;
104
+ /**
105
+ * 注销字段校验逻辑(按函数引用移除)
106
+ * 与 registerValidator 配对;widget 组件卸载时清理,避免校验器累积
107
+ */
108
+ unregisterValidator(path: string, validator: (value: unknown, formData: Record<string, unknown>) => string[] | Promise<string[]>): void;
109
+ /**
110
+ * 实时重校验指定字段(同步)
111
+ * 供 widget 组件内部状态变化(非字段值变化)时主动刷新错误态
112
+ */
113
+ revalidateField(path: string): void;
114
+ getSchema(): NexusSchema | null;
115
+ removeErrorField(path: string): void;
116
+ scrollToPath(path: string): void;
117
+ getFieldError(path: string): string[];
118
+ getFieldsError(): Map<string, string[]>;
119
+ validateFields(paths?: string[], options?: {
120
+ validateFirst?: boolean;
121
+ }): Promise<Map<string, string[]>>;
122
+ getFieldState(path: string): FieldState | undefined;
123
+ /**
124
+ * 重载远程选项数据(x-render reloadRemoteData 对齐)
125
+ * 传入 path 仅重载该字段的远程数据;缺省时重载全部远程数据字段。
126
+ * 作用于全部实例视图。
127
+ */
128
+ reloadRemoteData(path?: string): void;
129
+ }