@contractspec/lib.contracts-runtime-client-react 3.8.6 → 3.9.0
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/README.md +2 -0
- package/dist/browser/form-render.impl.js +1 -1
- package/dist/browser/form-render.js +1 -1
- package/dist/browser/index.js +1 -1
- package/dist/form-render.impl.d.ts +80 -7
- package/dist/form-render.impl.js +1 -1
- package/dist/form-render.impl.test.d.ts +1 -0
- package/dist/form-render.js +1 -1
- package/dist/index.js +1 -1
- package/dist/node/form-render.impl.js +1 -1
- package/dist/node/form-render.js +1 -1
- package/dist/node/index.js +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -21,6 +21,8 @@ or
|
|
|
21
21
|
|
|
22
22
|
Import the root entrypoint from `@contractspec/lib.contracts-runtime-client-react`, or choose a documented subpath when you only need one part of the package surface.
|
|
23
23
|
|
|
24
|
+
The form renderer supports the expanded FormSpec field set: readonly inputs, autocomplete, address, phone, date, time, datetime, groups, and repeated grouped arrays. Drivers are expected to provide dedicated slots for those rich widgets in addition to the base text/select/boolean controls.
|
|
25
|
+
|
|
24
26
|
## Architecture
|
|
25
27
|
|
|
26
28
|
- `src/drivers` is part of the package's public or composition surface.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var Qq=((U)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(U,{get:(H,J)=>(typeof require<"u"?require:H)[J]}):U)(function(U){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+U+'" is not supported')});import{buildZodWithRelations as o,evalPredicate as u}from"@contractspec/lib.contracts-spec/forms";import{zodResolver as i}from"@hookform/resolvers/zod";import x,{useEffect as a,useMemo as n,useState as d}from"react";import{Controller as s,useFieldArray as r,useForm as e}from"react-hook-form";import{jsx as Q,jsxs as M,Fragment as Jq}from"react/jsx-runtime";function v(U){if(!U)return;if(Array.isArray(U))return{kind:"static",options:U};return U}function qq(U,H){if(!H)return;let J=H.replace(/\[(\d+)\]/g,".$1").split(".").filter(Boolean),T=U;for(let L of J){if(T==null)return;T=T[L]}return T}function Hq(U,H){if(!H||H.length===0)return"[]";try{return JSON.stringify(H.map((J)=>qq(U,J)))}catch{return"[]"}}function p(U,H,J){let[T,L]=d([]),X=n(()=>{if(!H)return"nil";if(H.kind==="static")return JSON.stringify(H.options??[]);return Hq(U,H.deps)},[H,U]);return a(()=>{let N=!0;return(async()=>{if(!H)return L([]);if(H.kind==="static")return L([...H.options??[]]);let h=J?.[H.resolverKey];if(!h)return L([]);let k=await h(U,H.args);if(N)L([...k??[]])})(),()=>{N=!1}},[X,H&&H.kind==="resolver"?H.resolverKey:void 0]),T}function c(U,H,J){if(!H)return U??"";let T=typeof J==="number"?`${H.replace(/^\$index$/,String(J))}`:H;return U?`${U}${typeof J==="number"?`.${J}`:""}.${T}`.replace(/\.+/g,"."):T}function $q(U){let H=U,{driver:J}=H;function T(L){let{spec:X,options:N,merged:R}=L,h=n(()=>o(X),[X]),k=e({...R.formOptions,resolver:i(h),defaultValues:N?.defaultValues}),D=k.watch(),I=(q,w,W)=>{let{Field:Y,FieldLabel:y,FieldDescription:F,FieldError:B}=J,_=c(w,q.name,W),O=u(D,q.visibleWhen),Z=u(D,q.enabledWhen),P=Boolean(k.getFieldState(_)?.invalid);if(!O)return null;let $=_?.replace(/\./g,"-"),A={"data-invalid":P,hidden:!O,disabled:!Z},E=q.labelI18n?Q(y,{htmlFor:$,children:q.labelI18n}):null,g=q.descriptionI18n?Q(F,{children:q.descriptionI18n}):null;if(q.kind==="group"){let G=q.fields.map((z,K)=>Q(x.Fragment,{children:I(z,_,W)},`${_}-${K}`));return M(Y,{...A,children:[E,G,g]})}if(q.kind==="array")return l(q,w);return Q(s,{name:_,control:k.control,render:({field:G,fieldState:z})=>{let K=z.error?[z.error]:[],S=z.invalid||void 0;if(q.kind==="text"){let V=q,C=J.Input;return M(Y,{...A,children:[E,Q(C,{id:$,"aria-invalid":S,placeholder:q.placeholderI18n,autoComplete:V.autoComplete,inputMode:V.inputMode,maxLength:V.maxLength,minLength:V.minLength,disabled:!Z,...G,...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}if(q.kind==="textarea"){let V=q,C=J.Textarea;return M(Y,{...A,children:[E,Q(C,{id:$,"aria-invalid":S,placeholder:q.placeholderI18n,rows:V.rows,maxLength:V.maxLength,disabled:!Z,...G,...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}if(q.kind==="select"){let V=q,C=J.Select,b=v(V.options),j=p(D,b,R.resolvers);return M(Y,{...A,children:[E,Q(C,{id:$,name:_,"aria-invalid":S,disabled:!Z,value:G.value,onChange:(m)=>G.onChange(m),options:j,...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}if(q.kind==="checkbox"){let V=J.Checkbox;return M(Y,{...A,children:[E,Q(V,{id:$,name:_,disabled:!Z,checked:!!G.value,onCheckedChange:(C)=>G.onChange(C),...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}if(q.kind==="radio"){let V=q,C=J.RadioGroup,b=v(V.options),j=p(D,b,R.resolvers);return M(Y,{...A,children:[E,Q(C,{id:$,name:_,disabled:!Z,value:G.value,onValueChange:(m)=>G.onChange(m),options:j,...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}if(q.kind==="switch"){let V=J.Switch;return M(Y,{...A,children:[E,Q(V,{id:$,name:_,disabled:!Z,checked:!!G.value,onCheckedChange:(C)=>G.onChange(C),...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}return Q(Jq,{})}},_)},l=(q,w)=>{let W=c(w,q.name),{fields:Y,append:y,remove:F}=r({control:k.control,name:W}),B=q.max==null||Y.length<q.max,_=(P)=>(q.min==null?Y.length>0:Y.length>q.min)&&P>=0,O=J.Button,Z=J.FieldLabel;return M("div",{children:[q.labelI18n?Q(Z,{children:q.labelI18n}):null,Y.map((P,$)=>M("div",{children:[I(q.of,W,$),_($)?Q(O,{type:"button",variant:"ghost",size:"sm",onClick:()=>F($),children:"Remove"}):null]},P.id??$)),B?Q(O,{type:"button",variant:"outline",size:"sm",onClick:()=>y({}),children:"Add"}):null]},W)},t=async(q)=>{let w=X.actions?.[0]?.key??"submit";if(R.onSubmitOverride)return R.onSubmitOverride(q,w)},f=J.Button;return M("form",{onSubmit:k.handleSubmit(t),children:[(X.fields||[]).map((q,w)=>Q(x.Fragment,{children:I(q)},w)),X.actions&&X.actions.length?Q("div",{children:X.actions.map((q)=>Q(f,{type:"submit",children:q.labelI18n},q.key))}):null]})}return{render:(L,X)=>Q(T,{spec:L,options:X,merged:{...H,...X?.overrides??{}}})}}export{$q as createFormRenderer};
|
|
1
|
+
var TB=((B)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(B,{get:(G,Y)=>(typeof require<"u"?require:G)[Y]}):B)(function(B){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+B+'" is not supported')});import{buildZodWithRelations as d,evalPredicate as m,isFieldReadOnly as t,normalizeFormSpec as i}from"@contractspec/lib.contracts-spec/forms";import{zodResolver as l}from"@hookform/resolvers/zod";import V from"react";import{Controller as A,useFieldArray as s,useForm as o}from"react-hook-form";import{jsx as U,jsxs as q,Fragment as wB}from"react/jsx-runtime";function F(B){if(!B)return;if(Array.isArray(B))return{kind:"static",options:[...B]};return B}function y(B,G){if(!G)return;let Y=G.replace(/\[(\d+)\]/g,".$1").split(".").filter(Boolean),H=B;for(let J of Y){if(H==null)return;H=H[J]}return H}function r(B){if(!B)return[];return B.split(".").filter((G)=>/^\d+$/.test(G)).map((G)=>Number(G))}function u(B,G){if(!G)return B??"";return B?`${B}.${G}`:G}function f(B,G){if(!G||G.length===0)return"[]";try{return JSON.stringify(G.map((Y)=>y(B,Y)))}catch{return"[]"}}function e(B,G){let[Y,H]=V.useState(B);return V.useEffect(()=>{let J=globalThis.setTimeout(()=>H(B),G);return()=>globalThis.clearTimeout(J)},[G,B]),Y}function j(B,G,Y){let[H,J]=V.useState([]),_=V.useMemo(()=>{if(!G)return"nil";if(G.kind==="static")return JSON.stringify(G.options??[]);return`${G.resolverKey}:${f(B,G.deps)}`},[G,B]);return V.useEffect(()=>{let $=!0;return(async()=>{if(!G){J([]);return}if(G.kind==="static"){J([...G.options??[]]);return}let w=Y?.[G.resolverKey];if(!w){J([]);return}let b=await w(B,G.args);if($)J([...b??[]])})(),()=>{$=!1}},[_,Y,G,B]),H}function n(B){if(B instanceof Date&&!Number.isNaN(B.getTime()))return B;if(typeof B==="string"||typeof B==="number"){let G=new Date(B);if(!Number.isNaN(G.getTime()))return G}return null}function p(B){if(B instanceof Date&&!Number.isNaN(B.getTime()))return B;if(typeof B!=="string"||B.trim().length===0)return null;let[G,Y]=B.split(":").map(($)=>Number($)),H=G??Number.NaN,J=Y??Number.NaN;if(Number.isNaN(H)||Number.isNaN(J))return null;let _=new Date;return _.setHours(H,J,0,0),_}function BB(B){if(!B)return"";return`${String(B.getHours()).padStart(2,"0")}:${String(B.getMinutes()).padStart(2,"0")}`}function a(B){return{value:B.value,labelI18n:B.labelI18n,descriptionI18n:B.descriptionI18n,...B.data??{}}}function GB(B,G,Y){let H=G.trim().toLowerCase();if(!H)return[...B];let J=H.split(/\s+/).filter(Boolean);return B.filter((_)=>{let $=a(_),L=[_.labelI18n,_.descriptionI18n,String(_.value),...Y.map((w)=>String(y($,w)??""))].join(" ").toLowerCase();return J.every((w)=>L.includes(w))})}function x(B,G){let Y=a(B);switch(G.mode){case"scalar":return G.valueKey?y(Y,G.valueKey)??B.value:B.value;case"pick":return Object.fromEntries(G.pickKeys.map((H)=>[H,y(Y,H)]));case"object":default:return B.data??Y}}function v(B,G){try{return JSON.stringify(B)===JSON.stringify(G)}catch{return B===G}}function HB(B,G,Y,H){let J=H&&Array.isArray(G)?G:[G];return B.filter((_)=>J.some(($)=>v(x(_,Y),$)))}function c(B){if(!B)return{countryCode:"",nationalNumber:""};let G=B.countryCode.trim(),Y=B.nationalNumber.replace(/\s+/g,""),H=G.replace(/^\+?/,"+"),J={...B,countryCode:G,nationalNumber:B.nationalNumber};if(B.e164!=null||G||Y)J.e164=`${H}${Y}`.trim();return J}function JB(B){let G=j(B.values,F(B.spec.options),B.resolvers),Y=B.driver.Field,H=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:J,fieldState:_})=>{let $=_.error?[_.error]:[];return q(Y,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.Select,{id:B.ctx.id,name:B.ctx.name,"aria-invalid":_.invalid||void 0,disabled:!B.ctx.enabled||B.ctx.readOnly,value:J.value,onChange:(L)=>{if(B.ctx.readOnly)return;J.onChange(L)},options:G,...B.spec.uiProps}),B.descNode,_.invalid?U(H,{errors:$}):null]})}})}function UB(B){let G=j(B.values,F(B.spec.options),B.resolvers),Y=B.driver.Field,H=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:J,fieldState:_})=>{let $=_.error?[_.error]:[];return q(Y,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.RadioGroup,{id:B.ctx.id,name:B.ctx.name,disabled:!B.ctx.enabled||B.ctx.readOnly,value:J.value,onValueChange:(L)=>{if(B.ctx.readOnly)return;J.onChange(L)},options:G,...B.spec.uiProps}),B.descNode,_.invalid?U(H,{errors:$}):null]})}})}function XB(B){let[G,Y]=V.useState(""),H=B.spec.source.kind==="resolver"?B.spec.source.debounceMs??200:0,J=e(G,H),[_,$]=V.useState([]),L=V.useMemo(()=>{return B.spec.source.kind==="resolver"?`${B.spec.source.resolverKey}:${f(B.values,B.spec.source.deps)}:${J}`:"local"},[J,B.spec.source,B.values]);V.useEffect(()=>{if(B.spec.source.kind!=="resolver")return;let Z=B.resolvers?.[B.spec.source.resolverKey],k=B.spec.source.minQueryLength??0;if(!Z||J.trim().length<k){$([]);return}let g=!0,D={...B.spec.source.args??{},query:J};return Promise.resolve(Z(B.values,D)).then((C)=>{if(g)$([...C??[]])}),()=>{g=!1}},[L,B.resolvers,B.spec.source,B.values,J]);let w=B.spec.source.kind==="local"?GB(B.spec.source.options,G,B.spec.source.searchKeys):_,b=B.driver.Field,X=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:Z,fieldState:k})=>{let g=k.error?[k.error]:[],D=HB(w,Z.value,B.spec.valueMapping,B.spec.multiple),C=(O)=>{if(B.ctx.readOnly)return;let W=x(O,B.spec.valueMapping);if(B.spec.multiple){let P=Array.isArray(Z.value)?Z.value:[],R=P.some((S)=>v(S,W));Z.onChange(R?P:[...P,W]);return}Z.onChange(W),Y(O.labelI18n)},T=(O)=>{if(B.ctx.readOnly||!B.spec.multiple)return;let W=x(O,B.spec.valueMapping),P=Array.isArray(Z.value)?Z.value:[];Z.onChange(P.filter((R)=>!v(R,W)))};return q(b,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.Autocomplete,{id:B.ctx.id,name:B.ctx.name,disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,"aria-invalid":k.invalid||void 0,placeholder:B.spec.placeholderI18n,multiple:B.spec.multiple,query:G,options:w,selectedOptions:D,onQueryChange:Y,onSelectOption:C,onRemoveOption:T}),B.descNode,k.invalid?U(X,{errors:g}):null]})}})}function YB(B){let G=j(B.values,F(B.spec.countryOptions),B.resolvers),Y=B.driver.Field,H=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:J,fieldState:_})=>{let $=_.error?[_.error]:[];return q(Y,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.AddressField,{id:B.ctx.id,name:B.ctx.name,value:J.value??null,onChange:(L)=>{if(B.ctx.readOnly)return;J.onChange(L)},disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,"aria-invalid":_.invalid||void 0,parts:B.spec.parts,countryOptions:G}),B.descNode,_.invalid?U(H,{errors:$}):null]})}})}function _B(B){let G=j(B.values,F(B.spec.countryOptions),B.resolvers),Y=B.driver.Field,H=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:J,fieldState:_})=>{let $=_.error?[_.error]:[];return q(Y,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.PhoneField,{id:B.ctx.id,name:B.ctx.name,value:c(J.value??null),onChange:(L)=>{if(B.ctx.readOnly)return;J.onChange(c(L))},disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,"aria-invalid":_.invalid||void 0,parts:B.spec.parts,countryOptions:G}),B.descNode,_.invalid?U(H,{errors:$}):null]})}})}function $B(B){let G=B.driver.Field,Y=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:H,fieldState:J})=>{let _=J.error?[J.error]:[];return q(G,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.DateField,{id:B.ctx.id,name:B.ctx.name,value:n(H.value),onChange:($)=>{if(B.ctx.readOnly)return;H.onChange($)},disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,placeholder:B.spec.placeholderI18n,minDate:B.spec.minDate,maxDate:B.spec.maxDate}),B.descNode,J.invalid?U(Y,{errors:_}):null]})}})}function IB(B){let G=B.driver.Field,Y=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:H,fieldState:J})=>{let _=J.error?[J.error]:[];return q(G,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.TimeField,{id:B.ctx.id,name:B.ctx.name,value:p(H.value),onChange:($)=>{if(B.ctx.readOnly)return;H.onChange(BB($))},disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,placeholder:B.spec.placeholderI18n,is24Hour:B.spec.is24Hour}),B.descNode,J.invalid?U(Y,{errors:_}):null]})}})}function LB(B){let G=B.driver.Field,Y=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:H,fieldState:J})=>{let _=J.error?[J.error]:[];return q(G,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.DateTimeField,{id:B.ctx.id,name:B.ctx.name,value:n(H.value),onChange:($)=>{if(B.ctx.readOnly)return;H.onChange($)},disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,datePlaceholder:B.spec.placeholderI18n,timePlaceholder:B.spec.placeholderI18n,minDate:B.spec.minDate,maxDate:B.spec.maxDate,is24Hour:B.spec.is24Hour}),B.descNode,J.invalid?U(Y,{errors:_}):null]})}})}function ZB(B){let G=u(B.parent,B.spec.name),{fields:Y,append:H,remove:J}=s({control:B.form.control,name:G}),_=B.spec.max==null||Y.length<B.spec.max,$=(L)=>(B.spec.min==null?Y.length>0:Y.length>B.spec.min)&&L>=0;return q("div",{children:[B.spec.labelI18n?U(B.driver.FieldLabel,{children:B.spec.labelI18n}):null,Y.map((L,w)=>q("div",{children:[B.renderField(B.spec.of,`${G}.${w}`),$(w)?U(B.driver.Button,{type:"button",variant:"ghost",size:"sm",onClick:()=>J(w),children:"Remove"}):null]},L.id??w)),_?U(B.driver.Button,{type:"button",variant:"outline",size:"sm",onClick:()=>H({}),children:"Add"}):null]},G)}function kB(B){let G=B;function Y(H){let J=V.useMemo(()=>i(H.spec),[H.spec]),_=V.useMemo(()=>d(J),[J]),$=o({...H.merged.formOptions,resolver:l(_),defaultValues:H.options?.defaultValues}),L=$.watch(),w=(X,Z)=>{let k=H.merged.driver.Field,g=H.merged.driver.FieldLabel,D=H.merged.driver.FieldDescription,C=H.merged.driver.FieldError,T=u(Z,X.name),O=r(Z),W=m(L,X.visibleWhen,O),P=m(L,X.enabledWhen,O),R=t(X),S=Boolean($.getFieldState(T)?.invalid);if(!W)return null;let I={name:T,id:T.replace(/\./g,"-"),enabled:P,readOnly:R,visible:W},M={"data-invalid":S,hidden:!W,disabled:!P||R},K=X.labelI18n?U(g,{htmlFor:I.id,children:X.labelI18n}):null,Q=X.descriptionI18n?U(D,{children:X.descriptionI18n}):null;if(X.kind==="group")return q(k,{...M,children:[K,X.fields.map((N,z)=>U(V.Fragment,{children:w(N,T)},`${T}-${z}`)),Q]});if(X.kind==="array")return U(ZB,{driver:H.merged.driver,form:$,spec:X,parent:Z,renderField:w},T);if(X.kind==="select")return U(JB,{driver:H.merged.driver,form:$,values:L,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M,resolvers:H.merged.resolvers},T);if(X.kind==="radio")return U(UB,{driver:H.merged.driver,form:$,values:L,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M,resolvers:H.merged.resolvers},T);if(X.kind==="autocomplete")return U(XB,{driver:H.merged.driver,form:$,values:L,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M,resolvers:H.merged.resolvers},T);if(X.kind==="address")return U(YB,{driver:H.merged.driver,form:$,values:L,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M,resolvers:H.merged.resolvers},T);if(X.kind==="phone")return U(_B,{driver:H.merged.driver,form:$,values:L,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M,resolvers:H.merged.resolvers},T);if(X.kind==="date")return U($B,{driver:H.merged.driver,form:$,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M},T);if(X.kind==="time")return U(IB,{driver:H.merged.driver,form:$,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M},T);if(X.kind==="datetime")return U(LB,{driver:H.merged.driver,form:$,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M},T);return U(A,{name:T,control:$.control,render:({field:N,fieldState:z})=>{let h=z.error?[z.error]:[];if(X.kind==="text"){let E=X;return q(k,{...M,children:[K,U(H.merged.driver.Input,{id:I.id,"aria-invalid":z.invalid||void 0,placeholder:X.placeholderI18n,autoComplete:E.autoComplete,inputMode:E.inputMode,maxLength:E.maxLength,minLength:E.minLength,disabled:!I.enabled,readOnly:I.readOnly,...N,...X.uiProps}),Q,z.invalid?U(C,{errors:h}):null]})}if(X.kind==="textarea"){let E=X;return q(k,{...M,children:[K,U(H.merged.driver.Textarea,{id:I.id,"aria-invalid":z.invalid||void 0,placeholder:X.placeholderI18n,rows:E.rows,maxLength:E.maxLength,disabled:!I.enabled,readOnly:I.readOnly,...N,...X.uiProps}),Q,z.invalid?U(C,{errors:h}):null]})}if(X.kind==="checkbox")return q(k,{...M,children:[K,U(H.merged.driver.Checkbox,{id:I.id,name:I.name,disabled:!I.enabled||I.readOnly,checked:Boolean(N.value),onCheckedChange:(E)=>{if(I.readOnly)return;N.onChange(E)},...X.uiProps}),Q,z.invalid?U(C,{errors:h}):null]});if(X.kind==="switch")return q(k,{...M,children:[K,U(H.merged.driver.Switch,{id:I.id,name:I.name,disabled:!I.enabled||I.readOnly,checked:Boolean(N.value),onCheckedChange:(E)=>{if(I.readOnly)return;N.onChange(E)},...X.uiProps}),Q,z.invalid?U(C,{errors:h}):null]});return U(wB,{})}},T)},b=async(X)=>{let Z=J.actions?.[0]?.key??"submit";if(H.merged.onSubmitOverride)return H.merged.onSubmitOverride(X,Z)};return q("form",{onSubmit:$.handleSubmit(b),children:[J.fields.map((X,Z)=>U(V.Fragment,{children:w(X)},Z)),J.actions?.length?U("div",{children:J.actions.map((X)=>U(H.merged.driver.Button,{type:"submit",children:X.labelI18n},X.key))}):null]})}return{render:(H,J)=>U(Y,{spec:H,options:J,merged:{...G,...J?.overrides??{}}})}}export{x as mapAutocompleteValue,GB as filterAutocompleteOptions,kB as createFormRenderer};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var Qq=((U)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(U,{get:(H,J)=>(typeof require<"u"?require:H)[J]}):U)(function(U){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+U+'" is not supported')});import{buildZodWithRelations as o,evalPredicate as u}from"@contractspec/lib.contracts-spec/forms";import{zodResolver as i}from"@hookform/resolvers/zod";import x,{useEffect as a,useMemo as n,useState as d}from"react";import{Controller as s,useFieldArray as r,useForm as e}from"react-hook-form";import{jsx as Q,jsxs as M,Fragment as Jq}from"react/jsx-runtime";function v(U){if(!U)return;if(Array.isArray(U))return{kind:"static",options:U};return U}function qq(U,H){if(!H)return;let J=H.replace(/\[(\d+)\]/g,".$1").split(".").filter(Boolean),T=U;for(let L of J){if(T==null)return;T=T[L]}return T}function Hq(U,H){if(!H||H.length===0)return"[]";try{return JSON.stringify(H.map((J)=>qq(U,J)))}catch{return"[]"}}function p(U,H,J){let[T,L]=d([]),X=n(()=>{if(!H)return"nil";if(H.kind==="static")return JSON.stringify(H.options??[]);return Hq(U,H.deps)},[H,U]);return a(()=>{let N=!0;return(async()=>{if(!H)return L([]);if(H.kind==="static")return L([...H.options??[]]);let h=J?.[H.resolverKey];if(!h)return L([]);let k=await h(U,H.args);if(N)L([...k??[]])})(),()=>{N=!1}},[X,H&&H.kind==="resolver"?H.resolverKey:void 0]),T}function c(U,H,J){if(!H)return U??"";let T=typeof J==="number"?`${H.replace(/^\$index$/,String(J))}`:H;return U?`${U}${typeof J==="number"?`.${J}`:""}.${T}`.replace(/\.+/g,"."):T}function $q(U){let H=U,{driver:J}=H;function T(L){let{spec:X,options:N,merged:R}=L,h=n(()=>o(X),[X]),k=e({...R.formOptions,resolver:i(h),defaultValues:N?.defaultValues}),D=k.watch(),I=(q,w,W)=>{let{Field:Y,FieldLabel:y,FieldDescription:F,FieldError:B}=J,_=c(w,q.name,W),O=u(D,q.visibleWhen),Z=u(D,q.enabledWhen),P=Boolean(k.getFieldState(_)?.invalid);if(!O)return null;let $=_?.replace(/\./g,"-"),A={"data-invalid":P,hidden:!O,disabled:!Z},E=q.labelI18n?Q(y,{htmlFor:$,children:q.labelI18n}):null,g=q.descriptionI18n?Q(F,{children:q.descriptionI18n}):null;if(q.kind==="group"){let G=q.fields.map((z,K)=>Q(x.Fragment,{children:I(z,_,W)},`${_}-${K}`));return M(Y,{...A,children:[E,G,g]})}if(q.kind==="array")return l(q,w);return Q(s,{name:_,control:k.control,render:({field:G,fieldState:z})=>{let K=z.error?[z.error]:[],S=z.invalid||void 0;if(q.kind==="text"){let V=q,C=J.Input;return M(Y,{...A,children:[E,Q(C,{id:$,"aria-invalid":S,placeholder:q.placeholderI18n,autoComplete:V.autoComplete,inputMode:V.inputMode,maxLength:V.maxLength,minLength:V.minLength,disabled:!Z,...G,...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}if(q.kind==="textarea"){let V=q,C=J.Textarea;return M(Y,{...A,children:[E,Q(C,{id:$,"aria-invalid":S,placeholder:q.placeholderI18n,rows:V.rows,maxLength:V.maxLength,disabled:!Z,...G,...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}if(q.kind==="select"){let V=q,C=J.Select,b=v(V.options),j=p(D,b,R.resolvers);return M(Y,{...A,children:[E,Q(C,{id:$,name:_,"aria-invalid":S,disabled:!Z,value:G.value,onChange:(m)=>G.onChange(m),options:j,...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}if(q.kind==="checkbox"){let V=J.Checkbox;return M(Y,{...A,children:[E,Q(V,{id:$,name:_,disabled:!Z,checked:!!G.value,onCheckedChange:(C)=>G.onChange(C),...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}if(q.kind==="radio"){let V=q,C=J.RadioGroup,b=v(V.options),j=p(D,b,R.resolvers);return M(Y,{...A,children:[E,Q(C,{id:$,name:_,disabled:!Z,value:G.value,onValueChange:(m)=>G.onChange(m),options:j,...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}if(q.kind==="switch"){let V=J.Switch;return M(Y,{...A,children:[E,Q(V,{id:$,name:_,disabled:!Z,checked:!!G.value,onCheckedChange:(C)=>G.onChange(C),...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}return Q(Jq,{})}},_)},l=(q,w)=>{let W=c(w,q.name),{fields:Y,append:y,remove:F}=r({control:k.control,name:W}),B=q.max==null||Y.length<q.max,_=(P)=>(q.min==null?Y.length>0:Y.length>q.min)&&P>=0,O=J.Button,Z=J.FieldLabel;return M("div",{children:[q.labelI18n?Q(Z,{children:q.labelI18n}):null,Y.map((P,$)=>M("div",{children:[I(q.of,W,$),_($)?Q(O,{type:"button",variant:"ghost",size:"sm",onClick:()=>F($),children:"Remove"}):null]},P.id??$)),B?Q(O,{type:"button",variant:"outline",size:"sm",onClick:()=>y({}),children:"Add"}):null]},W)},t=async(q)=>{let w=X.actions?.[0]?.key??"submit";if(R.onSubmitOverride)return R.onSubmitOverride(q,w)},f=J.Button;return M("form",{onSubmit:k.handleSubmit(t),children:[(X.fields||[]).map((q,w)=>Q(x.Fragment,{children:I(q)},w)),X.actions&&X.actions.length?Q("div",{children:X.actions.map((q)=>Q(f,{type:"submit",children:q.labelI18n},q.key))}):null]})}return{render:(L,X)=>Q(T,{spec:L,options:X,merged:{...H,...X?.overrides??{}}})}}export{$q as createFormRenderer};
|
|
1
|
+
var TB=((B)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(B,{get:(G,Y)=>(typeof require<"u"?require:G)[Y]}):B)(function(B){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+B+'" is not supported')});import{buildZodWithRelations as d,evalPredicate as m,isFieldReadOnly as t,normalizeFormSpec as i}from"@contractspec/lib.contracts-spec/forms";import{zodResolver as l}from"@hookform/resolvers/zod";import V from"react";import{Controller as A,useFieldArray as s,useForm as o}from"react-hook-form";import{jsx as U,jsxs as q,Fragment as wB}from"react/jsx-runtime";function F(B){if(!B)return;if(Array.isArray(B))return{kind:"static",options:[...B]};return B}function y(B,G){if(!G)return;let Y=G.replace(/\[(\d+)\]/g,".$1").split(".").filter(Boolean),H=B;for(let J of Y){if(H==null)return;H=H[J]}return H}function r(B){if(!B)return[];return B.split(".").filter((G)=>/^\d+$/.test(G)).map((G)=>Number(G))}function u(B,G){if(!G)return B??"";return B?`${B}.${G}`:G}function f(B,G){if(!G||G.length===0)return"[]";try{return JSON.stringify(G.map((Y)=>y(B,Y)))}catch{return"[]"}}function e(B,G){let[Y,H]=V.useState(B);return V.useEffect(()=>{let J=globalThis.setTimeout(()=>H(B),G);return()=>globalThis.clearTimeout(J)},[G,B]),Y}function j(B,G,Y){let[H,J]=V.useState([]),_=V.useMemo(()=>{if(!G)return"nil";if(G.kind==="static")return JSON.stringify(G.options??[]);return`${G.resolverKey}:${f(B,G.deps)}`},[G,B]);return V.useEffect(()=>{let $=!0;return(async()=>{if(!G){J([]);return}if(G.kind==="static"){J([...G.options??[]]);return}let w=Y?.[G.resolverKey];if(!w){J([]);return}let b=await w(B,G.args);if($)J([...b??[]])})(),()=>{$=!1}},[_,Y,G,B]),H}function n(B){if(B instanceof Date&&!Number.isNaN(B.getTime()))return B;if(typeof B==="string"||typeof B==="number"){let G=new Date(B);if(!Number.isNaN(G.getTime()))return G}return null}function p(B){if(B instanceof Date&&!Number.isNaN(B.getTime()))return B;if(typeof B!=="string"||B.trim().length===0)return null;let[G,Y]=B.split(":").map(($)=>Number($)),H=G??Number.NaN,J=Y??Number.NaN;if(Number.isNaN(H)||Number.isNaN(J))return null;let _=new Date;return _.setHours(H,J,0,0),_}function BB(B){if(!B)return"";return`${String(B.getHours()).padStart(2,"0")}:${String(B.getMinutes()).padStart(2,"0")}`}function a(B){return{value:B.value,labelI18n:B.labelI18n,descriptionI18n:B.descriptionI18n,...B.data??{}}}function GB(B,G,Y){let H=G.trim().toLowerCase();if(!H)return[...B];let J=H.split(/\s+/).filter(Boolean);return B.filter((_)=>{let $=a(_),L=[_.labelI18n,_.descriptionI18n,String(_.value),...Y.map((w)=>String(y($,w)??""))].join(" ").toLowerCase();return J.every((w)=>L.includes(w))})}function x(B,G){let Y=a(B);switch(G.mode){case"scalar":return G.valueKey?y(Y,G.valueKey)??B.value:B.value;case"pick":return Object.fromEntries(G.pickKeys.map((H)=>[H,y(Y,H)]));case"object":default:return B.data??Y}}function v(B,G){try{return JSON.stringify(B)===JSON.stringify(G)}catch{return B===G}}function HB(B,G,Y,H){let J=H&&Array.isArray(G)?G:[G];return B.filter((_)=>J.some(($)=>v(x(_,Y),$)))}function c(B){if(!B)return{countryCode:"",nationalNumber:""};let G=B.countryCode.trim(),Y=B.nationalNumber.replace(/\s+/g,""),H=G.replace(/^\+?/,"+"),J={...B,countryCode:G,nationalNumber:B.nationalNumber};if(B.e164!=null||G||Y)J.e164=`${H}${Y}`.trim();return J}function JB(B){let G=j(B.values,F(B.spec.options),B.resolvers),Y=B.driver.Field,H=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:J,fieldState:_})=>{let $=_.error?[_.error]:[];return q(Y,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.Select,{id:B.ctx.id,name:B.ctx.name,"aria-invalid":_.invalid||void 0,disabled:!B.ctx.enabled||B.ctx.readOnly,value:J.value,onChange:(L)=>{if(B.ctx.readOnly)return;J.onChange(L)},options:G,...B.spec.uiProps}),B.descNode,_.invalid?U(H,{errors:$}):null]})}})}function UB(B){let G=j(B.values,F(B.spec.options),B.resolvers),Y=B.driver.Field,H=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:J,fieldState:_})=>{let $=_.error?[_.error]:[];return q(Y,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.RadioGroup,{id:B.ctx.id,name:B.ctx.name,disabled:!B.ctx.enabled||B.ctx.readOnly,value:J.value,onValueChange:(L)=>{if(B.ctx.readOnly)return;J.onChange(L)},options:G,...B.spec.uiProps}),B.descNode,_.invalid?U(H,{errors:$}):null]})}})}function XB(B){let[G,Y]=V.useState(""),H=B.spec.source.kind==="resolver"?B.spec.source.debounceMs??200:0,J=e(G,H),[_,$]=V.useState([]),L=V.useMemo(()=>{return B.spec.source.kind==="resolver"?`${B.spec.source.resolverKey}:${f(B.values,B.spec.source.deps)}:${J}`:"local"},[J,B.spec.source,B.values]);V.useEffect(()=>{if(B.spec.source.kind!=="resolver")return;let Z=B.resolvers?.[B.spec.source.resolverKey],k=B.spec.source.minQueryLength??0;if(!Z||J.trim().length<k){$([]);return}let g=!0,D={...B.spec.source.args??{},query:J};return Promise.resolve(Z(B.values,D)).then((C)=>{if(g)$([...C??[]])}),()=>{g=!1}},[L,B.resolvers,B.spec.source,B.values,J]);let w=B.spec.source.kind==="local"?GB(B.spec.source.options,G,B.spec.source.searchKeys):_,b=B.driver.Field,X=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:Z,fieldState:k})=>{let g=k.error?[k.error]:[],D=HB(w,Z.value,B.spec.valueMapping,B.spec.multiple),C=(O)=>{if(B.ctx.readOnly)return;let W=x(O,B.spec.valueMapping);if(B.spec.multiple){let P=Array.isArray(Z.value)?Z.value:[],R=P.some((S)=>v(S,W));Z.onChange(R?P:[...P,W]);return}Z.onChange(W),Y(O.labelI18n)},T=(O)=>{if(B.ctx.readOnly||!B.spec.multiple)return;let W=x(O,B.spec.valueMapping),P=Array.isArray(Z.value)?Z.value:[];Z.onChange(P.filter((R)=>!v(R,W)))};return q(b,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.Autocomplete,{id:B.ctx.id,name:B.ctx.name,disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,"aria-invalid":k.invalid||void 0,placeholder:B.spec.placeholderI18n,multiple:B.spec.multiple,query:G,options:w,selectedOptions:D,onQueryChange:Y,onSelectOption:C,onRemoveOption:T}),B.descNode,k.invalid?U(X,{errors:g}):null]})}})}function YB(B){let G=j(B.values,F(B.spec.countryOptions),B.resolvers),Y=B.driver.Field,H=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:J,fieldState:_})=>{let $=_.error?[_.error]:[];return q(Y,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.AddressField,{id:B.ctx.id,name:B.ctx.name,value:J.value??null,onChange:(L)=>{if(B.ctx.readOnly)return;J.onChange(L)},disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,"aria-invalid":_.invalid||void 0,parts:B.spec.parts,countryOptions:G}),B.descNode,_.invalid?U(H,{errors:$}):null]})}})}function _B(B){let G=j(B.values,F(B.spec.countryOptions),B.resolvers),Y=B.driver.Field,H=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:J,fieldState:_})=>{let $=_.error?[_.error]:[];return q(Y,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.PhoneField,{id:B.ctx.id,name:B.ctx.name,value:c(J.value??null),onChange:(L)=>{if(B.ctx.readOnly)return;J.onChange(c(L))},disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,"aria-invalid":_.invalid||void 0,parts:B.spec.parts,countryOptions:G}),B.descNode,_.invalid?U(H,{errors:$}):null]})}})}function $B(B){let G=B.driver.Field,Y=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:H,fieldState:J})=>{let _=J.error?[J.error]:[];return q(G,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.DateField,{id:B.ctx.id,name:B.ctx.name,value:n(H.value),onChange:($)=>{if(B.ctx.readOnly)return;H.onChange($)},disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,placeholder:B.spec.placeholderI18n,minDate:B.spec.minDate,maxDate:B.spec.maxDate}),B.descNode,J.invalid?U(Y,{errors:_}):null]})}})}function IB(B){let G=B.driver.Field,Y=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:H,fieldState:J})=>{let _=J.error?[J.error]:[];return q(G,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.TimeField,{id:B.ctx.id,name:B.ctx.name,value:p(H.value),onChange:($)=>{if(B.ctx.readOnly)return;H.onChange(BB($))},disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,placeholder:B.spec.placeholderI18n,is24Hour:B.spec.is24Hour}),B.descNode,J.invalid?U(Y,{errors:_}):null]})}})}function LB(B){let G=B.driver.Field,Y=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:H,fieldState:J})=>{let _=J.error?[J.error]:[];return q(G,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.DateTimeField,{id:B.ctx.id,name:B.ctx.name,value:n(H.value),onChange:($)=>{if(B.ctx.readOnly)return;H.onChange($)},disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,datePlaceholder:B.spec.placeholderI18n,timePlaceholder:B.spec.placeholderI18n,minDate:B.spec.minDate,maxDate:B.spec.maxDate,is24Hour:B.spec.is24Hour}),B.descNode,J.invalid?U(Y,{errors:_}):null]})}})}function ZB(B){let G=u(B.parent,B.spec.name),{fields:Y,append:H,remove:J}=s({control:B.form.control,name:G}),_=B.spec.max==null||Y.length<B.spec.max,$=(L)=>(B.spec.min==null?Y.length>0:Y.length>B.spec.min)&&L>=0;return q("div",{children:[B.spec.labelI18n?U(B.driver.FieldLabel,{children:B.spec.labelI18n}):null,Y.map((L,w)=>q("div",{children:[B.renderField(B.spec.of,`${G}.${w}`),$(w)?U(B.driver.Button,{type:"button",variant:"ghost",size:"sm",onClick:()=>J(w),children:"Remove"}):null]},L.id??w)),_?U(B.driver.Button,{type:"button",variant:"outline",size:"sm",onClick:()=>H({}),children:"Add"}):null]},G)}function kB(B){let G=B;function Y(H){let J=V.useMemo(()=>i(H.spec),[H.spec]),_=V.useMemo(()=>d(J),[J]),$=o({...H.merged.formOptions,resolver:l(_),defaultValues:H.options?.defaultValues}),L=$.watch(),w=(X,Z)=>{let k=H.merged.driver.Field,g=H.merged.driver.FieldLabel,D=H.merged.driver.FieldDescription,C=H.merged.driver.FieldError,T=u(Z,X.name),O=r(Z),W=m(L,X.visibleWhen,O),P=m(L,X.enabledWhen,O),R=t(X),S=Boolean($.getFieldState(T)?.invalid);if(!W)return null;let I={name:T,id:T.replace(/\./g,"-"),enabled:P,readOnly:R,visible:W},M={"data-invalid":S,hidden:!W,disabled:!P||R},K=X.labelI18n?U(g,{htmlFor:I.id,children:X.labelI18n}):null,Q=X.descriptionI18n?U(D,{children:X.descriptionI18n}):null;if(X.kind==="group")return q(k,{...M,children:[K,X.fields.map((N,z)=>U(V.Fragment,{children:w(N,T)},`${T}-${z}`)),Q]});if(X.kind==="array")return U(ZB,{driver:H.merged.driver,form:$,spec:X,parent:Z,renderField:w},T);if(X.kind==="select")return U(JB,{driver:H.merged.driver,form:$,values:L,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M,resolvers:H.merged.resolvers},T);if(X.kind==="radio")return U(UB,{driver:H.merged.driver,form:$,values:L,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M,resolvers:H.merged.resolvers},T);if(X.kind==="autocomplete")return U(XB,{driver:H.merged.driver,form:$,values:L,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M,resolvers:H.merged.resolvers},T);if(X.kind==="address")return U(YB,{driver:H.merged.driver,form:$,values:L,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M,resolvers:H.merged.resolvers},T);if(X.kind==="phone")return U(_B,{driver:H.merged.driver,form:$,values:L,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M,resolvers:H.merged.resolvers},T);if(X.kind==="date")return U($B,{driver:H.merged.driver,form:$,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M},T);if(X.kind==="time")return U(IB,{driver:H.merged.driver,form:$,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M},T);if(X.kind==="datetime")return U(LB,{driver:H.merged.driver,form:$,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M},T);return U(A,{name:T,control:$.control,render:({field:N,fieldState:z})=>{let h=z.error?[z.error]:[];if(X.kind==="text"){let E=X;return q(k,{...M,children:[K,U(H.merged.driver.Input,{id:I.id,"aria-invalid":z.invalid||void 0,placeholder:X.placeholderI18n,autoComplete:E.autoComplete,inputMode:E.inputMode,maxLength:E.maxLength,minLength:E.minLength,disabled:!I.enabled,readOnly:I.readOnly,...N,...X.uiProps}),Q,z.invalid?U(C,{errors:h}):null]})}if(X.kind==="textarea"){let E=X;return q(k,{...M,children:[K,U(H.merged.driver.Textarea,{id:I.id,"aria-invalid":z.invalid||void 0,placeholder:X.placeholderI18n,rows:E.rows,maxLength:E.maxLength,disabled:!I.enabled,readOnly:I.readOnly,...N,...X.uiProps}),Q,z.invalid?U(C,{errors:h}):null]})}if(X.kind==="checkbox")return q(k,{...M,children:[K,U(H.merged.driver.Checkbox,{id:I.id,name:I.name,disabled:!I.enabled||I.readOnly,checked:Boolean(N.value),onCheckedChange:(E)=>{if(I.readOnly)return;N.onChange(E)},...X.uiProps}),Q,z.invalid?U(C,{errors:h}):null]});if(X.kind==="switch")return q(k,{...M,children:[K,U(H.merged.driver.Switch,{id:I.id,name:I.name,disabled:!I.enabled||I.readOnly,checked:Boolean(N.value),onCheckedChange:(E)=>{if(I.readOnly)return;N.onChange(E)},...X.uiProps}),Q,z.invalid?U(C,{errors:h}):null]});return U(wB,{})}},T)},b=async(X)=>{let Z=J.actions?.[0]?.key??"submit";if(H.merged.onSubmitOverride)return H.merged.onSubmitOverride(X,Z)};return q("form",{onSubmit:$.handleSubmit(b),children:[J.fields.map((X,Z)=>U(V.Fragment,{children:w(X)},Z)),J.actions?.length?U("div",{children:J.actions.map((X)=>U(H.merged.driver.Button,{type:"submit",children:X.labelI18n},X.key))}):null]})}return{render:(H,J)=>U(Y,{spec:H,options:J,merged:{...G,...J?.overrides??{}}})}}export{x as mapAutocompleteValue,GB as filterAutocompleteOptions,kB as createFormRenderer};
|
package/dist/browser/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var s=((J)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(J,{get:(q,Q)=>(typeof require<"u"?require:q)[Q]}):J)(function(J){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+J+'" is not supported')});function Lq(J){return J}function Zq(J){return J}import{createDefaultTransformEngine as x,htmlToMarkdown as r,registerBasicValidation as u}from"@contractspec/lib.presentation-runtime-core/transform-engine";import e from"react";export*from"@contractspec/lib.presentation-runtime-core/transform-engine";function m(J){return J.register({target:"react",async render(q){if(q.source.type==="component"){let Q=q.source.props?q.source.props.getZod().safeParse({}).success?{}:void 0:void 0;return{kind:"react_component",componentKey:q.source.componentKey,props:Q}}return{kind:"blocknotejs",docJson:q.source.docJson,blockConfig:q.source.blockConfig}}}),J}function wq(J,q){return J.prependRegister({target:"markdown",async render(Q){if(Q.source.type!=="component")throw Error("React-to-markdown renderer only handles component presentations");let X=q[Q.source.componentKey];if(!X)throw Error(`Component ${Q.source.componentKey} not found in componentMap`);let{renderToStaticMarkup:Y}=await import("react-dom/server"),_=e.createElement(X,Q.source.props?{}:void 0),T=r(Y(_));return{mimeType:"text/markdown",body:Q.policy?.pii?.length?T.replace(/\[REDACTED\]/g,"[REDACTED]"):T}}}),J}import p from"react";function Dq(){return u(m(x()))}async function Wq(J,q,Q,X){if(q==="react"){let Y=await J.render("react",Q);if(Y.kind==="react_component"){let T=(X?.componentMap??{})[Y.componentKey];if(!T)return null;let A={...Y.props??{},...X?.reactProps??{}};return p.createElement(T,A)}if(Y.kind==="blocknotejs"){if(X?.renderBlockNote)return X.renderBlockNote(Y.docJson,Y.blockConfig);return p.createElement("div",{},"[BlockNote renderer not configured]")}return null}if(q==="markdown")return J.render(q,Q);if(q==="application/json")return J.render(q,Q);if(q==="application/xml")return J.render(q,Q);return null}function Eq(J,q){return{meta:J,...q}}function Oq(J,q){return J.register(q),J}import{buildZodWithRelations as qq,evalPredicate as l}from"@contractspec/lib.contracts-spec/forms";import{zodResolver as Hq}from"@hookform/resolvers/zod";import f,{useEffect as Jq,useMemo as i,useState as Qq}from"react";import{Controller as Uq,useFieldArray as Xq,useForm as Yq}from"react-hook-form";import{jsx as U,jsxs as B,Fragment as Gq}from"react/jsx-runtime";function c(J){if(!J)return;if(Array.isArray(J))return{kind:"static",options:J};return J}function _q(J,q){if(!q)return;let Q=q.replace(/\[(\d+)\]/g,".$1").split(".").filter(Boolean),X=J;for(let Y of Q){if(X==null)return;X=X[Y]}return X}function $q(J,q){if(!q||q.length===0)return"[]";try{return JSON.stringify(q.map((Q)=>_q(J,Q)))}catch{return"[]"}}function o(J,q,Q){let[X,Y]=Qq([]),_=i(()=>{if(!q)return"nil";if(q.kind==="static")return JSON.stringify(q.options??[]);return $q(J,q.deps)},[q,J]);return Jq(()=>{let T=!0;return(async()=>{if(!q)return Y([]);if(q.kind==="static")return Y([...q.options??[]]);let N=Q?.[q.resolverKey];if(!N)return Y([]);let k=await N(J,q.args);if(T)Y([...k??[]])})(),()=>{T=!1}},[_,q&&q.kind==="resolver"?q.resolverKey:void 0]),X}function n(J,q,Q){if(!q)return J??"";let X=typeof Q==="number"?`${q.replace(/^\$index$/,String(Q))}`:q;return J?`${J}${typeof Q==="number"?`.${Q}`:""}.${X}`.replace(/\.+/g,"."):X}function Iq(J){let q=J,{driver:Q}=q;function X(Y){let{spec:_,options:T,merged:A}=Y,N=i(()=>qq(_),[_]),k=Yq({...A.formOptions,resolver:Hq(N),defaultValues:T?.defaultValues}),y=k.watch(),S=(H,C,O)=>{let{Field:G,FieldLabel:I,FieldDescription:F,FieldError:M}=Q,z=n(C,H.name,O),P=l(y,H.visibleWhen),w=l(y,H.enabledWhen),h=Boolean(k.getFieldState(z)?.invalid);if(!P)return null;let L=z?.replace(/\./g,"-"),D={"data-invalid":h,hidden:!P,disabled:!w},W=H.labelI18n?U(I,{htmlFor:L,children:H.labelI18n}):null,E=H.descriptionI18n?U(F,{children:H.descriptionI18n}):null;if(H.kind==="group"){let V=H.fields.map((Z,R)=>U(f.Fragment,{children:S(Z,z,O)},`${z}-${R}`));return B(G,{...D,children:[W,V,E]})}if(H.kind==="array")return t(H,C);return U(Uq,{name:z,control:k.control,render:({field:V,fieldState:Z})=>{let R=Z.error?[Z.error]:[],b=Z.invalid||void 0;if(H.kind==="text"){let $=H,K=Q.Input;return B(G,{...D,children:[W,U(K,{id:L,"aria-invalid":b,placeholder:H.placeholderI18n,autoComplete:$.autoComplete,inputMode:$.inputMode,maxLength:$.maxLength,minLength:$.minLength,disabled:!w,...V,...H.uiProps}),E,Z.invalid?U(M,{errors:R}):null]})}if(H.kind==="textarea"){let $=H,K=Q.Textarea;return B(G,{...D,children:[W,U(K,{id:L,"aria-invalid":b,placeholder:H.placeholderI18n,rows:$.rows,maxLength:$.maxLength,disabled:!w,...V,...H.uiProps}),E,Z.invalid?U(M,{errors:R}):null]})}if(H.kind==="select"){let $=H,K=Q.Select,j=c($.options),g=o(y,j,A.resolvers);return B(G,{...D,children:[W,U(K,{id:L,name:z,"aria-invalid":b,disabled:!w,value:V.value,onChange:(v)=>V.onChange(v),options:g,...H.uiProps}),E,Z.invalid?U(M,{errors:R}):null]})}if(H.kind==="checkbox"){let $=Q.Checkbox;return B(G,{...D,children:[W,U($,{id:L,name:z,disabled:!w,checked:!!V.value,onCheckedChange:(K)=>V.onChange(K),...H.uiProps}),E,Z.invalid?U(M,{errors:R}):null]})}if(H.kind==="radio"){let $=H,K=Q.RadioGroup,j=c($.options),g=o(y,j,A.resolvers);return B(G,{...D,children:[W,U(K,{id:L,name:z,disabled:!w,value:V.value,onValueChange:(v)=>V.onChange(v),options:g,...H.uiProps}),E,Z.invalid?U(M,{errors:R}):null]})}if(H.kind==="switch"){let $=Q.Switch;return B(G,{...D,children:[W,U($,{id:L,name:z,disabled:!w,checked:!!V.value,onCheckedChange:(K)=>V.onChange(K),...H.uiProps}),E,Z.invalid?U(M,{errors:R}):null]})}return U(Gq,{})}},z)},t=(H,C)=>{let O=n(C,H.name),{fields:G,append:I,remove:F}=Xq({control:k.control,name:O}),M=H.max==null||G.length<H.max,z=(h)=>(H.min==null?G.length>0:G.length>H.min)&&h>=0,P=Q.Button,w=Q.FieldLabel;return B("div",{children:[H.labelI18n?U(w,{children:H.labelI18n}):null,G.map((h,L)=>B("div",{children:[S(H.of,O,L),z(L)?U(P,{type:"button",variant:"ghost",size:"sm",onClick:()=>F(L),children:"Remove"}):null]},h.id??L)),M?U(P,{type:"button",variant:"outline",size:"sm",onClick:()=>I({}),children:"Add"}):null]},O)},d=async(H)=>{let C=_.actions?.[0]?.key??"submit";if(A.onSubmitOverride)return A.onSubmitOverride(H,C)},a=Q.Button;return B("form",{onSubmit:k.handleSubmit(d),children:[(_.fields||[]).map((H,C)=>U(f.Fragment,{children:S(H)},C)),_.actions&&_.actions.length?U("div",{children:_.actions.map((H)=>U(a,{type:"submit",children:H.labelI18n},H.key))}):null]})}return{render:(Y,_)=>U(X,{spec:Y,options:_,merged:{...q,..._?.overrides??{}}})}}export{Zq as shadcnDriver,Lq as rnReusablesDriver,Wq as renderFeaturePresentation,Oq as registerFeature,Iq as createFormRenderer,Eq as createFeatureModule,Dq as createEngineWithDefaults};
|
|
1
|
+
var s=((G)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(G,{get:(H,X)=>(typeof require<"u"?require:H)[X]}):G)(function(G){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+G+'" is not supported')});function WG(G){return G}function AG(G){return G}import{createDefaultTransformEngine as m,htmlToMarkdown as o,registerBasicValidation as u}from"@contractspec/lib.presentation-runtime-core/transform-engine";import r from"react";export*from"@contractspec/lib.presentation-runtime-core/transform-engine";function c(G){return G.register({target:"react",async render(H){if(H.source.type==="component"){let X=H.source.props?H.source.props.getZod().safeParse({}).success?{}:void 0:void 0;return{kind:"react_component",componentKey:H.source.componentKey,props:X}}return{kind:"blocknotejs",docJson:H.source.docJson,blockConfig:H.source.blockConfig}}}),G}function DG(G,H){return G.prependRegister({target:"markdown",async render(X){if(X.source.type!=="component")throw Error("React-to-markdown renderer only handles component presentations");let J=H[X.source.componentKey];if(!J)throw Error(`Component ${X.source.componentKey} not found in componentMap`);let{renderToStaticMarkup:U}=await import("react-dom/server"),B=r.createElement(J,X.source.props?{}:void 0),$=o(U(B));return{mimeType:"text/markdown",body:X.policy?.pii?.length?$.replace(/\[REDACTED\]/g,"[REDACTED]"):$}}}),G}import f from"react";function FG(){return u(c(m()))}async function jG(G,H,X,J){if(H==="react"){let U=await G.render("react",X);if(U.kind==="react_component"){let $=(J?.componentMap??{})[U.componentKey];if(!$)return null;let I={...U.props??{},...J?.reactProps??{}};return f.createElement($,I)}if(U.kind==="blocknotejs"){if(J?.renderBlockNote)return J.renderBlockNote(U.docJson,U.blockConfig);return f.createElement("div",{},"[BlockNote renderer not configured]")}return null}if(H==="markdown")return G.render(H,X);if(H==="application/json")return G.render(H,X);if(H==="application/xml")return G.render(H,X);return null}function gG(G,H){return{meta:G,...H}}function SG(G,H){return G.register(H),G}import{buildZodWithRelations as p,evalPredicate as n,isFieldReadOnly as e,normalizeFormSpec as GG}from"@contractspec/lib.contracts-spec/forms";import{zodResolver as HG}from"@hookform/resolvers/zod";import V from"react";import{Controller as A,useFieldArray as JG,useForm as UG}from"react-hook-form";import{jsx as Y,jsxs as w,Fragment as zG}from"react/jsx-runtime";function j(G){if(!G)return;if(Array.isArray(G))return{kind:"static",options:[...G]};return G}function F(G,H){if(!H)return;let X=H.replace(/\[(\d+)\]/g,".$1").split(".").filter(Boolean),J=G;for(let U of X){if(J==null)return;J=J[U]}return J}function XG(G){if(!G)return[];return G.split(".").filter((H)=>/^\d+$/.test(H)).map((H)=>Number(H))}function d(G,H){if(!H)return G??"";return G?`${G}.${H}`:H}function l(G,H){if(!H||H.length===0)return"[]";try{return JSON.stringify(H.map((X)=>F(G,X)))}catch{return"[]"}}function YG(G,H){let[X,J]=V.useState(G);return V.useEffect(()=>{let U=globalThis.setTimeout(()=>J(G),H);return()=>globalThis.clearTimeout(U)},[H,G]),X}function g(G,H,X){let[J,U]=V.useState([]),B=V.useMemo(()=>{if(!H)return"nil";if(H.kind==="static")return JSON.stringify(H.options??[]);return`${H.resolverKey}:${l(G,H.deps)}`},[H,G]);return V.useEffect(()=>{let $=!0;return(async()=>{if(!H){U([]);return}if(H.kind==="static"){U([...H.options??[]]);return}let q=X?.[H.resolverKey];if(!q){U([]);return}let b=await q(G,H.args);if($)U([...b??[]])})(),()=>{$=!1}},[B,X,H,G]),J}function i(G){if(G instanceof Date&&!Number.isNaN(G.getTime()))return G;if(typeof G==="string"||typeof G==="number"){let H=new Date(G);if(!Number.isNaN(H.getTime()))return H}return null}function _G(G){if(G instanceof Date&&!Number.isNaN(G.getTime()))return G;if(typeof G!=="string"||G.trim().length===0)return null;let[H,X]=G.split(":").map(($)=>Number($)),J=H??Number.NaN,U=X??Number.NaN;if(Number.isNaN(J)||Number.isNaN(U))return null;let B=new Date;return B.setHours(J,U,0,0),B}function $G(G){if(!G)return"";return`${String(G.getHours()).padStart(2,"0")}:${String(G.getMinutes()).padStart(2,"0")}`}function t(G){return{value:G.value,labelI18n:G.labelI18n,descriptionI18n:G.descriptionI18n,...G.data??{}}}function BG(G,H,X){let J=H.trim().toLowerCase();if(!J)return[...G];let U=J.split(/\s+/).filter(Boolean);return G.filter((B)=>{let $=t(B),I=[B.labelI18n,B.descriptionI18n,String(B.value),...X.map((q)=>String(F($,q)??""))].join(" ").toLowerCase();return U.every((q)=>I.includes(q))})}function x(G,H){let X=t(G);switch(H.mode){case"scalar":return H.valueKey?F(X,H.valueKey)??G.value:G.value;case"pick":return Object.fromEntries(H.pickKeys.map((J)=>[J,F(X,J)]));case"object":default:return G.data??X}}function v(G,H){try{return JSON.stringify(G)===JSON.stringify(H)}catch{return G===H}}function IG(G,H,X,J){let U=J&&Array.isArray(H)?H:[H];return G.filter((B)=>U.some(($)=>v(x(B,X),$)))}function a(G){if(!G)return{countryCode:"",nationalNumber:""};let H=G.countryCode.trim(),X=G.nationalNumber.replace(/\s+/g,""),J=H.replace(/^\+?/,"+"),U={...G,countryCode:H,nationalNumber:G.nationalNumber};if(G.e164!=null||H||X)U.e164=`${J}${X}`.trim();return U}function LG(G){let H=g(G.values,j(G.spec.options),G.resolvers),X=G.driver.Field,J=G.driver.FieldError;return Y(A,{name:G.ctx.name,control:G.form.control,render:({field:U,fieldState:B})=>{let $=B.error?[B.error]:[];return w(X,{...G.commonWrapProps,children:[G.labelNode,Y(G.driver.Select,{id:G.ctx.id,name:G.ctx.name,"aria-invalid":B.invalid||void 0,disabled:!G.ctx.enabled||G.ctx.readOnly,value:U.value,onChange:(I)=>{if(G.ctx.readOnly)return;U.onChange(I)},options:H,...G.spec.uiProps}),G.descNode,B.invalid?Y(J,{errors:$}):null]})}})}function ZG(G){let H=g(G.values,j(G.spec.options),G.resolvers),X=G.driver.Field,J=G.driver.FieldError;return Y(A,{name:G.ctx.name,control:G.form.control,render:({field:U,fieldState:B})=>{let $=B.error?[B.error]:[];return w(X,{...G.commonWrapProps,children:[G.labelNode,Y(G.driver.RadioGroup,{id:G.ctx.id,name:G.ctx.name,disabled:!G.ctx.enabled||G.ctx.readOnly,value:U.value,onValueChange:(I)=>{if(G.ctx.readOnly)return;U.onChange(I)},options:H,...G.spec.uiProps}),G.descNode,B.invalid?Y(J,{errors:$}):null]})}})}function qG(G){let[H,X]=V.useState(""),J=G.spec.source.kind==="resolver"?G.spec.source.debounceMs??200:0,U=YG(H,J),[B,$]=V.useState([]),I=V.useMemo(()=>{return G.spec.source.kind==="resolver"?`${G.spec.source.resolverKey}:${l(G.values,G.spec.source.deps)}:${U}`:"local"},[U,G.spec.source,G.values]);V.useEffect(()=>{if(G.spec.source.kind!=="resolver")return;let Z=G.resolvers?.[G.spec.source.resolverKey],z=G.spec.source.minQueryLength??0;if(!Z||U.trim().length<z){$([]);return}let O=!0,y={...G.spec.source.args??{},query:U};return Promise.resolve(Z(G.values,y)).then((C)=>{if(O)$([...C??[]])}),()=>{O=!1}},[I,G.resolvers,G.spec.source,G.values,U]);let q=G.spec.source.kind==="local"?BG(G.spec.source.options,H,G.spec.source.searchKeys):B,b=G.driver.Field,_=G.driver.FieldError;return Y(A,{name:G.ctx.name,control:G.form.control,render:({field:Z,fieldState:z})=>{let O=z.error?[z.error]:[],y=IG(q,Z.value,G.spec.valueMapping,G.spec.multiple),C=(D)=>{if(G.ctx.readOnly)return;let k=x(D,G.spec.valueMapping);if(G.spec.multiple){let P=Array.isArray(Z.value)?Z.value:[],R=P.some((S)=>v(S,k));Z.onChange(R?P:[...P,k]);return}Z.onChange(k),X(D.labelI18n)},T=(D)=>{if(G.ctx.readOnly||!G.spec.multiple)return;let k=x(D,G.spec.valueMapping),P=Array.isArray(Z.value)?Z.value:[];Z.onChange(P.filter((R)=>!v(R,k)))};return w(b,{...G.commonWrapProps,children:[G.labelNode,Y(G.driver.Autocomplete,{id:G.ctx.id,name:G.ctx.name,disabled:!G.ctx.enabled,readOnly:G.ctx.readOnly,"aria-invalid":z.invalid||void 0,placeholder:G.spec.placeholderI18n,multiple:G.spec.multiple,query:H,options:q,selectedOptions:y,onQueryChange:X,onSelectOption:C,onRemoveOption:T}),G.descNode,z.invalid?Y(_,{errors:O}):null]})}})}function TG(G){let H=g(G.values,j(G.spec.countryOptions),G.resolvers),X=G.driver.Field,J=G.driver.FieldError;return Y(A,{name:G.ctx.name,control:G.form.control,render:({field:U,fieldState:B})=>{let $=B.error?[B.error]:[];return w(X,{...G.commonWrapProps,children:[G.labelNode,Y(G.driver.AddressField,{id:G.ctx.id,name:G.ctx.name,value:U.value??null,onChange:(I)=>{if(G.ctx.readOnly)return;U.onChange(I)},disabled:!G.ctx.enabled,readOnly:G.ctx.readOnly,"aria-invalid":B.invalid||void 0,parts:G.spec.parts,countryOptions:H}),G.descNode,B.invalid?Y(J,{errors:$}):null]})}})}function wG(G){let H=g(G.values,j(G.spec.countryOptions),G.resolvers),X=G.driver.Field,J=G.driver.FieldError;return Y(A,{name:G.ctx.name,control:G.form.control,render:({field:U,fieldState:B})=>{let $=B.error?[B.error]:[];return w(X,{...G.commonWrapProps,children:[G.labelNode,Y(G.driver.PhoneField,{id:G.ctx.id,name:G.ctx.name,value:a(U.value??null),onChange:(I)=>{if(G.ctx.readOnly)return;U.onChange(a(I))},disabled:!G.ctx.enabled,readOnly:G.ctx.readOnly,"aria-invalid":B.invalid||void 0,parts:G.spec.parts,countryOptions:H}),G.descNode,B.invalid?Y(J,{errors:$}):null]})}})}function KG(G){let H=G.driver.Field,X=G.driver.FieldError;return Y(A,{name:G.ctx.name,control:G.form.control,render:({field:J,fieldState:U})=>{let B=U.error?[U.error]:[];return w(H,{...G.commonWrapProps,children:[G.labelNode,Y(G.driver.DateField,{id:G.ctx.id,name:G.ctx.name,value:i(J.value),onChange:($)=>{if(G.ctx.readOnly)return;J.onChange($)},disabled:!G.ctx.enabled,readOnly:G.ctx.readOnly,placeholder:G.spec.placeholderI18n,minDate:G.spec.minDate,maxDate:G.spec.maxDate}),G.descNode,U.invalid?Y(X,{errors:B}):null]})}})}function QG(G){let H=G.driver.Field,X=G.driver.FieldError;return Y(A,{name:G.ctx.name,control:G.form.control,render:({field:J,fieldState:U})=>{let B=U.error?[U.error]:[];return w(H,{...G.commonWrapProps,children:[G.labelNode,Y(G.driver.TimeField,{id:G.ctx.id,name:G.ctx.name,value:_G(J.value),onChange:($)=>{if(G.ctx.readOnly)return;J.onChange($G($))},disabled:!G.ctx.enabled,readOnly:G.ctx.readOnly,placeholder:G.spec.placeholderI18n,is24Hour:G.spec.is24Hour}),G.descNode,U.invalid?Y(X,{errors:B}):null]})}})}function MG(G){let H=G.driver.Field,X=G.driver.FieldError;return Y(A,{name:G.ctx.name,control:G.form.control,render:({field:J,fieldState:U})=>{let B=U.error?[U.error]:[];return w(H,{...G.commonWrapProps,children:[G.labelNode,Y(G.driver.DateTimeField,{id:G.ctx.id,name:G.ctx.name,value:i(J.value),onChange:($)=>{if(G.ctx.readOnly)return;J.onChange($)},disabled:!G.ctx.enabled,readOnly:G.ctx.readOnly,datePlaceholder:G.spec.placeholderI18n,timePlaceholder:G.spec.placeholderI18n,minDate:G.spec.minDate,maxDate:G.spec.maxDate,is24Hour:G.spec.is24Hour}),G.descNode,U.invalid?Y(X,{errors:B}):null]})}})}function VG(G){let H=d(G.parent,G.spec.name),{fields:X,append:J,remove:U}=JG({control:G.form.control,name:H}),B=G.spec.max==null||X.length<G.spec.max,$=(I)=>(G.spec.min==null?X.length>0:X.length>G.spec.min)&&I>=0;return w("div",{children:[G.spec.labelI18n?Y(G.driver.FieldLabel,{children:G.spec.labelI18n}):null,X.map((I,q)=>w("div",{children:[G.renderField(G.spec.of,`${H}.${q}`),$(q)?Y(G.driver.Button,{type:"button",variant:"ghost",size:"sm",onClick:()=>U(q),children:"Remove"}):null]},I.id??q)),B?Y(G.driver.Button,{type:"button",variant:"outline",size:"sm",onClick:()=>J({}),children:"Add"}):null]},H)}function fG(G){let H=G;function X(J){let U=V.useMemo(()=>GG(J.spec),[J.spec]),B=V.useMemo(()=>p(U),[U]),$=UG({...J.merged.formOptions,resolver:HG(B),defaultValues:J.options?.defaultValues}),I=$.watch(),q=(_,Z)=>{let z=J.merged.driver.Field,O=J.merged.driver.FieldLabel,y=J.merged.driver.FieldDescription,C=J.merged.driver.FieldError,T=d(Z,_.name),D=XG(Z),k=n(I,_.visibleWhen,D),P=n(I,_.enabledWhen,D),R=e(_),S=Boolean($.getFieldState(T)?.invalid);if(!k)return null;let L={name:T,id:T.replace(/\./g,"-"),enabled:P,readOnly:R,visible:k},K={"data-invalid":S,hidden:!k,disabled:!P||R},Q=_.labelI18n?Y(O,{htmlFor:L.id,children:_.labelI18n}):null,M=_.descriptionI18n?Y(y,{children:_.descriptionI18n}):null;if(_.kind==="group")return w(z,{...K,children:[Q,_.fields.map((N,W)=>Y(V.Fragment,{children:q(N,T)},`${T}-${W}`)),M]});if(_.kind==="array")return Y(VG,{driver:J.merged.driver,form:$,spec:_,parent:Z,renderField:q},T);if(_.kind==="select")return Y(LG,{driver:J.merged.driver,form:$,values:I,spec:_,ctx:L,labelNode:Q,descNode:M,commonWrapProps:K,resolvers:J.merged.resolvers},T);if(_.kind==="radio")return Y(ZG,{driver:J.merged.driver,form:$,values:I,spec:_,ctx:L,labelNode:Q,descNode:M,commonWrapProps:K,resolvers:J.merged.resolvers},T);if(_.kind==="autocomplete")return Y(qG,{driver:J.merged.driver,form:$,values:I,spec:_,ctx:L,labelNode:Q,descNode:M,commonWrapProps:K,resolvers:J.merged.resolvers},T);if(_.kind==="address")return Y(TG,{driver:J.merged.driver,form:$,values:I,spec:_,ctx:L,labelNode:Q,descNode:M,commonWrapProps:K,resolvers:J.merged.resolvers},T);if(_.kind==="phone")return Y(wG,{driver:J.merged.driver,form:$,values:I,spec:_,ctx:L,labelNode:Q,descNode:M,commonWrapProps:K,resolvers:J.merged.resolvers},T);if(_.kind==="date")return Y(KG,{driver:J.merged.driver,form:$,spec:_,ctx:L,labelNode:Q,descNode:M,commonWrapProps:K},T);if(_.kind==="time")return Y(QG,{driver:J.merged.driver,form:$,spec:_,ctx:L,labelNode:Q,descNode:M,commonWrapProps:K},T);if(_.kind==="datetime")return Y(MG,{driver:J.merged.driver,form:$,spec:_,ctx:L,labelNode:Q,descNode:M,commonWrapProps:K},T);return Y(A,{name:T,control:$.control,render:({field:N,fieldState:W})=>{let h=W.error?[W.error]:[];if(_.kind==="text"){let E=_;return w(z,{...K,children:[Q,Y(J.merged.driver.Input,{id:L.id,"aria-invalid":W.invalid||void 0,placeholder:_.placeholderI18n,autoComplete:E.autoComplete,inputMode:E.inputMode,maxLength:E.maxLength,minLength:E.minLength,disabled:!L.enabled,readOnly:L.readOnly,...N,..._.uiProps}),M,W.invalid?Y(C,{errors:h}):null]})}if(_.kind==="textarea"){let E=_;return w(z,{...K,children:[Q,Y(J.merged.driver.Textarea,{id:L.id,"aria-invalid":W.invalid||void 0,placeholder:_.placeholderI18n,rows:E.rows,maxLength:E.maxLength,disabled:!L.enabled,readOnly:L.readOnly,...N,..._.uiProps}),M,W.invalid?Y(C,{errors:h}):null]})}if(_.kind==="checkbox")return w(z,{...K,children:[Q,Y(J.merged.driver.Checkbox,{id:L.id,name:L.name,disabled:!L.enabled||L.readOnly,checked:Boolean(N.value),onCheckedChange:(E)=>{if(L.readOnly)return;N.onChange(E)},..._.uiProps}),M,W.invalid?Y(C,{errors:h}):null]});if(_.kind==="switch")return w(z,{...K,children:[Q,Y(J.merged.driver.Switch,{id:L.id,name:L.name,disabled:!L.enabled||L.readOnly,checked:Boolean(N.value),onCheckedChange:(E)=>{if(L.readOnly)return;N.onChange(E)},..._.uiProps}),M,W.invalid?Y(C,{errors:h}):null]});return Y(zG,{})}},T)},b=async(_)=>{let Z=U.actions?.[0]?.key??"submit";if(J.merged.onSubmitOverride)return J.merged.onSubmitOverride(_,Z)};return w("form",{onSubmit:$.handleSubmit(b),children:[U.fields.map((_,Z)=>Y(V.Fragment,{children:q(_)},Z)),U.actions?.length?Y("div",{children:U.actions.map((_)=>Y(J.merged.driver.Button,{type:"submit",children:_.labelI18n},_.key))}):null]})}return{render:(J,U)=>Y(X,{spec:J,options:U,merged:{...H,...U?.overrides??{}}})}}export{AG as shadcnDriver,WG as rnReusablesDriver,jG as renderFeaturePresentation,SG as registerFeature,x as mapAutocompleteValue,BG as filterAutocompleteOptions,fG as createFormRenderer,gG as createFeatureModule,FG as createEngineWithDefaults};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { FormOption, FormSpec, FormValuesFor } from '@contractspec/lib.contracts-spec/forms';
|
|
1
|
+
import type { AddressFieldSpec, AddressFormValue, AutocompleteFieldSpec, AutocompleteOption, FormOption, FormSpec, FormValuesFor, PhoneFieldSpec, PhoneFormValue } from '@contractspec/lib.contracts-spec/forms';
|
|
2
2
|
import type { AnySchemaModel } from '@contractspec/lib.schema';
|
|
3
3
|
import React from 'react';
|
|
4
4
|
export interface DriverSlots {
|
|
@@ -10,7 +10,7 @@ export interface DriverSlots {
|
|
|
10
10
|
FieldLabel: React.ComponentType<React.PropsWithChildren<{
|
|
11
11
|
htmlFor?: string;
|
|
12
12
|
}>>;
|
|
13
|
-
FieldDescription: React.ComponentType<React.PropsWithChildren<
|
|
13
|
+
FieldDescription: React.ComponentType<React.PropsWithChildren<object>>;
|
|
14
14
|
FieldError: React.ComponentType<{
|
|
15
15
|
errors: {
|
|
16
16
|
message?: string;
|
|
@@ -31,7 +31,7 @@ export interface DriverSlots {
|
|
|
31
31
|
id?: string;
|
|
32
32
|
name?: string;
|
|
33
33
|
value?: unknown;
|
|
34
|
-
onChange?: (
|
|
34
|
+
onChange?: (value: unknown) => void;
|
|
35
35
|
disabled?: boolean;
|
|
36
36
|
'aria-invalid'?: boolean;
|
|
37
37
|
options: FormOption[];
|
|
@@ -40,14 +40,14 @@ export interface DriverSlots {
|
|
|
40
40
|
id?: string;
|
|
41
41
|
name?: string;
|
|
42
42
|
checked?: boolean;
|
|
43
|
-
onCheckedChange?: (
|
|
43
|
+
onCheckedChange?: (value: boolean) => void;
|
|
44
44
|
disabled?: boolean;
|
|
45
45
|
} & Record<string, unknown>>;
|
|
46
46
|
RadioGroup: React.ComponentType<{
|
|
47
47
|
id?: string;
|
|
48
48
|
name?: string;
|
|
49
49
|
value?: unknown;
|
|
50
|
-
onValueChange?: (
|
|
50
|
+
onValueChange?: (value: unknown) => void;
|
|
51
51
|
disabled?: boolean;
|
|
52
52
|
options: FormOption[];
|
|
53
53
|
} & Record<string, unknown>>;
|
|
@@ -55,9 +55,80 @@ export interface DriverSlots {
|
|
|
55
55
|
id?: string;
|
|
56
56
|
name?: string;
|
|
57
57
|
checked?: boolean;
|
|
58
|
-
onCheckedChange?: (
|
|
58
|
+
onCheckedChange?: (value: boolean) => void;
|
|
59
59
|
disabled?: boolean;
|
|
60
60
|
} & Record<string, unknown>>;
|
|
61
|
+
Autocomplete: React.ComponentType<{
|
|
62
|
+
id?: string;
|
|
63
|
+
name?: string;
|
|
64
|
+
disabled?: boolean;
|
|
65
|
+
readOnly?: boolean;
|
|
66
|
+
'aria-invalid'?: boolean;
|
|
67
|
+
placeholder?: string;
|
|
68
|
+
multiple?: boolean;
|
|
69
|
+
query: string;
|
|
70
|
+
options: AutocompleteOption[];
|
|
71
|
+
selectedOptions: AutocompleteOption[];
|
|
72
|
+
onQueryChange?: (query: string) => void;
|
|
73
|
+
onSelectOption?: (option: AutocompleteOption) => void;
|
|
74
|
+
onRemoveOption?: (option: AutocompleteOption) => void;
|
|
75
|
+
}>;
|
|
76
|
+
AddressField: React.ComponentType<{
|
|
77
|
+
id?: string;
|
|
78
|
+
name?: string;
|
|
79
|
+
value?: AddressFormValue | null;
|
|
80
|
+
onChange?: (value: AddressFormValue) => void;
|
|
81
|
+
disabled?: boolean;
|
|
82
|
+
readOnly?: boolean;
|
|
83
|
+
'aria-invalid'?: boolean;
|
|
84
|
+
parts?: AddressFieldSpec['parts'];
|
|
85
|
+
countryOptions?: FormOption[];
|
|
86
|
+
}>;
|
|
87
|
+
PhoneField: React.ComponentType<{
|
|
88
|
+
id?: string;
|
|
89
|
+
name?: string;
|
|
90
|
+
value?: PhoneFormValue | null;
|
|
91
|
+
onChange?: (value: PhoneFormValue) => void;
|
|
92
|
+
disabled?: boolean;
|
|
93
|
+
readOnly?: boolean;
|
|
94
|
+
'aria-invalid'?: boolean;
|
|
95
|
+
parts?: PhoneFieldSpec['parts'];
|
|
96
|
+
countryOptions?: FormOption[];
|
|
97
|
+
}>;
|
|
98
|
+
DateField: React.ComponentType<{
|
|
99
|
+
id?: string;
|
|
100
|
+
name?: string;
|
|
101
|
+
value?: Date | null;
|
|
102
|
+
onChange?: (value: Date | null) => void;
|
|
103
|
+
disabled?: boolean;
|
|
104
|
+
readOnly?: boolean;
|
|
105
|
+
placeholder?: string;
|
|
106
|
+
minDate?: Date;
|
|
107
|
+
maxDate?: Date;
|
|
108
|
+
}>;
|
|
109
|
+
TimeField: React.ComponentType<{
|
|
110
|
+
id?: string;
|
|
111
|
+
name?: string;
|
|
112
|
+
value?: Date | null;
|
|
113
|
+
onChange?: (value: Date | null) => void;
|
|
114
|
+
disabled?: boolean;
|
|
115
|
+
readOnly?: boolean;
|
|
116
|
+
placeholder?: string;
|
|
117
|
+
is24Hour?: boolean;
|
|
118
|
+
}>;
|
|
119
|
+
DateTimeField: React.ComponentType<{
|
|
120
|
+
id?: string;
|
|
121
|
+
name?: string;
|
|
122
|
+
value?: Date | null;
|
|
123
|
+
onChange?: (value: Date | null) => void;
|
|
124
|
+
disabled?: boolean;
|
|
125
|
+
readOnly?: boolean;
|
|
126
|
+
datePlaceholder?: string;
|
|
127
|
+
timePlaceholder?: string;
|
|
128
|
+
minDate?: Date;
|
|
129
|
+
maxDate?: Date;
|
|
130
|
+
is24Hour?: boolean;
|
|
131
|
+
}>;
|
|
61
132
|
Button: React.ComponentType<React.PropsWithChildren<{
|
|
62
133
|
type?: 'button' | 'submit' | 'reset';
|
|
63
134
|
variant?: string;
|
|
@@ -66,7 +137,7 @@ export interface DriverSlots {
|
|
|
66
137
|
disabled?: boolean;
|
|
67
138
|
}>>;
|
|
68
139
|
}
|
|
69
|
-
export type ResolverMap<TValues> = Record<string, (values: TValues, args?: unknown) => Promise<
|
|
140
|
+
export type ResolverMap<TValues> = Record<string, (values: TValues, args?: Record<string, unknown>) => Promise<readonly unknown[]> | readonly unknown[]>;
|
|
70
141
|
export type ComputationMap<TValues> = Record<string, (values: TValues) => unknown>;
|
|
71
142
|
export interface CreateRendererOptions<TValues = Record<string, unknown>> {
|
|
72
143
|
driver: DriverSlots;
|
|
@@ -81,6 +152,8 @@ export interface RenderOptions<TValues = Record<string, unknown>> {
|
|
|
81
152
|
defaultValues?: Partial<TValues>;
|
|
82
153
|
overrides?: Partial<CreateRendererOptions<TValues>>;
|
|
83
154
|
}
|
|
155
|
+
export declare function filterAutocompleteOptions(options: readonly AutocompleteOption[], query: string, searchKeys: string[]): AutocompleteOption[];
|
|
156
|
+
export declare function mapAutocompleteValue(option: AutocompleteOption, mapping: AutocompleteFieldSpec['valueMapping']): {};
|
|
84
157
|
export declare function createFormRenderer<M extends AnySchemaModel = AnySchemaModel>(base: CreateRendererOptions<FormValuesFor<M>>): {
|
|
85
158
|
render: (spec: FormSpec<M>, options?: RenderOptions<FormValuesFor<M>>) => import("react/jsx-runtime").JSX.Element;
|
|
86
159
|
};
|
package/dist/form-render.impl.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var Qq=import.meta.require;import{buildZodWithRelations as o,evalPredicate as u}from"@contractspec/lib.contracts-spec/forms";import{zodResolver as i}from"@hookform/resolvers/zod";import x,{useEffect as a,useMemo as n,useState as d}from"react";import{Controller as s,useFieldArray as r,useForm as e}from"react-hook-form";import{jsx as Q,jsxs as M,Fragment as Jq}from"react/jsx-runtime";function v(U){if(!U)return;if(Array.isArray(U))return{kind:"static",options:U};return U}function qq(U,H){if(!H)return;let J=H.replace(/\[(\d+)\]/g,".$1").split(".").filter(Boolean),T=U;for(let L of J){if(T==null)return;T=T[L]}return T}function Hq(U,H){if(!H||H.length===0)return"[]";try{return JSON.stringify(H.map((J)=>qq(U,J)))}catch{return"[]"}}function p(U,H,J){let[T,L]=d([]),X=n(()=>{if(!H)return"nil";if(H.kind==="static")return JSON.stringify(H.options??[]);return Hq(U,H.deps)},[H,U]);return a(()=>{let N=!0;return(async()=>{if(!H)return L([]);if(H.kind==="static")return L([...H.options??[]]);let h=J?.[H.resolverKey];if(!h)return L([]);let k=await h(U,H.args);if(N)L([...k??[]])})(),()=>{N=!1}},[X,H&&H.kind==="resolver"?H.resolverKey:void 0]),T}function c(U,H,J){if(!H)return U??"";let T=typeof J==="number"?`${H.replace(/^\$index$/,String(J))}`:H;return U?`${U}${typeof J==="number"?`.${J}`:""}.${T}`.replace(/\.+/g,"."):T}function $q(U){let H=U,{driver:J}=H;function T(L){let{spec:X,options:N,merged:R}=L,h=n(()=>o(X),[X]),k=e({...R.formOptions,resolver:i(h),defaultValues:N?.defaultValues}),D=k.watch(),I=(q,w,W)=>{let{Field:Y,FieldLabel:y,FieldDescription:F,FieldError:B}=J,_=c(w,q.name,W),O=u(D,q.visibleWhen),Z=u(D,q.enabledWhen),P=Boolean(k.getFieldState(_)?.invalid);if(!O)return null;let $=_?.replace(/\./g,"-"),A={"data-invalid":P,hidden:!O,disabled:!Z},E=q.labelI18n?Q(y,{htmlFor:$,children:q.labelI18n}):null,g=q.descriptionI18n?Q(F,{children:q.descriptionI18n}):null;if(q.kind==="group"){let G=q.fields.map((z,K)=>Q(x.Fragment,{children:I(z,_,W)},`${_}-${K}`));return M(Y,{...A,children:[E,G,g]})}if(q.kind==="array")return l(q,w);return Q(s,{name:_,control:k.control,render:({field:G,fieldState:z})=>{let K=z.error?[z.error]:[],S=z.invalid||void 0;if(q.kind==="text"){let V=q,C=J.Input;return M(Y,{...A,children:[E,Q(C,{id:$,"aria-invalid":S,placeholder:q.placeholderI18n,autoComplete:V.autoComplete,inputMode:V.inputMode,maxLength:V.maxLength,minLength:V.minLength,disabled:!Z,...G,...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}if(q.kind==="textarea"){let V=q,C=J.Textarea;return M(Y,{...A,children:[E,Q(C,{id:$,"aria-invalid":S,placeholder:q.placeholderI18n,rows:V.rows,maxLength:V.maxLength,disabled:!Z,...G,...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}if(q.kind==="select"){let V=q,C=J.Select,b=v(V.options),j=p(D,b,R.resolvers);return M(Y,{...A,children:[E,Q(C,{id:$,name:_,"aria-invalid":S,disabled:!Z,value:G.value,onChange:(m)=>G.onChange(m),options:j,...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}if(q.kind==="checkbox"){let V=J.Checkbox;return M(Y,{...A,children:[E,Q(V,{id:$,name:_,disabled:!Z,checked:!!G.value,onCheckedChange:(C)=>G.onChange(C),...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}if(q.kind==="radio"){let V=q,C=J.RadioGroup,b=v(V.options),j=p(D,b,R.resolvers);return M(Y,{...A,children:[E,Q(C,{id:$,name:_,disabled:!Z,value:G.value,onValueChange:(m)=>G.onChange(m),options:j,...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}if(q.kind==="switch"){let V=J.Switch;return M(Y,{...A,children:[E,Q(V,{id:$,name:_,disabled:!Z,checked:!!G.value,onCheckedChange:(C)=>G.onChange(C),...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}return Q(Jq,{})}},_)},l=(q,w)=>{let W=c(w,q.name),{fields:Y,append:y,remove:F}=r({control:k.control,name:W}),B=q.max==null||Y.length<q.max,_=(P)=>(q.min==null?Y.length>0:Y.length>q.min)&&P>=0,O=J.Button,Z=J.FieldLabel;return M("div",{children:[q.labelI18n?Q(Z,{children:q.labelI18n}):null,Y.map((P,$)=>M("div",{children:[I(q.of,W,$),_($)?Q(O,{type:"button",variant:"ghost",size:"sm",onClick:()=>F($),children:"Remove"}):null]},P.id??$)),B?Q(O,{type:"button",variant:"outline",size:"sm",onClick:()=>y({}),children:"Add"}):null]},W)},t=async(q)=>{let w=X.actions?.[0]?.key??"submit";if(R.onSubmitOverride)return R.onSubmitOverride(q,w)},f=J.Button;return M("form",{onSubmit:k.handleSubmit(t),children:[(X.fields||[]).map((q,w)=>Q(x.Fragment,{children:I(q)},w)),X.actions&&X.actions.length?Q("div",{children:X.actions.map((q)=>Q(f,{type:"submit",children:q.labelI18n},q.key))}):null]})}return{render:(L,X)=>Q(T,{spec:L,options:X,merged:{...H,...X?.overrides??{}}})}}export{$q as createFormRenderer};
|
|
2
|
+
var TB=import.meta.require;import{buildZodWithRelations as d,evalPredicate as m,isFieldReadOnly as t,normalizeFormSpec as i}from"@contractspec/lib.contracts-spec/forms";import{zodResolver as l}from"@hookform/resolvers/zod";import V from"react";import{Controller as A,useFieldArray as s,useForm as o}from"react-hook-form";import{jsx as U,jsxs as q,Fragment as wB}from"react/jsx-runtime";function F(B){if(!B)return;if(Array.isArray(B))return{kind:"static",options:[...B]};return B}function y(B,G){if(!G)return;let Y=G.replace(/\[(\d+)\]/g,".$1").split(".").filter(Boolean),H=B;for(let J of Y){if(H==null)return;H=H[J]}return H}function r(B){if(!B)return[];return B.split(".").filter((G)=>/^\d+$/.test(G)).map((G)=>Number(G))}function u(B,G){if(!G)return B??"";return B?`${B}.${G}`:G}function f(B,G){if(!G||G.length===0)return"[]";try{return JSON.stringify(G.map((Y)=>y(B,Y)))}catch{return"[]"}}function e(B,G){let[Y,H]=V.useState(B);return V.useEffect(()=>{let J=globalThis.setTimeout(()=>H(B),G);return()=>globalThis.clearTimeout(J)},[G,B]),Y}function j(B,G,Y){let[H,J]=V.useState([]),_=V.useMemo(()=>{if(!G)return"nil";if(G.kind==="static")return JSON.stringify(G.options??[]);return`${G.resolverKey}:${f(B,G.deps)}`},[G,B]);return V.useEffect(()=>{let $=!0;return(async()=>{if(!G){J([]);return}if(G.kind==="static"){J([...G.options??[]]);return}let w=Y?.[G.resolverKey];if(!w){J([]);return}let b=await w(B,G.args);if($)J([...b??[]])})(),()=>{$=!1}},[_,Y,G,B]),H}function n(B){if(B instanceof Date&&!Number.isNaN(B.getTime()))return B;if(typeof B==="string"||typeof B==="number"){let G=new Date(B);if(!Number.isNaN(G.getTime()))return G}return null}function p(B){if(B instanceof Date&&!Number.isNaN(B.getTime()))return B;if(typeof B!=="string"||B.trim().length===0)return null;let[G,Y]=B.split(":").map(($)=>Number($)),H=G??Number.NaN,J=Y??Number.NaN;if(Number.isNaN(H)||Number.isNaN(J))return null;let _=new Date;return _.setHours(H,J,0,0),_}function BB(B){if(!B)return"";return`${String(B.getHours()).padStart(2,"0")}:${String(B.getMinutes()).padStart(2,"0")}`}function a(B){return{value:B.value,labelI18n:B.labelI18n,descriptionI18n:B.descriptionI18n,...B.data??{}}}function GB(B,G,Y){let H=G.trim().toLowerCase();if(!H)return[...B];let J=H.split(/\s+/).filter(Boolean);return B.filter((_)=>{let $=a(_),L=[_.labelI18n,_.descriptionI18n,String(_.value),...Y.map((w)=>String(y($,w)??""))].join(" ").toLowerCase();return J.every((w)=>L.includes(w))})}function x(B,G){let Y=a(B);switch(G.mode){case"scalar":return G.valueKey?y(Y,G.valueKey)??B.value:B.value;case"pick":return Object.fromEntries(G.pickKeys.map((H)=>[H,y(Y,H)]));case"object":default:return B.data??Y}}function v(B,G){try{return JSON.stringify(B)===JSON.stringify(G)}catch{return B===G}}function HB(B,G,Y,H){let J=H&&Array.isArray(G)?G:[G];return B.filter((_)=>J.some(($)=>v(x(_,Y),$)))}function c(B){if(!B)return{countryCode:"",nationalNumber:""};let G=B.countryCode.trim(),Y=B.nationalNumber.replace(/\s+/g,""),H=G.replace(/^\+?/,"+"),J={...B,countryCode:G,nationalNumber:B.nationalNumber};if(B.e164!=null||G||Y)J.e164=`${H}${Y}`.trim();return J}function JB(B){let G=j(B.values,F(B.spec.options),B.resolvers),Y=B.driver.Field,H=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:J,fieldState:_})=>{let $=_.error?[_.error]:[];return q(Y,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.Select,{id:B.ctx.id,name:B.ctx.name,"aria-invalid":_.invalid||void 0,disabled:!B.ctx.enabled||B.ctx.readOnly,value:J.value,onChange:(L)=>{if(B.ctx.readOnly)return;J.onChange(L)},options:G,...B.spec.uiProps}),B.descNode,_.invalid?U(H,{errors:$}):null]})}})}function UB(B){let G=j(B.values,F(B.spec.options),B.resolvers),Y=B.driver.Field,H=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:J,fieldState:_})=>{let $=_.error?[_.error]:[];return q(Y,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.RadioGroup,{id:B.ctx.id,name:B.ctx.name,disabled:!B.ctx.enabled||B.ctx.readOnly,value:J.value,onValueChange:(L)=>{if(B.ctx.readOnly)return;J.onChange(L)},options:G,...B.spec.uiProps}),B.descNode,_.invalid?U(H,{errors:$}):null]})}})}function XB(B){let[G,Y]=V.useState(""),H=B.spec.source.kind==="resolver"?B.spec.source.debounceMs??200:0,J=e(G,H),[_,$]=V.useState([]),L=V.useMemo(()=>{return B.spec.source.kind==="resolver"?`${B.spec.source.resolverKey}:${f(B.values,B.spec.source.deps)}:${J}`:"local"},[J,B.spec.source,B.values]);V.useEffect(()=>{if(B.spec.source.kind!=="resolver")return;let Z=B.resolvers?.[B.spec.source.resolverKey],k=B.spec.source.minQueryLength??0;if(!Z||J.trim().length<k){$([]);return}let g=!0,D={...B.spec.source.args??{},query:J};return Promise.resolve(Z(B.values,D)).then((C)=>{if(g)$([...C??[]])}),()=>{g=!1}},[L,B.resolvers,B.spec.source,B.values,J]);let w=B.spec.source.kind==="local"?GB(B.spec.source.options,G,B.spec.source.searchKeys):_,b=B.driver.Field,X=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:Z,fieldState:k})=>{let g=k.error?[k.error]:[],D=HB(w,Z.value,B.spec.valueMapping,B.spec.multiple),C=(O)=>{if(B.ctx.readOnly)return;let W=x(O,B.spec.valueMapping);if(B.spec.multiple){let P=Array.isArray(Z.value)?Z.value:[],R=P.some((S)=>v(S,W));Z.onChange(R?P:[...P,W]);return}Z.onChange(W),Y(O.labelI18n)},T=(O)=>{if(B.ctx.readOnly||!B.spec.multiple)return;let W=x(O,B.spec.valueMapping),P=Array.isArray(Z.value)?Z.value:[];Z.onChange(P.filter((R)=>!v(R,W)))};return q(b,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.Autocomplete,{id:B.ctx.id,name:B.ctx.name,disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,"aria-invalid":k.invalid||void 0,placeholder:B.spec.placeholderI18n,multiple:B.spec.multiple,query:G,options:w,selectedOptions:D,onQueryChange:Y,onSelectOption:C,onRemoveOption:T}),B.descNode,k.invalid?U(X,{errors:g}):null]})}})}function YB(B){let G=j(B.values,F(B.spec.countryOptions),B.resolvers),Y=B.driver.Field,H=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:J,fieldState:_})=>{let $=_.error?[_.error]:[];return q(Y,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.AddressField,{id:B.ctx.id,name:B.ctx.name,value:J.value??null,onChange:(L)=>{if(B.ctx.readOnly)return;J.onChange(L)},disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,"aria-invalid":_.invalid||void 0,parts:B.spec.parts,countryOptions:G}),B.descNode,_.invalid?U(H,{errors:$}):null]})}})}function _B(B){let G=j(B.values,F(B.spec.countryOptions),B.resolvers),Y=B.driver.Field,H=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:J,fieldState:_})=>{let $=_.error?[_.error]:[];return q(Y,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.PhoneField,{id:B.ctx.id,name:B.ctx.name,value:c(J.value??null),onChange:(L)=>{if(B.ctx.readOnly)return;J.onChange(c(L))},disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,"aria-invalid":_.invalid||void 0,parts:B.spec.parts,countryOptions:G}),B.descNode,_.invalid?U(H,{errors:$}):null]})}})}function $B(B){let G=B.driver.Field,Y=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:H,fieldState:J})=>{let _=J.error?[J.error]:[];return q(G,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.DateField,{id:B.ctx.id,name:B.ctx.name,value:n(H.value),onChange:($)=>{if(B.ctx.readOnly)return;H.onChange($)},disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,placeholder:B.spec.placeholderI18n,minDate:B.spec.minDate,maxDate:B.spec.maxDate}),B.descNode,J.invalid?U(Y,{errors:_}):null]})}})}function IB(B){let G=B.driver.Field,Y=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:H,fieldState:J})=>{let _=J.error?[J.error]:[];return q(G,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.TimeField,{id:B.ctx.id,name:B.ctx.name,value:p(H.value),onChange:($)=>{if(B.ctx.readOnly)return;H.onChange(BB($))},disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,placeholder:B.spec.placeholderI18n,is24Hour:B.spec.is24Hour}),B.descNode,J.invalid?U(Y,{errors:_}):null]})}})}function LB(B){let G=B.driver.Field,Y=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:H,fieldState:J})=>{let _=J.error?[J.error]:[];return q(G,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.DateTimeField,{id:B.ctx.id,name:B.ctx.name,value:n(H.value),onChange:($)=>{if(B.ctx.readOnly)return;H.onChange($)},disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,datePlaceholder:B.spec.placeholderI18n,timePlaceholder:B.spec.placeholderI18n,minDate:B.spec.minDate,maxDate:B.spec.maxDate,is24Hour:B.spec.is24Hour}),B.descNode,J.invalid?U(Y,{errors:_}):null]})}})}function ZB(B){let G=u(B.parent,B.spec.name),{fields:Y,append:H,remove:J}=s({control:B.form.control,name:G}),_=B.spec.max==null||Y.length<B.spec.max,$=(L)=>(B.spec.min==null?Y.length>0:Y.length>B.spec.min)&&L>=0;return q("div",{children:[B.spec.labelI18n?U(B.driver.FieldLabel,{children:B.spec.labelI18n}):null,Y.map((L,w)=>q("div",{children:[B.renderField(B.spec.of,`${G}.${w}`),$(w)?U(B.driver.Button,{type:"button",variant:"ghost",size:"sm",onClick:()=>J(w),children:"Remove"}):null]},L.id??w)),_?U(B.driver.Button,{type:"button",variant:"outline",size:"sm",onClick:()=>H({}),children:"Add"}):null]},G)}function kB(B){let G=B;function Y(H){let J=V.useMemo(()=>i(H.spec),[H.spec]),_=V.useMemo(()=>d(J),[J]),$=o({...H.merged.formOptions,resolver:l(_),defaultValues:H.options?.defaultValues}),L=$.watch(),w=(X,Z)=>{let k=H.merged.driver.Field,g=H.merged.driver.FieldLabel,D=H.merged.driver.FieldDescription,C=H.merged.driver.FieldError,T=u(Z,X.name),O=r(Z),W=m(L,X.visibleWhen,O),P=m(L,X.enabledWhen,O),R=t(X),S=Boolean($.getFieldState(T)?.invalid);if(!W)return null;let I={name:T,id:T.replace(/\./g,"-"),enabled:P,readOnly:R,visible:W},M={"data-invalid":S,hidden:!W,disabled:!P||R},K=X.labelI18n?U(g,{htmlFor:I.id,children:X.labelI18n}):null,Q=X.descriptionI18n?U(D,{children:X.descriptionI18n}):null;if(X.kind==="group")return q(k,{...M,children:[K,X.fields.map((N,z)=>U(V.Fragment,{children:w(N,T)},`${T}-${z}`)),Q]});if(X.kind==="array")return U(ZB,{driver:H.merged.driver,form:$,spec:X,parent:Z,renderField:w},T);if(X.kind==="select")return U(JB,{driver:H.merged.driver,form:$,values:L,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M,resolvers:H.merged.resolvers},T);if(X.kind==="radio")return U(UB,{driver:H.merged.driver,form:$,values:L,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M,resolvers:H.merged.resolvers},T);if(X.kind==="autocomplete")return U(XB,{driver:H.merged.driver,form:$,values:L,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M,resolvers:H.merged.resolvers},T);if(X.kind==="address")return U(YB,{driver:H.merged.driver,form:$,values:L,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M,resolvers:H.merged.resolvers},T);if(X.kind==="phone")return U(_B,{driver:H.merged.driver,form:$,values:L,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M,resolvers:H.merged.resolvers},T);if(X.kind==="date")return U($B,{driver:H.merged.driver,form:$,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M},T);if(X.kind==="time")return U(IB,{driver:H.merged.driver,form:$,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M},T);if(X.kind==="datetime")return U(LB,{driver:H.merged.driver,form:$,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M},T);return U(A,{name:T,control:$.control,render:({field:N,fieldState:z})=>{let h=z.error?[z.error]:[];if(X.kind==="text"){let E=X;return q(k,{...M,children:[K,U(H.merged.driver.Input,{id:I.id,"aria-invalid":z.invalid||void 0,placeholder:X.placeholderI18n,autoComplete:E.autoComplete,inputMode:E.inputMode,maxLength:E.maxLength,minLength:E.minLength,disabled:!I.enabled,readOnly:I.readOnly,...N,...X.uiProps}),Q,z.invalid?U(C,{errors:h}):null]})}if(X.kind==="textarea"){let E=X;return q(k,{...M,children:[K,U(H.merged.driver.Textarea,{id:I.id,"aria-invalid":z.invalid||void 0,placeholder:X.placeholderI18n,rows:E.rows,maxLength:E.maxLength,disabled:!I.enabled,readOnly:I.readOnly,...N,...X.uiProps}),Q,z.invalid?U(C,{errors:h}):null]})}if(X.kind==="checkbox")return q(k,{...M,children:[K,U(H.merged.driver.Checkbox,{id:I.id,name:I.name,disabled:!I.enabled||I.readOnly,checked:Boolean(N.value),onCheckedChange:(E)=>{if(I.readOnly)return;N.onChange(E)},...X.uiProps}),Q,z.invalid?U(C,{errors:h}):null]});if(X.kind==="switch")return q(k,{...M,children:[K,U(H.merged.driver.Switch,{id:I.id,name:I.name,disabled:!I.enabled||I.readOnly,checked:Boolean(N.value),onCheckedChange:(E)=>{if(I.readOnly)return;N.onChange(E)},...X.uiProps}),Q,z.invalid?U(C,{errors:h}):null]});return U(wB,{})}},T)},b=async(X)=>{let Z=J.actions?.[0]?.key??"submit";if(H.merged.onSubmitOverride)return H.merged.onSubmitOverride(X,Z)};return q("form",{onSubmit:$.handleSubmit(b),children:[J.fields.map((X,Z)=>U(V.Fragment,{children:w(X)},Z)),J.actions?.length?U("div",{children:J.actions.map((X)=>U(H.merged.driver.Button,{type:"submit",children:X.labelI18n},X.key))}):null]})}return{render:(H,J)=>U(Y,{spec:H,options:J,merged:{...G,...J?.overrides??{}}})}}export{x as mapAutocompleteValue,GB as filterAutocompleteOptions,kB as createFormRenderer};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/form-render.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var Qq=import.meta.require;import{buildZodWithRelations as o,evalPredicate as u}from"@contractspec/lib.contracts-spec/forms";import{zodResolver as i}from"@hookform/resolvers/zod";import x,{useEffect as a,useMemo as n,useState as d}from"react";import{Controller as s,useFieldArray as r,useForm as e}from"react-hook-form";import{jsx as Q,jsxs as M,Fragment as Jq}from"react/jsx-runtime";function v(U){if(!U)return;if(Array.isArray(U))return{kind:"static",options:U};return U}function qq(U,H){if(!H)return;let J=H.replace(/\[(\d+)\]/g,".$1").split(".").filter(Boolean),T=U;for(let L of J){if(T==null)return;T=T[L]}return T}function Hq(U,H){if(!H||H.length===0)return"[]";try{return JSON.stringify(H.map((J)=>qq(U,J)))}catch{return"[]"}}function p(U,H,J){let[T,L]=d([]),X=n(()=>{if(!H)return"nil";if(H.kind==="static")return JSON.stringify(H.options??[]);return Hq(U,H.deps)},[H,U]);return a(()=>{let N=!0;return(async()=>{if(!H)return L([]);if(H.kind==="static")return L([...H.options??[]]);let h=J?.[H.resolverKey];if(!h)return L([]);let k=await h(U,H.args);if(N)L([...k??[]])})(),()=>{N=!1}},[X,H&&H.kind==="resolver"?H.resolverKey:void 0]),T}function c(U,H,J){if(!H)return U??"";let T=typeof J==="number"?`${H.replace(/^\$index$/,String(J))}`:H;return U?`${U}${typeof J==="number"?`.${J}`:""}.${T}`.replace(/\.+/g,"."):T}function $q(U){let H=U,{driver:J}=H;function T(L){let{spec:X,options:N,merged:R}=L,h=n(()=>o(X),[X]),k=e({...R.formOptions,resolver:i(h),defaultValues:N?.defaultValues}),D=k.watch(),I=(q,w,W)=>{let{Field:Y,FieldLabel:y,FieldDescription:F,FieldError:B}=J,_=c(w,q.name,W),O=u(D,q.visibleWhen),Z=u(D,q.enabledWhen),P=Boolean(k.getFieldState(_)?.invalid);if(!O)return null;let $=_?.replace(/\./g,"-"),A={"data-invalid":P,hidden:!O,disabled:!Z},E=q.labelI18n?Q(y,{htmlFor:$,children:q.labelI18n}):null,g=q.descriptionI18n?Q(F,{children:q.descriptionI18n}):null;if(q.kind==="group"){let G=q.fields.map((z,K)=>Q(x.Fragment,{children:I(z,_,W)},`${_}-${K}`));return M(Y,{...A,children:[E,G,g]})}if(q.kind==="array")return l(q,w);return Q(s,{name:_,control:k.control,render:({field:G,fieldState:z})=>{let K=z.error?[z.error]:[],S=z.invalid||void 0;if(q.kind==="text"){let V=q,C=J.Input;return M(Y,{...A,children:[E,Q(C,{id:$,"aria-invalid":S,placeholder:q.placeholderI18n,autoComplete:V.autoComplete,inputMode:V.inputMode,maxLength:V.maxLength,minLength:V.minLength,disabled:!Z,...G,...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}if(q.kind==="textarea"){let V=q,C=J.Textarea;return M(Y,{...A,children:[E,Q(C,{id:$,"aria-invalid":S,placeholder:q.placeholderI18n,rows:V.rows,maxLength:V.maxLength,disabled:!Z,...G,...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}if(q.kind==="select"){let V=q,C=J.Select,b=v(V.options),j=p(D,b,R.resolvers);return M(Y,{...A,children:[E,Q(C,{id:$,name:_,"aria-invalid":S,disabled:!Z,value:G.value,onChange:(m)=>G.onChange(m),options:j,...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}if(q.kind==="checkbox"){let V=J.Checkbox;return M(Y,{...A,children:[E,Q(V,{id:$,name:_,disabled:!Z,checked:!!G.value,onCheckedChange:(C)=>G.onChange(C),...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}if(q.kind==="radio"){let V=q,C=J.RadioGroup,b=v(V.options),j=p(D,b,R.resolvers);return M(Y,{...A,children:[E,Q(C,{id:$,name:_,disabled:!Z,value:G.value,onValueChange:(m)=>G.onChange(m),options:j,...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}if(q.kind==="switch"){let V=J.Switch;return M(Y,{...A,children:[E,Q(V,{id:$,name:_,disabled:!Z,checked:!!G.value,onCheckedChange:(C)=>G.onChange(C),...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}return Q(Jq,{})}},_)},l=(q,w)=>{let W=c(w,q.name),{fields:Y,append:y,remove:F}=r({control:k.control,name:W}),B=q.max==null||Y.length<q.max,_=(P)=>(q.min==null?Y.length>0:Y.length>q.min)&&P>=0,O=J.Button,Z=J.FieldLabel;return M("div",{children:[q.labelI18n?Q(Z,{children:q.labelI18n}):null,Y.map((P,$)=>M("div",{children:[I(q.of,W,$),_($)?Q(O,{type:"button",variant:"ghost",size:"sm",onClick:()=>F($),children:"Remove"}):null]},P.id??$)),B?Q(O,{type:"button",variant:"outline",size:"sm",onClick:()=>y({}),children:"Add"}):null]},W)},t=async(q)=>{let w=X.actions?.[0]?.key??"submit";if(R.onSubmitOverride)return R.onSubmitOverride(q,w)},f=J.Button;return M("form",{onSubmit:k.handleSubmit(t),children:[(X.fields||[]).map((q,w)=>Q(x.Fragment,{children:I(q)},w)),X.actions&&X.actions.length?Q("div",{children:X.actions.map((q)=>Q(f,{type:"submit",children:q.labelI18n},q.key))}):null]})}return{render:(L,X)=>Q(T,{spec:L,options:X,merged:{...H,...X?.overrides??{}}})}}export{$q as createFormRenderer};
|
|
2
|
+
var TB=import.meta.require;import{buildZodWithRelations as d,evalPredicate as m,isFieldReadOnly as t,normalizeFormSpec as i}from"@contractspec/lib.contracts-spec/forms";import{zodResolver as l}from"@hookform/resolvers/zod";import V from"react";import{Controller as A,useFieldArray as s,useForm as o}from"react-hook-form";import{jsx as U,jsxs as q,Fragment as wB}from"react/jsx-runtime";function F(B){if(!B)return;if(Array.isArray(B))return{kind:"static",options:[...B]};return B}function y(B,G){if(!G)return;let Y=G.replace(/\[(\d+)\]/g,".$1").split(".").filter(Boolean),H=B;for(let J of Y){if(H==null)return;H=H[J]}return H}function r(B){if(!B)return[];return B.split(".").filter((G)=>/^\d+$/.test(G)).map((G)=>Number(G))}function u(B,G){if(!G)return B??"";return B?`${B}.${G}`:G}function f(B,G){if(!G||G.length===0)return"[]";try{return JSON.stringify(G.map((Y)=>y(B,Y)))}catch{return"[]"}}function e(B,G){let[Y,H]=V.useState(B);return V.useEffect(()=>{let J=globalThis.setTimeout(()=>H(B),G);return()=>globalThis.clearTimeout(J)},[G,B]),Y}function j(B,G,Y){let[H,J]=V.useState([]),_=V.useMemo(()=>{if(!G)return"nil";if(G.kind==="static")return JSON.stringify(G.options??[]);return`${G.resolverKey}:${f(B,G.deps)}`},[G,B]);return V.useEffect(()=>{let $=!0;return(async()=>{if(!G){J([]);return}if(G.kind==="static"){J([...G.options??[]]);return}let w=Y?.[G.resolverKey];if(!w){J([]);return}let b=await w(B,G.args);if($)J([...b??[]])})(),()=>{$=!1}},[_,Y,G,B]),H}function n(B){if(B instanceof Date&&!Number.isNaN(B.getTime()))return B;if(typeof B==="string"||typeof B==="number"){let G=new Date(B);if(!Number.isNaN(G.getTime()))return G}return null}function p(B){if(B instanceof Date&&!Number.isNaN(B.getTime()))return B;if(typeof B!=="string"||B.trim().length===0)return null;let[G,Y]=B.split(":").map(($)=>Number($)),H=G??Number.NaN,J=Y??Number.NaN;if(Number.isNaN(H)||Number.isNaN(J))return null;let _=new Date;return _.setHours(H,J,0,0),_}function BB(B){if(!B)return"";return`${String(B.getHours()).padStart(2,"0")}:${String(B.getMinutes()).padStart(2,"0")}`}function a(B){return{value:B.value,labelI18n:B.labelI18n,descriptionI18n:B.descriptionI18n,...B.data??{}}}function GB(B,G,Y){let H=G.trim().toLowerCase();if(!H)return[...B];let J=H.split(/\s+/).filter(Boolean);return B.filter((_)=>{let $=a(_),L=[_.labelI18n,_.descriptionI18n,String(_.value),...Y.map((w)=>String(y($,w)??""))].join(" ").toLowerCase();return J.every((w)=>L.includes(w))})}function x(B,G){let Y=a(B);switch(G.mode){case"scalar":return G.valueKey?y(Y,G.valueKey)??B.value:B.value;case"pick":return Object.fromEntries(G.pickKeys.map((H)=>[H,y(Y,H)]));case"object":default:return B.data??Y}}function v(B,G){try{return JSON.stringify(B)===JSON.stringify(G)}catch{return B===G}}function HB(B,G,Y,H){let J=H&&Array.isArray(G)?G:[G];return B.filter((_)=>J.some(($)=>v(x(_,Y),$)))}function c(B){if(!B)return{countryCode:"",nationalNumber:""};let G=B.countryCode.trim(),Y=B.nationalNumber.replace(/\s+/g,""),H=G.replace(/^\+?/,"+"),J={...B,countryCode:G,nationalNumber:B.nationalNumber};if(B.e164!=null||G||Y)J.e164=`${H}${Y}`.trim();return J}function JB(B){let G=j(B.values,F(B.spec.options),B.resolvers),Y=B.driver.Field,H=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:J,fieldState:_})=>{let $=_.error?[_.error]:[];return q(Y,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.Select,{id:B.ctx.id,name:B.ctx.name,"aria-invalid":_.invalid||void 0,disabled:!B.ctx.enabled||B.ctx.readOnly,value:J.value,onChange:(L)=>{if(B.ctx.readOnly)return;J.onChange(L)},options:G,...B.spec.uiProps}),B.descNode,_.invalid?U(H,{errors:$}):null]})}})}function UB(B){let G=j(B.values,F(B.spec.options),B.resolvers),Y=B.driver.Field,H=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:J,fieldState:_})=>{let $=_.error?[_.error]:[];return q(Y,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.RadioGroup,{id:B.ctx.id,name:B.ctx.name,disabled:!B.ctx.enabled||B.ctx.readOnly,value:J.value,onValueChange:(L)=>{if(B.ctx.readOnly)return;J.onChange(L)},options:G,...B.spec.uiProps}),B.descNode,_.invalid?U(H,{errors:$}):null]})}})}function XB(B){let[G,Y]=V.useState(""),H=B.spec.source.kind==="resolver"?B.spec.source.debounceMs??200:0,J=e(G,H),[_,$]=V.useState([]),L=V.useMemo(()=>{return B.spec.source.kind==="resolver"?`${B.spec.source.resolverKey}:${f(B.values,B.spec.source.deps)}:${J}`:"local"},[J,B.spec.source,B.values]);V.useEffect(()=>{if(B.spec.source.kind!=="resolver")return;let Z=B.resolvers?.[B.spec.source.resolverKey],k=B.spec.source.minQueryLength??0;if(!Z||J.trim().length<k){$([]);return}let g=!0,D={...B.spec.source.args??{},query:J};return Promise.resolve(Z(B.values,D)).then((C)=>{if(g)$([...C??[]])}),()=>{g=!1}},[L,B.resolvers,B.spec.source,B.values,J]);let w=B.spec.source.kind==="local"?GB(B.spec.source.options,G,B.spec.source.searchKeys):_,b=B.driver.Field,X=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:Z,fieldState:k})=>{let g=k.error?[k.error]:[],D=HB(w,Z.value,B.spec.valueMapping,B.spec.multiple),C=(O)=>{if(B.ctx.readOnly)return;let W=x(O,B.spec.valueMapping);if(B.spec.multiple){let P=Array.isArray(Z.value)?Z.value:[],R=P.some((S)=>v(S,W));Z.onChange(R?P:[...P,W]);return}Z.onChange(W),Y(O.labelI18n)},T=(O)=>{if(B.ctx.readOnly||!B.spec.multiple)return;let W=x(O,B.spec.valueMapping),P=Array.isArray(Z.value)?Z.value:[];Z.onChange(P.filter((R)=>!v(R,W)))};return q(b,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.Autocomplete,{id:B.ctx.id,name:B.ctx.name,disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,"aria-invalid":k.invalid||void 0,placeholder:B.spec.placeholderI18n,multiple:B.spec.multiple,query:G,options:w,selectedOptions:D,onQueryChange:Y,onSelectOption:C,onRemoveOption:T}),B.descNode,k.invalid?U(X,{errors:g}):null]})}})}function YB(B){let G=j(B.values,F(B.spec.countryOptions),B.resolvers),Y=B.driver.Field,H=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:J,fieldState:_})=>{let $=_.error?[_.error]:[];return q(Y,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.AddressField,{id:B.ctx.id,name:B.ctx.name,value:J.value??null,onChange:(L)=>{if(B.ctx.readOnly)return;J.onChange(L)},disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,"aria-invalid":_.invalid||void 0,parts:B.spec.parts,countryOptions:G}),B.descNode,_.invalid?U(H,{errors:$}):null]})}})}function _B(B){let G=j(B.values,F(B.spec.countryOptions),B.resolvers),Y=B.driver.Field,H=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:J,fieldState:_})=>{let $=_.error?[_.error]:[];return q(Y,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.PhoneField,{id:B.ctx.id,name:B.ctx.name,value:c(J.value??null),onChange:(L)=>{if(B.ctx.readOnly)return;J.onChange(c(L))},disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,"aria-invalid":_.invalid||void 0,parts:B.spec.parts,countryOptions:G}),B.descNode,_.invalid?U(H,{errors:$}):null]})}})}function $B(B){let G=B.driver.Field,Y=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:H,fieldState:J})=>{let _=J.error?[J.error]:[];return q(G,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.DateField,{id:B.ctx.id,name:B.ctx.name,value:n(H.value),onChange:($)=>{if(B.ctx.readOnly)return;H.onChange($)},disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,placeholder:B.spec.placeholderI18n,minDate:B.spec.minDate,maxDate:B.spec.maxDate}),B.descNode,J.invalid?U(Y,{errors:_}):null]})}})}function IB(B){let G=B.driver.Field,Y=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:H,fieldState:J})=>{let _=J.error?[J.error]:[];return q(G,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.TimeField,{id:B.ctx.id,name:B.ctx.name,value:p(H.value),onChange:($)=>{if(B.ctx.readOnly)return;H.onChange(BB($))},disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,placeholder:B.spec.placeholderI18n,is24Hour:B.spec.is24Hour}),B.descNode,J.invalid?U(Y,{errors:_}):null]})}})}function LB(B){let G=B.driver.Field,Y=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:H,fieldState:J})=>{let _=J.error?[J.error]:[];return q(G,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.DateTimeField,{id:B.ctx.id,name:B.ctx.name,value:n(H.value),onChange:($)=>{if(B.ctx.readOnly)return;H.onChange($)},disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,datePlaceholder:B.spec.placeholderI18n,timePlaceholder:B.spec.placeholderI18n,minDate:B.spec.minDate,maxDate:B.spec.maxDate,is24Hour:B.spec.is24Hour}),B.descNode,J.invalid?U(Y,{errors:_}):null]})}})}function ZB(B){let G=u(B.parent,B.spec.name),{fields:Y,append:H,remove:J}=s({control:B.form.control,name:G}),_=B.spec.max==null||Y.length<B.spec.max,$=(L)=>(B.spec.min==null?Y.length>0:Y.length>B.spec.min)&&L>=0;return q("div",{children:[B.spec.labelI18n?U(B.driver.FieldLabel,{children:B.spec.labelI18n}):null,Y.map((L,w)=>q("div",{children:[B.renderField(B.spec.of,`${G}.${w}`),$(w)?U(B.driver.Button,{type:"button",variant:"ghost",size:"sm",onClick:()=>J(w),children:"Remove"}):null]},L.id??w)),_?U(B.driver.Button,{type:"button",variant:"outline",size:"sm",onClick:()=>H({}),children:"Add"}):null]},G)}function kB(B){let G=B;function Y(H){let J=V.useMemo(()=>i(H.spec),[H.spec]),_=V.useMemo(()=>d(J),[J]),$=o({...H.merged.formOptions,resolver:l(_),defaultValues:H.options?.defaultValues}),L=$.watch(),w=(X,Z)=>{let k=H.merged.driver.Field,g=H.merged.driver.FieldLabel,D=H.merged.driver.FieldDescription,C=H.merged.driver.FieldError,T=u(Z,X.name),O=r(Z),W=m(L,X.visibleWhen,O),P=m(L,X.enabledWhen,O),R=t(X),S=Boolean($.getFieldState(T)?.invalid);if(!W)return null;let I={name:T,id:T.replace(/\./g,"-"),enabled:P,readOnly:R,visible:W},M={"data-invalid":S,hidden:!W,disabled:!P||R},K=X.labelI18n?U(g,{htmlFor:I.id,children:X.labelI18n}):null,Q=X.descriptionI18n?U(D,{children:X.descriptionI18n}):null;if(X.kind==="group")return q(k,{...M,children:[K,X.fields.map((N,z)=>U(V.Fragment,{children:w(N,T)},`${T}-${z}`)),Q]});if(X.kind==="array")return U(ZB,{driver:H.merged.driver,form:$,spec:X,parent:Z,renderField:w},T);if(X.kind==="select")return U(JB,{driver:H.merged.driver,form:$,values:L,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M,resolvers:H.merged.resolvers},T);if(X.kind==="radio")return U(UB,{driver:H.merged.driver,form:$,values:L,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M,resolvers:H.merged.resolvers},T);if(X.kind==="autocomplete")return U(XB,{driver:H.merged.driver,form:$,values:L,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M,resolvers:H.merged.resolvers},T);if(X.kind==="address")return U(YB,{driver:H.merged.driver,form:$,values:L,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M,resolvers:H.merged.resolvers},T);if(X.kind==="phone")return U(_B,{driver:H.merged.driver,form:$,values:L,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M,resolvers:H.merged.resolvers},T);if(X.kind==="date")return U($B,{driver:H.merged.driver,form:$,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M},T);if(X.kind==="time")return U(IB,{driver:H.merged.driver,form:$,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M},T);if(X.kind==="datetime")return U(LB,{driver:H.merged.driver,form:$,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M},T);return U(A,{name:T,control:$.control,render:({field:N,fieldState:z})=>{let h=z.error?[z.error]:[];if(X.kind==="text"){let E=X;return q(k,{...M,children:[K,U(H.merged.driver.Input,{id:I.id,"aria-invalid":z.invalid||void 0,placeholder:X.placeholderI18n,autoComplete:E.autoComplete,inputMode:E.inputMode,maxLength:E.maxLength,minLength:E.minLength,disabled:!I.enabled,readOnly:I.readOnly,...N,...X.uiProps}),Q,z.invalid?U(C,{errors:h}):null]})}if(X.kind==="textarea"){let E=X;return q(k,{...M,children:[K,U(H.merged.driver.Textarea,{id:I.id,"aria-invalid":z.invalid||void 0,placeholder:X.placeholderI18n,rows:E.rows,maxLength:E.maxLength,disabled:!I.enabled,readOnly:I.readOnly,...N,...X.uiProps}),Q,z.invalid?U(C,{errors:h}):null]})}if(X.kind==="checkbox")return q(k,{...M,children:[K,U(H.merged.driver.Checkbox,{id:I.id,name:I.name,disabled:!I.enabled||I.readOnly,checked:Boolean(N.value),onCheckedChange:(E)=>{if(I.readOnly)return;N.onChange(E)},...X.uiProps}),Q,z.invalid?U(C,{errors:h}):null]});if(X.kind==="switch")return q(k,{...M,children:[K,U(H.merged.driver.Switch,{id:I.id,name:I.name,disabled:!I.enabled||I.readOnly,checked:Boolean(N.value),onCheckedChange:(E)=>{if(I.readOnly)return;N.onChange(E)},...X.uiProps}),Q,z.invalid?U(C,{errors:h}):null]});return U(wB,{})}},T)},b=async(X)=>{let Z=J.actions?.[0]?.key??"submit";if(H.merged.onSubmitOverride)return H.merged.onSubmitOverride(X,Z)};return q("form",{onSubmit:$.handleSubmit(b),children:[J.fields.map((X,Z)=>U(V.Fragment,{children:w(X)},Z)),J.actions?.length?U("div",{children:J.actions.map((X)=>U(H.merged.driver.Button,{type:"submit",children:X.labelI18n},X.key))}):null]})}return{render:(H,J)=>U(Y,{spec:H,options:J,merged:{...G,...J?.overrides??{}}})}}export{x as mapAutocompleteValue,GB as filterAutocompleteOptions,kB as createFormRenderer};
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var s=import.meta.require;function Lq(J){return J}function Zq(J){return J}import{createDefaultTransformEngine as x,htmlToMarkdown as r,registerBasicValidation as u}from"@contractspec/lib.presentation-runtime-core/transform-engine";import e from"react";export*from"@contractspec/lib.presentation-runtime-core/transform-engine";function m(J){return J.register({target:"react",async render(q){if(q.source.type==="component"){let Q=q.source.props?q.source.props.getZod().safeParse({}).success?{}:void 0:void 0;return{kind:"react_component",componentKey:q.source.componentKey,props:Q}}return{kind:"blocknotejs",docJson:q.source.docJson,blockConfig:q.source.blockConfig}}}),J}function wq(J,q){return J.prependRegister({target:"markdown",async render(Q){if(Q.source.type!=="component")throw Error("React-to-markdown renderer only handles component presentations");let X=q[Q.source.componentKey];if(!X)throw Error(`Component ${Q.source.componentKey} not found in componentMap`);let{renderToStaticMarkup:Y}=await import("react-dom/server"),_=e.createElement(X,Q.source.props?{}:void 0),T=r(Y(_));return{mimeType:"text/markdown",body:Q.policy?.pii?.length?T.replace(/\[REDACTED\]/g,"[REDACTED]"):T}}}),J}import p from"react";function Dq(){return u(m(x()))}async function Wq(J,q,Q,X){if(q==="react"){let Y=await J.render("react",Q);if(Y.kind==="react_component"){let T=(X?.componentMap??{})[Y.componentKey];if(!T)return null;let A={...Y.props??{},...X?.reactProps??{}};return p.createElement(T,A)}if(Y.kind==="blocknotejs"){if(X?.renderBlockNote)return X.renderBlockNote(Y.docJson,Y.blockConfig);return p.createElement("div",{},"[BlockNote renderer not configured]")}return null}if(q==="markdown")return J.render(q,Q);if(q==="application/json")return J.render(q,Q);if(q==="application/xml")return J.render(q,Q);return null}function Eq(J,q){return{meta:J,...q}}function Oq(J,q){return J.register(q),J}import{buildZodWithRelations as qq,evalPredicate as l}from"@contractspec/lib.contracts-spec/forms";import{zodResolver as Hq}from"@hookform/resolvers/zod";import f,{useEffect as Jq,useMemo as i,useState as Qq}from"react";import{Controller as Uq,useFieldArray as Xq,useForm as Yq}from"react-hook-form";import{jsx as U,jsxs as B,Fragment as Gq}from"react/jsx-runtime";function c(J){if(!J)return;if(Array.isArray(J))return{kind:"static",options:J};return J}function _q(J,q){if(!q)return;let Q=q.replace(/\[(\d+)\]/g,".$1").split(".").filter(Boolean),X=J;for(let Y of Q){if(X==null)return;X=X[Y]}return X}function $q(J,q){if(!q||q.length===0)return"[]";try{return JSON.stringify(q.map((Q)=>_q(J,Q)))}catch{return"[]"}}function o(J,q,Q){let[X,Y]=Qq([]),_=i(()=>{if(!q)return"nil";if(q.kind==="static")return JSON.stringify(q.options??[]);return $q(J,q.deps)},[q,J]);return Jq(()=>{let T=!0;return(async()=>{if(!q)return Y([]);if(q.kind==="static")return Y([...q.options??[]]);let N=Q?.[q.resolverKey];if(!N)return Y([]);let k=await N(J,q.args);if(T)Y([...k??[]])})(),()=>{T=!1}},[_,q&&q.kind==="resolver"?q.resolverKey:void 0]),X}function n(J,q,Q){if(!q)return J??"";let X=typeof Q==="number"?`${q.replace(/^\$index$/,String(Q))}`:q;return J?`${J}${typeof Q==="number"?`.${Q}`:""}.${X}`.replace(/\.+/g,"."):X}function Iq(J){let q=J,{driver:Q}=q;function X(Y){let{spec:_,options:T,merged:A}=Y,N=i(()=>qq(_),[_]),k=Yq({...A.formOptions,resolver:Hq(N),defaultValues:T?.defaultValues}),y=k.watch(),S=(H,C,O)=>{let{Field:G,FieldLabel:I,FieldDescription:F,FieldError:M}=Q,z=n(C,H.name,O),P=l(y,H.visibleWhen),w=l(y,H.enabledWhen),h=Boolean(k.getFieldState(z)?.invalid);if(!P)return null;let L=z?.replace(/\./g,"-"),D={"data-invalid":h,hidden:!P,disabled:!w},W=H.labelI18n?U(I,{htmlFor:L,children:H.labelI18n}):null,E=H.descriptionI18n?U(F,{children:H.descriptionI18n}):null;if(H.kind==="group"){let V=H.fields.map((Z,R)=>U(f.Fragment,{children:S(Z,z,O)},`${z}-${R}`));return B(G,{...D,children:[W,V,E]})}if(H.kind==="array")return t(H,C);return U(Uq,{name:z,control:k.control,render:({field:V,fieldState:Z})=>{let R=Z.error?[Z.error]:[],b=Z.invalid||void 0;if(H.kind==="text"){let $=H,K=Q.Input;return B(G,{...D,children:[W,U(K,{id:L,"aria-invalid":b,placeholder:H.placeholderI18n,autoComplete:$.autoComplete,inputMode:$.inputMode,maxLength:$.maxLength,minLength:$.minLength,disabled:!w,...V,...H.uiProps}),E,Z.invalid?U(M,{errors:R}):null]})}if(H.kind==="textarea"){let $=H,K=Q.Textarea;return B(G,{...D,children:[W,U(K,{id:L,"aria-invalid":b,placeholder:H.placeholderI18n,rows:$.rows,maxLength:$.maxLength,disabled:!w,...V,...H.uiProps}),E,Z.invalid?U(M,{errors:R}):null]})}if(H.kind==="select"){let $=H,K=Q.Select,j=c($.options),g=o(y,j,A.resolvers);return B(G,{...D,children:[W,U(K,{id:L,name:z,"aria-invalid":b,disabled:!w,value:V.value,onChange:(v)=>V.onChange(v),options:g,...H.uiProps}),E,Z.invalid?U(M,{errors:R}):null]})}if(H.kind==="checkbox"){let $=Q.Checkbox;return B(G,{...D,children:[W,U($,{id:L,name:z,disabled:!w,checked:!!V.value,onCheckedChange:(K)=>V.onChange(K),...H.uiProps}),E,Z.invalid?U(M,{errors:R}):null]})}if(H.kind==="radio"){let $=H,K=Q.RadioGroup,j=c($.options),g=o(y,j,A.resolvers);return B(G,{...D,children:[W,U(K,{id:L,name:z,disabled:!w,value:V.value,onValueChange:(v)=>V.onChange(v),options:g,...H.uiProps}),E,Z.invalid?U(M,{errors:R}):null]})}if(H.kind==="switch"){let $=Q.Switch;return B(G,{...D,children:[W,U($,{id:L,name:z,disabled:!w,checked:!!V.value,onCheckedChange:(K)=>V.onChange(K),...H.uiProps}),E,Z.invalid?U(M,{errors:R}):null]})}return U(Gq,{})}},z)},t=(H,C)=>{let O=n(C,H.name),{fields:G,append:I,remove:F}=Xq({control:k.control,name:O}),M=H.max==null||G.length<H.max,z=(h)=>(H.min==null?G.length>0:G.length>H.min)&&h>=0,P=Q.Button,w=Q.FieldLabel;return B("div",{children:[H.labelI18n?U(w,{children:H.labelI18n}):null,G.map((h,L)=>B("div",{children:[S(H.of,O,L),z(L)?U(P,{type:"button",variant:"ghost",size:"sm",onClick:()=>F(L),children:"Remove"}):null]},h.id??L)),M?U(P,{type:"button",variant:"outline",size:"sm",onClick:()=>I({}),children:"Add"}):null]},O)},d=async(H)=>{let C=_.actions?.[0]?.key??"submit";if(A.onSubmitOverride)return A.onSubmitOverride(H,C)},a=Q.Button;return B("form",{onSubmit:k.handleSubmit(d),children:[(_.fields||[]).map((H,C)=>U(f.Fragment,{children:S(H)},C)),_.actions&&_.actions.length?U("div",{children:_.actions.map((H)=>U(a,{type:"submit",children:H.labelI18n},H.key))}):null]})}return{render:(Y,_)=>U(X,{spec:Y,options:_,merged:{...q,..._?.overrides??{}}})}}export{Zq as shadcnDriver,Lq as rnReusablesDriver,Wq as renderFeaturePresentation,Oq as registerFeature,Iq as createFormRenderer,Eq as createFeatureModule,Dq as createEngineWithDefaults};
|
|
2
|
+
var s=import.meta.require;function WG(G){return G}function AG(G){return G}import{createDefaultTransformEngine as m,htmlToMarkdown as o,registerBasicValidation as u}from"@contractspec/lib.presentation-runtime-core/transform-engine";import r from"react";export*from"@contractspec/lib.presentation-runtime-core/transform-engine";function c(G){return G.register({target:"react",async render(H){if(H.source.type==="component"){let X=H.source.props?H.source.props.getZod().safeParse({}).success?{}:void 0:void 0;return{kind:"react_component",componentKey:H.source.componentKey,props:X}}return{kind:"blocknotejs",docJson:H.source.docJson,blockConfig:H.source.blockConfig}}}),G}function DG(G,H){return G.prependRegister({target:"markdown",async render(X){if(X.source.type!=="component")throw Error("React-to-markdown renderer only handles component presentations");let J=H[X.source.componentKey];if(!J)throw Error(`Component ${X.source.componentKey} not found in componentMap`);let{renderToStaticMarkup:U}=await import("react-dom/server"),B=r.createElement(J,X.source.props?{}:void 0),$=o(U(B));return{mimeType:"text/markdown",body:X.policy?.pii?.length?$.replace(/\[REDACTED\]/g,"[REDACTED]"):$}}}),G}import f from"react";function FG(){return u(c(m()))}async function jG(G,H,X,J){if(H==="react"){let U=await G.render("react",X);if(U.kind==="react_component"){let $=(J?.componentMap??{})[U.componentKey];if(!$)return null;let I={...U.props??{},...J?.reactProps??{}};return f.createElement($,I)}if(U.kind==="blocknotejs"){if(J?.renderBlockNote)return J.renderBlockNote(U.docJson,U.blockConfig);return f.createElement("div",{},"[BlockNote renderer not configured]")}return null}if(H==="markdown")return G.render(H,X);if(H==="application/json")return G.render(H,X);if(H==="application/xml")return G.render(H,X);return null}function gG(G,H){return{meta:G,...H}}function SG(G,H){return G.register(H),G}import{buildZodWithRelations as p,evalPredicate as n,isFieldReadOnly as e,normalizeFormSpec as GG}from"@contractspec/lib.contracts-spec/forms";import{zodResolver as HG}from"@hookform/resolvers/zod";import V from"react";import{Controller as A,useFieldArray as JG,useForm as UG}from"react-hook-form";import{jsx as Y,jsxs as w,Fragment as zG}from"react/jsx-runtime";function j(G){if(!G)return;if(Array.isArray(G))return{kind:"static",options:[...G]};return G}function F(G,H){if(!H)return;let X=H.replace(/\[(\d+)\]/g,".$1").split(".").filter(Boolean),J=G;for(let U of X){if(J==null)return;J=J[U]}return J}function XG(G){if(!G)return[];return G.split(".").filter((H)=>/^\d+$/.test(H)).map((H)=>Number(H))}function d(G,H){if(!H)return G??"";return G?`${G}.${H}`:H}function l(G,H){if(!H||H.length===0)return"[]";try{return JSON.stringify(H.map((X)=>F(G,X)))}catch{return"[]"}}function YG(G,H){let[X,J]=V.useState(G);return V.useEffect(()=>{let U=globalThis.setTimeout(()=>J(G),H);return()=>globalThis.clearTimeout(U)},[H,G]),X}function g(G,H,X){let[J,U]=V.useState([]),B=V.useMemo(()=>{if(!H)return"nil";if(H.kind==="static")return JSON.stringify(H.options??[]);return`${H.resolverKey}:${l(G,H.deps)}`},[H,G]);return V.useEffect(()=>{let $=!0;return(async()=>{if(!H){U([]);return}if(H.kind==="static"){U([...H.options??[]]);return}let q=X?.[H.resolverKey];if(!q){U([]);return}let b=await q(G,H.args);if($)U([...b??[]])})(),()=>{$=!1}},[B,X,H,G]),J}function i(G){if(G instanceof Date&&!Number.isNaN(G.getTime()))return G;if(typeof G==="string"||typeof G==="number"){let H=new Date(G);if(!Number.isNaN(H.getTime()))return H}return null}function _G(G){if(G instanceof Date&&!Number.isNaN(G.getTime()))return G;if(typeof G!=="string"||G.trim().length===0)return null;let[H,X]=G.split(":").map(($)=>Number($)),J=H??Number.NaN,U=X??Number.NaN;if(Number.isNaN(J)||Number.isNaN(U))return null;let B=new Date;return B.setHours(J,U,0,0),B}function $G(G){if(!G)return"";return`${String(G.getHours()).padStart(2,"0")}:${String(G.getMinutes()).padStart(2,"0")}`}function t(G){return{value:G.value,labelI18n:G.labelI18n,descriptionI18n:G.descriptionI18n,...G.data??{}}}function BG(G,H,X){let J=H.trim().toLowerCase();if(!J)return[...G];let U=J.split(/\s+/).filter(Boolean);return G.filter((B)=>{let $=t(B),I=[B.labelI18n,B.descriptionI18n,String(B.value),...X.map((q)=>String(F($,q)??""))].join(" ").toLowerCase();return U.every((q)=>I.includes(q))})}function x(G,H){let X=t(G);switch(H.mode){case"scalar":return H.valueKey?F(X,H.valueKey)??G.value:G.value;case"pick":return Object.fromEntries(H.pickKeys.map((J)=>[J,F(X,J)]));case"object":default:return G.data??X}}function v(G,H){try{return JSON.stringify(G)===JSON.stringify(H)}catch{return G===H}}function IG(G,H,X,J){let U=J&&Array.isArray(H)?H:[H];return G.filter((B)=>U.some(($)=>v(x(B,X),$)))}function a(G){if(!G)return{countryCode:"",nationalNumber:""};let H=G.countryCode.trim(),X=G.nationalNumber.replace(/\s+/g,""),J=H.replace(/^\+?/,"+"),U={...G,countryCode:H,nationalNumber:G.nationalNumber};if(G.e164!=null||H||X)U.e164=`${J}${X}`.trim();return U}function LG(G){let H=g(G.values,j(G.spec.options),G.resolvers),X=G.driver.Field,J=G.driver.FieldError;return Y(A,{name:G.ctx.name,control:G.form.control,render:({field:U,fieldState:B})=>{let $=B.error?[B.error]:[];return w(X,{...G.commonWrapProps,children:[G.labelNode,Y(G.driver.Select,{id:G.ctx.id,name:G.ctx.name,"aria-invalid":B.invalid||void 0,disabled:!G.ctx.enabled||G.ctx.readOnly,value:U.value,onChange:(I)=>{if(G.ctx.readOnly)return;U.onChange(I)},options:H,...G.spec.uiProps}),G.descNode,B.invalid?Y(J,{errors:$}):null]})}})}function ZG(G){let H=g(G.values,j(G.spec.options),G.resolvers),X=G.driver.Field,J=G.driver.FieldError;return Y(A,{name:G.ctx.name,control:G.form.control,render:({field:U,fieldState:B})=>{let $=B.error?[B.error]:[];return w(X,{...G.commonWrapProps,children:[G.labelNode,Y(G.driver.RadioGroup,{id:G.ctx.id,name:G.ctx.name,disabled:!G.ctx.enabled||G.ctx.readOnly,value:U.value,onValueChange:(I)=>{if(G.ctx.readOnly)return;U.onChange(I)},options:H,...G.spec.uiProps}),G.descNode,B.invalid?Y(J,{errors:$}):null]})}})}function qG(G){let[H,X]=V.useState(""),J=G.spec.source.kind==="resolver"?G.spec.source.debounceMs??200:0,U=YG(H,J),[B,$]=V.useState([]),I=V.useMemo(()=>{return G.spec.source.kind==="resolver"?`${G.spec.source.resolverKey}:${l(G.values,G.spec.source.deps)}:${U}`:"local"},[U,G.spec.source,G.values]);V.useEffect(()=>{if(G.spec.source.kind!=="resolver")return;let Z=G.resolvers?.[G.spec.source.resolverKey],z=G.spec.source.minQueryLength??0;if(!Z||U.trim().length<z){$([]);return}let O=!0,y={...G.spec.source.args??{},query:U};return Promise.resolve(Z(G.values,y)).then((C)=>{if(O)$([...C??[]])}),()=>{O=!1}},[I,G.resolvers,G.spec.source,G.values,U]);let q=G.spec.source.kind==="local"?BG(G.spec.source.options,H,G.spec.source.searchKeys):B,b=G.driver.Field,_=G.driver.FieldError;return Y(A,{name:G.ctx.name,control:G.form.control,render:({field:Z,fieldState:z})=>{let O=z.error?[z.error]:[],y=IG(q,Z.value,G.spec.valueMapping,G.spec.multiple),C=(D)=>{if(G.ctx.readOnly)return;let k=x(D,G.spec.valueMapping);if(G.spec.multiple){let P=Array.isArray(Z.value)?Z.value:[],R=P.some((S)=>v(S,k));Z.onChange(R?P:[...P,k]);return}Z.onChange(k),X(D.labelI18n)},T=(D)=>{if(G.ctx.readOnly||!G.spec.multiple)return;let k=x(D,G.spec.valueMapping),P=Array.isArray(Z.value)?Z.value:[];Z.onChange(P.filter((R)=>!v(R,k)))};return w(b,{...G.commonWrapProps,children:[G.labelNode,Y(G.driver.Autocomplete,{id:G.ctx.id,name:G.ctx.name,disabled:!G.ctx.enabled,readOnly:G.ctx.readOnly,"aria-invalid":z.invalid||void 0,placeholder:G.spec.placeholderI18n,multiple:G.spec.multiple,query:H,options:q,selectedOptions:y,onQueryChange:X,onSelectOption:C,onRemoveOption:T}),G.descNode,z.invalid?Y(_,{errors:O}):null]})}})}function TG(G){let H=g(G.values,j(G.spec.countryOptions),G.resolvers),X=G.driver.Field,J=G.driver.FieldError;return Y(A,{name:G.ctx.name,control:G.form.control,render:({field:U,fieldState:B})=>{let $=B.error?[B.error]:[];return w(X,{...G.commonWrapProps,children:[G.labelNode,Y(G.driver.AddressField,{id:G.ctx.id,name:G.ctx.name,value:U.value??null,onChange:(I)=>{if(G.ctx.readOnly)return;U.onChange(I)},disabled:!G.ctx.enabled,readOnly:G.ctx.readOnly,"aria-invalid":B.invalid||void 0,parts:G.spec.parts,countryOptions:H}),G.descNode,B.invalid?Y(J,{errors:$}):null]})}})}function wG(G){let H=g(G.values,j(G.spec.countryOptions),G.resolvers),X=G.driver.Field,J=G.driver.FieldError;return Y(A,{name:G.ctx.name,control:G.form.control,render:({field:U,fieldState:B})=>{let $=B.error?[B.error]:[];return w(X,{...G.commonWrapProps,children:[G.labelNode,Y(G.driver.PhoneField,{id:G.ctx.id,name:G.ctx.name,value:a(U.value??null),onChange:(I)=>{if(G.ctx.readOnly)return;U.onChange(a(I))},disabled:!G.ctx.enabled,readOnly:G.ctx.readOnly,"aria-invalid":B.invalid||void 0,parts:G.spec.parts,countryOptions:H}),G.descNode,B.invalid?Y(J,{errors:$}):null]})}})}function KG(G){let H=G.driver.Field,X=G.driver.FieldError;return Y(A,{name:G.ctx.name,control:G.form.control,render:({field:J,fieldState:U})=>{let B=U.error?[U.error]:[];return w(H,{...G.commonWrapProps,children:[G.labelNode,Y(G.driver.DateField,{id:G.ctx.id,name:G.ctx.name,value:i(J.value),onChange:($)=>{if(G.ctx.readOnly)return;J.onChange($)},disabled:!G.ctx.enabled,readOnly:G.ctx.readOnly,placeholder:G.spec.placeholderI18n,minDate:G.spec.minDate,maxDate:G.spec.maxDate}),G.descNode,U.invalid?Y(X,{errors:B}):null]})}})}function QG(G){let H=G.driver.Field,X=G.driver.FieldError;return Y(A,{name:G.ctx.name,control:G.form.control,render:({field:J,fieldState:U})=>{let B=U.error?[U.error]:[];return w(H,{...G.commonWrapProps,children:[G.labelNode,Y(G.driver.TimeField,{id:G.ctx.id,name:G.ctx.name,value:_G(J.value),onChange:($)=>{if(G.ctx.readOnly)return;J.onChange($G($))},disabled:!G.ctx.enabled,readOnly:G.ctx.readOnly,placeholder:G.spec.placeholderI18n,is24Hour:G.spec.is24Hour}),G.descNode,U.invalid?Y(X,{errors:B}):null]})}})}function MG(G){let H=G.driver.Field,X=G.driver.FieldError;return Y(A,{name:G.ctx.name,control:G.form.control,render:({field:J,fieldState:U})=>{let B=U.error?[U.error]:[];return w(H,{...G.commonWrapProps,children:[G.labelNode,Y(G.driver.DateTimeField,{id:G.ctx.id,name:G.ctx.name,value:i(J.value),onChange:($)=>{if(G.ctx.readOnly)return;J.onChange($)},disabled:!G.ctx.enabled,readOnly:G.ctx.readOnly,datePlaceholder:G.spec.placeholderI18n,timePlaceholder:G.spec.placeholderI18n,minDate:G.spec.minDate,maxDate:G.spec.maxDate,is24Hour:G.spec.is24Hour}),G.descNode,U.invalid?Y(X,{errors:B}):null]})}})}function VG(G){let H=d(G.parent,G.spec.name),{fields:X,append:J,remove:U}=JG({control:G.form.control,name:H}),B=G.spec.max==null||X.length<G.spec.max,$=(I)=>(G.spec.min==null?X.length>0:X.length>G.spec.min)&&I>=0;return w("div",{children:[G.spec.labelI18n?Y(G.driver.FieldLabel,{children:G.spec.labelI18n}):null,X.map((I,q)=>w("div",{children:[G.renderField(G.spec.of,`${H}.${q}`),$(q)?Y(G.driver.Button,{type:"button",variant:"ghost",size:"sm",onClick:()=>U(q),children:"Remove"}):null]},I.id??q)),B?Y(G.driver.Button,{type:"button",variant:"outline",size:"sm",onClick:()=>J({}),children:"Add"}):null]},H)}function fG(G){let H=G;function X(J){let U=V.useMemo(()=>GG(J.spec),[J.spec]),B=V.useMemo(()=>p(U),[U]),$=UG({...J.merged.formOptions,resolver:HG(B),defaultValues:J.options?.defaultValues}),I=$.watch(),q=(_,Z)=>{let z=J.merged.driver.Field,O=J.merged.driver.FieldLabel,y=J.merged.driver.FieldDescription,C=J.merged.driver.FieldError,T=d(Z,_.name),D=XG(Z),k=n(I,_.visibleWhen,D),P=n(I,_.enabledWhen,D),R=e(_),S=Boolean($.getFieldState(T)?.invalid);if(!k)return null;let L={name:T,id:T.replace(/\./g,"-"),enabled:P,readOnly:R,visible:k},K={"data-invalid":S,hidden:!k,disabled:!P||R},Q=_.labelI18n?Y(O,{htmlFor:L.id,children:_.labelI18n}):null,M=_.descriptionI18n?Y(y,{children:_.descriptionI18n}):null;if(_.kind==="group")return w(z,{...K,children:[Q,_.fields.map((N,W)=>Y(V.Fragment,{children:q(N,T)},`${T}-${W}`)),M]});if(_.kind==="array")return Y(VG,{driver:J.merged.driver,form:$,spec:_,parent:Z,renderField:q},T);if(_.kind==="select")return Y(LG,{driver:J.merged.driver,form:$,values:I,spec:_,ctx:L,labelNode:Q,descNode:M,commonWrapProps:K,resolvers:J.merged.resolvers},T);if(_.kind==="radio")return Y(ZG,{driver:J.merged.driver,form:$,values:I,spec:_,ctx:L,labelNode:Q,descNode:M,commonWrapProps:K,resolvers:J.merged.resolvers},T);if(_.kind==="autocomplete")return Y(qG,{driver:J.merged.driver,form:$,values:I,spec:_,ctx:L,labelNode:Q,descNode:M,commonWrapProps:K,resolvers:J.merged.resolvers},T);if(_.kind==="address")return Y(TG,{driver:J.merged.driver,form:$,values:I,spec:_,ctx:L,labelNode:Q,descNode:M,commonWrapProps:K,resolvers:J.merged.resolvers},T);if(_.kind==="phone")return Y(wG,{driver:J.merged.driver,form:$,values:I,spec:_,ctx:L,labelNode:Q,descNode:M,commonWrapProps:K,resolvers:J.merged.resolvers},T);if(_.kind==="date")return Y(KG,{driver:J.merged.driver,form:$,spec:_,ctx:L,labelNode:Q,descNode:M,commonWrapProps:K},T);if(_.kind==="time")return Y(QG,{driver:J.merged.driver,form:$,spec:_,ctx:L,labelNode:Q,descNode:M,commonWrapProps:K},T);if(_.kind==="datetime")return Y(MG,{driver:J.merged.driver,form:$,spec:_,ctx:L,labelNode:Q,descNode:M,commonWrapProps:K},T);return Y(A,{name:T,control:$.control,render:({field:N,fieldState:W})=>{let h=W.error?[W.error]:[];if(_.kind==="text"){let E=_;return w(z,{...K,children:[Q,Y(J.merged.driver.Input,{id:L.id,"aria-invalid":W.invalid||void 0,placeholder:_.placeholderI18n,autoComplete:E.autoComplete,inputMode:E.inputMode,maxLength:E.maxLength,minLength:E.minLength,disabled:!L.enabled,readOnly:L.readOnly,...N,..._.uiProps}),M,W.invalid?Y(C,{errors:h}):null]})}if(_.kind==="textarea"){let E=_;return w(z,{...K,children:[Q,Y(J.merged.driver.Textarea,{id:L.id,"aria-invalid":W.invalid||void 0,placeholder:_.placeholderI18n,rows:E.rows,maxLength:E.maxLength,disabled:!L.enabled,readOnly:L.readOnly,...N,..._.uiProps}),M,W.invalid?Y(C,{errors:h}):null]})}if(_.kind==="checkbox")return w(z,{...K,children:[Q,Y(J.merged.driver.Checkbox,{id:L.id,name:L.name,disabled:!L.enabled||L.readOnly,checked:Boolean(N.value),onCheckedChange:(E)=>{if(L.readOnly)return;N.onChange(E)},..._.uiProps}),M,W.invalid?Y(C,{errors:h}):null]});if(_.kind==="switch")return w(z,{...K,children:[Q,Y(J.merged.driver.Switch,{id:L.id,name:L.name,disabled:!L.enabled||L.readOnly,checked:Boolean(N.value),onCheckedChange:(E)=>{if(L.readOnly)return;N.onChange(E)},..._.uiProps}),M,W.invalid?Y(C,{errors:h}):null]});return Y(zG,{})}},T)},b=async(_)=>{let Z=U.actions?.[0]?.key??"submit";if(J.merged.onSubmitOverride)return J.merged.onSubmitOverride(_,Z)};return w("form",{onSubmit:$.handleSubmit(b),children:[U.fields.map((_,Z)=>Y(V.Fragment,{children:q(_)},Z)),U.actions?.length?Y("div",{children:U.actions.map((_)=>Y(J.merged.driver.Button,{type:"submit",children:_.labelI18n},_.key))}):null]})}return{render:(J,U)=>Y(X,{spec:J,options:U,merged:{...H,...U?.overrides??{}}})}}export{AG as shadcnDriver,WG as rnReusablesDriver,jG as renderFeaturePresentation,SG as registerFeature,x as mapAutocompleteValue,BG as filterAutocompleteOptions,fG as createFormRenderer,gG as createFeatureModule,FG as createEngineWithDefaults};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createRequire as o}from"node:module";var Vq=o(import.meta.url);import{buildZodWithRelations as i,evalPredicate as u}from"@contractspec/lib.contracts-spec/forms";import{zodResolver as a}from"@hookform/resolvers/zod";import x,{useEffect as d,useMemo as n,useState as s}from"react";import{Controller as r,useFieldArray as e,useForm as qq}from"react-hook-form";import{jsx as Q,jsxs as M,Fragment as Qq}from"react/jsx-runtime";function v(U){if(!U)return;if(Array.isArray(U))return{kind:"static",options:U};return U}function Hq(U,H){if(!H)return;let J=H.replace(/\[(\d+)\]/g,".$1").split(".").filter(Boolean),T=U;for(let L of J){if(T==null)return;T=T[L]}return T}function Jq(U,H){if(!H||H.length===0)return"[]";try{return JSON.stringify(H.map((J)=>Hq(U,J)))}catch{return"[]"}}function p(U,H,J){let[T,L]=s([]),X=n(()=>{if(!H)return"nil";if(H.kind==="static")return JSON.stringify(H.options??[]);return Jq(U,H.deps)},[H,U]);return d(()=>{let N=!0;return(async()=>{if(!H)return L([]);if(H.kind==="static")return L([...H.options??[]]);let h=J?.[H.resolverKey];if(!h)return L([]);let k=await h(U,H.args);if(N)L([...k??[]])})(),()=>{N=!1}},[X,H&&H.kind==="resolver"?H.resolverKey:void 0]),T}function c(U,H,J){if(!H)return U??"";let T=typeof J==="number"?`${H.replace(/^\$index$/,String(J))}`:H;return U?`${U}${typeof J==="number"?`.${J}`:""}.${T}`.replace(/\.+/g,"."):T}function Tq(U){let H=U,{driver:J}=H;function T(L){let{spec:X,options:N,merged:R}=L,h=n(()=>i(X),[X]),k=qq({...R.formOptions,resolver:a(h),defaultValues:N?.defaultValues}),D=k.watch(),I=(q,w,W)=>{let{Field:Y,FieldLabel:y,FieldDescription:F,FieldError:B}=J,_=c(w,q.name,W),O=u(D,q.visibleWhen),Z=u(D,q.enabledWhen),P=Boolean(k.getFieldState(_)?.invalid);if(!O)return null;let $=_?.replace(/\./g,"-"),A={"data-invalid":P,hidden:!O,disabled:!Z},E=q.labelI18n?Q(y,{htmlFor:$,children:q.labelI18n}):null,g=q.descriptionI18n?Q(F,{children:q.descriptionI18n}):null;if(q.kind==="group"){let G=q.fields.map((z,K)=>Q(x.Fragment,{children:I(z,_,W)},`${_}-${K}`));return M(Y,{...A,children:[E,G,g]})}if(q.kind==="array")return l(q,w);return Q(r,{name:_,control:k.control,render:({field:G,fieldState:z})=>{let K=z.error?[z.error]:[],S=z.invalid||void 0;if(q.kind==="text"){let V=q,C=J.Input;return M(Y,{...A,children:[E,Q(C,{id:$,"aria-invalid":S,placeholder:q.placeholderI18n,autoComplete:V.autoComplete,inputMode:V.inputMode,maxLength:V.maxLength,minLength:V.minLength,disabled:!Z,...G,...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}if(q.kind==="textarea"){let V=q,C=J.Textarea;return M(Y,{...A,children:[E,Q(C,{id:$,"aria-invalid":S,placeholder:q.placeholderI18n,rows:V.rows,maxLength:V.maxLength,disabled:!Z,...G,...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}if(q.kind==="select"){let V=q,C=J.Select,b=v(V.options),j=p(D,b,R.resolvers);return M(Y,{...A,children:[E,Q(C,{id:$,name:_,"aria-invalid":S,disabled:!Z,value:G.value,onChange:(m)=>G.onChange(m),options:j,...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}if(q.kind==="checkbox"){let V=J.Checkbox;return M(Y,{...A,children:[E,Q(V,{id:$,name:_,disabled:!Z,checked:!!G.value,onCheckedChange:(C)=>G.onChange(C),...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}if(q.kind==="radio"){let V=q,C=J.RadioGroup,b=v(V.options),j=p(D,b,R.resolvers);return M(Y,{...A,children:[E,Q(C,{id:$,name:_,disabled:!Z,value:G.value,onValueChange:(m)=>G.onChange(m),options:j,...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}if(q.kind==="switch"){let V=J.Switch;return M(Y,{...A,children:[E,Q(V,{id:$,name:_,disabled:!Z,checked:!!G.value,onCheckedChange:(C)=>G.onChange(C),...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}return Q(Qq,{})}},_)},l=(q,w)=>{let W=c(w,q.name),{fields:Y,append:y,remove:F}=e({control:k.control,name:W}),B=q.max==null||Y.length<q.max,_=(P)=>(q.min==null?Y.length>0:Y.length>q.min)&&P>=0,O=J.Button,Z=J.FieldLabel;return M("div",{children:[q.labelI18n?Q(Z,{children:q.labelI18n}):null,Y.map((P,$)=>M("div",{children:[I(q.of,W,$),_($)?Q(O,{type:"button",variant:"ghost",size:"sm",onClick:()=>F($),children:"Remove"}):null]},P.id??$)),B?Q(O,{type:"button",variant:"outline",size:"sm",onClick:()=>y({}),children:"Add"}):null]},W)},t=async(q)=>{let w=X.actions?.[0]?.key??"submit";if(R.onSubmitOverride)return R.onSubmitOverride(q,w)},f=J.Button;return M("form",{onSubmit:k.handleSubmit(t),children:[(X.fields||[]).map((q,w)=>Q(x.Fragment,{children:I(q)},w)),X.actions&&X.actions.length?Q("div",{children:X.actions.map((q)=>Q(f,{type:"submit",children:q.labelI18n},q.key))}):null]})}return{render:(L,X)=>Q(T,{spec:L,options:X,merged:{...H,...X?.overrides??{}}})}}export{Tq as createFormRenderer};
|
|
1
|
+
import{createRequire as d}from"node:module";var MB=d(import.meta.url);import{buildZodWithRelations as t,evalPredicate as m,isFieldReadOnly as i,normalizeFormSpec as l}from"@contractspec/lib.contracts-spec/forms";import{zodResolver as s}from"@hookform/resolvers/zod";import V from"react";import{Controller as A,useFieldArray as o,useForm as r}from"react-hook-form";import{jsx as U,jsxs as q,Fragment as TB}from"react/jsx-runtime";function F(B){if(!B)return;if(Array.isArray(B))return{kind:"static",options:[...B]};return B}function y(B,G){if(!G)return;let Y=G.replace(/\[(\d+)\]/g,".$1").split(".").filter(Boolean),H=B;for(let J of Y){if(H==null)return;H=H[J]}return H}function e(B){if(!B)return[];return B.split(".").filter((G)=>/^\d+$/.test(G)).map((G)=>Number(G))}function u(B,G){if(!G)return B??"";return B?`${B}.${G}`:G}function f(B,G){if(!G||G.length===0)return"[]";try{return JSON.stringify(G.map((Y)=>y(B,Y)))}catch{return"[]"}}function p(B,G){let[Y,H]=V.useState(B);return V.useEffect(()=>{let J=globalThis.setTimeout(()=>H(B),G);return()=>globalThis.clearTimeout(J)},[G,B]),Y}function j(B,G,Y){let[H,J]=V.useState([]),_=V.useMemo(()=>{if(!G)return"nil";if(G.kind==="static")return JSON.stringify(G.options??[]);return`${G.resolverKey}:${f(B,G.deps)}`},[G,B]);return V.useEffect(()=>{let $=!0;return(async()=>{if(!G){J([]);return}if(G.kind==="static"){J([...G.options??[]]);return}let w=Y?.[G.resolverKey];if(!w){J([]);return}let b=await w(B,G.args);if($)J([...b??[]])})(),()=>{$=!1}},[_,Y,G,B]),H}function n(B){if(B instanceof Date&&!Number.isNaN(B.getTime()))return B;if(typeof B==="string"||typeof B==="number"){let G=new Date(B);if(!Number.isNaN(G.getTime()))return G}return null}function BB(B){if(B instanceof Date&&!Number.isNaN(B.getTime()))return B;if(typeof B!=="string"||B.trim().length===0)return null;let[G,Y]=B.split(":").map(($)=>Number($)),H=G??Number.NaN,J=Y??Number.NaN;if(Number.isNaN(H)||Number.isNaN(J))return null;let _=new Date;return _.setHours(H,J,0,0),_}function GB(B){if(!B)return"";return`${String(B.getHours()).padStart(2,"0")}:${String(B.getMinutes()).padStart(2,"0")}`}function a(B){return{value:B.value,labelI18n:B.labelI18n,descriptionI18n:B.descriptionI18n,...B.data??{}}}function HB(B,G,Y){let H=G.trim().toLowerCase();if(!H)return[...B];let J=H.split(/\s+/).filter(Boolean);return B.filter((_)=>{let $=a(_),L=[_.labelI18n,_.descriptionI18n,String(_.value),...Y.map((w)=>String(y($,w)??""))].join(" ").toLowerCase();return J.every((w)=>L.includes(w))})}function x(B,G){let Y=a(B);switch(G.mode){case"scalar":return G.valueKey?y(Y,G.valueKey)??B.value:B.value;case"pick":return Object.fromEntries(G.pickKeys.map((H)=>[H,y(Y,H)]));case"object":default:return B.data??Y}}function v(B,G){try{return JSON.stringify(B)===JSON.stringify(G)}catch{return B===G}}function JB(B,G,Y,H){let J=H&&Array.isArray(G)?G:[G];return B.filter((_)=>J.some(($)=>v(x(_,Y),$)))}function c(B){if(!B)return{countryCode:"",nationalNumber:""};let G=B.countryCode.trim(),Y=B.nationalNumber.replace(/\s+/g,""),H=G.replace(/^\+?/,"+"),J={...B,countryCode:G,nationalNumber:B.nationalNumber};if(B.e164!=null||G||Y)J.e164=`${H}${Y}`.trim();return J}function UB(B){let G=j(B.values,F(B.spec.options),B.resolvers),Y=B.driver.Field,H=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:J,fieldState:_})=>{let $=_.error?[_.error]:[];return q(Y,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.Select,{id:B.ctx.id,name:B.ctx.name,"aria-invalid":_.invalid||void 0,disabled:!B.ctx.enabled||B.ctx.readOnly,value:J.value,onChange:(L)=>{if(B.ctx.readOnly)return;J.onChange(L)},options:G,...B.spec.uiProps}),B.descNode,_.invalid?U(H,{errors:$}):null]})}})}function XB(B){let G=j(B.values,F(B.spec.options),B.resolvers),Y=B.driver.Field,H=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:J,fieldState:_})=>{let $=_.error?[_.error]:[];return q(Y,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.RadioGroup,{id:B.ctx.id,name:B.ctx.name,disabled:!B.ctx.enabled||B.ctx.readOnly,value:J.value,onValueChange:(L)=>{if(B.ctx.readOnly)return;J.onChange(L)},options:G,...B.spec.uiProps}),B.descNode,_.invalid?U(H,{errors:$}):null]})}})}function YB(B){let[G,Y]=V.useState(""),H=B.spec.source.kind==="resolver"?B.spec.source.debounceMs??200:0,J=p(G,H),[_,$]=V.useState([]),L=V.useMemo(()=>{return B.spec.source.kind==="resolver"?`${B.spec.source.resolverKey}:${f(B.values,B.spec.source.deps)}:${J}`:"local"},[J,B.spec.source,B.values]);V.useEffect(()=>{if(B.spec.source.kind!=="resolver")return;let Z=B.resolvers?.[B.spec.source.resolverKey],k=B.spec.source.minQueryLength??0;if(!Z||J.trim().length<k){$([]);return}let g=!0,D={...B.spec.source.args??{},query:J};return Promise.resolve(Z(B.values,D)).then((C)=>{if(g)$([...C??[]])}),()=>{g=!1}},[L,B.resolvers,B.spec.source,B.values,J]);let w=B.spec.source.kind==="local"?HB(B.spec.source.options,G,B.spec.source.searchKeys):_,b=B.driver.Field,X=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:Z,fieldState:k})=>{let g=k.error?[k.error]:[],D=JB(w,Z.value,B.spec.valueMapping,B.spec.multiple),C=(O)=>{if(B.ctx.readOnly)return;let W=x(O,B.spec.valueMapping);if(B.spec.multiple){let P=Array.isArray(Z.value)?Z.value:[],R=P.some((S)=>v(S,W));Z.onChange(R?P:[...P,W]);return}Z.onChange(W),Y(O.labelI18n)},T=(O)=>{if(B.ctx.readOnly||!B.spec.multiple)return;let W=x(O,B.spec.valueMapping),P=Array.isArray(Z.value)?Z.value:[];Z.onChange(P.filter((R)=>!v(R,W)))};return q(b,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.Autocomplete,{id:B.ctx.id,name:B.ctx.name,disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,"aria-invalid":k.invalid||void 0,placeholder:B.spec.placeholderI18n,multiple:B.spec.multiple,query:G,options:w,selectedOptions:D,onQueryChange:Y,onSelectOption:C,onRemoveOption:T}),B.descNode,k.invalid?U(X,{errors:g}):null]})}})}function _B(B){let G=j(B.values,F(B.spec.countryOptions),B.resolvers),Y=B.driver.Field,H=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:J,fieldState:_})=>{let $=_.error?[_.error]:[];return q(Y,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.AddressField,{id:B.ctx.id,name:B.ctx.name,value:J.value??null,onChange:(L)=>{if(B.ctx.readOnly)return;J.onChange(L)},disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,"aria-invalid":_.invalid||void 0,parts:B.spec.parts,countryOptions:G}),B.descNode,_.invalid?U(H,{errors:$}):null]})}})}function $B(B){let G=j(B.values,F(B.spec.countryOptions),B.resolvers),Y=B.driver.Field,H=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:J,fieldState:_})=>{let $=_.error?[_.error]:[];return q(Y,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.PhoneField,{id:B.ctx.id,name:B.ctx.name,value:c(J.value??null),onChange:(L)=>{if(B.ctx.readOnly)return;J.onChange(c(L))},disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,"aria-invalid":_.invalid||void 0,parts:B.spec.parts,countryOptions:G}),B.descNode,_.invalid?U(H,{errors:$}):null]})}})}function IB(B){let G=B.driver.Field,Y=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:H,fieldState:J})=>{let _=J.error?[J.error]:[];return q(G,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.DateField,{id:B.ctx.id,name:B.ctx.name,value:n(H.value),onChange:($)=>{if(B.ctx.readOnly)return;H.onChange($)},disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,placeholder:B.spec.placeholderI18n,minDate:B.spec.minDate,maxDate:B.spec.maxDate}),B.descNode,J.invalid?U(Y,{errors:_}):null]})}})}function LB(B){let G=B.driver.Field,Y=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:H,fieldState:J})=>{let _=J.error?[J.error]:[];return q(G,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.TimeField,{id:B.ctx.id,name:B.ctx.name,value:BB(H.value),onChange:($)=>{if(B.ctx.readOnly)return;H.onChange(GB($))},disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,placeholder:B.spec.placeholderI18n,is24Hour:B.spec.is24Hour}),B.descNode,J.invalid?U(Y,{errors:_}):null]})}})}function ZB(B){let G=B.driver.Field,Y=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:H,fieldState:J})=>{let _=J.error?[J.error]:[];return q(G,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.DateTimeField,{id:B.ctx.id,name:B.ctx.name,value:n(H.value),onChange:($)=>{if(B.ctx.readOnly)return;H.onChange($)},disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,datePlaceholder:B.spec.placeholderI18n,timePlaceholder:B.spec.placeholderI18n,minDate:B.spec.minDate,maxDate:B.spec.maxDate,is24Hour:B.spec.is24Hour}),B.descNode,J.invalid?U(Y,{errors:_}):null]})}})}function wB(B){let G=u(B.parent,B.spec.name),{fields:Y,append:H,remove:J}=o({control:B.form.control,name:G}),_=B.spec.max==null||Y.length<B.spec.max,$=(L)=>(B.spec.min==null?Y.length>0:Y.length>B.spec.min)&&L>=0;return q("div",{children:[B.spec.labelI18n?U(B.driver.FieldLabel,{children:B.spec.labelI18n}):null,Y.map((L,w)=>q("div",{children:[B.renderField(B.spec.of,`${G}.${w}`),$(w)?U(B.driver.Button,{type:"button",variant:"ghost",size:"sm",onClick:()=>J(w),children:"Remove"}):null]},L.id??w)),_?U(B.driver.Button,{type:"button",variant:"outline",size:"sm",onClick:()=>H({}),children:"Add"}):null]},G)}function zB(B){let G=B;function Y(H){let J=V.useMemo(()=>l(H.spec),[H.spec]),_=V.useMemo(()=>t(J),[J]),$=r({...H.merged.formOptions,resolver:s(_),defaultValues:H.options?.defaultValues}),L=$.watch(),w=(X,Z)=>{let k=H.merged.driver.Field,g=H.merged.driver.FieldLabel,D=H.merged.driver.FieldDescription,C=H.merged.driver.FieldError,T=u(Z,X.name),O=e(Z),W=m(L,X.visibleWhen,O),P=m(L,X.enabledWhen,O),R=i(X),S=Boolean($.getFieldState(T)?.invalid);if(!W)return null;let I={name:T,id:T.replace(/\./g,"-"),enabled:P,readOnly:R,visible:W},M={"data-invalid":S,hidden:!W,disabled:!P||R},K=X.labelI18n?U(g,{htmlFor:I.id,children:X.labelI18n}):null,Q=X.descriptionI18n?U(D,{children:X.descriptionI18n}):null;if(X.kind==="group")return q(k,{...M,children:[K,X.fields.map((N,z)=>U(V.Fragment,{children:w(N,T)},`${T}-${z}`)),Q]});if(X.kind==="array")return U(wB,{driver:H.merged.driver,form:$,spec:X,parent:Z,renderField:w},T);if(X.kind==="select")return U(UB,{driver:H.merged.driver,form:$,values:L,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M,resolvers:H.merged.resolvers},T);if(X.kind==="radio")return U(XB,{driver:H.merged.driver,form:$,values:L,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M,resolvers:H.merged.resolvers},T);if(X.kind==="autocomplete")return U(YB,{driver:H.merged.driver,form:$,values:L,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M,resolvers:H.merged.resolvers},T);if(X.kind==="address")return U(_B,{driver:H.merged.driver,form:$,values:L,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M,resolvers:H.merged.resolvers},T);if(X.kind==="phone")return U($B,{driver:H.merged.driver,form:$,values:L,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M,resolvers:H.merged.resolvers},T);if(X.kind==="date")return U(IB,{driver:H.merged.driver,form:$,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M},T);if(X.kind==="time")return U(LB,{driver:H.merged.driver,form:$,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M},T);if(X.kind==="datetime")return U(ZB,{driver:H.merged.driver,form:$,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M},T);return U(A,{name:T,control:$.control,render:({field:N,fieldState:z})=>{let h=z.error?[z.error]:[];if(X.kind==="text"){let E=X;return q(k,{...M,children:[K,U(H.merged.driver.Input,{id:I.id,"aria-invalid":z.invalid||void 0,placeholder:X.placeholderI18n,autoComplete:E.autoComplete,inputMode:E.inputMode,maxLength:E.maxLength,minLength:E.minLength,disabled:!I.enabled,readOnly:I.readOnly,...N,...X.uiProps}),Q,z.invalid?U(C,{errors:h}):null]})}if(X.kind==="textarea"){let E=X;return q(k,{...M,children:[K,U(H.merged.driver.Textarea,{id:I.id,"aria-invalid":z.invalid||void 0,placeholder:X.placeholderI18n,rows:E.rows,maxLength:E.maxLength,disabled:!I.enabled,readOnly:I.readOnly,...N,...X.uiProps}),Q,z.invalid?U(C,{errors:h}):null]})}if(X.kind==="checkbox")return q(k,{...M,children:[K,U(H.merged.driver.Checkbox,{id:I.id,name:I.name,disabled:!I.enabled||I.readOnly,checked:Boolean(N.value),onCheckedChange:(E)=>{if(I.readOnly)return;N.onChange(E)},...X.uiProps}),Q,z.invalid?U(C,{errors:h}):null]});if(X.kind==="switch")return q(k,{...M,children:[K,U(H.merged.driver.Switch,{id:I.id,name:I.name,disabled:!I.enabled||I.readOnly,checked:Boolean(N.value),onCheckedChange:(E)=>{if(I.readOnly)return;N.onChange(E)},...X.uiProps}),Q,z.invalid?U(C,{errors:h}):null]});return U(TB,{})}},T)},b=async(X)=>{let Z=J.actions?.[0]?.key??"submit";if(H.merged.onSubmitOverride)return H.merged.onSubmitOverride(X,Z)};return q("form",{onSubmit:$.handleSubmit(b),children:[J.fields.map((X,Z)=>U(V.Fragment,{children:w(X)},Z)),J.actions?.length?U("div",{children:J.actions.map((X)=>U(H.merged.driver.Button,{type:"submit",children:X.labelI18n},X.key))}):null]})}return{render:(H,J)=>U(Y,{spec:H,options:J,merged:{...G,...J?.overrides??{}}})}}export{x as mapAutocompleteValue,HB as filterAutocompleteOptions,zB as createFormRenderer};
|
package/dist/node/form-render.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createRequire as o}from"node:module";var Vq=o(import.meta.url);import{buildZodWithRelations as i,evalPredicate as u}from"@contractspec/lib.contracts-spec/forms";import{zodResolver as a}from"@hookform/resolvers/zod";import x,{useEffect as d,useMemo as n,useState as s}from"react";import{Controller as r,useFieldArray as e,useForm as qq}from"react-hook-form";import{jsx as Q,jsxs as M,Fragment as Qq}from"react/jsx-runtime";function v(U){if(!U)return;if(Array.isArray(U))return{kind:"static",options:U};return U}function Hq(U,H){if(!H)return;let J=H.replace(/\[(\d+)\]/g,".$1").split(".").filter(Boolean),T=U;for(let L of J){if(T==null)return;T=T[L]}return T}function Jq(U,H){if(!H||H.length===0)return"[]";try{return JSON.stringify(H.map((J)=>Hq(U,J)))}catch{return"[]"}}function p(U,H,J){let[T,L]=s([]),X=n(()=>{if(!H)return"nil";if(H.kind==="static")return JSON.stringify(H.options??[]);return Jq(U,H.deps)},[H,U]);return d(()=>{let N=!0;return(async()=>{if(!H)return L([]);if(H.kind==="static")return L([...H.options??[]]);let h=J?.[H.resolverKey];if(!h)return L([]);let k=await h(U,H.args);if(N)L([...k??[]])})(),()=>{N=!1}},[X,H&&H.kind==="resolver"?H.resolverKey:void 0]),T}function c(U,H,J){if(!H)return U??"";let T=typeof J==="number"?`${H.replace(/^\$index$/,String(J))}`:H;return U?`${U}${typeof J==="number"?`.${J}`:""}.${T}`.replace(/\.+/g,"."):T}function Tq(U){let H=U,{driver:J}=H;function T(L){let{spec:X,options:N,merged:R}=L,h=n(()=>i(X),[X]),k=qq({...R.formOptions,resolver:a(h),defaultValues:N?.defaultValues}),D=k.watch(),I=(q,w,W)=>{let{Field:Y,FieldLabel:y,FieldDescription:F,FieldError:B}=J,_=c(w,q.name,W),O=u(D,q.visibleWhen),Z=u(D,q.enabledWhen),P=Boolean(k.getFieldState(_)?.invalid);if(!O)return null;let $=_?.replace(/\./g,"-"),A={"data-invalid":P,hidden:!O,disabled:!Z},E=q.labelI18n?Q(y,{htmlFor:$,children:q.labelI18n}):null,g=q.descriptionI18n?Q(F,{children:q.descriptionI18n}):null;if(q.kind==="group"){let G=q.fields.map((z,K)=>Q(x.Fragment,{children:I(z,_,W)},`${_}-${K}`));return M(Y,{...A,children:[E,G,g]})}if(q.kind==="array")return l(q,w);return Q(r,{name:_,control:k.control,render:({field:G,fieldState:z})=>{let K=z.error?[z.error]:[],S=z.invalid||void 0;if(q.kind==="text"){let V=q,C=J.Input;return M(Y,{...A,children:[E,Q(C,{id:$,"aria-invalid":S,placeholder:q.placeholderI18n,autoComplete:V.autoComplete,inputMode:V.inputMode,maxLength:V.maxLength,minLength:V.minLength,disabled:!Z,...G,...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}if(q.kind==="textarea"){let V=q,C=J.Textarea;return M(Y,{...A,children:[E,Q(C,{id:$,"aria-invalid":S,placeholder:q.placeholderI18n,rows:V.rows,maxLength:V.maxLength,disabled:!Z,...G,...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}if(q.kind==="select"){let V=q,C=J.Select,b=v(V.options),j=p(D,b,R.resolvers);return M(Y,{...A,children:[E,Q(C,{id:$,name:_,"aria-invalid":S,disabled:!Z,value:G.value,onChange:(m)=>G.onChange(m),options:j,...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}if(q.kind==="checkbox"){let V=J.Checkbox;return M(Y,{...A,children:[E,Q(V,{id:$,name:_,disabled:!Z,checked:!!G.value,onCheckedChange:(C)=>G.onChange(C),...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}if(q.kind==="radio"){let V=q,C=J.RadioGroup,b=v(V.options),j=p(D,b,R.resolvers);return M(Y,{...A,children:[E,Q(C,{id:$,name:_,disabled:!Z,value:G.value,onValueChange:(m)=>G.onChange(m),options:j,...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}if(q.kind==="switch"){let V=J.Switch;return M(Y,{...A,children:[E,Q(V,{id:$,name:_,disabled:!Z,checked:!!G.value,onCheckedChange:(C)=>G.onChange(C),...q.uiProps}),g,z.invalid?Q(B,{errors:K}):null]})}return Q(Qq,{})}},_)},l=(q,w)=>{let W=c(w,q.name),{fields:Y,append:y,remove:F}=e({control:k.control,name:W}),B=q.max==null||Y.length<q.max,_=(P)=>(q.min==null?Y.length>0:Y.length>q.min)&&P>=0,O=J.Button,Z=J.FieldLabel;return M("div",{children:[q.labelI18n?Q(Z,{children:q.labelI18n}):null,Y.map((P,$)=>M("div",{children:[I(q.of,W,$),_($)?Q(O,{type:"button",variant:"ghost",size:"sm",onClick:()=>F($),children:"Remove"}):null]},P.id??$)),B?Q(O,{type:"button",variant:"outline",size:"sm",onClick:()=>y({}),children:"Add"}):null]},W)},t=async(q)=>{let w=X.actions?.[0]?.key??"submit";if(R.onSubmitOverride)return R.onSubmitOverride(q,w)},f=J.Button;return M("form",{onSubmit:k.handleSubmit(t),children:[(X.fields||[]).map((q,w)=>Q(x.Fragment,{children:I(q)},w)),X.actions&&X.actions.length?Q("div",{children:X.actions.map((q)=>Q(f,{type:"submit",children:q.labelI18n},q.key))}):null]})}return{render:(L,X)=>Q(T,{spec:L,options:X,merged:{...H,...X?.overrides??{}}})}}export{Tq as createFormRenderer};
|
|
1
|
+
import{createRequire as d}from"node:module";var MB=d(import.meta.url);import{buildZodWithRelations as t,evalPredicate as m,isFieldReadOnly as i,normalizeFormSpec as l}from"@contractspec/lib.contracts-spec/forms";import{zodResolver as s}from"@hookform/resolvers/zod";import V from"react";import{Controller as A,useFieldArray as o,useForm as r}from"react-hook-form";import{jsx as U,jsxs as q,Fragment as TB}from"react/jsx-runtime";function F(B){if(!B)return;if(Array.isArray(B))return{kind:"static",options:[...B]};return B}function y(B,G){if(!G)return;let Y=G.replace(/\[(\d+)\]/g,".$1").split(".").filter(Boolean),H=B;for(let J of Y){if(H==null)return;H=H[J]}return H}function e(B){if(!B)return[];return B.split(".").filter((G)=>/^\d+$/.test(G)).map((G)=>Number(G))}function u(B,G){if(!G)return B??"";return B?`${B}.${G}`:G}function f(B,G){if(!G||G.length===0)return"[]";try{return JSON.stringify(G.map((Y)=>y(B,Y)))}catch{return"[]"}}function p(B,G){let[Y,H]=V.useState(B);return V.useEffect(()=>{let J=globalThis.setTimeout(()=>H(B),G);return()=>globalThis.clearTimeout(J)},[G,B]),Y}function j(B,G,Y){let[H,J]=V.useState([]),_=V.useMemo(()=>{if(!G)return"nil";if(G.kind==="static")return JSON.stringify(G.options??[]);return`${G.resolverKey}:${f(B,G.deps)}`},[G,B]);return V.useEffect(()=>{let $=!0;return(async()=>{if(!G){J([]);return}if(G.kind==="static"){J([...G.options??[]]);return}let w=Y?.[G.resolverKey];if(!w){J([]);return}let b=await w(B,G.args);if($)J([...b??[]])})(),()=>{$=!1}},[_,Y,G,B]),H}function n(B){if(B instanceof Date&&!Number.isNaN(B.getTime()))return B;if(typeof B==="string"||typeof B==="number"){let G=new Date(B);if(!Number.isNaN(G.getTime()))return G}return null}function BB(B){if(B instanceof Date&&!Number.isNaN(B.getTime()))return B;if(typeof B!=="string"||B.trim().length===0)return null;let[G,Y]=B.split(":").map(($)=>Number($)),H=G??Number.NaN,J=Y??Number.NaN;if(Number.isNaN(H)||Number.isNaN(J))return null;let _=new Date;return _.setHours(H,J,0,0),_}function GB(B){if(!B)return"";return`${String(B.getHours()).padStart(2,"0")}:${String(B.getMinutes()).padStart(2,"0")}`}function a(B){return{value:B.value,labelI18n:B.labelI18n,descriptionI18n:B.descriptionI18n,...B.data??{}}}function HB(B,G,Y){let H=G.trim().toLowerCase();if(!H)return[...B];let J=H.split(/\s+/).filter(Boolean);return B.filter((_)=>{let $=a(_),L=[_.labelI18n,_.descriptionI18n,String(_.value),...Y.map((w)=>String(y($,w)??""))].join(" ").toLowerCase();return J.every((w)=>L.includes(w))})}function x(B,G){let Y=a(B);switch(G.mode){case"scalar":return G.valueKey?y(Y,G.valueKey)??B.value:B.value;case"pick":return Object.fromEntries(G.pickKeys.map((H)=>[H,y(Y,H)]));case"object":default:return B.data??Y}}function v(B,G){try{return JSON.stringify(B)===JSON.stringify(G)}catch{return B===G}}function JB(B,G,Y,H){let J=H&&Array.isArray(G)?G:[G];return B.filter((_)=>J.some(($)=>v(x(_,Y),$)))}function c(B){if(!B)return{countryCode:"",nationalNumber:""};let G=B.countryCode.trim(),Y=B.nationalNumber.replace(/\s+/g,""),H=G.replace(/^\+?/,"+"),J={...B,countryCode:G,nationalNumber:B.nationalNumber};if(B.e164!=null||G||Y)J.e164=`${H}${Y}`.trim();return J}function UB(B){let G=j(B.values,F(B.spec.options),B.resolvers),Y=B.driver.Field,H=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:J,fieldState:_})=>{let $=_.error?[_.error]:[];return q(Y,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.Select,{id:B.ctx.id,name:B.ctx.name,"aria-invalid":_.invalid||void 0,disabled:!B.ctx.enabled||B.ctx.readOnly,value:J.value,onChange:(L)=>{if(B.ctx.readOnly)return;J.onChange(L)},options:G,...B.spec.uiProps}),B.descNode,_.invalid?U(H,{errors:$}):null]})}})}function XB(B){let G=j(B.values,F(B.spec.options),B.resolvers),Y=B.driver.Field,H=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:J,fieldState:_})=>{let $=_.error?[_.error]:[];return q(Y,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.RadioGroup,{id:B.ctx.id,name:B.ctx.name,disabled:!B.ctx.enabled||B.ctx.readOnly,value:J.value,onValueChange:(L)=>{if(B.ctx.readOnly)return;J.onChange(L)},options:G,...B.spec.uiProps}),B.descNode,_.invalid?U(H,{errors:$}):null]})}})}function YB(B){let[G,Y]=V.useState(""),H=B.spec.source.kind==="resolver"?B.spec.source.debounceMs??200:0,J=p(G,H),[_,$]=V.useState([]),L=V.useMemo(()=>{return B.spec.source.kind==="resolver"?`${B.spec.source.resolverKey}:${f(B.values,B.spec.source.deps)}:${J}`:"local"},[J,B.spec.source,B.values]);V.useEffect(()=>{if(B.spec.source.kind!=="resolver")return;let Z=B.resolvers?.[B.spec.source.resolverKey],k=B.spec.source.minQueryLength??0;if(!Z||J.trim().length<k){$([]);return}let g=!0,D={...B.spec.source.args??{},query:J};return Promise.resolve(Z(B.values,D)).then((C)=>{if(g)$([...C??[]])}),()=>{g=!1}},[L,B.resolvers,B.spec.source,B.values,J]);let w=B.spec.source.kind==="local"?HB(B.spec.source.options,G,B.spec.source.searchKeys):_,b=B.driver.Field,X=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:Z,fieldState:k})=>{let g=k.error?[k.error]:[],D=JB(w,Z.value,B.spec.valueMapping,B.spec.multiple),C=(O)=>{if(B.ctx.readOnly)return;let W=x(O,B.spec.valueMapping);if(B.spec.multiple){let P=Array.isArray(Z.value)?Z.value:[],R=P.some((S)=>v(S,W));Z.onChange(R?P:[...P,W]);return}Z.onChange(W),Y(O.labelI18n)},T=(O)=>{if(B.ctx.readOnly||!B.spec.multiple)return;let W=x(O,B.spec.valueMapping),P=Array.isArray(Z.value)?Z.value:[];Z.onChange(P.filter((R)=>!v(R,W)))};return q(b,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.Autocomplete,{id:B.ctx.id,name:B.ctx.name,disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,"aria-invalid":k.invalid||void 0,placeholder:B.spec.placeholderI18n,multiple:B.spec.multiple,query:G,options:w,selectedOptions:D,onQueryChange:Y,onSelectOption:C,onRemoveOption:T}),B.descNode,k.invalid?U(X,{errors:g}):null]})}})}function _B(B){let G=j(B.values,F(B.spec.countryOptions),B.resolvers),Y=B.driver.Field,H=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:J,fieldState:_})=>{let $=_.error?[_.error]:[];return q(Y,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.AddressField,{id:B.ctx.id,name:B.ctx.name,value:J.value??null,onChange:(L)=>{if(B.ctx.readOnly)return;J.onChange(L)},disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,"aria-invalid":_.invalid||void 0,parts:B.spec.parts,countryOptions:G}),B.descNode,_.invalid?U(H,{errors:$}):null]})}})}function $B(B){let G=j(B.values,F(B.spec.countryOptions),B.resolvers),Y=B.driver.Field,H=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:J,fieldState:_})=>{let $=_.error?[_.error]:[];return q(Y,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.PhoneField,{id:B.ctx.id,name:B.ctx.name,value:c(J.value??null),onChange:(L)=>{if(B.ctx.readOnly)return;J.onChange(c(L))},disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,"aria-invalid":_.invalid||void 0,parts:B.spec.parts,countryOptions:G}),B.descNode,_.invalid?U(H,{errors:$}):null]})}})}function IB(B){let G=B.driver.Field,Y=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:H,fieldState:J})=>{let _=J.error?[J.error]:[];return q(G,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.DateField,{id:B.ctx.id,name:B.ctx.name,value:n(H.value),onChange:($)=>{if(B.ctx.readOnly)return;H.onChange($)},disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,placeholder:B.spec.placeholderI18n,minDate:B.spec.minDate,maxDate:B.spec.maxDate}),B.descNode,J.invalid?U(Y,{errors:_}):null]})}})}function LB(B){let G=B.driver.Field,Y=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:H,fieldState:J})=>{let _=J.error?[J.error]:[];return q(G,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.TimeField,{id:B.ctx.id,name:B.ctx.name,value:BB(H.value),onChange:($)=>{if(B.ctx.readOnly)return;H.onChange(GB($))},disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,placeholder:B.spec.placeholderI18n,is24Hour:B.spec.is24Hour}),B.descNode,J.invalid?U(Y,{errors:_}):null]})}})}function ZB(B){let G=B.driver.Field,Y=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:H,fieldState:J})=>{let _=J.error?[J.error]:[];return q(G,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.DateTimeField,{id:B.ctx.id,name:B.ctx.name,value:n(H.value),onChange:($)=>{if(B.ctx.readOnly)return;H.onChange($)},disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,datePlaceholder:B.spec.placeholderI18n,timePlaceholder:B.spec.placeholderI18n,minDate:B.spec.minDate,maxDate:B.spec.maxDate,is24Hour:B.spec.is24Hour}),B.descNode,J.invalid?U(Y,{errors:_}):null]})}})}function wB(B){let G=u(B.parent,B.spec.name),{fields:Y,append:H,remove:J}=o({control:B.form.control,name:G}),_=B.spec.max==null||Y.length<B.spec.max,$=(L)=>(B.spec.min==null?Y.length>0:Y.length>B.spec.min)&&L>=0;return q("div",{children:[B.spec.labelI18n?U(B.driver.FieldLabel,{children:B.spec.labelI18n}):null,Y.map((L,w)=>q("div",{children:[B.renderField(B.spec.of,`${G}.${w}`),$(w)?U(B.driver.Button,{type:"button",variant:"ghost",size:"sm",onClick:()=>J(w),children:"Remove"}):null]},L.id??w)),_?U(B.driver.Button,{type:"button",variant:"outline",size:"sm",onClick:()=>H({}),children:"Add"}):null]},G)}function zB(B){let G=B;function Y(H){let J=V.useMemo(()=>l(H.spec),[H.spec]),_=V.useMemo(()=>t(J),[J]),$=r({...H.merged.formOptions,resolver:s(_),defaultValues:H.options?.defaultValues}),L=$.watch(),w=(X,Z)=>{let k=H.merged.driver.Field,g=H.merged.driver.FieldLabel,D=H.merged.driver.FieldDescription,C=H.merged.driver.FieldError,T=u(Z,X.name),O=e(Z),W=m(L,X.visibleWhen,O),P=m(L,X.enabledWhen,O),R=i(X),S=Boolean($.getFieldState(T)?.invalid);if(!W)return null;let I={name:T,id:T.replace(/\./g,"-"),enabled:P,readOnly:R,visible:W},M={"data-invalid":S,hidden:!W,disabled:!P||R},K=X.labelI18n?U(g,{htmlFor:I.id,children:X.labelI18n}):null,Q=X.descriptionI18n?U(D,{children:X.descriptionI18n}):null;if(X.kind==="group")return q(k,{...M,children:[K,X.fields.map((N,z)=>U(V.Fragment,{children:w(N,T)},`${T}-${z}`)),Q]});if(X.kind==="array")return U(wB,{driver:H.merged.driver,form:$,spec:X,parent:Z,renderField:w},T);if(X.kind==="select")return U(UB,{driver:H.merged.driver,form:$,values:L,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M,resolvers:H.merged.resolvers},T);if(X.kind==="radio")return U(XB,{driver:H.merged.driver,form:$,values:L,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M,resolvers:H.merged.resolvers},T);if(X.kind==="autocomplete")return U(YB,{driver:H.merged.driver,form:$,values:L,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M,resolvers:H.merged.resolvers},T);if(X.kind==="address")return U(_B,{driver:H.merged.driver,form:$,values:L,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M,resolvers:H.merged.resolvers},T);if(X.kind==="phone")return U($B,{driver:H.merged.driver,form:$,values:L,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M,resolvers:H.merged.resolvers},T);if(X.kind==="date")return U(IB,{driver:H.merged.driver,form:$,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M},T);if(X.kind==="time")return U(LB,{driver:H.merged.driver,form:$,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M},T);if(X.kind==="datetime")return U(ZB,{driver:H.merged.driver,form:$,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M},T);return U(A,{name:T,control:$.control,render:({field:N,fieldState:z})=>{let h=z.error?[z.error]:[];if(X.kind==="text"){let E=X;return q(k,{...M,children:[K,U(H.merged.driver.Input,{id:I.id,"aria-invalid":z.invalid||void 0,placeholder:X.placeholderI18n,autoComplete:E.autoComplete,inputMode:E.inputMode,maxLength:E.maxLength,minLength:E.minLength,disabled:!I.enabled,readOnly:I.readOnly,...N,...X.uiProps}),Q,z.invalid?U(C,{errors:h}):null]})}if(X.kind==="textarea"){let E=X;return q(k,{...M,children:[K,U(H.merged.driver.Textarea,{id:I.id,"aria-invalid":z.invalid||void 0,placeholder:X.placeholderI18n,rows:E.rows,maxLength:E.maxLength,disabled:!I.enabled,readOnly:I.readOnly,...N,...X.uiProps}),Q,z.invalid?U(C,{errors:h}):null]})}if(X.kind==="checkbox")return q(k,{...M,children:[K,U(H.merged.driver.Checkbox,{id:I.id,name:I.name,disabled:!I.enabled||I.readOnly,checked:Boolean(N.value),onCheckedChange:(E)=>{if(I.readOnly)return;N.onChange(E)},...X.uiProps}),Q,z.invalid?U(C,{errors:h}):null]});if(X.kind==="switch")return q(k,{...M,children:[K,U(H.merged.driver.Switch,{id:I.id,name:I.name,disabled:!I.enabled||I.readOnly,checked:Boolean(N.value),onCheckedChange:(E)=>{if(I.readOnly)return;N.onChange(E)},...X.uiProps}),Q,z.invalid?U(C,{errors:h}):null]});return U(TB,{})}},T)},b=async(X)=>{let Z=J.actions?.[0]?.key??"submit";if(H.merged.onSubmitOverride)return H.merged.onSubmitOverride(X,Z)};return q("form",{onSubmit:$.handleSubmit(b),children:[J.fields.map((X,Z)=>U(V.Fragment,{children:w(X)},Z)),J.actions?.length?U("div",{children:J.actions.map((X)=>U(H.merged.driver.Button,{type:"submit",children:X.labelI18n},X.key))}):null]})}return{render:(H,J)=>U(Y,{spec:H,options:J,merged:{...G,...J?.overrides??{}}})}}export{x as mapAutocompleteValue,HB as filterAutocompleteOptions,zB as createFormRenderer};
|
package/dist/node/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createRequire as s}from"node:module";var r=s(import.meta.url);function Zq(J){return J}function Tq(J){return J}import{createDefaultTransformEngine as x,htmlToMarkdown as e,registerBasicValidation as u}from"@contractspec/lib.presentation-runtime-core/transform-engine";import qq from"react";export*from"@contractspec/lib.presentation-runtime-core/transform-engine";function m(J){return J.register({target:"react",async render(q){if(q.source.type==="component"){let Q=q.source.props?q.source.props.getZod().safeParse({}).success?{}:void 0:void 0;return{kind:"react_component",componentKey:q.source.componentKey,props:Q}}return{kind:"blocknotejs",docJson:q.source.docJson,blockConfig:q.source.blockConfig}}}),J}function Cq(J,q){return J.prependRegister({target:"markdown",async render(Q){if(Q.source.type!=="component")throw Error("React-to-markdown renderer only handles component presentations");let X=q[Q.source.componentKey];if(!X)throw Error(`Component ${Q.source.componentKey} not found in componentMap`);let{renderToStaticMarkup:Y}=await import("react-dom/server"),_=qq.createElement(X,Q.source.props?{}:void 0),T=e(Y(_));return{mimeType:"text/markdown",body:Q.policy?.pii?.length?T.replace(/\[REDACTED\]/g,"[REDACTED]"):T}}}),J}import p from"react";function Eq(){return u(m(x()))}async function Oq(J,q,Q,X){if(q==="react"){let Y=await J.render("react",Q);if(Y.kind==="react_component"){let T=(X?.componentMap??{})[Y.componentKey];if(!T)return null;let A={...Y.props??{},...X?.reactProps??{}};return p.createElement(T,A)}if(Y.kind==="blocknotejs"){if(X?.renderBlockNote)return X.renderBlockNote(Y.docJson,Y.blockConfig);return p.createElement("div",{},"[BlockNote renderer not configured]")}return null}if(q==="markdown")return J.render(q,Q);if(q==="application/json")return J.render(q,Q);if(q==="application/xml")return J.render(q,Q);return null}function Pq(J,q){return{meta:J,...q}}function hq(J,q){return J.register(q),J}import{buildZodWithRelations as Hq,evalPredicate as l}from"@contractspec/lib.contracts-spec/forms";import{zodResolver as Jq}from"@hookform/resolvers/zod";import f,{useEffect as Qq,useMemo as i,useState as Uq}from"react";import{Controller as Xq,useFieldArray as Yq,useForm as _q}from"react-hook-form";import{jsx as U,jsxs as B,Fragment as zq}from"react/jsx-runtime";function c(J){if(!J)return;if(Array.isArray(J))return{kind:"static",options:J};return J}function $q(J,q){if(!q)return;let Q=q.replace(/\[(\d+)\]/g,".$1").split(".").filter(Boolean),X=J;for(let Y of Q){if(X==null)return;X=X[Y]}return X}function Gq(J,q){if(!q||q.length===0)return"[]";try{return JSON.stringify(q.map((Q)=>$q(J,Q)))}catch{return"[]"}}function o(J,q,Q){let[X,Y]=Uq([]),_=i(()=>{if(!q)return"nil";if(q.kind==="static")return JSON.stringify(q.options??[]);return Gq(J,q.deps)},[q,J]);return Qq(()=>{let T=!0;return(async()=>{if(!q)return Y([]);if(q.kind==="static")return Y([...q.options??[]]);let N=Q?.[q.resolverKey];if(!N)return Y([]);let k=await N(J,q.args);if(T)Y([...k??[]])})(),()=>{T=!1}},[_,q&&q.kind==="resolver"?q.resolverKey:void 0]),X}function n(J,q,Q){if(!q)return J??"";let X=typeof Q==="number"?`${q.replace(/^\$index$/,String(Q))}`:q;return J?`${J}${typeof Q==="number"?`.${Q}`:""}.${X}`.replace(/\.+/g,"."):X}function bq(J){let q=J,{driver:Q}=q;function X(Y){let{spec:_,options:T,merged:A}=Y,N=i(()=>Hq(_),[_]),k=_q({...A.formOptions,resolver:Jq(N),defaultValues:T?.defaultValues}),y=k.watch(),S=(H,C,O)=>{let{Field:G,FieldLabel:I,FieldDescription:F,FieldError:M}=Q,z=n(C,H.name,O),P=l(y,H.visibleWhen),w=l(y,H.enabledWhen),h=Boolean(k.getFieldState(z)?.invalid);if(!P)return null;let L=z?.replace(/\./g,"-"),D={"data-invalid":h,hidden:!P,disabled:!w},W=H.labelI18n?U(I,{htmlFor:L,children:H.labelI18n}):null,E=H.descriptionI18n?U(F,{children:H.descriptionI18n}):null;if(H.kind==="group"){let V=H.fields.map((Z,R)=>U(f.Fragment,{children:S(Z,z,O)},`${z}-${R}`));return B(G,{...D,children:[W,V,E]})}if(H.kind==="array")return t(H,C);return U(Xq,{name:z,control:k.control,render:({field:V,fieldState:Z})=>{let R=Z.error?[Z.error]:[],b=Z.invalid||void 0;if(H.kind==="text"){let $=H,K=Q.Input;return B(G,{...D,children:[W,U(K,{id:L,"aria-invalid":b,placeholder:H.placeholderI18n,autoComplete:$.autoComplete,inputMode:$.inputMode,maxLength:$.maxLength,minLength:$.minLength,disabled:!w,...V,...H.uiProps}),E,Z.invalid?U(M,{errors:R}):null]})}if(H.kind==="textarea"){let $=H,K=Q.Textarea;return B(G,{...D,children:[W,U(K,{id:L,"aria-invalid":b,placeholder:H.placeholderI18n,rows:$.rows,maxLength:$.maxLength,disabled:!w,...V,...H.uiProps}),E,Z.invalid?U(M,{errors:R}):null]})}if(H.kind==="select"){let $=H,K=Q.Select,j=c($.options),g=o(y,j,A.resolvers);return B(G,{...D,children:[W,U(K,{id:L,name:z,"aria-invalid":b,disabled:!w,value:V.value,onChange:(v)=>V.onChange(v),options:g,...H.uiProps}),E,Z.invalid?U(M,{errors:R}):null]})}if(H.kind==="checkbox"){let $=Q.Checkbox;return B(G,{...D,children:[W,U($,{id:L,name:z,disabled:!w,checked:!!V.value,onCheckedChange:(K)=>V.onChange(K),...H.uiProps}),E,Z.invalid?U(M,{errors:R}):null]})}if(H.kind==="radio"){let $=H,K=Q.RadioGroup,j=c($.options),g=o(y,j,A.resolvers);return B(G,{...D,children:[W,U(K,{id:L,name:z,disabled:!w,value:V.value,onValueChange:(v)=>V.onChange(v),options:g,...H.uiProps}),E,Z.invalid?U(M,{errors:R}):null]})}if(H.kind==="switch"){let $=Q.Switch;return B(G,{...D,children:[W,U($,{id:L,name:z,disabled:!w,checked:!!V.value,onCheckedChange:(K)=>V.onChange(K),...H.uiProps}),E,Z.invalid?U(M,{errors:R}):null]})}return U(zq,{})}},z)},t=(H,C)=>{let O=n(C,H.name),{fields:G,append:I,remove:F}=Yq({control:k.control,name:O}),M=H.max==null||G.length<H.max,z=(h)=>(H.min==null?G.length>0:G.length>H.min)&&h>=0,P=Q.Button,w=Q.FieldLabel;return B("div",{children:[H.labelI18n?U(w,{children:H.labelI18n}):null,G.map((h,L)=>B("div",{children:[S(H.of,O,L),z(L)?U(P,{type:"button",variant:"ghost",size:"sm",onClick:()=>F(L),children:"Remove"}):null]},h.id??L)),M?U(P,{type:"button",variant:"outline",size:"sm",onClick:()=>I({}),children:"Add"}):null]},O)},d=async(H)=>{let C=_.actions?.[0]?.key??"submit";if(A.onSubmitOverride)return A.onSubmitOverride(H,C)},a=Q.Button;return B("form",{onSubmit:k.handleSubmit(d),children:[(_.fields||[]).map((H,C)=>U(f.Fragment,{children:S(H)},C)),_.actions&&_.actions.length?U("div",{children:_.actions.map((H)=>U(a,{type:"submit",children:H.labelI18n},H.key))}):null]})}return{render:(Y,_)=>U(X,{spec:Y,options:_,merged:{...q,..._?.overrides??{}}})}}export{Tq as shadcnDriver,Zq as rnReusablesDriver,Oq as renderFeaturePresentation,hq as registerFeature,bq as createFormRenderer,Pq as createFeatureModule,Eq as createEngineWithDefaults};
|
|
1
|
+
import{createRequire as s}from"node:module";var o=s(import.meta.url);function AG(G){return G}function PG(G){return G}import{createDefaultTransformEngine as m,htmlToMarkdown as r,registerBasicValidation as u}from"@contractspec/lib.presentation-runtime-core/transform-engine";import p from"react";export*from"@contractspec/lib.presentation-runtime-core/transform-engine";function c(G){return G.register({target:"react",async render(H){if(H.source.type==="component"){let X=H.source.props?H.source.props.getZod().safeParse({}).success?{}:void 0:void 0;return{kind:"react_component",componentKey:H.source.componentKey,props:X}}return{kind:"blocknotejs",docJson:H.source.docJson,blockConfig:H.source.blockConfig}}}),G}function RG(G,H){return G.prependRegister({target:"markdown",async render(X){if(X.source.type!=="component")throw Error("React-to-markdown renderer only handles component presentations");let J=H[X.source.componentKey];if(!J)throw Error(`Component ${X.source.componentKey} not found in componentMap`);let{renderToStaticMarkup:U}=await import("react-dom/server"),B=p.createElement(J,X.source.props?{}:void 0),$=r(U(B));return{mimeType:"text/markdown",body:X.policy?.pii?.length?$.replace(/\[REDACTED\]/g,"[REDACTED]"):$}}}),G}import f from"react";function gG(){return u(c(m()))}async function SG(G,H,X,J){if(H==="react"){let U=await G.render("react",X);if(U.kind==="react_component"){let $=(J?.componentMap??{})[U.componentKey];if(!$)return null;let I={...U.props??{},...J?.reactProps??{}};return f.createElement($,I)}if(U.kind==="blocknotejs"){if(J?.renderBlockNote)return J.renderBlockNote(U.docJson,U.blockConfig);return f.createElement("div",{},"[BlockNote renderer not configured]")}return null}if(H==="markdown")return G.render(H,X);if(H==="application/json")return G.render(H,X);if(H==="application/xml")return G.render(H,X);return null}function xG(G,H){return{meta:G,...H}}function vG(G,H){return G.register(H),G}import{buildZodWithRelations as e,evalPredicate as n,isFieldReadOnly as GG,normalizeFormSpec as HG}from"@contractspec/lib.contracts-spec/forms";import{zodResolver as JG}from"@hookform/resolvers/zod";import V from"react";import{Controller as A,useFieldArray as UG,useForm as XG}from"react-hook-form";import{jsx as Y,jsxs as w,Fragment as EG}from"react/jsx-runtime";function j(G){if(!G)return;if(Array.isArray(G))return{kind:"static",options:[...G]};return G}function F(G,H){if(!H)return;let X=H.replace(/\[(\d+)\]/g,".$1").split(".").filter(Boolean),J=G;for(let U of X){if(J==null)return;J=J[U]}return J}function YG(G){if(!G)return[];return G.split(".").filter((H)=>/^\d+$/.test(H)).map((H)=>Number(H))}function d(G,H){if(!H)return G??"";return G?`${G}.${H}`:H}function l(G,H){if(!H||H.length===0)return"[]";try{return JSON.stringify(H.map((X)=>F(G,X)))}catch{return"[]"}}function _G(G,H){let[X,J]=V.useState(G);return V.useEffect(()=>{let U=globalThis.setTimeout(()=>J(G),H);return()=>globalThis.clearTimeout(U)},[H,G]),X}function g(G,H,X){let[J,U]=V.useState([]),B=V.useMemo(()=>{if(!H)return"nil";if(H.kind==="static")return JSON.stringify(H.options??[]);return`${H.resolverKey}:${l(G,H.deps)}`},[H,G]);return V.useEffect(()=>{let $=!0;return(async()=>{if(!H){U([]);return}if(H.kind==="static"){U([...H.options??[]]);return}let q=X?.[H.resolverKey];if(!q){U([]);return}let b=await q(G,H.args);if($)U([...b??[]])})(),()=>{$=!1}},[B,X,H,G]),J}function i(G){if(G instanceof Date&&!Number.isNaN(G.getTime()))return G;if(typeof G==="string"||typeof G==="number"){let H=new Date(G);if(!Number.isNaN(H.getTime()))return H}return null}function $G(G){if(G instanceof Date&&!Number.isNaN(G.getTime()))return G;if(typeof G!=="string"||G.trim().length===0)return null;let[H,X]=G.split(":").map(($)=>Number($)),J=H??Number.NaN,U=X??Number.NaN;if(Number.isNaN(J)||Number.isNaN(U))return null;let B=new Date;return B.setHours(J,U,0,0),B}function BG(G){if(!G)return"";return`${String(G.getHours()).padStart(2,"0")}:${String(G.getMinutes()).padStart(2,"0")}`}function t(G){return{value:G.value,labelI18n:G.labelI18n,descriptionI18n:G.descriptionI18n,...G.data??{}}}function IG(G,H,X){let J=H.trim().toLowerCase();if(!J)return[...G];let U=J.split(/\s+/).filter(Boolean);return G.filter((B)=>{let $=t(B),I=[B.labelI18n,B.descriptionI18n,String(B.value),...X.map((q)=>String(F($,q)??""))].join(" ").toLowerCase();return U.every((q)=>I.includes(q))})}function x(G,H){let X=t(G);switch(H.mode){case"scalar":return H.valueKey?F(X,H.valueKey)??G.value:G.value;case"pick":return Object.fromEntries(H.pickKeys.map((J)=>[J,F(X,J)]));case"object":default:return G.data??X}}function v(G,H){try{return JSON.stringify(G)===JSON.stringify(H)}catch{return G===H}}function LG(G,H,X,J){let U=J&&Array.isArray(H)?H:[H];return G.filter((B)=>U.some(($)=>v(x(B,X),$)))}function a(G){if(!G)return{countryCode:"",nationalNumber:""};let H=G.countryCode.trim(),X=G.nationalNumber.replace(/\s+/g,""),J=H.replace(/^\+?/,"+"),U={...G,countryCode:H,nationalNumber:G.nationalNumber};if(G.e164!=null||H||X)U.e164=`${J}${X}`.trim();return U}function ZG(G){let H=g(G.values,j(G.spec.options),G.resolvers),X=G.driver.Field,J=G.driver.FieldError;return Y(A,{name:G.ctx.name,control:G.form.control,render:({field:U,fieldState:B})=>{let $=B.error?[B.error]:[];return w(X,{...G.commonWrapProps,children:[G.labelNode,Y(G.driver.Select,{id:G.ctx.id,name:G.ctx.name,"aria-invalid":B.invalid||void 0,disabled:!G.ctx.enabled||G.ctx.readOnly,value:U.value,onChange:(I)=>{if(G.ctx.readOnly)return;U.onChange(I)},options:H,...G.spec.uiProps}),G.descNode,B.invalid?Y(J,{errors:$}):null]})}})}function qG(G){let H=g(G.values,j(G.spec.options),G.resolvers),X=G.driver.Field,J=G.driver.FieldError;return Y(A,{name:G.ctx.name,control:G.form.control,render:({field:U,fieldState:B})=>{let $=B.error?[B.error]:[];return w(X,{...G.commonWrapProps,children:[G.labelNode,Y(G.driver.RadioGroup,{id:G.ctx.id,name:G.ctx.name,disabled:!G.ctx.enabled||G.ctx.readOnly,value:U.value,onValueChange:(I)=>{if(G.ctx.readOnly)return;U.onChange(I)},options:H,...G.spec.uiProps}),G.descNode,B.invalid?Y(J,{errors:$}):null]})}})}function TG(G){let[H,X]=V.useState(""),J=G.spec.source.kind==="resolver"?G.spec.source.debounceMs??200:0,U=_G(H,J),[B,$]=V.useState([]),I=V.useMemo(()=>{return G.spec.source.kind==="resolver"?`${G.spec.source.resolverKey}:${l(G.values,G.spec.source.deps)}:${U}`:"local"},[U,G.spec.source,G.values]);V.useEffect(()=>{if(G.spec.source.kind!=="resolver")return;let Z=G.resolvers?.[G.spec.source.resolverKey],z=G.spec.source.minQueryLength??0;if(!Z||U.trim().length<z){$([]);return}let O=!0,y={...G.spec.source.args??{},query:U};return Promise.resolve(Z(G.values,y)).then((C)=>{if(O)$([...C??[]])}),()=>{O=!1}},[I,G.resolvers,G.spec.source,G.values,U]);let q=G.spec.source.kind==="local"?IG(G.spec.source.options,H,G.spec.source.searchKeys):B,b=G.driver.Field,_=G.driver.FieldError;return Y(A,{name:G.ctx.name,control:G.form.control,render:({field:Z,fieldState:z})=>{let O=z.error?[z.error]:[],y=LG(q,Z.value,G.spec.valueMapping,G.spec.multiple),C=(D)=>{if(G.ctx.readOnly)return;let k=x(D,G.spec.valueMapping);if(G.spec.multiple){let P=Array.isArray(Z.value)?Z.value:[],R=P.some((S)=>v(S,k));Z.onChange(R?P:[...P,k]);return}Z.onChange(k),X(D.labelI18n)},T=(D)=>{if(G.ctx.readOnly||!G.spec.multiple)return;let k=x(D,G.spec.valueMapping),P=Array.isArray(Z.value)?Z.value:[];Z.onChange(P.filter((R)=>!v(R,k)))};return w(b,{...G.commonWrapProps,children:[G.labelNode,Y(G.driver.Autocomplete,{id:G.ctx.id,name:G.ctx.name,disabled:!G.ctx.enabled,readOnly:G.ctx.readOnly,"aria-invalid":z.invalid||void 0,placeholder:G.spec.placeholderI18n,multiple:G.spec.multiple,query:H,options:q,selectedOptions:y,onQueryChange:X,onSelectOption:C,onRemoveOption:T}),G.descNode,z.invalid?Y(_,{errors:O}):null]})}})}function wG(G){let H=g(G.values,j(G.spec.countryOptions),G.resolvers),X=G.driver.Field,J=G.driver.FieldError;return Y(A,{name:G.ctx.name,control:G.form.control,render:({field:U,fieldState:B})=>{let $=B.error?[B.error]:[];return w(X,{...G.commonWrapProps,children:[G.labelNode,Y(G.driver.AddressField,{id:G.ctx.id,name:G.ctx.name,value:U.value??null,onChange:(I)=>{if(G.ctx.readOnly)return;U.onChange(I)},disabled:!G.ctx.enabled,readOnly:G.ctx.readOnly,"aria-invalid":B.invalid||void 0,parts:G.spec.parts,countryOptions:H}),G.descNode,B.invalid?Y(J,{errors:$}):null]})}})}function KG(G){let H=g(G.values,j(G.spec.countryOptions),G.resolvers),X=G.driver.Field,J=G.driver.FieldError;return Y(A,{name:G.ctx.name,control:G.form.control,render:({field:U,fieldState:B})=>{let $=B.error?[B.error]:[];return w(X,{...G.commonWrapProps,children:[G.labelNode,Y(G.driver.PhoneField,{id:G.ctx.id,name:G.ctx.name,value:a(U.value??null),onChange:(I)=>{if(G.ctx.readOnly)return;U.onChange(a(I))},disabled:!G.ctx.enabled,readOnly:G.ctx.readOnly,"aria-invalid":B.invalid||void 0,parts:G.spec.parts,countryOptions:H}),G.descNode,B.invalid?Y(J,{errors:$}):null]})}})}function QG(G){let H=G.driver.Field,X=G.driver.FieldError;return Y(A,{name:G.ctx.name,control:G.form.control,render:({field:J,fieldState:U})=>{let B=U.error?[U.error]:[];return w(H,{...G.commonWrapProps,children:[G.labelNode,Y(G.driver.DateField,{id:G.ctx.id,name:G.ctx.name,value:i(J.value),onChange:($)=>{if(G.ctx.readOnly)return;J.onChange($)},disabled:!G.ctx.enabled,readOnly:G.ctx.readOnly,placeholder:G.spec.placeholderI18n,minDate:G.spec.minDate,maxDate:G.spec.maxDate}),G.descNode,U.invalid?Y(X,{errors:B}):null]})}})}function MG(G){let H=G.driver.Field,X=G.driver.FieldError;return Y(A,{name:G.ctx.name,control:G.form.control,render:({field:J,fieldState:U})=>{let B=U.error?[U.error]:[];return w(H,{...G.commonWrapProps,children:[G.labelNode,Y(G.driver.TimeField,{id:G.ctx.id,name:G.ctx.name,value:$G(J.value),onChange:($)=>{if(G.ctx.readOnly)return;J.onChange(BG($))},disabled:!G.ctx.enabled,readOnly:G.ctx.readOnly,placeholder:G.spec.placeholderI18n,is24Hour:G.spec.is24Hour}),G.descNode,U.invalid?Y(X,{errors:B}):null]})}})}function VG(G){let H=G.driver.Field,X=G.driver.FieldError;return Y(A,{name:G.ctx.name,control:G.form.control,render:({field:J,fieldState:U})=>{let B=U.error?[U.error]:[];return w(H,{...G.commonWrapProps,children:[G.labelNode,Y(G.driver.DateTimeField,{id:G.ctx.id,name:G.ctx.name,value:i(J.value),onChange:($)=>{if(G.ctx.readOnly)return;J.onChange($)},disabled:!G.ctx.enabled,readOnly:G.ctx.readOnly,datePlaceholder:G.spec.placeholderI18n,timePlaceholder:G.spec.placeholderI18n,minDate:G.spec.minDate,maxDate:G.spec.maxDate,is24Hour:G.spec.is24Hour}),G.descNode,U.invalid?Y(X,{errors:B}):null]})}})}function zG(G){let H=d(G.parent,G.spec.name),{fields:X,append:J,remove:U}=UG({control:G.form.control,name:H}),B=G.spec.max==null||X.length<G.spec.max,$=(I)=>(G.spec.min==null?X.length>0:X.length>G.spec.min)&&I>=0;return w("div",{children:[G.spec.labelI18n?Y(G.driver.FieldLabel,{children:G.spec.labelI18n}):null,X.map((I,q)=>w("div",{children:[G.renderField(G.spec.of,`${H}.${q}`),$(q)?Y(G.driver.Button,{type:"button",variant:"ghost",size:"sm",onClick:()=>U(q),children:"Remove"}):null]},I.id??q)),B?Y(G.driver.Button,{type:"button",variant:"outline",size:"sm",onClick:()=>J({}),children:"Add"}):null]},H)}function aG(G){let H=G;function X(J){let U=V.useMemo(()=>HG(J.spec),[J.spec]),B=V.useMemo(()=>e(U),[U]),$=XG({...J.merged.formOptions,resolver:JG(B),defaultValues:J.options?.defaultValues}),I=$.watch(),q=(_,Z)=>{let z=J.merged.driver.Field,O=J.merged.driver.FieldLabel,y=J.merged.driver.FieldDescription,C=J.merged.driver.FieldError,T=d(Z,_.name),D=YG(Z),k=n(I,_.visibleWhen,D),P=n(I,_.enabledWhen,D),R=GG(_),S=Boolean($.getFieldState(T)?.invalid);if(!k)return null;let L={name:T,id:T.replace(/\./g,"-"),enabled:P,readOnly:R,visible:k},K={"data-invalid":S,hidden:!k,disabled:!P||R},Q=_.labelI18n?Y(O,{htmlFor:L.id,children:_.labelI18n}):null,M=_.descriptionI18n?Y(y,{children:_.descriptionI18n}):null;if(_.kind==="group")return w(z,{...K,children:[Q,_.fields.map((N,W)=>Y(V.Fragment,{children:q(N,T)},`${T}-${W}`)),M]});if(_.kind==="array")return Y(zG,{driver:J.merged.driver,form:$,spec:_,parent:Z,renderField:q},T);if(_.kind==="select")return Y(ZG,{driver:J.merged.driver,form:$,values:I,spec:_,ctx:L,labelNode:Q,descNode:M,commonWrapProps:K,resolvers:J.merged.resolvers},T);if(_.kind==="radio")return Y(qG,{driver:J.merged.driver,form:$,values:I,spec:_,ctx:L,labelNode:Q,descNode:M,commonWrapProps:K,resolvers:J.merged.resolvers},T);if(_.kind==="autocomplete")return Y(TG,{driver:J.merged.driver,form:$,values:I,spec:_,ctx:L,labelNode:Q,descNode:M,commonWrapProps:K,resolvers:J.merged.resolvers},T);if(_.kind==="address")return Y(wG,{driver:J.merged.driver,form:$,values:I,spec:_,ctx:L,labelNode:Q,descNode:M,commonWrapProps:K,resolvers:J.merged.resolvers},T);if(_.kind==="phone")return Y(KG,{driver:J.merged.driver,form:$,values:I,spec:_,ctx:L,labelNode:Q,descNode:M,commonWrapProps:K,resolvers:J.merged.resolvers},T);if(_.kind==="date")return Y(QG,{driver:J.merged.driver,form:$,spec:_,ctx:L,labelNode:Q,descNode:M,commonWrapProps:K},T);if(_.kind==="time")return Y(MG,{driver:J.merged.driver,form:$,spec:_,ctx:L,labelNode:Q,descNode:M,commonWrapProps:K},T);if(_.kind==="datetime")return Y(VG,{driver:J.merged.driver,form:$,spec:_,ctx:L,labelNode:Q,descNode:M,commonWrapProps:K},T);return Y(A,{name:T,control:$.control,render:({field:N,fieldState:W})=>{let h=W.error?[W.error]:[];if(_.kind==="text"){let E=_;return w(z,{...K,children:[Q,Y(J.merged.driver.Input,{id:L.id,"aria-invalid":W.invalid||void 0,placeholder:_.placeholderI18n,autoComplete:E.autoComplete,inputMode:E.inputMode,maxLength:E.maxLength,minLength:E.minLength,disabled:!L.enabled,readOnly:L.readOnly,...N,..._.uiProps}),M,W.invalid?Y(C,{errors:h}):null]})}if(_.kind==="textarea"){let E=_;return w(z,{...K,children:[Q,Y(J.merged.driver.Textarea,{id:L.id,"aria-invalid":W.invalid||void 0,placeholder:_.placeholderI18n,rows:E.rows,maxLength:E.maxLength,disabled:!L.enabled,readOnly:L.readOnly,...N,..._.uiProps}),M,W.invalid?Y(C,{errors:h}):null]})}if(_.kind==="checkbox")return w(z,{...K,children:[Q,Y(J.merged.driver.Checkbox,{id:L.id,name:L.name,disabled:!L.enabled||L.readOnly,checked:Boolean(N.value),onCheckedChange:(E)=>{if(L.readOnly)return;N.onChange(E)},..._.uiProps}),M,W.invalid?Y(C,{errors:h}):null]});if(_.kind==="switch")return w(z,{...K,children:[Q,Y(J.merged.driver.Switch,{id:L.id,name:L.name,disabled:!L.enabled||L.readOnly,checked:Boolean(N.value),onCheckedChange:(E)=>{if(L.readOnly)return;N.onChange(E)},..._.uiProps}),M,W.invalid?Y(C,{errors:h}):null]});return Y(EG,{})}},T)},b=async(_)=>{let Z=U.actions?.[0]?.key??"submit";if(J.merged.onSubmitOverride)return J.merged.onSubmitOverride(_,Z)};return w("form",{onSubmit:$.handleSubmit(b),children:[U.fields.map((_,Z)=>Y(V.Fragment,{children:q(_)},Z)),U.actions?.length?Y("div",{children:U.actions.map((_)=>Y(J.merged.driver.Button,{type:"submit",children:_.labelI18n},_.key))}):null]})}return{render:(J,U)=>Y(X,{spec:J,options:U,merged:{...H,...U?.overrides??{}}})}}export{PG as shadcnDriver,AG as rnReusablesDriver,SG as renderFeaturePresentation,vG as registerFeature,x as mapAutocompleteValue,IG as filterAutocompleteOptions,aG as createFormRenderer,xG as createFeatureModule,gG as createEngineWithDefaults};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contractspec/lib.contracts-runtime-client-react",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.9.0",
|
|
4
4
|
"description": "React runtime adapters for ContractSpec contracts",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -30,9 +30,9 @@
|
|
|
30
30
|
"react-hook-form": "^7.72.0"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@contractspec/lib.contracts-spec": "5.
|
|
33
|
+
"@contractspec/lib.contracts-spec": "5.3.0",
|
|
34
34
|
"@contractspec/lib.schema": "3.7.14",
|
|
35
|
-
"@contractspec/lib.presentation-runtime-core": "3.9.
|
|
35
|
+
"@contractspec/lib.presentation-runtime-core": "3.9.7"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"@contractspec/tool.typescript": "3.7.13",
|