@bgscore/react-form 1.0.36 → 1.0.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var ne=require('react'),jsxRuntime=require('react/jsx-runtime'),reactCore=require('@bgscore/react-core'),reactHookForm=require('react-hook-form');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var ne__default=/*#__PURE__*/_interopDefault(ne);var q=ne.createContext(void 0);function A(){let e=ne.useContext(q);return e||{}}function O({children:e,controller:a,onSubmit:o,onFieldChange:n=()=>{}}){let d={...a,triggerSubmit:async(t,l)=>{a.setIsSubmit(true);let i=l?await a.formControl.trigger():true,s=a.getData();i&&o&&o({...s,...t},{...a});},onFieldChange:n};return jsxRuntime.jsx(q.Provider,{value:d,children:e})}var W=new WeakMap;function V(e){return W.has(e)||W.set(e,reactCore.createStore({})),W.get(e)}function U(e){if(typeof e!="object"||e===null||Array.isArray(e))return e;let a={};for(let[o,n]of Object.entries(e))if(o.includes(".")){let u=o.split("."),d=a;for(let t=0;t<u.length;t++){let l=u[t];t===u.length-1?d[l]=U(n):((!d[l]||typeof d[l]!="object")&&(d[l]={}),d=d[l]);}}else a[o]=U(n);return a}function K(){return reactCore.createTable({name:"draft",primaryKey:"field_1731131919872_aj29d"})}var Q=ne.createContext(void 0);function I(){let e=ne.useContext(Q);return e||{}}function H({children:e,value:a}){return jsxRuntime.jsx(Q.Provider,{value:a,children:e})}function E(){let{dbName:e="bgs-react-form"}=I();return reactCore.createDatabase({dbName:e,table:{draft:K()}})}function _(e){let a=E(),o=reactCore.useDbLiveFlag(a.draft.detail,{key:e}),n=async(t,l)=>{let s={...await d(),...t};Object.keys(s).forEach(c=>{reactCore.isNotEmpty(s[c])||delete s[c];});let r=Object.keys(s);if(r.length===1&&r[0]==="field_1731131919872_aj29d")return u();r.some(c=>c!=="field_1731131919872_aj29d"&&s[c]!==reactCore.getFieldValue(l,c))?await a.draft.put(e,s):await u();},u=async()=>{await a.draft.remove(e);},d=async()=>await a.draft.detail(e);return {isDraft:o,saveDraft:n,removeDraft:u,getDataDraft:d}}var Y=(e={})=>{e.defaultValues||(e.defaultValues={}),e.defaultValues=U(e.defaultValues);let a=ne.useRef(null),[o,n]=ne.useState(false),u=e?.draftKey,d=u?_(u):void 0,t=ne.useRef([]),l=ne.useCallback(f=>{let F=t.current.findIndex(g=>g.id===f.id);if(F>-1){let g=[...t.current];g[F]=f,t.current=[...g];}else t.current.push(f);},[t]),i=ne.useCallback(f=>{t.current=t.current.filter(F=>F.id!==f);},[]),s=reactHookForm.useForm({reValidateMode:"onSubmit",mode:"all",...e}),r=V(s),p=ne.useMemo(()=>reactCore.generateUUID(),[]),c=f=>f?reactCore.getFieldValue(reactCore.mappingUndefinedtoNull(s.getValues()),f):reactCore.mappingUndefinedtoNull(s.getValues()),b=f=>{f?typeof f=="string"?s.resetField(f,{}):typeof f=="object"&&reactCore.isArray(f,0)&&f.forEach(F=>s.resetField(F)):s.reset();},P={...s,ref:a,reset:b,updateData:(f,F)=>{let g=c();s.reset(U({...g,...f}),F);},getData:c,formControl:s,useFieldArray:f=>reactHookForm.useFieldArray({control:s.control,name:f}),useWatch:f=>reactHookForm.useWatch({control:s.control,name:f}),isSubmit:o,formId:p,setIsSubmit:n,useSelected:f=>r.useStore(F=>reactCore.getFieldValue(F,f)),setSelected:r.setState,isDraft:!!d?.isDraft,removeDraft:()=>{d?.removeDraft?.();},resetDraft:()=>{d?.removeDraft?.(),b();},saveDraft:(...f)=>d?.saveDraft?.(...f),getDataDraft:()=>d?.getDataDraft?.(),draftKey:u,registerItem:l,unregisterItem:i,items:t.current,getItems:()=>t.current};return [P,P]};var je=({asChild:e,onSubmit:a,onChange:o,onInvalid:n,onFieldChange:u,formData:d,controller:t,children:l,...i})=>{d&&(d=U(d));let s=t??Y({draftKey:i.draftKey}),[r]=Array.isArray(s)?s:[s],p=r.draftKey,c=ne.useRef(true),b=ne.useRef(void 0),{autoSaveDelay:P=.5}=I(),f=async y=>{y.preventDefault(),y.stopPropagation(),r.setIsSubmit(true);let T=await r.formControl.trigger(),x=r.getData();T?a&&a({...x},{...r}):n&&n(r.formControl.formState.errors);},F=async()=>{if(!p)return;let y=await r.getDataDraft();y&&Object.entries(y).forEach(([T,x])=>{T==="field_1731131919872_aj29d"||!reactCore.isNotEmpty(x)||(r.setValue(T,x),r.trigger(T));});},g=()=>{if(d){let y={...d};reactCore.diffJson(b.current||{},y)&&(r.updateData(y),b.current=y,setTimeout(F,0));}};ne.useEffect(()=>{g();},[d,r.formControl.reset]),ne.useEffect(()=>{if(!o)return;let y=r.formControl.watch((T,x)=>o(T,x,r));return ()=>y.unsubscribe()},[]),ne.useEffect(()=>{c.current=true;},[p]),ne.useEffect(()=>{c.current&&r?.isDraft&&(c.current=false,F());},[r.isDraft,p]);let h=ne.useMemo(()=>reactCore.debounce((y,T,x)=>{x?.saveDraft?.({[y]:T},d);},P),[d,P]),v=async(y,T,x)=>{u?.(y,T,x),h(y,T,x);},m={...i};return delete m?.draftKey,jsxRuntime.jsx(jsxRuntime.Fragment,{children:jsxRuntime.jsx(O,{controller:{...r,disabled:i?.disabled,readOnly:i?.readOnly},onSubmit:a,onFieldChange:v,children:e?jsxRuntime.jsx("div",{id:r.formId,children:l}):jsxRuntime.jsx("form",{...m,id:r.formId,ref:r.ref,onSubmit:f,children:l})})})},re=je;var te=ne.createContext(void 0);function G(){let e=ne.useContext(te);return e||{}}function N({children:e,...a}){return jsxRuntime.jsx(te.Provider,{value:a,children:e})}var oe=e=>{let a=A(),o=reactHookForm.useFieldArray({control:a.control,name:e}),u={formArrayId:ne.useMemo(()=>reactCore.generateUUID(),[]),name:e,...o,...a};return [u,u]};var ae=({defaultData:e,controller:a,children:o,...n})=>{let u=a??oe(n?.name),d=ne.useRef(false),[t]=Array.isArray(u)?u:[u],l=t.name;return ne.useEffect(()=>{d.current||e&&(t.fields.length>0||(typeof e=="boolean"?(t.append({}),d.current=true):typeof e=="number"&&e>0?(t.append([...Array(e).fill(null).map(()=>({}))]),d.current=true):typeof e=="object"&&(t.append(e),d.current=true)));},[]),jsxRuntime.jsx(jsxRuntime.Fragment,{children:t.fields.map((i,s)=>{let r=`${l}.${s}.`,p={...t,index:s,fieldId:i.id,name:r,countFields:t.fields.length,removeItem:()=>t.remove(s),watchItem:c=>t.watch(c?`${r}${c}`:r.slice(0,-1)),setValueItem:(c,b)=>t.setValue(`${r}${c}`,b),useSelectedItem:c=>t.useSelected(`${r}${c}`)};return jsxRuntime.jsx(ne__default.default.Fragment,{children:jsxRuntime.jsx(N,{...p,children:reactCore.renderChildren(o,p)})},i.id)})})};ae.displayName="BgsFormArray";var Ye=ae;ne__default.default.memo(({children:e,props:a})=>jsxRuntime.jsx(jsxRuntime.Fragment,{children:reactCore.renderChildren(e,a)}));var me=ne.createContext(void 0);function k(){let e=ne.useContext(me);return e||{}}function M({children:e,...a}){return jsxRuntime.jsx(me.Provider,{value:a,children:e})}var le=({children:e,...a})=>{let o=A(),n=ne.useMemo(()=>reactCore.generateUUID(),[]);return jsxRuntime.jsx(jsxRuntime.Fragment,{children:jsxRuntime.jsx(M,{...o,...a,formGroupId:n,children:e})})};le.displayName="BgsFormGroup";var sr=le;var ir=/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;function L({validationRules:e,label:a},o,n){let{formControl:u,getData:d}=o,t=[];return e&&(typeof e=="string"?ue(n,e,true,a,u,d,{}).forEach(l=>t.push(l)):typeof e=="object"&&Object.keys(e).forEach(l=>{let{validate:i}=t.find(r=>r.validate)||{};if(["minLength","maxLength","min","max","match","diff","regexp","pattern","required","email"].includes(l)){let r=e[l],p="";["match","diff"].includes(l)&&typeof r=="object"&&(r=e[l].dataField,p=e[l].label),r!=null&&ue(n,l,r,a,u,d,i,p).forEach(c=>t.push(c));}else if(typeof e[l]=="object"){let r=e[l];t.push({validate:{...i,[l]:p=>r.validation(p)||r.message&&(typeof r.message=="string"?r.message:r.message(a))}});}})),Object.assign({},...t)}var ue=(e,a,o,n,u,d,t,l)=>{let i=[],{required:s,minLength:r,maxLength:p,min:c,max:b,email:P,match:f,diff:F,pattern:g}=e||{},v={required:m=>{if(!o)return true;let y=s?s(n):`${n} is required`;return typeof m=="string"&&!m.trim()||m==null?y:true},minLength:{value:o,message:r?r(n,o):`${n} must be at least ${o} characters long`},maxLength:{value:o,message:p?p(n,o):`${n} cannot be more than ${o} characters long`},min:{value:Number(o),message:c?c(n,o):`${n} should be at least ${o}`},max:{value:Number(o),message:b?b(n,o):`${n} should be at most ${o}`},regexp:(m="")=>m?new RegExp(o.regexp).test(m)||`${n} ${o.message}`:true,email:(m="")=>!o||!m?true:ir.test(m)||(P?P(n):`${n} must be type email`),match:(m="")=>m?m===(d&&d(o))||(f?f(n,l||reactCore.labelFormatter.changeAll(o)):`${n} must be same with ${l||reactCore.labelFormatter.changeAll(o)}`):true,diff:(m="")=>m?m!==(d&&d(o))||(F?F(n,l||reactCore.labelFormatter.changeAll(o)):`${n} must be different with ${l||reactCore.labelFormatter.changeAll(o)}`):true,pattern:{alphabet:(m="")=>!!m&&new RegExp("^[A-Za-z ]*$").test(m)||(g?.alphabet?g?.alphabet(n):`${n} must be format Alphabet`),alphanumber:(m="")=>!!m&&new RegExp("^[A-Za-z0-9 ]*$").test(m)||(g?.alphanumber?g?.alphanumber(n):`${n} must be format Alphabet or Number`),number:(m="")=>!!m&&new RegExp("^[0-9]*$").test(m)||(g?.number?g?.number(n):`${n} must be format Number`),lowercase:(m="")=>!!m&&new RegExp("^[a-z0-9 ]*$").test(m)||(g?.lowercase?g?.lowercase(n):`${n} must be format Lowercase`),url:(m="")=>!!m&&/^(ftp|http|https):\/\/[^ "]+$/.test(m)||(g?.url?g?.url(n):`${n} must be a valid URL`),uppercase:(m="")=>!!m&&new RegExp("^[A-Z0-9 ]*$").test(m)||(g?.uppercase?g?.uppercase(n):`${n} must be format Uppercase`),mixedcase:(m="")=>!!m&&/[a-z]/.test(m)&&/[A-Z]/.test(m)||(g?.mixedcase?g?.mixedcase(n):`${n} must be mixed case`),specialcharacters:(m="")=>!!m&&/[^a-zA-Z0-9\s]/.test(m)||(g?.specialcharacters?g?.specialcharacters(n):`${n} must contain special characters`)}}[a];if(v){let{validate:m}=i.find(y=>y.validate)||{};typeof v=="function"?i.push({validate:{...m,...t,[a]:v}}):a==="pattern"?i.push({validate:{...m,...t,[`${a}${o}`]:v[o]}}):i.push({[a]:v});}return i};var kt=e=>{let a=ne.useMemo(()=>reactCore.generateUUID(),[]),o=A(),{validationMessage:n}=I(),{registerItem:u,unregisterItem:d,control:t,disabled:l,readOnly:i,formId:s,setSelected:r,useSelected:p,onFieldChange:c}=o,{name:b,formId:P,...f}=k(),{name:F,formId:g}=G(),h=ne.useMemo(()=>{let R=e.dataField;return e.disabledHierarchy||(F&&s===g&&(R=`${F}${R}`),b&&s===P&&(R=`${b}${R}`)),R},[F,s,g,e.dataField,b,P,e.disabledHierarchy]),v=ne.useMemo(()=>{if(e.label)return e.label;if(!e.noLabel)return reactCore.labelFormatter.changeAll(h)},[e.label,e.noLabel,h]);ne.useEffect(()=>(u({id:a,...e,dataField:h,label:v}),()=>{d(a);}),[a,e,h,v]);let m=ne.useMemo(()=>typeof e.disabled=="boolean"?e.disabled:typeof f.disabled=="boolean"?f.disabled:!!l,[e.disabled,f.disabled,l]),y=ne.useMemo(()=>typeof e.readOnly=="boolean"?e.readOnly:typeof f.readOnly=="boolean"?f.readOnly:!!i,[e.readOnly,f.readOnly,i]),T=ne.useMemo(()=>typeof e.hidden=="boolean"?e.hidden:false,[e.hidden]),x=ne.useMemo(()=>{if(typeof e.required=="boolean"){if(typeof e.validationRules>"u")return {required:e.required};if(typeof e.validationRules=="string"&&e.validationRules==="email")return {email:true,required:e.required};if(typeof e.validationRules=="object")return {...e.validationRules,required:e.required}}return e.validationRules},[e.validationRules,e.required]),fe=ne.useMemo(()=>m||y||T?{required:false}:L({validationRules:x,label:v},o,n),[m,y,T,x,v,h,o,n]),S=reactHookForm.useController({name:h,control:t,disabled:m,defaultValue:e.defaultValue,shouldUnregister:e.shouldUnregister,rules:fe}),ce=S.fieldState.invalid,pe=S.fieldState.error?.message,ge=reactHookForm.useWatch({name:h,control:t,defaultValue:e.defaultValue}),ye=ne.useMemo(()=>reactCore.debounce(R=>r(he=>({...he,[h]:R||null}))),[r,h]),Fe=p(h),be=x?.required;return {...e,setSelectedField:ye,label:v,dataField:h,controller:S,invalid:ce,messageError:pe,selectedField:Fe,value:ge,required:be,onChange:R=>{S.field.onChange(R),c?.(h,R,o);}}};var jt=()=>{let{formControl:e,items:a}=A(),o=(u,d,t,l=0)=>{let i=[];if(Array.isArray(t))t.forEach((s,r)=>{let p=Object.entries(s||{}).map(([c,b])=>o(`${u}.${r}.${c}`,`${d}[]${c}`,b,t.length>1?r+1:0)).flat();i=[...i,...p];});else if(t&&typeof t=="object"&&!Array.isArray(t)&&!t?.ref)Object.entries(t).map(([s,r])=>{let p=o(`${u}.${s}`,`${u}.${s}`,r);i=[...i,...p];});else {let s=t?.message||"",r=a.find(p=>p.dataField===d)?.label;i.push({label:`${r||""}${l>0?` ${l}`:""}`,message:s,dataField:u});}return i};return Object.entries(e.formState.errors||{}).map(([u,d])=>o(u,u,d)).flat()};function Ht(e){let{watch:a}=A(),o=ne.useMemo(()=>{let t=new Set,l=i=>{if(i)for(let[s,r]of Object.entries(i)){if(s==="and"||s==="or"){r?.forEach(l);continue}r&&typeof r=="object"&&"fromField"in r&&typeof r.fromField=="string"&&t.add(r.fromField);}};return l(e),Array.from(t)},[e]),n=o.length?a(o):[],u=ne.useMemo(()=>{let t={};return o.forEach((l,i)=>{t[l]=n?.[i];}),t},[o,n]),d=ne.useCallback(t=>{if(!t)return t;let l={};for(let[i,s]of Object.entries(t)){if(i==="and"||i==="or"){l[i]=s?.map(r=>d(r))??s;continue}if(s&&typeof s=="object"&&"fromField"in s){let r=s,p={...r},c=r.fromField;c&&c in u?p.value=u[c]:p.value=r.value,delete p.fromField,l[i]=p;}else l[i]=s;}return l},[u]);return ne.useMemo(()=>d(e)??{},[e,d])}var gr=(i=>(i.alphabet="alphabet",i.alphaNumber="alphanumber",i.number="number",i.lowercase="lowercase",i.url="url",i.uppercase="uppercase",i.mixedCase="mixedcase",i.specialCharacters="specialcharacters",i))(gr||{});var Jt=re;exports.BgsFormArray=Ye;exports.BgsFormGroup=sr;exports.BgsReactFormProvider=H;exports.PatternTypeEnum=gr;exports.default=Jt;exports.useBgsController=kt;exports.useBgsForm=A;exports.useBgsFormArray=G;exports.useBgsFormArrayInit=oe;exports.useBgsFormGroup=k;exports.useBgsFormInit=Y;exports.useResolvedQuery=Ht;exports.useSummaryValidation=jt;
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var ne=require('react'),jsxRuntime=require('react/jsx-runtime'),reactCore=require('@bgscore/react-core'),reactHookForm=require('react-hook-form');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var ne__default=/*#__PURE__*/_interopDefault(ne);var q=ne.createContext(void 0);function A(){let e=ne.useContext(q);return e||{}}function O({children:e,controller:a,onSubmit:o,onFieldChange:n=()=>{}}){let d={...a,triggerSubmit:async(t,l)=>{a.setIsSubmit(true);let i=l?await a.formControl.trigger():true,s=a.getData();i&&o&&o({...s,...t},{...a});},onFieldChange:n};return jsxRuntime.jsx(q.Provider,{value:d,children:e})}var K=new WeakMap;function V(e){return K.has(e)||K.set(e,reactCore.createStore({})),K.get(e)}function U(e){if(typeof e!="object"||e===null||Array.isArray(e))return e;let a={};for(let[o,n]of Object.entries(e))if(o.includes(".")){let u=o.split("."),d=a;for(let t=0;t<u.length;t++){let l=u[t];t===u.length-1?d[l]=U(n):((!d[l]||typeof d[l]!="object")&&(d[l]={}),d=d[l]);}}else a[o]=U(n);return a}function W(){return reactCore.createTable({name:"draft",primaryKey:"field_1731131919872_aj29d"})}var Q=ne.createContext(void 0);function I(){let e=ne.useContext(Q);return e||{}}function H({children:e,value:a}){return jsxRuntime.jsx(Q.Provider,{value:a,children:e})}function N(){let{dbName:e="bgs-react-form"}=I();return reactCore.createDatabase({dbName:e,table:{draft:W()}})}function _(e){let a=N(),o=reactCore.useDbLiveFlag(a.draft.detail,{key:e}),n=async(t,l)=>{let s={...await d(),...t};Object.keys(s).forEach(c=>{reactCore.isNotEmpty(s[c])||delete s[c];});let r=Object.keys(s);if(r.length===1&&r[0]==="field_1731131919872_aj29d")return u();r.some(c=>c!=="field_1731131919872_aj29d"&&s[c]!==reactCore.getFieldValue(l,c))?await a.draft.put(e,s):await u();},u=async()=>{await a.draft.remove(e);},d=async()=>await a.draft.detail(e);return {isDraft:o,saveDraft:n,removeDraft:u,getDataDraft:d}}var Y=(e={})=>{e.defaultValues||(e.defaultValues={}),e.defaultValues=U(e.defaultValues);let a=ne.useRef(null),[o,n]=ne.useState(false),u=e?.draftKey,d=u?_(u):void 0,t=ne.useRef([]),l=ne.useCallback(f=>{let F=t.current.findIndex(g=>g.id===f.id);if(F>-1){let g=[...t.current];g[F]=f,t.current=[...g];}else t.current.push(f);},[t]),i=ne.useCallback(f=>{t.current=t.current.filter(F=>F.id!==f);},[]),s=reactHookForm.useForm({reValidateMode:"onSubmit",mode:"all",...e}),r=V(s),p=ne.useMemo(()=>reactCore.generateUUID(),[]),c=f=>f?reactCore.getFieldValue(reactCore.mappingUndefinedtoNull(s.getValues()),f):reactCore.mappingUndefinedtoNull(s.getValues()),h=f=>{f?typeof f=="string"?s.resetField(f,{}):typeof f=="object"&&reactCore.isArray(f,0)&&f.forEach(F=>s.resetField(F)):s.reset();},v={...s,ref:a,reset:h,updateData:(f,F)=>{let g=c();s.reset(U({...g,...f}),F);},getData:c,formControl:s,useFieldArray:f=>reactHookForm.useFieldArray({control:s.control,name:f}),useWatch:f=>reactHookForm.useWatch({control:s.control,name:f}),isSubmit:o,formId:p,setIsSubmit:n,useSelected:f=>r.useStore(F=>reactCore.getFieldValue(F,f)),setSelected:r.setState,isDraft:!!d?.isDraft,removeDraft:()=>{d?.removeDraft?.();},resetDraft:()=>{d?.removeDraft?.(),h();},saveDraft:(...f)=>d?.saveDraft?.(...f),getDataDraft:()=>d?.getDataDraft?.(),draftKey:u,registerItem:l,unregisterItem:i,items:t.current,getItems:()=>t.current};return [v,v]};var je=({asChild:e,onSubmit:a,onChange:o,onInvalid:n,onFieldChange:u,formData:d,controller:t,children:l,...i})=>{d&&(d=U(d));let s=t??Y({draftKey:i.draftKey}),[r]=Array.isArray(s)?s:[s],p=r.draftKey,c=ne.useRef(true),h=ne.useRef(void 0),{autoSaveDelay:v=.5}=I(),f=async y=>{y.preventDefault(),y.stopPropagation(),r.setIsSubmit(true);let T=await r.formControl.trigger(),P=r.getData();T?a&&a({...P},{...r}):n&&n(r.formControl.formState.errors);},F=async()=>{if(!p)return;let y=await r.getDataDraft();y&&Object.entries(y).forEach(([T,P])=>{T==="field_1731131919872_aj29d"||!reactCore.isNotEmpty(P)||(r.setValue(T,P),r.trigger(T));});},g=()=>{if(d){let y={...d};reactCore.diffJson(h.current||{},y)&&(r.updateData(y),h.current=y,setTimeout(F,0));}};ne.useEffect(()=>{g();},[d,r.formControl.reset]),ne.useEffect(()=>{if(!o)return;let y=r.formControl.watch((T,P)=>o(T,P,r));return ()=>y.unsubscribe()},[]),ne.useEffect(()=>{c.current=true;},[p]),ne.useEffect(()=>{c.current&&r?.isDraft&&(c.current=false,F());},[r.isDraft,p]);let b=ne.useMemo(()=>reactCore.debounce((y,T,P)=>{P?.saveDraft?.({[y]:T},d);},v),[d,v]),x=async(y,T,P)=>{u?.(y,T,P),b(y,T,P);},m={...i};return delete m?.draftKey,jsxRuntime.jsx(jsxRuntime.Fragment,{children:jsxRuntime.jsx(O,{controller:{...r,disabled:i?.disabled,readOnly:i?.readOnly},onSubmit:a,onFieldChange:x,children:e?jsxRuntime.jsx("div",{id:r.formId,children:l}):jsxRuntime.jsx("form",{...m,id:r.formId,ref:r.ref,onSubmit:f,children:l})})})},re=je;var te=ne.createContext(void 0);function E(){let e=ne.useContext(te);return e||{}}function G({children:e,...a}){return jsxRuntime.jsx(te.Provider,{value:a,children:e})}var oe=e=>{let a=A(),o=reactHookForm.useFieldArray({control:a.control,name:e}),u={formArrayId:ne.useMemo(()=>reactCore.generateUUID(),[]),name:e,...o,...a};return [u,u]};var ae=({defaultData:e,controller:a,children:o,...n})=>{let u=a??oe(n?.name),d=ne.useRef(false),[t]=Array.isArray(u)?u:[u],l=t.name;return ne.useEffect(()=>{d.current||e&&(t.fields.length>0||(typeof e=="boolean"?(t.append({}),d.current=true):typeof e=="number"&&e>0?(t.append([...Array(e).fill(null).map(()=>({}))]),d.current=true):typeof e=="object"&&(t.append(e),d.current=true)));},[]),jsxRuntime.jsx(jsxRuntime.Fragment,{children:t.fields.map((i,s)=>{let r=`${l}.${s}.`,p={...t,index:s,fieldId:i.id,name:r,countFields:t.fields.length,removeItem:()=>t.remove(s),watchItem:c=>t.watch(c?`${r}${c}`:r.slice(0,-1)),setValueItem:(c,h)=>t.setValue(`${r}${c}`,h),useSelectedItem:c=>t.useSelected(`${r}${c}`)};return jsxRuntime.jsx(ne__default.default.Fragment,{children:jsxRuntime.jsx(G,{...p,children:reactCore.renderChildren(o,p)})},i.id)})})};ae.displayName="BgsFormArray";var Ye=ae;ne__default.default.memo(({children:e,props:a})=>jsxRuntime.jsx(jsxRuntime.Fragment,{children:reactCore.renderChildren(e,a)}));var me=ne.createContext(void 0);function k(){let e=ne.useContext(me);return e||{}}function M({children:e,...a}){return jsxRuntime.jsx(me.Provider,{value:a,children:e})}var le=({children:e,...a})=>{let o=A(),n=ne.useMemo(()=>reactCore.generateUUID(),[]);return jsxRuntime.jsx(jsxRuntime.Fragment,{children:jsxRuntime.jsx(M,{...o,...a,formGroupId:n,children:e})})};le.displayName="BgsFormGroup";var sr=le;var ir=/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;function L({validationRules:e,label:a},o,n){let{formControl:u,getData:d}=o,t=[];return e&&(typeof e=="string"?ue(n,e,true,a,u,d,{}).forEach(l=>t.push(l)):typeof e=="object"&&Object.keys(e).forEach(l=>{let{validate:i}=t.find(r=>r.validate)||{};if(["minLength","maxLength","min","max","match","diff","regexp","pattern","required","email"].includes(l)){let r=e[l],p="";["match","diff"].includes(l)&&typeof r=="object"&&(r=e[l].dataField,p=e[l].label),r!=null&&ue(n,l,r,a,u,d,i,p).forEach(c=>t.push(c));}else if(typeof e[l]=="object"){let r=e[l];t.push({validate:{...i,[l]:p=>r.validation(p)||r.message&&(typeof r.message=="string"?r.message:r.message(a))}});}})),Object.assign({},...t)}var ue=(e,a,o,n,u,d,t,l)=>{let i=[],{required:s,minLength:r,maxLength:p,min:c,max:h,email:v,match:f,diff:F,pattern:g}=e||{},x={required:m=>{if(!o)return true;let y=s?s(n):`${n} is required`;return typeof m=="string"&&!m.trim()||m==null?y:true},minLength:{value:o,message:r?r(n,o):`${n} must be at least ${o} characters long`},maxLength:{value:o,message:p?p(n,o):`${n} cannot be more than ${o} characters long`},min:{value:Number(o),message:c?c(n,o):`${n} should be at least ${o}`},max:{value:Number(o),message:h?h(n,o):`${n} should be at most ${o}`},regexp:(m="")=>m?new RegExp(o.regexp).test(m)||`${n} ${o.message}`:true,email:(m="")=>!o||!m?true:ir.test(m)||(v?v(n):`${n} must be type email`),match:(m="")=>m?m===(d&&d(o))||(f?f(n,l||reactCore.labelFormatter.changeAll(o)):`${n} must be same with ${l||reactCore.labelFormatter.changeAll(o)}`):true,diff:(m="")=>m?m!==(d&&d(o))||(F?F(n,l||reactCore.labelFormatter.changeAll(o)):`${n} must be different with ${l||reactCore.labelFormatter.changeAll(o)}`):true,pattern:{alphabet:(m="")=>!!m&&new RegExp("^[A-Za-z ]*$").test(m)||(g?.alphabet?g?.alphabet(n):`${n} must be format Alphabet`),alphanumber:(m="")=>!!m&&new RegExp("^[A-Za-z0-9 ]*$").test(m)||(g?.alphanumber?g?.alphanumber(n):`${n} must be format Alphabet or Number`),number:(m="")=>!!m&&new RegExp("^[0-9]*$").test(m)||(g?.number?g?.number(n):`${n} must be format Number`),lowercase:(m="")=>!!m&&new RegExp("^[a-z0-9 ]*$").test(m)||(g?.lowercase?g?.lowercase(n):`${n} must be format Lowercase`),url:(m="")=>!!m&&/^(ftp|http|https):\/\/[^ "]+$/.test(m)||(g?.url?g?.url(n):`${n} must be a valid URL`),uppercase:(m="")=>!!m&&new RegExp("^[A-Z0-9 ]*$").test(m)||(g?.uppercase?g?.uppercase(n):`${n} must be format Uppercase`),mixedcase:(m="")=>!!m&&/[a-z]/.test(m)&&/[A-Z]/.test(m)||(g?.mixedcase?g?.mixedcase(n):`${n} must be mixed case`),specialcharacters:(m="")=>!!m&&/[^a-zA-Z0-9\s]/.test(m)||(g?.specialcharacters?g?.specialcharacters(n):`${n} must contain special characters`)}}[a];if(x){let{validate:m}=i.find(y=>y.validate)||{};typeof x=="function"?i.push({validate:{...m,...t,[a]:x}}):a==="pattern"?i.push({validate:{...m,...t,[`${a}${o}`]:x[o]}}):i.push({[a]:x});}return i};var kt=e=>{let a=ne.useMemo(()=>reactCore.generateUUID(),[]),o=A(),{validationMessage:n}=I(),{registerItem:u,unregisterItem:d,control:t,disabled:l,readOnly:i,formId:s,setSelected:r,useSelected:p,onFieldChange:c}=o,{name:h,formId:v,...f}=k(),{name:F,formId:g}=E(),b=ne.useMemo(()=>{let R=e.dataField;return e.disabledHierarchy||(F&&s===g&&(R=`${F}${R}`),h&&s===v&&(R=`${h}${R}`)),R},[F,s,g,e.dataField,h,v,e.disabledHierarchy]),x=ne.useMemo(()=>{if(e.label)return e.label;if(!e.noLabel)return reactCore.labelFormatter.changeAll(b)},[e.label,e.noLabel,b]);ne.useEffect(()=>(u({id:a,...e,dataField:b,label:x}),()=>{d(a);}),[a,e,b,x]);let m=ne.useMemo(()=>typeof e.disabled=="boolean"?e.disabled:typeof f.disabled=="boolean"?f.disabled:!!l,[e.disabled,f.disabled,l]),y=ne.useMemo(()=>typeof e.readOnly=="boolean"?e.readOnly:typeof f.readOnly=="boolean"?f.readOnly:!!i,[e.readOnly,f.readOnly,i]),T=ne.useMemo(()=>typeof e.hidden=="boolean"?e.hidden:false,[e.hidden]),P=ne.useMemo(()=>{if(typeof e.required=="boolean"){if(typeof e.validationRules>"u")return {required:e.required};if(typeof e.validationRules=="string"&&e.validationRules==="email")return {email:true,required:e.required};if(typeof e.validationRules=="object")return {...e.validationRules,required:e.required}}return e.validationRules},[e.validationRules,e.required]),fe=ne.useMemo(()=>m||y||T?{required:false}:L({validationRules:P,label:x},o,n),[m,y,T,P,x,b,o,n]),S=reactHookForm.useController({name:b,control:t,disabled:m,defaultValue:e.defaultValue,shouldUnregister:e.shouldUnregister,rules:fe}),ce=S.fieldState.invalid,pe=S.fieldState.error?.message,ge=reactHookForm.useWatch({name:b,control:t,defaultValue:e.defaultValue}),ye=ne.useMemo(()=>reactCore.debounce(R=>r(be=>({...be,[b]:R||null}))),[r,b]),Fe=p(b),he=P?.required;return {...e,setSelectedField:ye,label:x,dataField:b,controller:S,invalid:ce,messageError:pe,selectedField:Fe,value:ge,required:he,onChange:R=>{S.field.onChange(R),c?.(b,R,o);}}};var jt=()=>{let{formControl:e,items:a}=A(),o=(u,d,t,l=0)=>{let i=[];if(Array.isArray(t))t.forEach((s,r)=>{let p=Object.entries(s||{}).map(([c,h])=>o(`${u}.${r}.${c}`,`${d}[]${c}`,h,t.length>1?r+1:0)).flat();i=[...i,...p];});else if(t&&typeof t=="object"&&!Array.isArray(t)&&!t?.ref)Object.entries(t).map(([s,r])=>{let p=o(`${u}.${s}`,`${u}.${s}`,r);i=[...i,...p];});else {let s=t?.message||"",r=a.find(p=>p.dataField===d)?.label;i.push({label:`${r||""}${l>0?` ${l}`:""}`,message:s,dataField:u});}return i};return Object.entries(e.formState.errors||{}).map(([u,d])=>o(u,u,d)).flat()};function Ht(e){let{watch:a}=A(),o=ne.useMemo(()=>{let t=new Set,l=i=>{if(i)for(let[s,r]of Object.entries(i)){if(s==="and"||s==="or"){r?.forEach(l);continue}r&&typeof r=="object"&&"fromField"in r&&typeof r.fromField=="string"&&t.add(r.fromField);}};return l(e),Array.from(t)},[e]),n=o.length?a(o):[],u=ne.useMemo(()=>{let t={};return o.forEach((l,i)=>{t[l]=n?.[i];}),t},[o,n]),d=ne.useCallback(t=>{if(!t)return t;let l={};for(let[i,s]of Object.entries(t)){if(i==="and"||i==="or"){l[i]=s?.map(r=>d(r))??s;continue}if(s&&typeof s=="object"&&"fromField"in s){let r=s,p={...r},c=r.fromField;c&&c in u?p.value=u[c]:p.value=r.value,delete p.fromField,l[i]=p;}else l[i]=s;}return l},[u]);return ne.useMemo(()=>d(e)??{},[e,d])}var gr=(i=>(i.alphabet="alphabet",i.alphaNumber="alphanumber",i.number="number",i.lowercase="lowercase",i.url="url",i.uppercase="uppercase",i.mixedCase="mixedcase",i.specialCharacters="specialcharacters",i))(gr||{});var Jt=re;exports.BgsFormArray=Ye;exports.BgsFormGroup=sr;exports.BgsReactFormProvider=H;exports.PatternTypeEnum=gr;exports.default=Jt;exports.useBgsController=kt;exports.useBgsForm=A;exports.useBgsFormArray=E;exports.useBgsFormArrayInit=oe;exports.useBgsFormGroup=k;exports.useBgsFormInit=Y;exports.useResolvedQuery=Ht;exports.useSummaryValidation=jt;
package/dist/index.d.cts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { PropsWithChildren } from 'react';
3
3
  import { ControllerRenderProps, FieldValues, ControllerFieldState, UseFormStateReturn, UseFormReturn, KeepStateOptions, UseFieldArrayReturn, EventType, FieldErrors, UseFieldArraySwap, UseFieldArrayMove, UseFieldArrayPrepend, UseFieldArrayAppend, UseFieldArrayRemove, UseFieldArrayInsert, UseFieldArrayUpdate, UseFieldArrayReplace, FieldArrayWithId, DeepPartialSkipArrayKey, UseFormProps } from 'react-hook-form';
4
- import { NestedKeyOf as NestedKeyOf$1, QueryOperator, PathValue } from '@bgscore/react-core';
4
+ import { NestedKeyOf as NestedKeyOf$1, QueryOperator, PathValue as PathValue$1 } from '@bgscore/react-core';
5
5
 
6
6
  type ControllerWithKey = ControllerProps & {
7
7
  id: string;
@@ -19,6 +19,7 @@ interface Controller {
19
19
  type NestedKeyOf<T> = T extends object ? T extends Array<infer U> ? `${number}` | `${number}.${NestedKeyOf<U>}` : {
20
20
  [K in keyof T]: T[K] extends Array<infer U> ? `${K & string}` | `${K & string}[${number}]` | `${K & string}[${number}].${NestedKeyOf<U>}` : T[K] extends object ? `${K & string}` | `${K & string}.${NestedKeyOf<T[K]>}` : `${K & string}`;
21
21
  }[keyof T] : never;
22
+ type PathValue<T, P extends string> = P extends `${infer K}[${infer I}].${infer R}` ? K extends keyof T ? T[K] extends Array<infer U> ? PathValue<U, R> : never : never : P extends `${infer K}[${infer I}]` ? K extends keyof T ? T[K] extends Array<infer U> ? U : never : never : P extends `${infer K}.${infer R}` ? K extends keyof T ? PathValue<T[K], R> : never : P extends keyof T ? T[P] : never;
22
23
 
23
24
  type UseDraftReturn<T> = {
24
25
  saveDraft: (values: T, compareData: T) => void;
@@ -53,8 +54,8 @@ type OnChange<T = unknown> = (values: T, event: {
53
54
  }, controller: UseFormInitReturn<T>) => void;
54
55
  type OnFieldChange<T = unknown> = (dataField: string, value: T, controller: UseFormInitReturn<T>) => void;
55
56
  type SetSelectedFn<T> = (newState: SelectedNested<T> | ((prev: SelectedNested<T>) => SelectedNested<T>)) => void;
56
- interface UseFormInitReturn<T = unknown> extends FormDefaultProps, Omit<UseFormReturn, "reset">, UseDraftReturn<T> {
57
- reset: (field?: string | string[]) => void;
57
+ interface UseFormInitReturn<T = unknown> extends FormDefaultProps, Omit<UseFormReturn, "reset" | "watch">, UseDraftReturn<T> {
58
+ reset: <P extends NestedKeyOf<T>>(field?: P | P[]) => void;
58
59
  updateData: (values: Partial<T>, keepStateOptions?: KeepStateOptions) => void;
59
60
  getData: (field?: string) => T;
60
61
  formControl: UseFormReturn;
@@ -73,6 +74,7 @@ interface UseFormInitReturn<T = unknown> extends FormDefaultProps, Omit<UseFormR
73
74
  unregisterItem: (id: string) => void;
74
75
  items: ControllerWithKey[];
75
76
  getItems: () => ControllerWithKey[];
77
+ watch: <P extends NestedKeyOf<T>>(name?: P) => P extends undefined ? T : PathValue<T, P>;
76
78
  }
77
79
  type ArrayWithName<T> = T & {
78
80
  name: string;
@@ -248,12 +250,12 @@ declare const useSummaryValidation: () => SummaryValidation[];
248
250
 
249
251
  interface ResolvedQueryFilterOption<T, P extends NestedKeyOf$1<T>> {
250
252
  opt?: QueryOperator;
251
- value?: PathValue<T, P> | undefined | null;
253
+ value?: PathValue$1<T, P> | undefined | null;
252
254
  required?: boolean;
253
255
  fromField?: string | string[];
254
256
  }
255
257
  type ResolvedQueryCondition<T> = {
256
- [P in NestedKeyOf$1<T>]?: ResolvedQueryFilterOption<T, P> | PathValue<T, P>;
258
+ [P in NestedKeyOf$1<T>]?: ResolvedQueryFilterOption<T, P> | PathValue$1<T, P>;
257
259
  } & {
258
260
  and?: ResolvedQueryCondition<T>[];
259
261
  or?: ResolvedQueryCondition<T>[];
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { PropsWithChildren } from 'react';
3
3
  import { ControllerRenderProps, FieldValues, ControllerFieldState, UseFormStateReturn, UseFormReturn, KeepStateOptions, UseFieldArrayReturn, EventType, FieldErrors, UseFieldArraySwap, UseFieldArrayMove, UseFieldArrayPrepend, UseFieldArrayAppend, UseFieldArrayRemove, UseFieldArrayInsert, UseFieldArrayUpdate, UseFieldArrayReplace, FieldArrayWithId, DeepPartialSkipArrayKey, UseFormProps } from 'react-hook-form';
4
- import { NestedKeyOf as NestedKeyOf$1, QueryOperator, PathValue } from '@bgscore/react-core';
4
+ import { NestedKeyOf as NestedKeyOf$1, QueryOperator, PathValue as PathValue$1 } from '@bgscore/react-core';
5
5
 
6
6
  type ControllerWithKey = ControllerProps & {
7
7
  id: string;
@@ -19,6 +19,7 @@ interface Controller {
19
19
  type NestedKeyOf<T> = T extends object ? T extends Array<infer U> ? `${number}` | `${number}.${NestedKeyOf<U>}` : {
20
20
  [K in keyof T]: T[K] extends Array<infer U> ? `${K & string}` | `${K & string}[${number}]` | `${K & string}[${number}].${NestedKeyOf<U>}` : T[K] extends object ? `${K & string}` | `${K & string}.${NestedKeyOf<T[K]>}` : `${K & string}`;
21
21
  }[keyof T] : never;
22
+ type PathValue<T, P extends string> = P extends `${infer K}[${infer I}].${infer R}` ? K extends keyof T ? T[K] extends Array<infer U> ? PathValue<U, R> : never : never : P extends `${infer K}[${infer I}]` ? K extends keyof T ? T[K] extends Array<infer U> ? U : never : never : P extends `${infer K}.${infer R}` ? K extends keyof T ? PathValue<T[K], R> : never : P extends keyof T ? T[P] : never;
22
23
 
23
24
  type UseDraftReturn<T> = {
24
25
  saveDraft: (values: T, compareData: T) => void;
@@ -53,8 +54,8 @@ type OnChange<T = unknown> = (values: T, event: {
53
54
  }, controller: UseFormInitReturn<T>) => void;
54
55
  type OnFieldChange<T = unknown> = (dataField: string, value: T, controller: UseFormInitReturn<T>) => void;
55
56
  type SetSelectedFn<T> = (newState: SelectedNested<T> | ((prev: SelectedNested<T>) => SelectedNested<T>)) => void;
56
- interface UseFormInitReturn<T = unknown> extends FormDefaultProps, Omit<UseFormReturn, "reset">, UseDraftReturn<T> {
57
- reset: (field?: string | string[]) => void;
57
+ interface UseFormInitReturn<T = unknown> extends FormDefaultProps, Omit<UseFormReturn, "reset" | "watch">, UseDraftReturn<T> {
58
+ reset: <P extends NestedKeyOf<T>>(field?: P | P[]) => void;
58
59
  updateData: (values: Partial<T>, keepStateOptions?: KeepStateOptions) => void;
59
60
  getData: (field?: string) => T;
60
61
  formControl: UseFormReturn;
@@ -73,6 +74,7 @@ interface UseFormInitReturn<T = unknown> extends FormDefaultProps, Omit<UseFormR
73
74
  unregisterItem: (id: string) => void;
74
75
  items: ControllerWithKey[];
75
76
  getItems: () => ControllerWithKey[];
77
+ watch: <P extends NestedKeyOf<T>>(name?: P) => P extends undefined ? T : PathValue<T, P>;
76
78
  }
77
79
  type ArrayWithName<T> = T & {
78
80
  name: string;
@@ -248,12 +250,12 @@ declare const useSummaryValidation: () => SummaryValidation[];
248
250
 
249
251
  interface ResolvedQueryFilterOption<T, P extends NestedKeyOf$1<T>> {
250
252
  opt?: QueryOperator;
251
- value?: PathValue<T, P> | undefined | null;
253
+ value?: PathValue$1<T, P> | undefined | null;
252
254
  required?: boolean;
253
255
  fromField?: string | string[];
254
256
  }
255
257
  type ResolvedQueryCondition<T> = {
256
- [P in NestedKeyOf$1<T>]?: ResolvedQueryFilterOption<T, P> | PathValue<T, P>;
258
+ [P in NestedKeyOf$1<T>]?: ResolvedQueryFilterOption<T, P> | PathValue$1<T, P>;
257
259
  } & {
258
260
  and?: ResolvedQueryCondition<T>[];
259
261
  or?: ResolvedQueryCondition<T>[];
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import ne,{createContext,useContext,useRef,useState,useCallback,useMemo,useEffect}from'react';import {jsx,Fragment}from'react/jsx-runtime';import {renderChildren,generateUUID,getFieldValue,mappingUndefinedtoNull,debounce,labelFormatter,isNotEmpty,diffJson,isArray,useDbLiveFlag,createStore,createDatabase,createTable}from'@bgscore/react-core';import {useForm,useWatch,useFieldArray,useController}from'react-hook-form';var q=createContext(void 0);function A(){let e=useContext(q);return e||{}}function O({children:e,controller:a,onSubmit:o,onFieldChange:n=()=>{}}){let d={...a,triggerSubmit:async(t,l)=>{a.setIsSubmit(true);let i=l?await a.formControl.trigger():true,s=a.getData();i&&o&&o({...s,...t},{...a});},onFieldChange:n};return jsx(q.Provider,{value:d,children:e})}var W=new WeakMap;function V(e){return W.has(e)||W.set(e,createStore({})),W.get(e)}function U(e){if(typeof e!="object"||e===null||Array.isArray(e))return e;let a={};for(let[o,n]of Object.entries(e))if(o.includes(".")){let u=o.split("."),d=a;for(let t=0;t<u.length;t++){let l=u[t];t===u.length-1?d[l]=U(n):((!d[l]||typeof d[l]!="object")&&(d[l]={}),d=d[l]);}}else a[o]=U(n);return a}function K(){return createTable({name:"draft",primaryKey:"field_1731131919872_aj29d"})}var Q=createContext(void 0);function I(){let e=useContext(Q);return e||{}}function H({children:e,value:a}){return jsx(Q.Provider,{value:a,children:e})}function E(){let{dbName:e="bgs-react-form"}=I();return createDatabase({dbName:e,table:{draft:K()}})}function _(e){let a=E(),o=useDbLiveFlag(a.draft.detail,{key:e}),n=async(t,l)=>{let s={...await d(),...t};Object.keys(s).forEach(c=>{isNotEmpty(s[c])||delete s[c];});let r=Object.keys(s);if(r.length===1&&r[0]==="field_1731131919872_aj29d")return u();r.some(c=>c!=="field_1731131919872_aj29d"&&s[c]!==getFieldValue(l,c))?await a.draft.put(e,s):await u();},u=async()=>{await a.draft.remove(e);},d=async()=>await a.draft.detail(e);return {isDraft:o,saveDraft:n,removeDraft:u,getDataDraft:d}}var Y=(e={})=>{e.defaultValues||(e.defaultValues={}),e.defaultValues=U(e.defaultValues);let a=useRef(null),[o,n]=useState(false),u=e?.draftKey,d=u?_(u):void 0,t=useRef([]),l=useCallback(f=>{let F=t.current.findIndex(g=>g.id===f.id);if(F>-1){let g=[...t.current];g[F]=f,t.current=[...g];}else t.current.push(f);},[t]),i=useCallback(f=>{t.current=t.current.filter(F=>F.id!==f);},[]),s=useForm({reValidateMode:"onSubmit",mode:"all",...e}),r=V(s),p=useMemo(()=>generateUUID(),[]),c=f=>f?getFieldValue(mappingUndefinedtoNull(s.getValues()),f):mappingUndefinedtoNull(s.getValues()),b=f=>{f?typeof f=="string"?s.resetField(f,{}):typeof f=="object"&&isArray(f,0)&&f.forEach(F=>s.resetField(F)):s.reset();},P={...s,ref:a,reset:b,updateData:(f,F)=>{let g=c();s.reset(U({...g,...f}),F);},getData:c,formControl:s,useFieldArray:f=>useFieldArray({control:s.control,name:f}),useWatch:f=>useWatch({control:s.control,name:f}),isSubmit:o,formId:p,setIsSubmit:n,useSelected:f=>r.useStore(F=>getFieldValue(F,f)),setSelected:r.setState,isDraft:!!d?.isDraft,removeDraft:()=>{d?.removeDraft?.();},resetDraft:()=>{d?.removeDraft?.(),b();},saveDraft:(...f)=>d?.saveDraft?.(...f),getDataDraft:()=>d?.getDataDraft?.(),draftKey:u,registerItem:l,unregisterItem:i,items:t.current,getItems:()=>t.current};return [P,P]};var je=({asChild:e,onSubmit:a,onChange:o,onInvalid:n,onFieldChange:u,formData:d,controller:t,children:l,...i})=>{d&&(d=U(d));let s=t??Y({draftKey:i.draftKey}),[r]=Array.isArray(s)?s:[s],p=r.draftKey,c=useRef(true),b=useRef(void 0),{autoSaveDelay:P=.5}=I(),f=async y=>{y.preventDefault(),y.stopPropagation(),r.setIsSubmit(true);let T=await r.formControl.trigger(),x=r.getData();T?a&&a({...x},{...r}):n&&n(r.formControl.formState.errors);},F=async()=>{if(!p)return;let y=await r.getDataDraft();y&&Object.entries(y).forEach(([T,x])=>{T==="field_1731131919872_aj29d"||!isNotEmpty(x)||(r.setValue(T,x),r.trigger(T));});},g=()=>{if(d){let y={...d};diffJson(b.current||{},y)&&(r.updateData(y),b.current=y,setTimeout(F,0));}};useEffect(()=>{g();},[d,r.formControl.reset]),useEffect(()=>{if(!o)return;let y=r.formControl.watch((T,x)=>o(T,x,r));return ()=>y.unsubscribe()},[]),useEffect(()=>{c.current=true;},[p]),useEffect(()=>{c.current&&r?.isDraft&&(c.current=false,F());},[r.isDraft,p]);let h=useMemo(()=>debounce((y,T,x)=>{x?.saveDraft?.({[y]:T},d);},P),[d,P]),v=async(y,T,x)=>{u?.(y,T,x),h(y,T,x);},m={...i};return delete m?.draftKey,jsx(Fragment,{children:jsx(O,{controller:{...r,disabled:i?.disabled,readOnly:i?.readOnly},onSubmit:a,onFieldChange:v,children:e?jsx("div",{id:r.formId,children:l}):jsx("form",{...m,id:r.formId,ref:r.ref,onSubmit:f,children:l})})})},re=je;var te=createContext(void 0);function G(){let e=useContext(te);return e||{}}function N({children:e,...a}){return jsx(te.Provider,{value:a,children:e})}var oe=e=>{let a=A(),o=useFieldArray({control:a.control,name:e}),u={formArrayId:useMemo(()=>generateUUID(),[]),name:e,...o,...a};return [u,u]};var ae=({defaultData:e,controller:a,children:o,...n})=>{let u=a??oe(n?.name),d=useRef(false),[t]=Array.isArray(u)?u:[u],l=t.name;return useEffect(()=>{d.current||e&&(t.fields.length>0||(typeof e=="boolean"?(t.append({}),d.current=true):typeof e=="number"&&e>0?(t.append([...Array(e).fill(null).map(()=>({}))]),d.current=true):typeof e=="object"&&(t.append(e),d.current=true)));},[]),jsx(Fragment,{children:t.fields.map((i,s)=>{let r=`${l}.${s}.`,p={...t,index:s,fieldId:i.id,name:r,countFields:t.fields.length,removeItem:()=>t.remove(s),watchItem:c=>t.watch(c?`${r}${c}`:r.slice(0,-1)),setValueItem:(c,b)=>t.setValue(`${r}${c}`,b),useSelectedItem:c=>t.useSelected(`${r}${c}`)};return jsx(ne.Fragment,{children:jsx(N,{...p,children:renderChildren(o,p)})},i.id)})})};ae.displayName="BgsFormArray";var Ye=ae;ne.memo(({children:e,props:a})=>jsx(Fragment,{children:renderChildren(e,a)}));var me=createContext(void 0);function k(){let e=useContext(me);return e||{}}function M({children:e,...a}){return jsx(me.Provider,{value:a,children:e})}var le=({children:e,...a})=>{let o=A(),n=useMemo(()=>generateUUID(),[]);return jsx(Fragment,{children:jsx(M,{...o,...a,formGroupId:n,children:e})})};le.displayName="BgsFormGroup";var sr=le;var ir=/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;function L({validationRules:e,label:a},o,n){let{formControl:u,getData:d}=o,t=[];return e&&(typeof e=="string"?ue(n,e,true,a,u,d,{}).forEach(l=>t.push(l)):typeof e=="object"&&Object.keys(e).forEach(l=>{let{validate:i}=t.find(r=>r.validate)||{};if(["minLength","maxLength","min","max","match","diff","regexp","pattern","required","email"].includes(l)){let r=e[l],p="";["match","diff"].includes(l)&&typeof r=="object"&&(r=e[l].dataField,p=e[l].label),r!=null&&ue(n,l,r,a,u,d,i,p).forEach(c=>t.push(c));}else if(typeof e[l]=="object"){let r=e[l];t.push({validate:{...i,[l]:p=>r.validation(p)||r.message&&(typeof r.message=="string"?r.message:r.message(a))}});}})),Object.assign({},...t)}var ue=(e,a,o,n,u,d,t,l)=>{let i=[],{required:s,minLength:r,maxLength:p,min:c,max:b,email:P,match:f,diff:F,pattern:g}=e||{},v={required:m=>{if(!o)return true;let y=s?s(n):`${n} is required`;return typeof m=="string"&&!m.trim()||m==null?y:true},minLength:{value:o,message:r?r(n,o):`${n} must be at least ${o} characters long`},maxLength:{value:o,message:p?p(n,o):`${n} cannot be more than ${o} characters long`},min:{value:Number(o),message:c?c(n,o):`${n} should be at least ${o}`},max:{value:Number(o),message:b?b(n,o):`${n} should be at most ${o}`},regexp:(m="")=>m?new RegExp(o.regexp).test(m)||`${n} ${o.message}`:true,email:(m="")=>!o||!m?true:ir.test(m)||(P?P(n):`${n} must be type email`),match:(m="")=>m?m===(d&&d(o))||(f?f(n,l||labelFormatter.changeAll(o)):`${n} must be same with ${l||labelFormatter.changeAll(o)}`):true,diff:(m="")=>m?m!==(d&&d(o))||(F?F(n,l||labelFormatter.changeAll(o)):`${n} must be different with ${l||labelFormatter.changeAll(o)}`):true,pattern:{alphabet:(m="")=>!!m&&new RegExp("^[A-Za-z ]*$").test(m)||(g?.alphabet?g?.alphabet(n):`${n} must be format Alphabet`),alphanumber:(m="")=>!!m&&new RegExp("^[A-Za-z0-9 ]*$").test(m)||(g?.alphanumber?g?.alphanumber(n):`${n} must be format Alphabet or Number`),number:(m="")=>!!m&&new RegExp("^[0-9]*$").test(m)||(g?.number?g?.number(n):`${n} must be format Number`),lowercase:(m="")=>!!m&&new RegExp("^[a-z0-9 ]*$").test(m)||(g?.lowercase?g?.lowercase(n):`${n} must be format Lowercase`),url:(m="")=>!!m&&/^(ftp|http|https):\/\/[^ "]+$/.test(m)||(g?.url?g?.url(n):`${n} must be a valid URL`),uppercase:(m="")=>!!m&&new RegExp("^[A-Z0-9 ]*$").test(m)||(g?.uppercase?g?.uppercase(n):`${n} must be format Uppercase`),mixedcase:(m="")=>!!m&&/[a-z]/.test(m)&&/[A-Z]/.test(m)||(g?.mixedcase?g?.mixedcase(n):`${n} must be mixed case`),specialcharacters:(m="")=>!!m&&/[^a-zA-Z0-9\s]/.test(m)||(g?.specialcharacters?g?.specialcharacters(n):`${n} must contain special characters`)}}[a];if(v){let{validate:m}=i.find(y=>y.validate)||{};typeof v=="function"?i.push({validate:{...m,...t,[a]:v}}):a==="pattern"?i.push({validate:{...m,...t,[`${a}${o}`]:v[o]}}):i.push({[a]:v});}return i};var kt=e=>{let a=useMemo(()=>generateUUID(),[]),o=A(),{validationMessage:n}=I(),{registerItem:u,unregisterItem:d,control:t,disabled:l,readOnly:i,formId:s,setSelected:r,useSelected:p,onFieldChange:c}=o,{name:b,formId:P,...f}=k(),{name:F,formId:g}=G(),h=useMemo(()=>{let R=e.dataField;return e.disabledHierarchy||(F&&s===g&&(R=`${F}${R}`),b&&s===P&&(R=`${b}${R}`)),R},[F,s,g,e.dataField,b,P,e.disabledHierarchy]),v=useMemo(()=>{if(e.label)return e.label;if(!e.noLabel)return labelFormatter.changeAll(h)},[e.label,e.noLabel,h]);useEffect(()=>(u({id:a,...e,dataField:h,label:v}),()=>{d(a);}),[a,e,h,v]);let m=useMemo(()=>typeof e.disabled=="boolean"?e.disabled:typeof f.disabled=="boolean"?f.disabled:!!l,[e.disabled,f.disabled,l]),y=useMemo(()=>typeof e.readOnly=="boolean"?e.readOnly:typeof f.readOnly=="boolean"?f.readOnly:!!i,[e.readOnly,f.readOnly,i]),T=useMemo(()=>typeof e.hidden=="boolean"?e.hidden:false,[e.hidden]),x=useMemo(()=>{if(typeof e.required=="boolean"){if(typeof e.validationRules>"u")return {required:e.required};if(typeof e.validationRules=="string"&&e.validationRules==="email")return {email:true,required:e.required};if(typeof e.validationRules=="object")return {...e.validationRules,required:e.required}}return e.validationRules},[e.validationRules,e.required]),fe=useMemo(()=>m||y||T?{required:false}:L({validationRules:x,label:v},o,n),[m,y,T,x,v,h,o,n]),S=useController({name:h,control:t,disabled:m,defaultValue:e.defaultValue,shouldUnregister:e.shouldUnregister,rules:fe}),ce=S.fieldState.invalid,pe=S.fieldState.error?.message,ge=useWatch({name:h,control:t,defaultValue:e.defaultValue}),ye=useMemo(()=>debounce(R=>r(he=>({...he,[h]:R||null}))),[r,h]),Fe=p(h),be=x?.required;return {...e,setSelectedField:ye,label:v,dataField:h,controller:S,invalid:ce,messageError:pe,selectedField:Fe,value:ge,required:be,onChange:R=>{S.field.onChange(R),c?.(h,R,o);}}};var jt=()=>{let{formControl:e,items:a}=A(),o=(u,d,t,l=0)=>{let i=[];if(Array.isArray(t))t.forEach((s,r)=>{let p=Object.entries(s||{}).map(([c,b])=>o(`${u}.${r}.${c}`,`${d}[]${c}`,b,t.length>1?r+1:0)).flat();i=[...i,...p];});else if(t&&typeof t=="object"&&!Array.isArray(t)&&!t?.ref)Object.entries(t).map(([s,r])=>{let p=o(`${u}.${s}`,`${u}.${s}`,r);i=[...i,...p];});else {let s=t?.message||"",r=a.find(p=>p.dataField===d)?.label;i.push({label:`${r||""}${l>0?` ${l}`:""}`,message:s,dataField:u});}return i};return Object.entries(e.formState.errors||{}).map(([u,d])=>o(u,u,d)).flat()};function Ht(e){let{watch:a}=A(),o=useMemo(()=>{let t=new Set,l=i=>{if(i)for(let[s,r]of Object.entries(i)){if(s==="and"||s==="or"){r?.forEach(l);continue}r&&typeof r=="object"&&"fromField"in r&&typeof r.fromField=="string"&&t.add(r.fromField);}};return l(e),Array.from(t)},[e]),n=o.length?a(o):[],u=useMemo(()=>{let t={};return o.forEach((l,i)=>{t[l]=n?.[i];}),t},[o,n]),d=useCallback(t=>{if(!t)return t;let l={};for(let[i,s]of Object.entries(t)){if(i==="and"||i==="or"){l[i]=s?.map(r=>d(r))??s;continue}if(s&&typeof s=="object"&&"fromField"in s){let r=s,p={...r},c=r.fromField;c&&c in u?p.value=u[c]:p.value=r.value,delete p.fromField,l[i]=p;}else l[i]=s;}return l},[u]);return useMemo(()=>d(e)??{},[e,d])}var gr=(i=>(i.alphabet="alphabet",i.alphaNumber="alphanumber",i.number="number",i.lowercase="lowercase",i.url="url",i.uppercase="uppercase",i.mixedCase="mixedcase",i.specialCharacters="specialcharacters",i))(gr||{});var Jt=re;export{Ye as BgsFormArray,sr as BgsFormGroup,H as BgsReactFormProvider,gr as PatternTypeEnum,Jt as default,kt as useBgsController,A as useBgsForm,G as useBgsFormArray,oe as useBgsFormArrayInit,k as useBgsFormGroup,Y as useBgsFormInit,Ht as useResolvedQuery,jt as useSummaryValidation};
1
+ import ne,{createContext,useContext,useRef,useState,useCallback,useMemo,useEffect}from'react';import {jsx,Fragment}from'react/jsx-runtime';import {renderChildren,generateUUID,getFieldValue,mappingUndefinedtoNull,debounce,labelFormatter,isNotEmpty,diffJson,isArray,useDbLiveFlag,createStore,createDatabase,createTable}from'@bgscore/react-core';import {useForm,useWatch,useFieldArray,useController}from'react-hook-form';var q=createContext(void 0);function A(){let e=useContext(q);return e||{}}function O({children:e,controller:a,onSubmit:o,onFieldChange:n=()=>{}}){let d={...a,triggerSubmit:async(t,l)=>{a.setIsSubmit(true);let i=l?await a.formControl.trigger():true,s=a.getData();i&&o&&o({...s,...t},{...a});},onFieldChange:n};return jsx(q.Provider,{value:d,children:e})}var K=new WeakMap;function V(e){return K.has(e)||K.set(e,createStore({})),K.get(e)}function U(e){if(typeof e!="object"||e===null||Array.isArray(e))return e;let a={};for(let[o,n]of Object.entries(e))if(o.includes(".")){let u=o.split("."),d=a;for(let t=0;t<u.length;t++){let l=u[t];t===u.length-1?d[l]=U(n):((!d[l]||typeof d[l]!="object")&&(d[l]={}),d=d[l]);}}else a[o]=U(n);return a}function W(){return createTable({name:"draft",primaryKey:"field_1731131919872_aj29d"})}var Q=createContext(void 0);function I(){let e=useContext(Q);return e||{}}function H({children:e,value:a}){return jsx(Q.Provider,{value:a,children:e})}function N(){let{dbName:e="bgs-react-form"}=I();return createDatabase({dbName:e,table:{draft:W()}})}function _(e){let a=N(),o=useDbLiveFlag(a.draft.detail,{key:e}),n=async(t,l)=>{let s={...await d(),...t};Object.keys(s).forEach(c=>{isNotEmpty(s[c])||delete s[c];});let r=Object.keys(s);if(r.length===1&&r[0]==="field_1731131919872_aj29d")return u();r.some(c=>c!=="field_1731131919872_aj29d"&&s[c]!==getFieldValue(l,c))?await a.draft.put(e,s):await u();},u=async()=>{await a.draft.remove(e);},d=async()=>await a.draft.detail(e);return {isDraft:o,saveDraft:n,removeDraft:u,getDataDraft:d}}var Y=(e={})=>{e.defaultValues||(e.defaultValues={}),e.defaultValues=U(e.defaultValues);let a=useRef(null),[o,n]=useState(false),u=e?.draftKey,d=u?_(u):void 0,t=useRef([]),l=useCallback(f=>{let F=t.current.findIndex(g=>g.id===f.id);if(F>-1){let g=[...t.current];g[F]=f,t.current=[...g];}else t.current.push(f);},[t]),i=useCallback(f=>{t.current=t.current.filter(F=>F.id!==f);},[]),s=useForm({reValidateMode:"onSubmit",mode:"all",...e}),r=V(s),p=useMemo(()=>generateUUID(),[]),c=f=>f?getFieldValue(mappingUndefinedtoNull(s.getValues()),f):mappingUndefinedtoNull(s.getValues()),h=f=>{f?typeof f=="string"?s.resetField(f,{}):typeof f=="object"&&isArray(f,0)&&f.forEach(F=>s.resetField(F)):s.reset();},v={...s,ref:a,reset:h,updateData:(f,F)=>{let g=c();s.reset(U({...g,...f}),F);},getData:c,formControl:s,useFieldArray:f=>useFieldArray({control:s.control,name:f}),useWatch:f=>useWatch({control:s.control,name:f}),isSubmit:o,formId:p,setIsSubmit:n,useSelected:f=>r.useStore(F=>getFieldValue(F,f)),setSelected:r.setState,isDraft:!!d?.isDraft,removeDraft:()=>{d?.removeDraft?.();},resetDraft:()=>{d?.removeDraft?.(),h();},saveDraft:(...f)=>d?.saveDraft?.(...f),getDataDraft:()=>d?.getDataDraft?.(),draftKey:u,registerItem:l,unregisterItem:i,items:t.current,getItems:()=>t.current};return [v,v]};var je=({asChild:e,onSubmit:a,onChange:o,onInvalid:n,onFieldChange:u,formData:d,controller:t,children:l,...i})=>{d&&(d=U(d));let s=t??Y({draftKey:i.draftKey}),[r]=Array.isArray(s)?s:[s],p=r.draftKey,c=useRef(true),h=useRef(void 0),{autoSaveDelay:v=.5}=I(),f=async y=>{y.preventDefault(),y.stopPropagation(),r.setIsSubmit(true);let T=await r.formControl.trigger(),P=r.getData();T?a&&a({...P},{...r}):n&&n(r.formControl.formState.errors);},F=async()=>{if(!p)return;let y=await r.getDataDraft();y&&Object.entries(y).forEach(([T,P])=>{T==="field_1731131919872_aj29d"||!isNotEmpty(P)||(r.setValue(T,P),r.trigger(T));});},g=()=>{if(d){let y={...d};diffJson(h.current||{},y)&&(r.updateData(y),h.current=y,setTimeout(F,0));}};useEffect(()=>{g();},[d,r.formControl.reset]),useEffect(()=>{if(!o)return;let y=r.formControl.watch((T,P)=>o(T,P,r));return ()=>y.unsubscribe()},[]),useEffect(()=>{c.current=true;},[p]),useEffect(()=>{c.current&&r?.isDraft&&(c.current=false,F());},[r.isDraft,p]);let b=useMemo(()=>debounce((y,T,P)=>{P?.saveDraft?.({[y]:T},d);},v),[d,v]),x=async(y,T,P)=>{u?.(y,T,P),b(y,T,P);},m={...i};return delete m?.draftKey,jsx(Fragment,{children:jsx(O,{controller:{...r,disabled:i?.disabled,readOnly:i?.readOnly},onSubmit:a,onFieldChange:x,children:e?jsx("div",{id:r.formId,children:l}):jsx("form",{...m,id:r.formId,ref:r.ref,onSubmit:f,children:l})})})},re=je;var te=createContext(void 0);function E(){let e=useContext(te);return e||{}}function G({children:e,...a}){return jsx(te.Provider,{value:a,children:e})}var oe=e=>{let a=A(),o=useFieldArray({control:a.control,name:e}),u={formArrayId:useMemo(()=>generateUUID(),[]),name:e,...o,...a};return [u,u]};var ae=({defaultData:e,controller:a,children:o,...n})=>{let u=a??oe(n?.name),d=useRef(false),[t]=Array.isArray(u)?u:[u],l=t.name;return useEffect(()=>{d.current||e&&(t.fields.length>0||(typeof e=="boolean"?(t.append({}),d.current=true):typeof e=="number"&&e>0?(t.append([...Array(e).fill(null).map(()=>({}))]),d.current=true):typeof e=="object"&&(t.append(e),d.current=true)));},[]),jsx(Fragment,{children:t.fields.map((i,s)=>{let r=`${l}.${s}.`,p={...t,index:s,fieldId:i.id,name:r,countFields:t.fields.length,removeItem:()=>t.remove(s),watchItem:c=>t.watch(c?`${r}${c}`:r.slice(0,-1)),setValueItem:(c,h)=>t.setValue(`${r}${c}`,h),useSelectedItem:c=>t.useSelected(`${r}${c}`)};return jsx(ne.Fragment,{children:jsx(G,{...p,children:renderChildren(o,p)})},i.id)})})};ae.displayName="BgsFormArray";var Ye=ae;ne.memo(({children:e,props:a})=>jsx(Fragment,{children:renderChildren(e,a)}));var me=createContext(void 0);function k(){let e=useContext(me);return e||{}}function M({children:e,...a}){return jsx(me.Provider,{value:a,children:e})}var le=({children:e,...a})=>{let o=A(),n=useMemo(()=>generateUUID(),[]);return jsx(Fragment,{children:jsx(M,{...o,...a,formGroupId:n,children:e})})};le.displayName="BgsFormGroup";var sr=le;var ir=/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;function L({validationRules:e,label:a},o,n){let{formControl:u,getData:d}=o,t=[];return e&&(typeof e=="string"?ue(n,e,true,a,u,d,{}).forEach(l=>t.push(l)):typeof e=="object"&&Object.keys(e).forEach(l=>{let{validate:i}=t.find(r=>r.validate)||{};if(["minLength","maxLength","min","max","match","diff","regexp","pattern","required","email"].includes(l)){let r=e[l],p="";["match","diff"].includes(l)&&typeof r=="object"&&(r=e[l].dataField,p=e[l].label),r!=null&&ue(n,l,r,a,u,d,i,p).forEach(c=>t.push(c));}else if(typeof e[l]=="object"){let r=e[l];t.push({validate:{...i,[l]:p=>r.validation(p)||r.message&&(typeof r.message=="string"?r.message:r.message(a))}});}})),Object.assign({},...t)}var ue=(e,a,o,n,u,d,t,l)=>{let i=[],{required:s,minLength:r,maxLength:p,min:c,max:h,email:v,match:f,diff:F,pattern:g}=e||{},x={required:m=>{if(!o)return true;let y=s?s(n):`${n} is required`;return typeof m=="string"&&!m.trim()||m==null?y:true},minLength:{value:o,message:r?r(n,o):`${n} must be at least ${o} characters long`},maxLength:{value:o,message:p?p(n,o):`${n} cannot be more than ${o} characters long`},min:{value:Number(o),message:c?c(n,o):`${n} should be at least ${o}`},max:{value:Number(o),message:h?h(n,o):`${n} should be at most ${o}`},regexp:(m="")=>m?new RegExp(o.regexp).test(m)||`${n} ${o.message}`:true,email:(m="")=>!o||!m?true:ir.test(m)||(v?v(n):`${n} must be type email`),match:(m="")=>m?m===(d&&d(o))||(f?f(n,l||labelFormatter.changeAll(o)):`${n} must be same with ${l||labelFormatter.changeAll(o)}`):true,diff:(m="")=>m?m!==(d&&d(o))||(F?F(n,l||labelFormatter.changeAll(o)):`${n} must be different with ${l||labelFormatter.changeAll(o)}`):true,pattern:{alphabet:(m="")=>!!m&&new RegExp("^[A-Za-z ]*$").test(m)||(g?.alphabet?g?.alphabet(n):`${n} must be format Alphabet`),alphanumber:(m="")=>!!m&&new RegExp("^[A-Za-z0-9 ]*$").test(m)||(g?.alphanumber?g?.alphanumber(n):`${n} must be format Alphabet or Number`),number:(m="")=>!!m&&new RegExp("^[0-9]*$").test(m)||(g?.number?g?.number(n):`${n} must be format Number`),lowercase:(m="")=>!!m&&new RegExp("^[a-z0-9 ]*$").test(m)||(g?.lowercase?g?.lowercase(n):`${n} must be format Lowercase`),url:(m="")=>!!m&&/^(ftp|http|https):\/\/[^ "]+$/.test(m)||(g?.url?g?.url(n):`${n} must be a valid URL`),uppercase:(m="")=>!!m&&new RegExp("^[A-Z0-9 ]*$").test(m)||(g?.uppercase?g?.uppercase(n):`${n} must be format Uppercase`),mixedcase:(m="")=>!!m&&/[a-z]/.test(m)&&/[A-Z]/.test(m)||(g?.mixedcase?g?.mixedcase(n):`${n} must be mixed case`),specialcharacters:(m="")=>!!m&&/[^a-zA-Z0-9\s]/.test(m)||(g?.specialcharacters?g?.specialcharacters(n):`${n} must contain special characters`)}}[a];if(x){let{validate:m}=i.find(y=>y.validate)||{};typeof x=="function"?i.push({validate:{...m,...t,[a]:x}}):a==="pattern"?i.push({validate:{...m,...t,[`${a}${o}`]:x[o]}}):i.push({[a]:x});}return i};var kt=e=>{let a=useMemo(()=>generateUUID(),[]),o=A(),{validationMessage:n}=I(),{registerItem:u,unregisterItem:d,control:t,disabled:l,readOnly:i,formId:s,setSelected:r,useSelected:p,onFieldChange:c}=o,{name:h,formId:v,...f}=k(),{name:F,formId:g}=E(),b=useMemo(()=>{let R=e.dataField;return e.disabledHierarchy||(F&&s===g&&(R=`${F}${R}`),h&&s===v&&(R=`${h}${R}`)),R},[F,s,g,e.dataField,h,v,e.disabledHierarchy]),x=useMemo(()=>{if(e.label)return e.label;if(!e.noLabel)return labelFormatter.changeAll(b)},[e.label,e.noLabel,b]);useEffect(()=>(u({id:a,...e,dataField:b,label:x}),()=>{d(a);}),[a,e,b,x]);let m=useMemo(()=>typeof e.disabled=="boolean"?e.disabled:typeof f.disabled=="boolean"?f.disabled:!!l,[e.disabled,f.disabled,l]),y=useMemo(()=>typeof e.readOnly=="boolean"?e.readOnly:typeof f.readOnly=="boolean"?f.readOnly:!!i,[e.readOnly,f.readOnly,i]),T=useMemo(()=>typeof e.hidden=="boolean"?e.hidden:false,[e.hidden]),P=useMemo(()=>{if(typeof e.required=="boolean"){if(typeof e.validationRules>"u")return {required:e.required};if(typeof e.validationRules=="string"&&e.validationRules==="email")return {email:true,required:e.required};if(typeof e.validationRules=="object")return {...e.validationRules,required:e.required}}return e.validationRules},[e.validationRules,e.required]),fe=useMemo(()=>m||y||T?{required:false}:L({validationRules:P,label:x},o,n),[m,y,T,P,x,b,o,n]),S=useController({name:b,control:t,disabled:m,defaultValue:e.defaultValue,shouldUnregister:e.shouldUnregister,rules:fe}),ce=S.fieldState.invalid,pe=S.fieldState.error?.message,ge=useWatch({name:b,control:t,defaultValue:e.defaultValue}),ye=useMemo(()=>debounce(R=>r(be=>({...be,[b]:R||null}))),[r,b]),Fe=p(b),he=P?.required;return {...e,setSelectedField:ye,label:x,dataField:b,controller:S,invalid:ce,messageError:pe,selectedField:Fe,value:ge,required:he,onChange:R=>{S.field.onChange(R),c?.(b,R,o);}}};var jt=()=>{let{formControl:e,items:a}=A(),o=(u,d,t,l=0)=>{let i=[];if(Array.isArray(t))t.forEach((s,r)=>{let p=Object.entries(s||{}).map(([c,h])=>o(`${u}.${r}.${c}`,`${d}[]${c}`,h,t.length>1?r+1:0)).flat();i=[...i,...p];});else if(t&&typeof t=="object"&&!Array.isArray(t)&&!t?.ref)Object.entries(t).map(([s,r])=>{let p=o(`${u}.${s}`,`${u}.${s}`,r);i=[...i,...p];});else {let s=t?.message||"",r=a.find(p=>p.dataField===d)?.label;i.push({label:`${r||""}${l>0?` ${l}`:""}`,message:s,dataField:u});}return i};return Object.entries(e.formState.errors||{}).map(([u,d])=>o(u,u,d)).flat()};function Ht(e){let{watch:a}=A(),o=useMemo(()=>{let t=new Set,l=i=>{if(i)for(let[s,r]of Object.entries(i)){if(s==="and"||s==="or"){r?.forEach(l);continue}r&&typeof r=="object"&&"fromField"in r&&typeof r.fromField=="string"&&t.add(r.fromField);}};return l(e),Array.from(t)},[e]),n=o.length?a(o):[],u=useMemo(()=>{let t={};return o.forEach((l,i)=>{t[l]=n?.[i];}),t},[o,n]),d=useCallback(t=>{if(!t)return t;let l={};for(let[i,s]of Object.entries(t)){if(i==="and"||i==="or"){l[i]=s?.map(r=>d(r))??s;continue}if(s&&typeof s=="object"&&"fromField"in s){let r=s,p={...r},c=r.fromField;c&&c in u?p.value=u[c]:p.value=r.value,delete p.fromField,l[i]=p;}else l[i]=s;}return l},[u]);return useMemo(()=>d(e)??{},[e,d])}var gr=(i=>(i.alphabet="alphabet",i.alphaNumber="alphanumber",i.number="number",i.lowercase="lowercase",i.url="url",i.uppercase="uppercase",i.mixedCase="mixedcase",i.specialCharacters="specialcharacters",i))(gr||{});var Jt=re;export{Ye as BgsFormArray,sr as BgsFormGroup,H as BgsReactFormProvider,gr as PatternTypeEnum,Jt as default,kt as useBgsController,A as useBgsForm,E as useBgsFormArray,oe as useBgsFormArrayInit,k as useBgsFormGroup,Y as useBgsFormInit,Ht as useResolvedQuery,jt as useSummaryValidation};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bgscore/react-form",
3
- "version": "1.0.36",
3
+ "version": "1.0.37",
4
4
  "description": "React form component library using context and react-hook-form with dynamic arrays, groups, and validations.",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.js",