@xbeeant/form-engine-react 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/cjs/components/FormController.cjs +1 -1
- package/dist/cjs/components/NexusField.cjs +1 -1
- package/dist/cjs/components/NexusForm.cjs +1 -1
- package/dist/cjs/components/form-controller.cjs +1 -0
- package/dist/cjs/components/nexus-field.cjs +1 -0
- package/dist/cjs/components/nexus-form-provider.cjs +1 -0
- package/dist/cjs/components/nexus-form.cjs +1 -0
- package/dist/cjs/components/nexus-layout.cjs +1 -0
- package/dist/cjs/components/nexus-object.cjs +1 -0
- package/dist/cjs/contexts/field-inherit-context.cjs +1 -0
- package/dist/cjs/contexts/grid-context.cjs +1 -0
- package/dist/cjs/contexts/layout-config-context.cjs +1 -0
- package/dist/cjs/contexts/nexus-context.cjs +1 -0
- package/dist/cjs/hooks/index.cjs +1 -1
- package/dist/cjs/hooks/use-engine.cjs +1 -0
- package/dist/cjs/hooks/use-field-state.cjs +1 -0
- package/dist/cjs/hooks/use-field-validator.cjs +1 -0
- package/dist/cjs/hooks/use-field-value.cjs +1 -0
- package/dist/cjs/hooks/use-form-config.cjs +1 -0
- package/dist/cjs/hooks/use-form-data.cjs +1 -0
- package/dist/cjs/hooks/use-form-submitting.cjs +1 -0
- package/dist/cjs/hooks/use-form.cjs +1 -0
- package/dist/cjs/hooks/use-nexus-context.cjs +1 -0
- package/dist/cjs/hooks/use-watch-all.cjs +1 -0
- package/dist/cjs/hooks/use-watch-multiple.cjs +1 -0
- package/dist/cjs/hooks/use-watch-state.cjs +1 -0
- package/dist/cjs/hooks/use-watch.cjs +1 -0
- package/dist/cjs/hooks/useFormData.cjs +1 -1
- package/dist/cjs/hooks/useFormSubmitting.cjs +1 -0
- package/dist/cjs/index.cjs +1 -1
- package/dist/cjs/styles.css +1 -1
- package/dist/cjs/utils/omit-nil.cjs +1 -0
- package/dist/cjs/utils/omitNil.cjs +1 -0
- package/dist/cjs/utils/persist.cjs +1 -0
- package/dist/cjs/utils/render-tree-node.cjs +1 -0
- package/dist/cjs/utils/resolve-col-span.cjs +1 -0
- package/dist/es/components/FormController.d.ts +73 -19
- package/dist/es/components/FormController.js +222 -71
- package/dist/es/components/NexusField.js +25 -21
- package/dist/es/components/NexusForm.d.ts +33 -3
- package/dist/es/components/NexusForm.js +143 -96
- package/dist/es/components/form-controller.d.ts +129 -0
- package/dist/es/components/form-controller.js +310 -0
- package/dist/es/components/nexus-field.d.ts +9 -0
- package/dist/es/components/nexus-field.js +131 -0
- package/dist/es/components/nexus-form-provider.d.ts +12 -0
- package/dist/es/components/nexus-form-provider.js +18 -0
- package/dist/es/components/nexus-form.d.ts +114 -0
- package/dist/es/components/nexus-form.js +174 -0
- package/dist/es/components/nexus-layout.d.ts +9 -0
- package/dist/es/components/nexus-layout.js +48 -0
- package/dist/es/components/nexus-object.d.ts +16 -0
- package/dist/es/components/nexus-object.js +64 -0
- package/dist/es/contexts/NexusContext.d.ts +2 -0
- package/dist/es/contexts/field-inherit-context.d.ts +18 -0
- package/dist/es/contexts/field-inherit-context.js +5 -0
- package/dist/es/contexts/grid-context.d.ts +5 -0
- package/dist/es/contexts/grid-context.js +5 -0
- package/dist/es/contexts/layout-config-context.d.ts +4 -0
- package/dist/es/contexts/layout-config-context.js +5 -0
- package/dist/es/contexts/nexus-context.d.ts +29 -0
- package/dist/es/contexts/nexus-context.js +12 -0
- package/dist/es/hooks/index.d.ts +12 -11
- package/dist/es/hooks/index.js +20 -18
- package/dist/es/hooks/use-engine.d.ts +2 -0
- package/dist/es/hooks/use-engine.js +8 -0
- package/dist/es/hooks/use-field-state.d.ts +7 -0
- package/dist/es/hooks/use-field-state.js +13 -0
- package/dist/es/hooks/use-field-validator.d.ts +40 -0
- package/dist/es/hooks/use-field-validator.js +35 -0
- package/dist/es/hooks/use-field-value.d.ts +6 -0
- package/dist/es/hooks/use-field-value.js +13 -0
- package/dist/es/hooks/use-form-config.d.ts +5 -0
- package/dist/es/hooks/use-form-config.js +8 -0
- package/dist/es/hooks/use-form-data.d.ts +6 -0
- package/dist/es/hooks/use-form-data.js +13 -0
- package/dist/es/hooks/use-form-submitting.d.ts +7 -0
- package/dist/es/hooks/use-form-submitting.js +11 -0
- package/dist/es/hooks/use-form.d.ts +22 -0
- package/dist/es/hooks/use-form.js +12 -0
- package/dist/es/hooks/use-nexus-context.d.ts +11 -0
- package/dist/es/hooks/use-nexus-context.js +12 -0
- package/dist/es/hooks/use-watch-all.d.ts +19 -0
- package/dist/es/hooks/use-watch-all.js +29 -0
- package/dist/es/hooks/use-watch-multiple.d.ts +20 -0
- package/dist/es/hooks/use-watch-multiple.js +29 -0
- package/dist/es/hooks/use-watch-state.d.ts +18 -0
- package/dist/es/hooks/use-watch-state.js +19 -0
- package/dist/es/hooks/use-watch.d.ts +25 -0
- package/dist/es/hooks/use-watch.js +20 -0
- package/dist/es/hooks/useForm.d.ts +11 -4
- package/dist/es/hooks/useFormData.js +9 -9
- package/dist/es/hooks/useFormSubmitting.d.ts +7 -0
- package/dist/es/hooks/useFormSubmitting.js +11 -0
- package/dist/es/index.d.ts +26 -24
- package/dist/es/index.js +36 -32
- package/dist/es/styles.css +1 -1
- package/dist/es/utils/omit-nil.d.ts +9 -0
- package/dist/es/utils/omit-nil.js +14 -0
- package/dist/es/utils/omitNil.d.ts +9 -0
- package/dist/es/utils/omitNil.js +14 -0
- package/dist/es/utils/persist.d.ts +24 -0
- package/dist/es/utils/persist.js +43 -0
- package/dist/es/utils/render-tree-node.d.ts +6 -0
- package/dist/es/utils/render-tree-node.js +17 -0
- package/dist/es/utils/resolve-col-span.d.ts +5 -0
- package/dist/es/utils/resolve-col-span.js +9 -0
- package/dist/umd/index.css +1 -1
- package/dist/umd/index.umd.cjs +1 -1
- package/package.json +5 -4
- package/src/components/form-controller.ts +584 -0
- package/src/components/{NexusField.tsx → nexus-field.tsx} +57 -6
- package/src/components/{NexusFormProvider.tsx → nexus-form-provider.tsx} +3 -3
- package/src/components/{NexusForm.tsx → nexus-form.tsx} +135 -18
- package/src/components/{NexusLayout.tsx → nexus-layout.tsx} +5 -5
- package/src/components/{NexusObject.tsx → nexus-object.tsx} +3 -3
- package/src/contexts/{NexusContext.ts → nexus-context.ts} +3 -1
- package/src/hooks/index.ts +12 -11
- package/src/hooks/{useEngine.ts → use-engine.ts} +1 -1
- package/src/hooks/{useFieldState.ts → use-field-state.ts} +1 -1
- package/src/hooks/{useFieldValidator.ts → use-field-validator.ts} +1 -1
- package/src/hooks/{useFieldValue.ts → use-field-value.ts} +1 -1
- package/src/hooks/{useFormConfig.ts → use-form-config.ts} +2 -2
- package/src/hooks/{useFormData.ts → use-form-data.ts} +4 -4
- package/src/hooks/use-form-submitting.ts +16 -0
- package/src/hooks/{useForm.ts → use-form.ts} +12 -5
- package/src/hooks/{useNexusContext.ts → use-nexus-context.ts} +2 -2
- package/src/index.ts +26 -24
- package/src/utils/omit-nil.ts +24 -0
- package/src/utils/persist.ts +88 -0
- package/src/utils/{renderTreeNode.tsx → render-tree-node.tsx} +3 -3
- package/src/utils/{resolveColSpan.ts → resolve-col-span.ts} +1 -1
- package/dist/cjs/tailwind.css +0 -1
- package/dist/es/tailwind.css +0 -1
- package/src/components/FormController.ts +0 -278
- /package/src/contexts/{FieldInheritContext.ts → field-inherit-context.ts} +0 -0
- /package/src/contexts/{GridContext.ts → grid-context.ts} +0 -0
- /package/src/contexts/{LayoutConfigContext.ts → layout-config-context.ts} +0 -0
- /package/src/hooks/{useWatchAll.ts → use-watch-all.ts} +0 -0
- /package/src/hooks/{useWatchMultiple.ts → use-watch-multiple.ts} +0 -0
- /package/src/hooks/{useWatchState.ts → use-watch-state.ts} +0 -0
- /package/src/hooks/{useWatch.ts → use-watch.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("@xbeeant/form-engine"),f=require("../utils/omitNil.cjs"),u=new WeakSet;class g{engine;submitting=!1;submittingListeners=new Set;views=new Map;instanceBindings=new Map;instanceConfigs=new Map;constructor(e){this.engine=e??new c.NexusEngine,this.engine.hasPlugin("async-validator")||this.engine.use(new c.AsyncValidatorPlugin(this.engine))}_useInstance(e){let t=this.views.get(e);return t||(this.views.size===0&&!u.has(this.engine)?(u.add(this.engine),t=this.engine):t=this.engine.instance(e),this.views.set(e,t),this.instanceConfigs.set(e,{removeHiddenData:!0,omitNil:!1,watchers:new Map,globalWatcher:null,onValuesChange:null})),t}resolveViews(){const e=Array.from(this.views.values());return e.length>0?e:[this.engine]}getPrimaryFormEl(){return this.instanceBindings.values().next().value?.formEl??null}_bind(e,t,s,n){this.instanceBindings.set(e,{formEl:t,getOnFinish:s,getOnFinishFailed:n}),this._useInstance(e).registerOnFieldValueChange((o,r)=>this._onFieldValueChange(e,o,r))}_syncConfig(e,t){const s=this.instanceConfigs.get(e)??{removeHiddenData:!0,omitNil:!1,watchers:new Map,globalWatcher:null,onValuesChange:null};if(t.removeHiddenData!==void 0&&(s.removeHiddenData=t.removeHiddenData),t.omitNil!==void 0&&(s.omitNil=t.omitNil),t.onValuesChange!==void 0&&(s.onValuesChange=t.onValuesChange),t.watch){s.watchers.clear(),s.globalWatcher=null;for(const[n,i]of Object.entries(t.watch))n==="#"?s.globalWatcher=i:s.watchers.set(n,i)}this.instanceConfigs.set(e,s)}_onFieldValueChange(e,t,s){const n=this.views.get(e),i=this.instanceConfigs.get(e);if(!n||!i)return;const o=n.getFormData(),r=i.removeHiddenData?o:n.getAllFormData();i.globalWatcher&&i.globalWatcher(r,r,t),i.onValuesChange&&i.onValuesChange(s,r,t);const a=i.watchers.get(t);a&&a(s,r)}_getEngine(){return this.engine}getEngine(){return this.engine}async submit(e){this.setSubmitting(!0);try{await this.runSubmit(e)}finally{this.setSubmitting(!1)}}getSubmitting(){return this.submitting}onSubmittingChange(e){return this.submittingListeners.add(e),()=>{this.submittingListeners.delete(e)}}setSubmitting(e){if(this.submitting!==e){this.submitting=e;for(const t of this.submittingListeners)t()}}async runSubmit(e){const t=this.resolveViews(),s=new Map;let n;for(const i of t){const o=await i.validate(void 0,{validateFirst:e?.validateFirst});if(o.size>0){for(const[r,a]of o)s.set(r,a);n??=this.instanceBindings.get(this.findInstanceId(i))}}if(s.size>0){this.focusFirstError(s,n?.formEl??null),n?.getOnFinishFailed()?.(s);return}for(const i of t){const o=this.findInstanceId(i),r=this.instanceConfigs.get(o)??{removeHiddenData:!0,omitNil:!1},a=r.removeHiddenData?i.getFormData():i.getAllFormData(),l=e?.omitNil??r.omitNil??!1?f.omitNilDeep(a):a;await i.submit(l)&&await this.instanceBindings.get(o)?.getOnFinish()?.(l)}}findInstanceId(e){for(const[t,s]of this.views)if(s===e)return t;return"default"}focusFirstError(e,t){if(!t||e.size===0)return;const s=new Set(e.keys());requestAnimationFrame(()=>{const i=t.querySelectorAll("[data-nexus-field]");for(const o of Array.from(i)){const r=o.getAttribute("data-nexus-field");if(!r||!s.has(r))continue;typeof o.scrollIntoView=="function"&&o.scrollIntoView({behavior:"smooth",block:"center"}),o.querySelector('input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])')?.focus();return}})}resetFields(){for(const e of this.resolveViews())e.reset()}setErrorFields(e){for(const t of this.resolveViews())t.setErrorFields(e)}setValues(e){for(const t of this.resolveViews())t.setFieldValues(e)}setValueByPath(e,t){for(const s of this.resolveViews())s.setFieldValue(e,t)}setSchemaByPath(e,t){for(const s of this.resolveViews())s.setSchemaByPath(e,t)}setSchema(e){for(const t of this.resolveViews())t.setSchema(e)}getValues(e,t){const s={};for(const n of this.resolveViews()){const i=n.getFormData(e);t?.omitNil?Object.assign(s,f.omitNilDeep(i)):Object.assign(s,i)}return s}getHiddenValues(){const e={};for(const t of this.resolveViews())Object.assign(e,t.getHiddenValues());return e}getAllValues(){const e={};for(const t of this.resolveViews())Object.assign(e,t.getAllFormData());return e}getValueByPath(e){for(const t of this.resolveViews()){const s=t.getFieldValue(e);if(s!==void 0)return s}}registerValidator(e,t){for(const s of this.resolveViews())s.registerFieldValidator(e,t)}unregisterValidator(e,t){for(const s of this.resolveViews())s.unregisterFieldValidator(e,t)}revalidateField(e){for(const t of this.resolveViews())t.validateField(e,{trigger:"change"})}getSchema(){return this.resolveViews()[0]?.getSchema()??null}removeErrorField(e){for(const t of this.resolveViews())t.removeErrorField(e)}scrollToPath(e){this.getPrimaryFormEl()?.querySelector(`[data-nexus-field="${e}"]`)?.scrollIntoView({behavior:"smooth",block:"center"})}getFieldError(e){for(const t of this.resolveViews()){const s=t.getFieldError(e);if(s.length>0)return s}return[]}getFieldsError(){const e=new Map;for(const t of this.resolveViews())for(const[s,n]of t.getFieldsError())e.set(s,n);return e}validateFields(e,t){const s=this.resolveViews();return s.length===1?s[0].validate(e,t):Promise.all(s.map(n=>n.validate(e,t))).then(n=>{const i=new Map;for(const o of n)for(const[r,a]of o)i.set(r,a);return i})}getFieldState(e){for(const t of this.resolveViews()){const s=t.getFieldState(e);if(s)return s}}reloadRemoteData(e){for(const t of this.resolveViews())t.reloadRemoteData(e)}}exports.FormController=g;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),o=require("react"),_=require("../contexts/FieldInheritContext.cjs"),k=require("../contexts/GridContext.cjs"),L=require("../contexts/LayoutConfigContext.cjs"),M=require("../contexts/NexusContext.cjs"),R=require("../utils/resolveColSpan.cjs");function B({dataPath:t,layoutKey:u}){const{engine:n,config:l,form:b}=M.useNexusContext();o.useSyncExternalStore(i=>n.subscribeField(t,i),()=>n.getFieldVersion(t),()=>n.getFieldVersion(t));const e=n.getFieldState(t),h=o.useContext(k.GridContext),F=o.useContext(L.LayoutConfigContext),a=o.useContext(_.FieldInheritContext),v=o.useCallback(i=>{n.setFieldValue(t,i)},[n,t]),W=o.useCallback(i=>{i.currentTarget.contains(i.relatedTarget)||n.validateField(t,{trigger:"blur"})},[n,t]),w=o.useMemo(()=>e?.meta.enum?e.meta.enum.map((i,d)=>({value:i,label:e.meta.enumNames?.[d]??String(i)})):e?.props.options,[e?.meta.enum,e?.meta.enumNames,e?.props.options]),S=o.useMemo(()=>{const i={};if(e?.reactions){for(const d of e.reactions)if(d.dependencies)for(const y of d.dependencies)i[y]=n.getFieldValue(y)}return i},[e?.reactions,n]);if(!e)return n.getSnapshot()>0&&console.warn(`[NexusField] Field not found: ${t}`),null;if(a.visible===!1||!e.visible)return F.removeHidden===!0?null:s.jsx("div",{className:"hidden","data-nexus-hidden":t});const m=l.readOnly||a.readOnly===!0||e.readOnly,N=a.disabled===!0||e.disabled,p=m&&!!e.meta.readOnlyWidget,j=p?e.meta.readOnlyWidget:e.meta.widget;let r=n.getWidget(j);if(!r&&p&&(r=n.getWidget(e.meta.widget)),!r)return s.jsxs("div",{className:"text-xs text-red-500","data-nexus-field":t,children:['⚠️ Widget "',e.meta.widget,'" 未注册 (path: ',t,")"]});const q=e.meta.displayType??l.displayType,O=e.meta.labelWidth??l.labelWidth,T=e.meta.column??l.column,g=R.resolveColSpan(e.meta.colSpan,h),x={...e.meta.width?{width:e.meta.width,flexShrink:0}:{},...g?{gridColumn:`span ${g}`}:{}},f=n.getFieldWrapper(),V={label:e.meta.label,title:e.meta.title,description:e.meta.description,tooltip:e.meta.tooltip,errors:e.errors,required:e.required,extra:e.meta.extra,width:e.meta.width,displayType:q,labelWidth:O,column:T},C={dataPath:t,path:t,value:e.value,onChange:v,disabled:N,readOnly:m,loading:e.loading,placeholder:e.meta.placeholder,options:w,form:b,dependValues:S,items:e.meta.items,schema:e.meta.schema,remoteVersion:n.getRemoteDataVersion(t),...e.props};let c;return f?c=s.jsx(f,{...V,children:s.jsx(r,{...C})},u):c=s.jsx(r,{...C},u),s.jsx("div",{"data-nexus-field":t,onBlur:W,style:Object.keys(x).length>0?x:void 0,children:c})}exports.NexusField=B;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("react/jsx-runtime"),e=require("react");require("../contexts/NexusContext.cjs");require("@xbeeant/form-engine");const ce=require("../hooks/useFormSubmitting.cjs"),F=require("../utils/persist.cjs"),le=require("../utils/renderTreeNode.cjs"),ae=require("./NexusFormProvider.cjs");function S(){}function fe({form:u,schema:r,initialValues:z,widgets:d,layouts:b,fieldWrapper:g,onFinish:A,onFinishFailed:B,onMount:x,footer:R=!1,className:G,style:J,children:Q,labelCol:p,labelWidth:U,colon:X,label:Y,displayType:Z,readOnly:T,column:H,watch:j,onValuesChange:v,removeHiddenData:C=!0,omitNil:E=!1,locale:ee,persist:c}){const o=e.useId(),t=e.useMemo(()=>u._useInstance(o),[u,o]),q=e.useRef(null),l=e.useRef(c);l.current=c;const _=Z??r?.displayType??"row",N=Y??r?.label??!0,k=X??r?.colon,i=U??r?.labelWidth,L=T??r?.readOnly??!1,a=H??r?.column,M=ee??r?.locale??t.getLocale();e.useEffect(()=>{d&&t.registerWidgets(d),g&&t.registerFieldWrapper(g),b&&t.registerLayouts(b)},[t,d,b,g]);const P=e.useRef(!0),te=e.useRef(z);e.useEffect(()=>{if(r)if(P.current){const n=l.current?F.loadPersisted(l.current):void 0;t.init(r,n??te.current),P.current=!1}else t.init(r,t.getFormData())},[t,r]);const h=c?`${c.storage??"localStorage"}:${c.key}`:null;e.useEffect(()=>{const n=h?l.current:void 0;if(!n)return;let s=null;const m=n.debounce??300,oe=t.subscribeStore(()=>{s&&clearTimeout(s),s=setTimeout(()=>{F.savePersisted(n,t.getFormData())},m)});return()=>{s&&clearTimeout(s),oe()}},[t,h]);const O=e.useRef(x);O.current=x;const I=e.useRef(!1),$=!r||typeof r=="object"&&Object.keys(r).length===0;e.useEffect(()=>{I.current||$||(I.current=!0,O.current?.())},[$]);const D=e.useRef(S),V=e.useRef(S);D.current=n=>{const s=l.current;return s&&s.clearOnSubmit!==!1&&F.clearPersisted(s),A?.(n)},V.current=B??S,e.useEffect(()=>{u._bind(o,q.current,()=>D.current,()=>V.current)},[u,o]);const W=e.useRef(v);W.current=v,e.useEffect(()=>{u._syncConfig(o,{removeHiddenData:C,omitNil:E,watch:j,onValuesChange:(n,s,m)=>W.current?.(n,s,m)})},[u,o,C,E,j]);const ne=e.useSyncExternalStore(n=>t.subscribeRender(n),()=>t.getRenderSnapshot(),()=>t.getRenderSnapshot()),re=e.useMemo(()=>t.getRenderTree(),[t,ne]),se=e.useCallback(async n=>{n.preventDefault(),await u.submit()},[u]),ue=e.useCallback(()=>{u.resetFields()},[u]),K=ce.useFormSubmitting(u);let y=null;R===!0?y=f.jsxs("div",{className:"mt-4",children:[f.jsx("button",{type:"submit",disabled:K,children:K?"提交中...":"提交"})," ",f.jsx("button",{type:"button",onClick:ue,children:"重置"})]}):R&&(y=R);const w=e.useMemo(()=>{if(p)return p;if(i)return{style:{width:typeof i=="number"?`${i}px`:i}}},[p,i]),ie=e.useMemo(()=>({labelCol:w,labelWidth:i,colon:k,label:N,displayType:_,readOnly:L,column:a,locale:M}),[w,i,k,N,_,L,a,M]);return f.jsx(ae.NexusFormProvider,{engine:t,config:ie,form:u,children:f.jsxs("form",{ref:q,onSubmit:se,className:G,style:{...J,...a&&a>1?{display:"grid",gridTemplateColumns:`repeat(${a}, 1fr)`,gap:"0 16px"}:{}},noValidate:!0,children:[re.map((n,s)=>le.renderTreeNode(n,s)),!T&&y,Q]})})}exports.NexusForm=fe;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("@xbeeant/form-engine"),f=require("../utils/omit-nil.cjs"),u=new WeakSet;class g{engine;submitting=!1;submittingListeners=new Set;views=new Map;instanceBindings=new Map;instanceConfigs=new Map;constructor(e){this.engine=e??new c.NexusEngine,this.engine.hasPlugin("async-validator")||this.engine.use(new c.AsyncValidatorPlugin(this.engine))}_useInstance(e){let t=this.views.get(e);return t||(this.views.size===0&&!u.has(this.engine)?(u.add(this.engine),t=this.engine):t=this.engine.instance(e),this.views.set(e,t),this.instanceConfigs.set(e,{removeHiddenData:!0,omitNil:!1,watchers:new Map,globalWatcher:null,onValuesChange:null})),t}resolveViews(){const e=Array.from(this.views.values());return e.length>0?e:[this.engine]}getPrimaryFormEl(){return this.instanceBindings.values().next().value?.formEl??null}_bind(e,t,s,n){this.instanceBindings.set(e,{formEl:t,getOnFinish:s,getOnFinishFailed:n}),this._useInstance(e).registerOnFieldValueChange((o,r)=>this._onFieldValueChange(e,o,r))}_syncConfig(e,t){const s=this.instanceConfigs.get(e)??{removeHiddenData:!0,omitNil:!1,watchers:new Map,globalWatcher:null,onValuesChange:null};if(t.removeHiddenData!==void 0&&(s.removeHiddenData=t.removeHiddenData),t.omitNil!==void 0&&(s.omitNil=t.omitNil),t.onValuesChange!==void 0&&(s.onValuesChange=t.onValuesChange),t.watch){s.watchers.clear(),s.globalWatcher=null;for(const[n,i]of Object.entries(t.watch))n==="#"?s.globalWatcher=i:s.watchers.set(n,i)}this.instanceConfigs.set(e,s)}_onFieldValueChange(e,t,s){const n=this.views.get(e),i=this.instanceConfigs.get(e);if(!n||!i)return;const o=n.getFormData(),r=i.removeHiddenData?o:n.getAllFormData();i.globalWatcher&&i.globalWatcher(r,r,t),i.onValuesChange&&i.onValuesChange(s,r,t);const a=i.watchers.get(t);a&&a(s,r)}_getEngine(){return this.engine}getEngine(){return this.engine}async submit(e){this.setSubmitting(!0);try{await this.runSubmit(e)}finally{this.setSubmitting(!1)}}getSubmitting(){return this.submitting}onSubmittingChange(e){return this.submittingListeners.add(e),()=>{this.submittingListeners.delete(e)}}setSubmitting(e){if(this.submitting!==e){this.submitting=e;for(const t of this.submittingListeners)t()}}async runSubmit(e){const t=this.resolveViews(),s=new Map;let n;for(const i of t){const o=await i.validate(void 0,{validateFirst:e?.validateFirst});if(o.size>0){for(const[r,a]of o)s.set(r,a);n??=this.instanceBindings.get(this.findInstanceId(i))}}if(s.size>0){this.focusFirstError(s,n?.formEl??null),n?.getOnFinishFailed()?.(s);return}for(const i of t){const o=this.findInstanceId(i),r=this.instanceConfigs.get(o)??{removeHiddenData:!0,omitNil:!1},a=r.removeHiddenData?i.getFormData():i.getAllFormData(),l=e?.omitNil??r.omitNil??!1?f.omitNilDeep(a):a;await i.submit(l)&&await this.instanceBindings.get(o)?.getOnFinish()?.(l)}}findInstanceId(e){for(const[t,s]of this.views)if(s===e)return t;return"default"}focusFirstError(e,t){if(!t||e.size===0)return;const s=new Set(e.keys());requestAnimationFrame(()=>{const i=t.querySelectorAll("[data-nexus-field]");for(const o of Array.from(i)){const r=o.getAttribute("data-nexus-field");if(!r||!s.has(r))continue;typeof o.scrollIntoView=="function"&&o.scrollIntoView({behavior:"smooth",block:"center"}),o.querySelector('input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])')?.focus();return}})}resetFields(){for(const e of this.resolveViews())e.reset()}setErrorFields(e){for(const t of this.resolveViews())t.setErrorFields(e)}setValues(e){for(const t of this.resolveViews())t.setFieldValues(e)}setValueByPath(e,t){for(const s of this.resolveViews())s.setFieldValue(e,t)}setSchemaByPath(e,t){for(const s of this.resolveViews())s.setSchemaByPath(e,t)}setSchema(e){for(const t of this.resolveViews())t.setSchema(e)}getValues(e,t){const s={};for(const n of this.resolveViews()){const i=n.getFormData(e);t?.omitNil?Object.assign(s,f.omitNilDeep(i)):Object.assign(s,i)}return s}getHiddenValues(){const e={};for(const t of this.resolveViews())Object.assign(e,t.getHiddenValues());return e}getAllValues(){const e={};for(const t of this.resolveViews())Object.assign(e,t.getAllFormData());return e}getValueByPath(e){for(const t of this.resolveViews()){const s=t.getFieldValue(e);if(s!==void 0)return s}}registerValidator(e,t){for(const s of this.resolveViews())s.registerFieldValidator(e,t)}unregisterValidator(e,t){for(const s of this.resolveViews())s.unregisterFieldValidator(e,t)}revalidateField(e){for(const t of this.resolveViews())t.validateField(e,{trigger:"change"})}getSchema(){return this.resolveViews()[0]?.getSchema()??null}removeErrorField(e){for(const t of this.resolveViews())t.removeErrorField(e)}scrollToPath(e){this.getPrimaryFormEl()?.querySelector(`[data-nexus-field="${e}"]`)?.scrollIntoView({behavior:"smooth",block:"center"})}getFieldError(e){for(const t of this.resolveViews()){const s=t.getFieldError(e);if(s.length>0)return s}return[]}getFieldsError(){const e=new Map;for(const t of this.resolveViews())for(const[s,n]of t.getFieldsError())e.set(s,n);return e}validateFields(e,t){const s=this.resolveViews();return s.length===1?s[0].validate(e,t):Promise.all(s.map(n=>n.validate(e,t))).then(n=>{const i=new Map;for(const o of n)for(const[r,a]of o)i.set(r,a);return i})}getFieldState(e){for(const t of this.resolveViews()){const s=t.getFieldState(e);if(s)return s}}reloadRemoteData(e){for(const t of this.resolveViews())t.reloadRemoteData(e)}}exports.FormController=g;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react/jsx-runtime"),o=require("react"),k=require("../contexts/field-inherit-context.cjs"),D=require("../contexts/grid-context.cjs"),R=require("../contexts/layout-config-context.cjs"),L=require("../contexts/nexus-context.cjs"),$=require("../utils/resolve-col-span.cjs");function E({dataPath:t,layoutKey:f}){const{engine:s,config:m,form:i}=L.useNexusContext();o.useSyncExternalStore(n=>s.subscribeField(t,n),()=>s.getFieldVersion(t),()=>s.getFieldVersion(t));const e=s.getFieldState(t),F=o.useContext(D.GridContext),S=o.useContext(R.LayoutConfigContext),g=o.useContext(k.FieldInheritContext),V=o.useCallback(n=>{s.setFieldValue(t,n)},[s,t]),w=o.useCallback(n=>{n.currentTarget.contains(n.relatedTarget)||s.validateField(t,{trigger:"blur"})},[s,t]),W=o.useMemo(()=>e?.meta.enum?e.meta.enum.map((n,d)=>({value:n,label:e.meta.enumNames?.[d]??String(n)})):e?.props.options,[e?.meta.enum,e?.meta.enumNames,e?.props.options]),N=o.useMemo(()=>{const n={};if(e?.reactions){for(const d of e.reactions)if(d.dependencies)for(const u of d.dependencies)n[u]=s.getFieldValue(u)}return n},[e?.reactions,s]),O=o.useMemo(()=>{const n=e?.meta.itemOf,u=!!n?t.match(/\[(\d+)\]/):void 0,_=u?Number(u[1]):void 0;return{get formData(){return i.getValues()},get rootValue(){return i.getValues()},value:e?.value,dataPath:t,path:t,index:_,parentValues:n?i.getValueByPath(n):void 0,getValue:l=>i.getValueByPath(l),setValue:(l,c)=>i.setValueByPath(l,c),onItemChange:(l,c)=>i.setValueByPath(l,c),validate:async l=>{l?await i.validateFields([l]):await i.validateFields([t])},validateFields:async l=>{await i.validateFields(l)},submit:()=>i.submit(),resetFields:()=>i.resetFields(),setSchema:l=>i.setSchema(l),setSchemaByPath:(l,c)=>i.setSchemaByPath(l,c),getSchema:()=>i.getSchema()}},[i,t,e?.value,e?.meta.itemOf]);if(!e)return s.getSnapshot()>0&&console.warn(`[NexusField] Field not found: ${t}`),null;if(g.visible===!1||!e.visible)return S.removeHidden===!0?null:r.jsx("div",{className:"hidden","data-nexus-hidden":t});const p=m.readOnly||g.readOnly===!0||e.readOnly,j=g.disabled===!0||e.disabled,y=p&&!!e.meta.readOnlyWidget,q=y?e.meta.readOnlyWidget:e.meta.widget;let a=s.getWidget(q);if(!a&&y&&(a=s.getWidget(e.meta.widget)),!a)return r.jsxs("div",{className:"text-xs text-red-500","data-nexus-field":t,children:['⚠️ Widget "',e.meta.widget,'" 未注册 (path: ',t,")"]});const B=e.meta.displayType??m.displayType,T=e.meta.labelWidth??m.labelWidth,I=e.meta.column??m.column,v=$.resolveColSpan(e.meta.colSpan,F),h={...e.meta.width?{width:e.meta.width,flexShrink:0}:{},...v?{gridColumn:`span ${v}`}:{}},C=s.getFieldWrapper(),M={label:e.meta.label,title:e.meta.title,description:e.meta.description,tooltip:e.meta.tooltip,errors:e.errors,required:e.required,extra:e.meta.extra,displayType:B,labelWidth:T,column:I},b={dataPath:t,path:t,value:e.value,onChange:V,disabled:j,readOnly:p,loading:e.loading,placeholder:e.meta.placeholder,options:W,form:i,addons:O,dependValues:N,items:e.meta.items,schema:e.meta.schema,remoteVersion:s.getRemoteDataVersion(t),...e.props};let x;return C?x=r.jsx(C,{...M,children:r.jsx(a,{...b})},f):x=r.jsx(a,{...b},f),r.jsx("div",{"data-nexus-field":t,className:p?"nexus-field-readonly":void 0,onBlur:w,style:Object.keys(h).length>0?h:void 0,children:x})}exports.NexusField=E;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),n=require("react"),i=require("../contexts/nexus-context.cjs");function x({engine:e,config:r,form:t,children:o}){const u=n.useMemo(()=>({engine:e,config:r,form:t}),[e,r,t]);return s.jsx(i.NexusContext.Provider,{value:u,children:o})}exports.NexusFormProvider=x;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("react/jsx-runtime"),e=require("react");require("../contexts/nexus-context.cjs");require("@xbeeant/form-engine");const ce=require("../hooks/use-form-submitting.cjs"),F=require("../utils/persist.cjs"),le=require("../utils/render-tree-node.cjs"),ae=require("./nexus-form-provider.cjs");function S(){}function fe({form:u,schema:r,initialValues:z,widgets:d,layouts:b,fieldWrapper:g,onFinish:A,onFinishFailed:B,onMount:x,footer:R=!1,className:G,style:J,children:Q,labelCol:p,labelWidth:U,colon:X,label:Y,displayType:Z,readOnly:T,column:H,watch:j,onValuesChange:v,removeHiddenData:C=!0,omitNil:E=!1,locale:ee,persist:c}){const o=e.useId(),t=e.useMemo(()=>u._useInstance(o),[u,o]),q=e.useRef(null),l=e.useRef(c);l.current=c;const _=Z??r?.displayType??"row",k=Y??r?.label??!0,L=X??r?.colon,i=U??r?.labelWidth,M=T??r?.readOnly??!1,a=H??r?.column,N=ee??r?.locale??t.getLocale();e.useEffect(()=>{d&&t.registerWidgets(d),g&&t.registerFieldWrapper(g),b&&t.registerLayouts(b)},[t,d,b,g]);const P=e.useRef(!0),te=e.useRef(z);e.useEffect(()=>{if(r)if(P.current){const n=l.current?F.loadPersisted(l.current):void 0;t.init(r,n??te.current),P.current=!1}else t.init(r,t.getFormData())},[t,r]);const h=c?`${c.storage??"localStorage"}:${c.key}`:null;e.useEffect(()=>{const n=h?l.current:void 0;if(!n)return;let s=null;const m=n.debounce??300,oe=t.subscribeStore(()=>{s&&clearTimeout(s),s=setTimeout(()=>{F.savePersisted(n,t.getFormData())},m)});return()=>{s&&clearTimeout(s),oe()}},[t,h]);const O=e.useRef(x);O.current=x;const I=e.useRef(!1),$=!r||typeof r=="object"&&Object.keys(r).length===0;e.useEffect(()=>{I.current||$||(I.current=!0,O.current?.())},[$]);const D=e.useRef(S),V=e.useRef(S);D.current=n=>{const s=l.current;return s&&s.clearOnSubmit!==!1&&F.clearPersisted(s),A?.(n)},V.current=B??S,e.useEffect(()=>{u._bind(o,q.current,()=>D.current,()=>V.current)},[u,o]);const W=e.useRef(v);W.current=v,e.useEffect(()=>{u._syncConfig(o,{removeHiddenData:C,omitNil:E,watch:j,onValuesChange:(n,s,m)=>W.current?.(n,s,m)})},[u,o,C,E,j]);const ne=e.useSyncExternalStore(n=>t.subscribeRender(n),()=>t.getRenderSnapshot(),()=>t.getRenderSnapshot()),re=e.useMemo(()=>t.getRenderTree(),[t,ne]),se=e.useCallback(async n=>{n.preventDefault(),await u.submit()},[u]),ue=e.useCallback(()=>{u.resetFields()},[u]),K=ce.useFormSubmitting(u);let y=null;R===!0?y=f.jsxs("div",{className:"mt-4",children:[f.jsx("button",{type:"submit",disabled:K,children:K?"提交中...":"提交"})," ",f.jsx("button",{type:"button",onClick:ue,children:"重置"})]}):R&&(y=R);const w=e.useMemo(()=>{if(p)return p;if(i)return{style:{width:typeof i=="number"?`${i}px`:i}}},[p,i]),ie=e.useMemo(()=>({labelCol:w,labelWidth:i,colon:L,label:k,displayType:_,readOnly:M,column:a,locale:N}),[w,i,L,k,_,M,a,N]);return f.jsx(ae.NexusFormProvider,{engine:t,config:ie,form:u,children:f.jsxs("form",{ref:q,onSubmit:se,className:G,style:{...J,...a&&a>1?{display:"grid",gridTemplateColumns:`repeat(${a}, 1fr)`,gap:"0 16px"}:{}},noValidate:!0,children:[re.map((n,s)=>le.renderTreeNode(n,s)),!T&&y,Q]})})}exports.NexusForm=fe;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),l=require("react"),y=require("../contexts/grid-context.cjs"),u=require("../contexts/layout-config-context.cjs"),C=require("../contexts/nexus-context.cjs"),v=require("../utils/render-tree-node.cjs"),h=require("../utils/resolve-col-span.cjs");function g({node:e}){const{engine:c}=C.useNexusContext(),r=c.getLayout(e.type),s=e.children.map((d,x)=>v.renderTreeNode(d,x)),a=l.useContext(y.GridContext),n=h.resolveColSpan(e.props.colSpan,a),o={...n?{gridColumn:`span ${n}`}:{},...e.props.width?{width:e.props.width,flexShrink:0}:{}},i=l.useMemo(()=>({removeHidden:e.props.removeHidden}),[e.props.removeHidden]);if(!r)return t.jsx(u.LayoutConfigContext.Provider,{value:i,children:t.jsxs("div",{"data-nexus-layout":e.type,className:"mb-4",style:Object.keys(o).length>0?o:void 0,children:[e.title&&t.jsx("div",{className:"mb-2 font-bold",children:e.title}),s]})});const{displayType:m,labelWidth:f,colSpan:j,width:S,...p}=e.props;return t.jsx(u.LayoutConfigContext.Provider,{value:i,children:t.jsx("div",{style:Object.keys(o).length>0?o:void 0,children:t.jsx(r,{...p,node:e,title:e.title,children:s})})})}exports.NexusLayout=g;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),o=require("react"),h=require("../contexts/field-inherit-context.cjs"),v=require("../contexts/nexus-context.cjs"),m=require("../utils/render-tree-node.cjs");function f({node:e}){const{engine:s,config:a}=v.useNexusContext(),n=o.useContext(h.FieldInheritContext);o.useSyncExternalStore(i=>s.subscribeField(e.dataPath,i),()=>s.getFieldVersion(e.dataPath),()=>s.getFieldVersion(e.dataPath));const r=s.getFieldState(e.dataPath),[l,x]=o.useState(!1),d=(a.column??1)>1,c=d?{gridTemplateColumns:`repeat(${a.column}, 1fr)`}:{},u={disabled:n.disabled??(r?.disabled===!0?!0:void 0),readOnly:n.readOnly??(r?.readOnly===!0?!0:void 0),visible:n.visible===!1||r?.visible===!1?!1:void 0},b=u.visible===!1,g=()=>x(i=>!i);return t.jsx(h.FieldInheritContext.Provider,{value:u,children:t.jsxs("div",{"data-nexus-object":e.dataPath,className:`mb-4 ${b?"hidden":""}`,children:[e.title&&t.jsxs("div",{onClick:g,className:"flex gap-1 mb-2 cursor-pointer select-none border-none bg-transparent p-0 font-bold",children:[t.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:`align-middle transition-transform duration-200 ease-in-out ${l?"rotate-0":"rotate-90"}`,"aria-hidden":"true",children:t.jsx("polyline",{points:"9 18 15 12 9 6"})}),e.title]}),t.jsx("div",{className:`${d?"grid gap-x-4":""} ${l?"hidden":""}`,style:Object.keys(c).length>0?c:void 0,children:e.children.map((i,p)=>m.renderTreeNode(i,p))})]})})}exports.NexusObject=f;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react"),t=e.createContext({});exports.FieldInheritContext=t;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react"),e=t.createContext(null);exports.GridContext=e;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react"),e=t.createContext({});exports.LayoutConfigContext=e;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react"),o=t.createContext(null);function u(){const e=t.useContext(o);if(!e)throw new Error("[NexusField] Must be used within <NexusFormProvider>");return e}exports.NexusContext=o;exports.useNexusContext=u;
|
package/dist/cjs/hooks/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./use-engine.cjs"),s=require("./use-field-state.cjs"),u=require("./use-field-validator.cjs"),o=require("./use-field-value.cjs"),t=require("./use-form.cjs"),r=require("./use-form-config.cjs"),i=require("./use-form-data.cjs"),a=require("./use-form-submitting.cjs"),l=require("./use-watch.cjs"),c=require("./use-watch-all.cjs"),n=require("./use-watch-multiple.cjs"),h=require("./use-watch-state.cjs");exports.useEngine=e.useEngine;exports.useFieldState=s.useFieldState;exports.useFieldValidator=u.useFieldValidator;exports.useFieldValue=o.useFieldValue;exports.useForm=t.useForm;exports.useFormConfig=r.useFormConfig;exports.useFormData=i.useFormData;exports.useFormSubmitting=a.useFormSubmitting;exports.useWatch=l.useWatch;exports.useWatchAll=c.useWatchAll;exports.useWatchMultiple=n.useWatchMultiple;exports.useWatchState=h.useWatchState;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("../contexts/nexus-context.cjs");function t(){const{engine:e}=n.useNexusContext();return e}exports.useEngine=t;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("react"),r=require("../contexts/nexus-context.cjs");function s(e){const{engine:t}=r.useNexusContext();return i.useSyncExternalStore(n=>t.subscribeField(e,n),()=>t.getFieldVersion(e),()=>t.getFieldVersion(e)),t.getFieldState(e)}exports.useFieldState=s;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react"),g=require("../contexts/nexus-context.cjs");function b(n,e,i,u){const{engine:d}=g.useNexusContext(),o=s.useRef(i);o.current=i;const t=s.useRef(u?.dependsOn);t.current=u?.dependsOn;const l=u?.deps;s.useEffect(()=>{if(!n||!e)return;const r=o.current;return n.registerValidator(e,r),()=>{n.unregisterValidator(e,r)}},[n,e,...l??[]]),s.useEffect(()=>{if(!e||!t.current||t.current.length===0)return;const r=d;if(!r)return;const f=e,a=t.current.map(c=>r.subscribeField(c,()=>{n?.revalidateField(f)}));return()=>{for(const c of a)c()}},[d,n,e])}exports.useFieldValidator=b;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react"),u=require("./use-engine.cjs");function s(e){const i=u.useEngine();return r.useSyncExternalStore(n=>i.subscribeField(e,n),()=>i.getFieldVersion(e),()=>i.getFieldVersion(e)),i.getFieldValue(e)}exports.useFieldValue=s;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("../contexts/nexus-context.cjs");function o(){const{config:e}=t.useNexusContext();return e}exports.useFormConfig=o;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react"),r=require("./use-engine.cjs");function s(){const e=r.useEngine(),n=t.useSyncExternalStore(o=>e.subscribeStore(o),()=>e.getSnapshot(),()=>e.getSnapshot());return t.useMemo(()=>e.getFormData(),[e,n])}exports.useFormData=s;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("react");function n(t){return i.useSyncExternalStore(e=>t.onSubmittingChange(e),()=>t.getSubmitting(),()=>t.getSubmitting())}exports.useFormSubmitting=n;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("@xbeeant/form-engine"),t=require("react"),u=require("../components/form-controller.cjs");function c(r,n){const e=t.useRef(null);return e.current||(e.current=new u.FormController(n??(r?new o.NexusEngine({formId:r}):void 0))),[e.current]}exports.useForm=c;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react"),o=t.createContext(null);function u(){const e=t.useContext(o);if(!e)throw new Error("[NexusField] Must be used within <NexusFormProvider>");return e}exports.NexusContext=o;exports.useNexusContext=u;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react");function R(t,i,b){const{deep:l=!1}=b||{},e=s.useRef({}),c=s.useRef({}),u=s.useRef(i);return u.current=i,s.useEffect(()=>{if(!t)return;const f=t.getFormData();e.current=f,c.current=f,u.current(f);const d=t.subscribeAll(r=>{if(l)JSON.stringify(r)!==JSON.stringify(e.current)&&(e.current=r,c.current=r,u.current(r));else{let n=!1;for(const o in r)if(r[o]!==e.current[o]){n=!0;break}n&&(e.current=r,c.current=r,u.current(r))}});return()=>{d()}},[t,l]),c.current}exports.useWatchAll=R;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react");function h(r,n,a,d){const{deep:l=!1}=d||{},o=t.useRef({}),u=t.useRef({}),f=t.useRef(a);f.current=a;const i=t.useRef(n);i.current=n;const y=[...n].sort().join(",");return t.useEffect(()=>{if(!r)return;const R=i.current,c={};for(const e of R)c[e]=r.getFieldValue(e);o.current=c,u.current=c,f.current(c);const V=R.map(e=>r.subscribe(e,g=>{const s=g.value,b=o.current[e];(l?JSON.stringify(s)!==JSON.stringify(b):s!==b)&&(o.current[e]=s,u.current={[e]:s},f.current(u.current))}));return()=>{for(const e of V)e()}},[r,l,y]),u.current}exports.useWatchMultiple=h;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react");function i(t,e,n){const r=s.useRef(void 0),u=s.useRef(n);return u.current=n,s.useEffect(()=>{if(!t)return;const c=t.getFieldState(e);r.current=c,c&&u.current(c);const f=t.subscribe(e,o=>{r.current=o,u.current(o)});return()=>{f()}},[t,e]),r.current||{}}exports.useWatchState=i;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("react");function d(t,c,i,l){const{deep:s=!1}=l||{},e=o.useRef(void 0),n=o.useRef(i);return n.current=i,o.useEffect(()=>{if(!t)return;const r=t.getFieldValue(c);e.current===void 0&&(e.current=r),(s?JSON.stringify(r)!==JSON.stringify(e.current):r!==e.current)&&(e.current=r,n.current(r));const f=t.subscribe(c,a=>{const u=a.value;(s?JSON.stringify(u)!==JSON.stringify(e.current):u!==e.current)&&(e.current=u,n.current(u))});return()=>{f()}},[t,c,s]),e.current}exports.useWatch=d;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react"),r=require("./useEngine.cjs");function s(){const e=r.useEngine(),n=t.useSyncExternalStore(o=>e.subscribeStore(o),()=>e.getSnapshot(),()=>e.getSnapshot());return t.useMemo(()=>e.getFormData(),[e,n])}exports.useFormData=s;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("react");function n(t){return i.useSyncExternalStore(e=>t.onSubmittingChange(e),()=>t.getSubmitting(),()=>t.getSubmitting())}exports.useFormSubmitting=n;
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('./styles.css');;/* empty css */const e=require("./components/
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('./styles.css');;/* empty css */const e=require("./components/form-controller.cjs"),o=require("./components/nexus-field.cjs"),t=require("./components/nexus-form.cjs"),s=require("./components/nexus-form-provider.cjs"),u=require("./components/nexus-layout.cjs"),r=require("./components/nexus-object.cjs"),n=require("./contexts/field-inherit-context.cjs"),i=require("./contexts/grid-context.cjs"),c=require("./contexts/layout-config-context.cjs"),l=require("./contexts/nexus-context.cjs"),a=require("./hooks/use-engine.cjs"),x=require("./hooks/use-field-state.cjs"),F=require("./hooks/use-field-validator.cjs"),m=require("./hooks/use-field-value.cjs"),h=require("./hooks/use-form.cjs"),d=require("./hooks/use-form-config.cjs"),q=require("./hooks/use-form-data.cjs"),_=require("./hooks/use-form-submitting.cjs"),C=require("./hooks/use-watch.cjs"),g=require("./hooks/use-watch-all.cjs"),k=require("./hooks/use-watch-multiple.cjs"),N=require("./hooks/use-watch-state.cjs");exports.FormController=e.FormController;exports.NexusField=o.NexusField;exports.NexusForm=t.NexusForm;exports.NexusFormProvider=s.NexusFormProvider;exports.NexusLayout=u.NexusLayout;exports.NexusObject=r.NexusObject;exports.FieldInheritContext=n.FieldInheritContext;exports.GridContext=i.GridContext;exports.LayoutConfigContext=c.LayoutConfigContext;exports.NexusContext=l.NexusContext;exports.useEngine=a.useEngine;exports.useFieldState=x.useFieldState;exports.useFieldValidator=F.useFieldValidator;exports.useFieldValue=m.useFieldValue;exports.useForm=h.useForm;exports.useFormConfig=d.useFormConfig;exports.useFormData=q.useFormData;exports.useFormSubmitting=_.useFormSubmitting;exports.useWatch=C.useWatch;exports.useWatchAll=g.useWatchAll;exports.useWatchMultiple=k.useWatchMultiple;exports.useWatchState=N.useWatchState;
|
package/dist/cjs/styles.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight:initial;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial}}}:root,:host{--color-red-500:oklch(63.7% .237 25.331);--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--font-weight-bold:700;--ease-in-out:cubic-bezier(.4, 0, .2, 1);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1)}.visible{visibility:visible}.mt-4{margin-top:calc(var(--spacing) * 4)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.rotate-0{rotate:0deg}.rotate-90{rotate:90deg}.cursor-pointer{cursor:pointer}.gap-1{gap:var(--spacing)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.border-none{--tw-border-style:none;border-style:none}.bg-transparent{background-color:#0000}.p-0{padding:0}.align-middle{vertical-align:middle}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.text-red-500{color:var(--color-red-500)}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.select-none{-webkit-user-select:none;user-select:none}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}
|
|
1
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight:initial;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial}}}:root,:host{--color-red-500:oklch(63.7% .237 25.331);--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--font-weight-bold:700;--ease-in-out:cubic-bezier(.4, 0, .2, 1);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1)}.visible{visibility:visible}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mt-4{margin-top:calc(var(--spacing) * 4)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.rotate-0{rotate:0deg}.rotate-90{rotate:90deg}.cursor-pointer{cursor:pointer}.gap-1{gap:var(--spacing)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.border-none{--tw-border-style:none;border-style:none}.bg-transparent{background-color:#0000}.p-0{padding:0}.align-middle{vertical-align:middle}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.text-red-500{color:var(--color-red-500)}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.select-none{-webkit-user-select:none;user-select:none}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function i(t){if(Array.isArray(t))return t.map(e=>i(e));if(t!==null&&typeof t=="object"){const e={};for(const[o,r]of Object.entries(t))r==null||r===""||(e[o]=i(r));return e}return t}exports.omitNilDeep=i;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function i(t){if(Array.isArray(t))return t.map(e=>i(e));if(t!==null&&typeof t=="object"){const e={};for(const[o,r]of Object.entries(t))r==null||r===""||(e[o]=i(r));return e}return t}exports.omitNilDeep=i;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function o(t){if(!(typeof window>"u"))try{const e=t==="sessionStorage"?window.sessionStorage:window.localStorage;return e.setItem("__nexus_persist_probe__","1"),e.removeItem("__nexus_persist_probe__"),e}catch{return}}function n(t){const e=o(t.storage);if(e)try{const r=e.getItem(t.key);if(!r)return;const s=JSON.parse(r);return typeof s=="object"&&s!==null?s:void 0}catch{return}}function i(t,e){const r=o(t.storage);if(r)try{r.setItem(t.key,JSON.stringify(e))}catch{}}function a(t){const e=o(t.storage);if(e)try{e.removeItem(t.key)}catch{}}exports.clearPersisted=a;exports.loadPersisted=n;exports.savePersisted=i;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),r=require("../components/nexus-field.cjs"),s=require("../components/nexus-layout.cjs"),a=require("../components/nexus-object.cjs");function o(e,u){return e.type==="field"?t.jsx(r.NexusField,{dataPath:e.dataPath,layoutKey:e.layoutKey},e.layoutKey||e.dataPath):e.type==="object"?t.jsx(a.NexusObject,{node:e},`object-${e.layoutKey}-${u}`):t.jsx(s.NexusLayout,{node:e},`layout-${e.type}-${u}`)}exports.renderTreeNode=o;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function n(o,e){if(o!==void 0)return o;if(e&&e.column>0)return Math.max(1,Math.round(e.column/24))}exports.resolveColSpan=n;
|
|
@@ -1,35 +1,79 @@
|
|
|
1
1
|
import { FieldState, NexusFormInstance, NexusSchema, NexusEngine } from '@xbeeant/form-engine';
|
|
2
2
|
/**
|
|
3
|
-
* FormController —
|
|
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))
|
|
4
11
|
*/
|
|
5
12
|
export declare class FormController implements NexusFormInstance {
|
|
6
13
|
private engine;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
private
|
|
11
|
-
|
|
12
|
-
private
|
|
13
|
-
|
|
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;
|
|
14
24
|
constructor(engine?: NexusEngine);
|
|
15
|
-
/**
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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: {
|
|
19
48
|
removeHiddenData?: boolean;
|
|
49
|
+
/** 提交/取值时递归移除空值(undefined/null/'',ProForm omitNil 对齐) */
|
|
50
|
+
omitNil?: boolean;
|
|
20
51
|
watch?: {
|
|
21
52
|
[path: string]: (value: unknown, allValues: Record<string, unknown>, changedPath?: string) => void;
|
|
22
53
|
};
|
|
54
|
+
onValuesChange?: (changedValue: unknown, allValues: Record<string, unknown>, changedPath: string) => void;
|
|
23
55
|
}): void;
|
|
24
|
-
/** 内部:值变更时调用(由 Engine
|
|
25
|
-
_onFieldValueChange(path: string, value: unknown): void;
|
|
26
|
-
/**
|
|
56
|
+
/** 内部:值变更时调用(由 Engine 通知,携带实例标识路由到对应实例的 watcher) */
|
|
57
|
+
_onFieldValueChange(instanceId: string, path: string, value: unknown): void;
|
|
58
|
+
/** 内部:获取引擎宿主实例 */
|
|
27
59
|
_getEngine(): NexusEngine;
|
|
28
60
|
/**
|
|
29
|
-
*
|
|
61
|
+
* 获取底层引擎宿主实例(用于跨表单联动:linkForm / setFormId / registerAntdUI 等;
|
|
62
|
+
* 宿主上的组件/插件注册对全部实例生效)
|
|
30
63
|
*/
|
|
31
64
|
getEngine(): NexusEngine;
|
|
32
|
-
submit(
|
|
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;
|
|
33
77
|
/**
|
|
34
78
|
* 定位到第一个校验失败的字段:按 DOM 渲染顺序查找(保证视觉上的"第一个"),
|
|
35
79
|
* 滚动入视并聚焦其内部可交互控件。
|
|
@@ -44,7 +88,9 @@ export declare class FormController implements NexusFormInstance {
|
|
|
44
88
|
setValueByPath(path: string, value: unknown): void;
|
|
45
89
|
setSchemaByPath(path: string, patch: Record<string, unknown>): void;
|
|
46
90
|
setSchema(schema: NexusSchema): void;
|
|
47
|
-
getValues(paths?: string[]
|
|
91
|
+
getValues(paths?: string[], options?: {
|
|
92
|
+
omitNil?: boolean;
|
|
93
|
+
}): Record<string, unknown>;
|
|
48
94
|
getHiddenValues(): Record<string, unknown>;
|
|
49
95
|
/** 获取所有字段值(含 hidden) */
|
|
50
96
|
getAllValues(): Record<string, unknown>;
|
|
@@ -70,6 +116,14 @@ export declare class FormController implements NexusFormInstance {
|
|
|
70
116
|
scrollToPath(path: string): void;
|
|
71
117
|
getFieldError(path: string): string[];
|
|
72
118
|
getFieldsError(): Map<string, string[]>;
|
|
73
|
-
validateFields(paths?: string[]
|
|
119
|
+
validateFields(paths?: string[], options?: {
|
|
120
|
+
validateFirst?: boolean;
|
|
121
|
+
}): Promise<Map<string, string[]>>;
|
|
74
122
|
getFieldState(path: string): FieldState | undefined;
|
|
123
|
+
/**
|
|
124
|
+
* 重载远程选项数据(x-render reloadRemoteData 对齐)
|
|
125
|
+
* 传入 path 仅重载该字段的远程数据;缺省时重载全部远程数据字段。
|
|
126
|
+
* 作用于全部实例视图。
|
|
127
|
+
*/
|
|
128
|
+
reloadRemoteData(path?: string): void;
|
|
75
129
|
}
|