@bgscore/react-form 1.0.5 → 1.0.7

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 j=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 j__default=/*#__PURE__*/_interopDefault(j);var E=j.createContext(void 0);function y(){let e=j.useContext(E);return e||{}}function v({children:e,controller:r,onSubmit:t}){let i=j.useRef([]),m=j.useCallback(o=>{let c=i.current.findIndex(d=>d.id===o.id);if(c>-1){let d=[...i.current];d[c]=o,i.current=[...d];}else i.current.push(o);},[i]),n=j.useCallback(o=>{i.current=i.current.filter(c=>c.id!==o);},[]),u=async(o,c)=>{r.setIsSubmit(true);let d=c?await r.formControl.trigger():true,a=r.getData();d&&t&&t({...a,...o},{...r});},l={...r,registerItem:m,unregisterItem:n,items:i.current,triggerSubmit:u};return jsxRuntime.jsx(E.Provider,{value:l,children:e})}var $=new WeakMap;function N(e){return $.has(e)||$.set(e,reactCore.createStore({})),$.get(e)}function A(e){if(typeof e!="object"||e===null||Array.isArray(e))return e;let r={};for(let[t,i]of Object.entries(e))if(t.includes(".")){let m=t.split("."),n=r;for(let u=0;u<m.length;u++){let l=m[u];u===m.length-1?n[l]=A(i):((!n[l]||typeof n[l]!="object")&&(n[l]={}),n=n[l]);}}else r[t]=A(i);return r}var K=(e,r)=>{e||(e={}),e=A(e);let t=j.useRef(null),[i,m]=j.useState(false),n=reactHookForm.useForm({...r,reValidateMode:"onSubmit",mode:"all",defaultValues:e}),u=N(n),l=j.useMemo(()=>reactCore.generateUUID(),[]),o=a=>a?reactCore.getFieldValue(reactCore.mappingUndefinedtoNull(n.getValues()),a):reactCore.mappingUndefinedtoNull(n.getValues()),d={...n,ref:t,reset:a=>{a?typeof a=="string"?n.resetField(a,{}):typeof a=="object"&&reactCore.isArray(a,0)&&a.forEach(p=>n.resetField(p)):n.reset();},updateData:a=>{let p=o();n.reset(A({...p,...a}));},getData:o,formControl:n,useFieldArray:a=>reactHookForm.useFieldArray({control:n.control,name:a}),useWatch:a=>reactHookForm.useWatch({control:n.control,name:a}),isSubmit:i,formId:l,setIsSubmit:m,useSelected:a=>u.useStore(p=>reactCore.getFieldValue(p,a)),setSelected:u.setState};return [d,d]};var Ie=({onSubmit:e,onChange:r,onInvalid:t,formData:i,controller:m,children:n,...u})=>{i&&(i=A(i));let l=m??K(),[o]=Array.isArray(l)?l:[l],c=j.useRef(void 0),d=async a=>{a.preventDefault(),a.stopPropagation(),o.setIsSubmit(true);let p=await o.formControl.trigger(),F=o.getData();p?e&&e({...F},{...o}):t&&t(o.formControl.formState.errors);};return j.useEffect(()=>{i&&reactCore.diffJson(c.current||{},i)&&(o.formControl.reset(i),c.current=i);},[i,o.formControl.reset]),j.useEffect(()=>{if(!r)return;let a=o.formControl.watch(r);return ()=>a.unsubscribe()},[]),jsxRuntime.jsx(jsxRuntime.Fragment,{children:jsxRuntime.jsx(v,{controller:{...o,disabled:u?.disabled,readOnly:u?.readOnly},onSubmit:e,children:jsxRuntime.jsx("form",{...u,id:o.formId,ref:o.ref,onSubmit:d,children:n})})})},H=Ie;var z=j.createContext(void 0);function B(){let e=j.useContext(z);return e||{}}function G({children:e,...r}){return jsxRuntime.jsx(z.Provider,{value:r,children:e})}var Z=e=>{let r=y(),t=reactHookForm.useFieldArray({control:r.control,name:e}),m={formArrayId:j.useMemo(()=>reactCore.generateUUID(),[]),...t,...r};return [m,m]};var X=({name:e,defaultData:r,controller:t,children:i})=>{let m=t??Z(e),[n]=Array.isArray(m)?m:[m];return j.useEffect(()=>{typeof r=="boolean"&&r?n.append({}):typeof r=="number"&&r>0?n.append([...Array(r).fill(null).map(()=>({}))]):typeof r=="object"&&r&&n.append(r);},[]),jsxRuntime.jsx(jsxRuntime.Fragment,{children:n.fields.map((u,l)=>{let o=`${e}.${l}.`,c={...n,index:l,fieldId:u.id,name:o,countFields:n.fields.length,removeItem:()=>n.remove(l),watchItem:d=>n.watch(d?`${o}${d}`:o.slice(0,-1)),setValueItem:(d,a)=>n.setValue(`${o}${d}`,a),useSelectedItem:d=>n.useSelected(`${o}${d}`)};return jsxRuntime.jsx(j__default.default.Fragment,{children:jsxRuntime.jsx(G,{...c,children:reactCore.renderChildren(i,c)})},u.id)})})};X.displayName="BgsFormArray";var We=X;j__default.default.memo(({children:e,props:r})=>jsxRuntime.jsx(jsxRuntime.Fragment,{children:reactCore.renderChildren(e,r)}));var Q=j.createContext(void 0);function O(){let e=j.useContext(Q);return e||{}}function W({children:e,...r}){return jsxRuntime.jsx(Q.Provider,{value:r,children:e})}var V=({children:e,...r})=>{let t=y(),i=j.useMemo(()=>reactCore.generateUUID(),[]);return jsxRuntime.jsx(jsxRuntime.Fragment,{children:jsxRuntime.jsx(W,{...t,...r,formGroupId:i,children:e})})};V.displayName="BgsFormGroup";var qe=V;var ee=j.createContext(void 0);function re(){let e=j.useContext(ee);return e||{}}function te({children:e,...r}){return jsxRuntime.jsx(ee.Provider,{value:r,children:e})}var Ze=/^(([^<>()[\]\\.,;:\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 k({validationRules:e,label:r}){let{formControl:t,getData:i}=y(),m=[];return e&&(typeof e=="string"?oe(e,true,r,t,i,{}).forEach(n=>m.push(n)):typeof e=="object"&&Object.keys(e).forEach(n=>{let{validate:u}=m.find(o=>o.validate)||{};if(["minLength","maxLength","min","max","match","diff","regexp","pattern","required","email"].includes(n)){let o=e[n],c="";["match","diff"].includes(n)&&typeof o=="object"&&(o=e[n].dataField,c=e[n].label),o!=null&&oe(n,o,r,t,i,u,c).forEach(d=>m.push(d));}else if(typeof e[n]=="object"){let o=e[n];m.push({validate:{...u,[n]:c=>o.validation(c)||o.message&&(typeof o.message=="string"?o.message:o.message(r))}});}})),Object.assign({},...m)}var oe=(e,r,t,i,m,n,u)=>{let l=[],{validationMessage:o}=re(),{required:c,minLength:d,maxLength:a,min:p,max:F,email:T,match:g,diff:b,pattern:f}=o||{},h={required:s=>{if(!r)return true;let U=c?c(t):`${t} is required`;return typeof s=="string"&&!s.trim()||s==null?U:true},minLength:{value:r,message:d?d(t,r):`${t} must be at least ${r} characters long`},maxLength:{value:r,message:a?a(t,r):`${t} cannot be more than ${r} characters long`},min:{value:Number(r),message:p?p(t,r):`${t} should be at least ${r}`},max:{value:Number(r),message:F?F(t,r):`${t} should be at most ${r}`},regexp:(s="")=>s?new RegExp(r.regexp).test(s)||`${t} ${r.message}`:true,email:(s="")=>!r||!s?true:Ze.test(s)||(T?T(t):`${t} must be type email`),match:(s="")=>s?s===(m&&m(r))||(g?g(t,u||reactCore.labelFormatter.changeAll(r)):`${t} must be same with ${u||reactCore.labelFormatter.changeAll(r)}`):true,diff:(s="")=>s?s!==(m&&m(r))||(b?b(t,u||reactCore.labelFormatter.changeAll(r)):`${t} must be different with ${u||reactCore.labelFormatter.changeAll(r)}`):true,pattern:{alphabet:(s="")=>!!s&&new RegExp("^[A-Za-z ]*$").test(s)||(f?.alphabet?f?.alphabet(t):`${t} must be format Alphabet`),alphanumber:(s="")=>!!s&&new RegExp("^[A-Za-z0-9 ]*$").test(s)||(f?.alphanumber?f?.alphanumber(t):`${t} must be format Alphabet or Number`),number:(s="")=>!!s&&new RegExp("^[0-9]*$").test(s)||(f?.number?f?.number(t):`${t} must be format Number`),lowercase:(s="")=>!!s&&new RegExp("^[a-z0-9 ]*$").test(s)||(f?.lowercase?f?.lowercase(t):`${t} must be format Lowercase`),url:(s="")=>!!s&&/^(ftp|http|https):\/\/[^ "]+$/.test(s)||(f?.url?f?.url(t):`${t} must be a valid URL`),uppercase:(s="")=>!!s&&new RegExp("^[A-Z0-9 ]*$").test(s)||(f?.uppercase?f?.uppercase(t):`${t} must be format Uppercase`),mixedcase:(s="")=>!!s&&/[a-z]/.test(s)&&/[A-Z]/.test(s)||(f?.mixedcase?f?.mixedcase(t):`${t} must be mixed case`),specialcharacters:(s="")=>!!s&&/[^a-zA-Z0-9\s]/.test(s)||(f?.specialcharacters?f?.specialcharacters(t):`${t} must contain special characters`)}}[e];if(h){let{validate:s}=l.find(U=>U.validate)||{};typeof h=="function"?l.push({validate:{...s,...n,[e]:h}}):e==="pattern"?l.push({validate:{...s,...n,[`${e}${r}`]:h[r]}}):l.push({[e]:h});}return l};var ct=e=>{let r=j.useMemo(()=>reactCore.generateUUID(),[]),{registerItem:t,unregisterItem:i,control:m,disabled:n,readOnly:u,formId:l,setSelected:o,useSelected:c}=y(),{name:d,formId:a,...p}=O(),{name:F,formId:T}=B(),g=j.useMemo(()=>{let x=e.dataField;return e.disabledHierarchy||(F&&l===T&&(x=`${F}${x}`),d&&l===a&&(x=`${d}${x}`)),x},[F,l,T,e.dataField,d,a,e.disabledHierarchy]),b=j.useMemo(()=>{if(e.label)return e.label;if(!e.noLabel)return reactCore.labelFormatter.changeAll(g)},[e.label,e.noLabel,g]);j.useEffect(()=>(t({id:r,...e,dataField:g,label:b}),()=>{i(r);}),[r,e,g,b]);let f=false;typeof e.disabled=="boolean"?f=e.disabled:typeof p.disabled=="boolean"?f=p.disabled:f=!!n;let R=false;typeof e.readOnly=="boolean"?R=e.readOnly:typeof p.readOnly=="boolean"?R=p.readOnly:R=!!u;let h=false;typeof e.hidden=="boolean"&&(h=e.hidden);let s=e.validationRules;typeof e.required=="boolean"&&(typeof e.validationRules>"u"?s={required:e.required}:typeof e.validationRules=="string"&&e.validationRules==="email"?s={email:true,required:e.required}:typeof e.validationRules=="object"&&(s={...e.validationRules,required:e.required}));let U=f||R||h?{required:false}:k({...e,validationRules:s,label:b}),S=reactHookForm.useController({name:g,control:m,disabled:f,defaultValue:e.defaultValue,shouldUnregister:e.shouldUnregister,rules:U}),ne=S.fieldState.invalid,se=S.fieldState.error?.message,ie=reactHookForm.useWatch({name:g,control:m,defaultValue:e.defaultValue}),ae=j.useMemo(()=>reactCore.debounce(x=>o(de=>({...de,[g]:x||null}))),[o,g]),me=c(g),le=s?.required;return {...e,setSelectedField:ae,label:b,dataField:g,controller:S,invalid:ne,messageError:se,selectedField:me,value:ie,required:le}};var Ve=(o=>(o.alphabet="alphabet",o.alphaNumber="alphanumber",o.number="number",o.lowercase="lowercase",o.url="url",o.uppercase="uppercase",o.mixedCase="mixedcase",o.specialCharacters="specialcharacters",o))(Ve||{});var yt=H;exports.BgsFormArray=We;exports.BgsFormGroup=qe;exports.BgsReactFormProvider=te;exports.PatternTypeEnum=Ve;exports.default=yt;exports.useBgsController=ct;exports.useBgsForm=y;exports.useBgsFormArray=B;exports.useBgsFormArrayInit=Z;exports.useBgsFormGroup=O;exports.useBgsFormInit=K;
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var Z=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 Z__default=/*#__PURE__*/_interopDefault(Z);var k=Z.createContext(void 0);function F(){let e=Z.useContext(k);return e||{}}function $({children:e,controller:r,onSubmit:o}){let l=Z.useRef([]),a=Z.useCallback(t=>{let c=l.current.findIndex(d=>d.id===t.id);if(c>-1){let d=[...l.current];d[c]=t,l.current=[...d];}else l.current.push(t);},[l]),n=Z.useCallback(t=>{l.current=l.current.filter(c=>c.id!==t);},[]),m=async(t,c)=>{r.setIsSubmit(true);let d=c?await r.formControl.trigger():true,i=r.getData();d&&o&&o({...i,...t},{...r});},u={...r,registerItem:a,unregisterItem:n,items:l.current,triggerSubmit:m};return jsxRuntime.jsx(k.Provider,{value:u,children:e})}var v=new WeakMap;function M(e){return v.has(e)||v.set(e,reactCore.createStore({})),v.get(e)}function A(e){if(typeof e!="object"||e===null||Array.isArray(e))return e;let r={};for(let[o,l]of Object.entries(e))if(o.includes(".")){let a=o.split("."),n=r;for(let m=0;m<a.length;m++){let u=a[m];m===a.length-1?n[u]=A(l):((!n[u]||typeof n[u]!="object")&&(n[u]={}),n=n[u]);}}else r[o]=A(l);return r}var K=(e,r)=>{e||(e={}),e=A(e);let o=Z.useRef(null),[l,a]=Z.useState(false),n=reactHookForm.useForm({...r,reValidateMode:"onSubmit",mode:"all",defaultValues:e}),m=M(n),u=Z.useMemo(()=>reactCore.generateUUID(),[]),t=i=>i?reactCore.getFieldValue(reactCore.mappingUndefinedtoNull(n.getValues()),i):reactCore.mappingUndefinedtoNull(n.getValues()),d={...n,ref:o,reset:i=>{i?typeof i=="string"?n.resetField(i,{}):typeof i=="object"&&reactCore.isArray(i,0)&&i.forEach(p=>n.resetField(p)):n.reset();},updateData:i=>{let p=t();n.reset(A({...p,...i}));},getData:t,formControl:n,useFieldArray:i=>reactHookForm.useFieldArray({control:n.control,name:i}),useWatch:i=>reactHookForm.useWatch({control:n.control,name:i}),isSubmit:l,formId:u,setIsSubmit:a,useSelected:i=>m.useStore(p=>reactCore.getFieldValue(p,i)),setSelected:m.setState};return [d,d]};var Ie=({onSubmit:e,onChange:r,onInvalid:o,formData:l,controller:a,children:n,...m})=>{l&&(l=A(l));let u=a??K(),[t]=Array.isArray(u)?u:[u],c=Z.useRef(void 0),d=async i=>{i.preventDefault(),i.stopPropagation(),t.setIsSubmit(true);let p=await t.formControl.trigger(),y=t.getData();p?e&&e({...y},{...t}):o&&o(t.formControl.formState.errors);};return Z.useEffect(()=>{l&&reactCore.diffJson(c.current||{},l)&&(t.formControl.reset(l),c.current=l);},[l,t.formControl.reset]),Z.useEffect(()=>{if(!r)return;let i=t.formControl.watch((p,y)=>r(p,y,t));return ()=>i.unsubscribe()},[]),jsxRuntime.jsx(jsxRuntime.Fragment,{children:jsxRuntime.jsx($,{controller:{...t,disabled:m?.disabled,readOnly:m?.readOnly},onSubmit:e,children:jsxRuntime.jsx("form",{...m,id:t.formId,ref:t.ref,onSubmit:d,children:n})})})},H=Ie;var z=Z.createContext(void 0);function B(){let e=Z.useContext(z);return e||{}}function O({children:e,...r}){return jsxRuntime.jsx(z.Provider,{value:r,children:e})}var j=e=>{let r=F(),o=reactHookForm.useFieldArray({control:r.control,name:e}),a={formArrayId:Z.useMemo(()=>reactCore.generateUUID(),[]),...o,...r};return [a,a]};var V=({name:e,defaultData:r,controller:o,children:l})=>{let a=o??j(e),[n]=Array.isArray(a)?a:[a];return Z.useEffect(()=>{typeof r=="boolean"&&r?n.append({}):typeof r=="number"&&r>0?n.append([...Array(r).fill(null).map(()=>({}))]):typeof r=="object"&&r&&n.append(r);},[]),jsxRuntime.jsx(jsxRuntime.Fragment,{children:n.fields.map((m,u)=>{let t=`${e}.${u}.`,c={...n,index:u,fieldId:m.id,name:t,countFields:n.fields.length,removeItem:()=>n.remove(u),watchItem:d=>n.watch(d?`${t}${d}`:t.slice(0,-1)),setValueItem:(d,i)=>n.setValue(`${t}${d}`,i),useSelectedItem:d=>n.useSelected(`${t}${d}`)};return jsxRuntime.jsx(Z__default.default.Fragment,{children:jsxRuntime.jsx(O,{...c,children:reactCore.renderChildren(l,c)})},m.id)})})};V.displayName="BgsFormArray";var We=V;Z__default.default.memo(({children:e,props:r})=>jsxRuntime.jsx(jsxRuntime.Fragment,{children:reactCore.renderChildren(e,r)}));var _=Z.createContext(void 0);function G(){let e=Z.useContext(_);return e||{}}function W({children:e,...r}){return jsxRuntime.jsx(_.Provider,{value:r,children:e})}var Y=({children:e,...r})=>{let o=F(),l=Z.useMemo(()=>reactCore.generateUUID(),[]);return jsxRuntime.jsx(jsxRuntime.Fragment,{children:jsxRuntime.jsx(W,{...o,...r,formGroupId:l,children:e})})};Y.displayName="BgsFormGroup";var qe=Y;var ee=Z.createContext(void 0);function re(){let e=Z.useContext(ee);return e||{}}function te({children:e,...r}){return jsxRuntime.jsx(ee.Provider,{value:r,children:e})}var je=/^(([^<>()[\]\\.,;:\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 E({validationRules:e,label:r}){let{formControl:o,getData:l}=F(),a=[];return e&&(typeof e=="string"?oe(e,true,r,o,l,{}).forEach(n=>a.push(n)):typeof e=="object"&&Object.keys(e).forEach(n=>{let{validate:m}=a.find(t=>t.validate)||{};if(["minLength","maxLength","min","max","match","diff","regexp","pattern","required","email"].includes(n)){let t=e[n],c="";["match","diff"].includes(n)&&typeof t=="object"&&(t=e[n].dataField,c=e[n].label),t!=null&&oe(n,t,r,o,l,m,c).forEach(d=>a.push(d));}else if(typeof e[n]=="object"){let t=e[n];a.push({validate:{...m,[n]:c=>t.validation(c)||t.message&&(typeof t.message=="string"?t.message:t.message(r))}});}})),Object.assign({},...a)}var oe=(e,r,o,l,a,n,m)=>{let u=[],{validationMessage:t}=re(),{required:c,minLength:d,maxLength:i,min:p,max:y,email:T,match:g,diff:b,pattern:f}=t||{},h={required:s=>{if(!r)return true;let U=c?c(o):`${o} is required`;return typeof s=="string"&&!s.trim()||s==null?U:true},minLength:{value:r,message:d?d(o,r):`${o} must be at least ${r} characters long`},maxLength:{value:r,message:i?i(o,r):`${o} cannot be more than ${r} characters long`},min:{value:Number(r),message:p?p(o,r):`${o} should be at least ${r}`},max:{value:Number(r),message:y?y(o,r):`${o} should be at most ${r}`},regexp:(s="")=>s?new RegExp(r.regexp).test(s)||`${o} ${r.message}`:true,email:(s="")=>!r||!s?true:je.test(s)||(T?T(o):`${o} must be type email`),match:(s="")=>s?s===(a&&a(r))||(g?g(o,m||reactCore.labelFormatter.changeAll(r)):`${o} must be same with ${m||reactCore.labelFormatter.changeAll(r)}`):true,diff:(s="")=>s?s!==(a&&a(r))||(b?b(o,m||reactCore.labelFormatter.changeAll(r)):`${o} must be different with ${m||reactCore.labelFormatter.changeAll(r)}`):true,pattern:{alphabet:(s="")=>!!s&&new RegExp("^[A-Za-z ]*$").test(s)||(f?.alphabet?f?.alphabet(o):`${o} must be format Alphabet`),alphanumber:(s="")=>!!s&&new RegExp("^[A-Za-z0-9 ]*$").test(s)||(f?.alphanumber?f?.alphanumber(o):`${o} must be format Alphabet or Number`),number:(s="")=>!!s&&new RegExp("^[0-9]*$").test(s)||(f?.number?f?.number(o):`${o} must be format Number`),lowercase:(s="")=>!!s&&new RegExp("^[a-z0-9 ]*$").test(s)||(f?.lowercase?f?.lowercase(o):`${o} must be format Lowercase`),url:(s="")=>!!s&&/^(ftp|http|https):\/\/[^ "]+$/.test(s)||(f?.url?f?.url(o):`${o} must be a valid URL`),uppercase:(s="")=>!!s&&new RegExp("^[A-Z0-9 ]*$").test(s)||(f?.uppercase?f?.uppercase(o):`${o} must be format Uppercase`),mixedcase:(s="")=>!!s&&/[a-z]/.test(s)&&/[A-Z]/.test(s)||(f?.mixedcase?f?.mixedcase(o):`${o} must be mixed case`),specialcharacters:(s="")=>!!s&&/[^a-zA-Z0-9\s]/.test(s)||(f?.specialcharacters?f?.specialcharacters(o):`${o} must contain special characters`)}}[e];if(h){let{validate:s}=u.find(U=>U.validate)||{};typeof h=="function"?u.push({validate:{...s,...n,[e]:h}}):e==="pattern"?u.push({validate:{...s,...n,[`${e}${r}`]:h[r]}}):u.push({[e]:h});}return u};var ct=e=>{let r=Z.useMemo(()=>reactCore.generateUUID(),[]),{registerItem:o,unregisterItem:l,control:a,disabled:n,readOnly:m,formId:u,setSelected:t,useSelected:c}=F(),{name:d,formId:i,...p}=G(),{name:y,formId:T}=B(),g=Z.useMemo(()=>{let x=e.dataField;return e.disabledHierarchy||(y&&u===T&&(x=`${y}${x}`),d&&u===i&&(x=`${d}${x}`)),x},[y,u,T,e.dataField,d,i,e.disabledHierarchy]),b=Z.useMemo(()=>{if(e.label)return e.label;if(!e.noLabel)return reactCore.labelFormatter.changeAll(g)},[e.label,e.noLabel,g]);Z.useEffect(()=>(o({id:r,...e,dataField:g,label:b}),()=>{l(r);}),[r,e,g,b]);let f=false;typeof e.disabled=="boolean"?f=e.disabled:typeof p.disabled=="boolean"?f=p.disabled:f=!!n;let R=false;typeof e.readOnly=="boolean"?R=e.readOnly:typeof p.readOnly=="boolean"?R=p.readOnly:R=!!m;let h=false;typeof e.hidden=="boolean"&&(h=e.hidden);let s=e.validationRules;typeof e.required=="boolean"&&(typeof e.validationRules>"u"?s={required:e.required}:typeof e.validationRules=="string"&&e.validationRules==="email"?s={email:true,required:e.required}:typeof e.validationRules=="object"&&(s={...e.validationRules,required:e.required}));let U=f||R||h?{required:false}:E({...e,validationRules:s,label:b}),P=reactHookForm.useController({name:g,control:a,disabled:f,defaultValue:e.defaultValue,shouldUnregister:e.shouldUnregister,rules:U}),ne=P.fieldState.invalid,se=P.fieldState.error?.message,ie=reactHookForm.useWatch({name:g,control:a,defaultValue:e.defaultValue}),ae=Z.useMemo(()=>reactCore.debounce(x=>t(de=>({...de,[g]:x||null}))),[t,g]),me=c(g),le=s?.required;return {...e,setSelectedField:ae,label:b,dataField:g,controller:P,invalid:ne,messageError:se,selectedField:me,value:ie,required:le}};var gt=()=>{let{formControl:e,items:r}=F(),o=(a,n,m,u=0)=>{let t=[];if(Array.isArray(m))m.forEach((c,d)=>{let i=Object.entries(c||{}).map(([p,y])=>o(`${a}.${d}.${p}`,`${n}[]${p}`,y,m.length>1?d+1:0)).flat();t=[...t,...i];});else if(m&&typeof m=="object"&&!Array.isArray(m)&&!m?.ref)Object.entries(m).map(([c,d])=>{let i=o(`${a}.${c}`,`${a}.${c}`,d);t=[...t,...i];});else {let c=m?.message||"",d=r.find(i=>i.dataField===n)?.label;t.push({label:`${d||""}${u>0?` ${u}`:""}`,message:c,dataField:a});}return t};return Object.entries(e.formState.errors||{}).map(([a,n])=>o(a,a,n)).flat()};var Ye=(t=>(t.alphabet="alphabet",t.alphaNumber="alphanumber",t.number="number",t.lowercase="lowercase",t.url="url",t.uppercase="uppercase",t.mixedCase="mixedcase",t.specialCharacters="specialcharacters",t))(Ye||{});var bt=H;exports.BgsFormArray=We;exports.BgsFormGroup=qe;exports.BgsReactFormProvider=te;exports.PatternTypeEnum=Ye;exports.default=bt;exports.useBgsController=ct;exports.useBgsForm=F;exports.useBgsFormArray=B;exports.useBgsFormArrayInit=j;exports.useBgsFormGroup=G;exports.useBgsFormInit=K;exports.useSummaryValidation=gt;
package/dist/index.d.cts CHANGED
@@ -35,7 +35,7 @@ type FormProps<T = unknown> = Omit<React.FormHTMLAttributes<HTMLFormElement>, "o
35
35
  type OnChange<T = unknown> = (values: T, event: {
36
36
  name?: string | undefined;
37
37
  type?: EventType | undefined;
38
- }) => void;
38
+ }, controller: UseFormInitReturn<T>) => void;
39
39
  type SetSelectedFn<T> = (newState: SelectedNested<T> | ((prev: SelectedNested<T>) => SelectedNested<T>)) => void;
40
40
  interface UseFormInitReturn<T = unknown> extends FormDefaultProps, Omit<UseFormReturn, "reset"> {
41
41
  reset: (field?: string | string[]) => void;
@@ -204,4 +204,11 @@ declare const useBgsFormArrayInit: <T = unknown>(name: string) => UseFormArrayIn
204
204
 
205
205
  declare const useBgsController: (props: ControllerProps) => UseController;
206
206
 
207
- export { FormArray as BgsFormArray, FormGroup as BgsFormGroup, BgsReactFormProvider, type ControllerProps, type FormArrayProps, type FormGroupProps, type FormProps, type OnChange, type OnSubmit, type PatternType, PatternTypeEnum, type SelectedNested, type TriggerSubmit, type UseBgsForm, type UseController, type UseFormArray, type UseFormArrayInitReturn, type UseFormInitReturn, type UseSelected, type ValidationCallback, type ValidationOptions, type ValidationRules, BgsForm as default, useBgsController, useForm as useBgsForm, useFormArray as useBgsFormArray, useBgsFormArrayInit, useFormGroup as useBgsFormGroup, useBgsFormInit };
207
+ interface SummaryValidation {
208
+ dataField: string;
209
+ label: string;
210
+ message: string;
211
+ }
212
+ declare const useSummaryValidation: () => SummaryValidation[];
213
+
214
+ export { FormArray as BgsFormArray, FormGroup as BgsFormGroup, BgsReactFormProvider, type ControllerProps, type FormArrayProps, type FormGroupProps, type FormProps, type OnChange, type OnSubmit, type PatternType, PatternTypeEnum, type SelectedNested, type TriggerSubmit, type UseBgsForm, type UseController, type UseFormArray, type UseFormArrayInitReturn, type UseFormInitReturn, type UseSelected, type ValidationCallback, type ValidationOptions, type ValidationRules, BgsForm as default, useBgsController, useForm as useBgsForm, useFormArray as useBgsFormArray, useBgsFormArrayInit, useFormGroup as useBgsFormGroup, useBgsFormInit, useSummaryValidation };
package/dist/index.d.ts CHANGED
@@ -35,7 +35,7 @@ type FormProps<T = unknown> = Omit<React.FormHTMLAttributes<HTMLFormElement>, "o
35
35
  type OnChange<T = unknown> = (values: T, event: {
36
36
  name?: string | undefined;
37
37
  type?: EventType | undefined;
38
- }) => void;
38
+ }, controller: UseFormInitReturn<T>) => void;
39
39
  type SetSelectedFn<T> = (newState: SelectedNested<T> | ((prev: SelectedNested<T>) => SelectedNested<T>)) => void;
40
40
  interface UseFormInitReturn<T = unknown> extends FormDefaultProps, Omit<UseFormReturn, "reset"> {
41
41
  reset: (field?: string | string[]) => void;
@@ -204,4 +204,11 @@ declare const useBgsFormArrayInit: <T = unknown>(name: string) => UseFormArrayIn
204
204
 
205
205
  declare const useBgsController: (props: ControllerProps) => UseController;
206
206
 
207
- export { FormArray as BgsFormArray, FormGroup as BgsFormGroup, BgsReactFormProvider, type ControllerProps, type FormArrayProps, type FormGroupProps, type FormProps, type OnChange, type OnSubmit, type PatternType, PatternTypeEnum, type SelectedNested, type TriggerSubmit, type UseBgsForm, type UseController, type UseFormArray, type UseFormArrayInitReturn, type UseFormInitReturn, type UseSelected, type ValidationCallback, type ValidationOptions, type ValidationRules, BgsForm as default, useBgsController, useForm as useBgsForm, useFormArray as useBgsFormArray, useBgsFormArrayInit, useFormGroup as useBgsFormGroup, useBgsFormInit };
207
+ interface SummaryValidation {
208
+ dataField: string;
209
+ label: string;
210
+ message: string;
211
+ }
212
+ declare const useSummaryValidation: () => SummaryValidation[];
213
+
214
+ export { FormArray as BgsFormArray, FormGroup as BgsFormGroup, BgsReactFormProvider, type ControllerProps, type FormArrayProps, type FormGroupProps, type FormProps, type OnChange, type OnSubmit, type PatternType, PatternTypeEnum, type SelectedNested, type TriggerSubmit, type UseBgsForm, type UseController, type UseFormArray, type UseFormArrayInitReturn, type UseFormInitReturn, type UseSelected, type ValidationCallback, type ValidationOptions, type ValidationRules, BgsForm as default, useBgsController, useForm as useBgsForm, useFormArray as useBgsFormArray, useBgsFormArrayInit, useFormGroup as useBgsFormGroup, useBgsFormInit, useSummaryValidation };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import j,{createContext,useContext,useRef,useState,useMemo,useEffect,useCallback}from'react';import {jsx,Fragment}from'react/jsx-runtime';import {renderChildren,generateUUID,getFieldValue,mappingUndefinedtoNull,diffJson,labelFormatter,debounce,isArray,createStore}from'@bgscore/react-core';import {useForm,useWatch,useFieldArray,useController}from'react-hook-form';var E=createContext(void 0);function y(){let e=useContext(E);return e||{}}function v({children:e,controller:r,onSubmit:t}){let i=useRef([]),m=useCallback(o=>{let c=i.current.findIndex(d=>d.id===o.id);if(c>-1){let d=[...i.current];d[c]=o,i.current=[...d];}else i.current.push(o);},[i]),n=useCallback(o=>{i.current=i.current.filter(c=>c.id!==o);},[]),u=async(o,c)=>{r.setIsSubmit(true);let d=c?await r.formControl.trigger():true,a=r.getData();d&&t&&t({...a,...o},{...r});},l={...r,registerItem:m,unregisterItem:n,items:i.current,triggerSubmit:u};return jsx(E.Provider,{value:l,children:e})}var $=new WeakMap;function N(e){return $.has(e)||$.set(e,createStore({})),$.get(e)}function A(e){if(typeof e!="object"||e===null||Array.isArray(e))return e;let r={};for(let[t,i]of Object.entries(e))if(t.includes(".")){let m=t.split("."),n=r;for(let u=0;u<m.length;u++){let l=m[u];u===m.length-1?n[l]=A(i):((!n[l]||typeof n[l]!="object")&&(n[l]={}),n=n[l]);}}else r[t]=A(i);return r}var K=(e,r)=>{e||(e={}),e=A(e);let t=useRef(null),[i,m]=useState(false),n=useForm({...r,reValidateMode:"onSubmit",mode:"all",defaultValues:e}),u=N(n),l=useMemo(()=>generateUUID(),[]),o=a=>a?getFieldValue(mappingUndefinedtoNull(n.getValues()),a):mappingUndefinedtoNull(n.getValues()),d={...n,ref:t,reset:a=>{a?typeof a=="string"?n.resetField(a,{}):typeof a=="object"&&isArray(a,0)&&a.forEach(p=>n.resetField(p)):n.reset();},updateData:a=>{let p=o();n.reset(A({...p,...a}));},getData:o,formControl:n,useFieldArray:a=>useFieldArray({control:n.control,name:a}),useWatch:a=>useWatch({control:n.control,name:a}),isSubmit:i,formId:l,setIsSubmit:m,useSelected:a=>u.useStore(p=>getFieldValue(p,a)),setSelected:u.setState};return [d,d]};var Ie=({onSubmit:e,onChange:r,onInvalid:t,formData:i,controller:m,children:n,...u})=>{i&&(i=A(i));let l=m??K(),[o]=Array.isArray(l)?l:[l],c=useRef(void 0),d=async a=>{a.preventDefault(),a.stopPropagation(),o.setIsSubmit(true);let p=await o.formControl.trigger(),F=o.getData();p?e&&e({...F},{...o}):t&&t(o.formControl.formState.errors);};return useEffect(()=>{i&&diffJson(c.current||{},i)&&(o.formControl.reset(i),c.current=i);},[i,o.formControl.reset]),useEffect(()=>{if(!r)return;let a=o.formControl.watch(r);return ()=>a.unsubscribe()},[]),jsx(Fragment,{children:jsx(v,{controller:{...o,disabled:u?.disabled,readOnly:u?.readOnly},onSubmit:e,children:jsx("form",{...u,id:o.formId,ref:o.ref,onSubmit:d,children:n})})})},H=Ie;var z=createContext(void 0);function B(){let e=useContext(z);return e||{}}function G({children:e,...r}){return jsx(z.Provider,{value:r,children:e})}var Z=e=>{let r=y(),t=useFieldArray({control:r.control,name:e}),m={formArrayId:useMemo(()=>generateUUID(),[]),...t,...r};return [m,m]};var X=({name:e,defaultData:r,controller:t,children:i})=>{let m=t??Z(e),[n]=Array.isArray(m)?m:[m];return useEffect(()=>{typeof r=="boolean"&&r?n.append({}):typeof r=="number"&&r>0?n.append([...Array(r).fill(null).map(()=>({}))]):typeof r=="object"&&r&&n.append(r);},[]),jsx(Fragment,{children:n.fields.map((u,l)=>{let o=`${e}.${l}.`,c={...n,index:l,fieldId:u.id,name:o,countFields:n.fields.length,removeItem:()=>n.remove(l),watchItem:d=>n.watch(d?`${o}${d}`:o.slice(0,-1)),setValueItem:(d,a)=>n.setValue(`${o}${d}`,a),useSelectedItem:d=>n.useSelected(`${o}${d}`)};return jsx(j.Fragment,{children:jsx(G,{...c,children:renderChildren(i,c)})},u.id)})})};X.displayName="BgsFormArray";var We=X;j.memo(({children:e,props:r})=>jsx(Fragment,{children:renderChildren(e,r)}));var Q=createContext(void 0);function O(){let e=useContext(Q);return e||{}}function W({children:e,...r}){return jsx(Q.Provider,{value:r,children:e})}var V=({children:e,...r})=>{let t=y(),i=useMemo(()=>generateUUID(),[]);return jsx(Fragment,{children:jsx(W,{...t,...r,formGroupId:i,children:e})})};V.displayName="BgsFormGroup";var qe=V;var ee=createContext(void 0);function re(){let e=useContext(ee);return e||{}}function te({children:e,...r}){return jsx(ee.Provider,{value:r,children:e})}var Ze=/^(([^<>()[\]\\.,;:\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 k({validationRules:e,label:r}){let{formControl:t,getData:i}=y(),m=[];return e&&(typeof e=="string"?oe(e,true,r,t,i,{}).forEach(n=>m.push(n)):typeof e=="object"&&Object.keys(e).forEach(n=>{let{validate:u}=m.find(o=>o.validate)||{};if(["minLength","maxLength","min","max","match","diff","regexp","pattern","required","email"].includes(n)){let o=e[n],c="";["match","diff"].includes(n)&&typeof o=="object"&&(o=e[n].dataField,c=e[n].label),o!=null&&oe(n,o,r,t,i,u,c).forEach(d=>m.push(d));}else if(typeof e[n]=="object"){let o=e[n];m.push({validate:{...u,[n]:c=>o.validation(c)||o.message&&(typeof o.message=="string"?o.message:o.message(r))}});}})),Object.assign({},...m)}var oe=(e,r,t,i,m,n,u)=>{let l=[],{validationMessage:o}=re(),{required:c,minLength:d,maxLength:a,min:p,max:F,email:T,match:g,diff:b,pattern:f}=o||{},h={required:s=>{if(!r)return true;let U=c?c(t):`${t} is required`;return typeof s=="string"&&!s.trim()||s==null?U:true},minLength:{value:r,message:d?d(t,r):`${t} must be at least ${r} characters long`},maxLength:{value:r,message:a?a(t,r):`${t} cannot be more than ${r} characters long`},min:{value:Number(r),message:p?p(t,r):`${t} should be at least ${r}`},max:{value:Number(r),message:F?F(t,r):`${t} should be at most ${r}`},regexp:(s="")=>s?new RegExp(r.regexp).test(s)||`${t} ${r.message}`:true,email:(s="")=>!r||!s?true:Ze.test(s)||(T?T(t):`${t} must be type email`),match:(s="")=>s?s===(m&&m(r))||(g?g(t,u||labelFormatter.changeAll(r)):`${t} must be same with ${u||labelFormatter.changeAll(r)}`):true,diff:(s="")=>s?s!==(m&&m(r))||(b?b(t,u||labelFormatter.changeAll(r)):`${t} must be different with ${u||labelFormatter.changeAll(r)}`):true,pattern:{alphabet:(s="")=>!!s&&new RegExp("^[A-Za-z ]*$").test(s)||(f?.alphabet?f?.alphabet(t):`${t} must be format Alphabet`),alphanumber:(s="")=>!!s&&new RegExp("^[A-Za-z0-9 ]*$").test(s)||(f?.alphanumber?f?.alphanumber(t):`${t} must be format Alphabet or Number`),number:(s="")=>!!s&&new RegExp("^[0-9]*$").test(s)||(f?.number?f?.number(t):`${t} must be format Number`),lowercase:(s="")=>!!s&&new RegExp("^[a-z0-9 ]*$").test(s)||(f?.lowercase?f?.lowercase(t):`${t} must be format Lowercase`),url:(s="")=>!!s&&/^(ftp|http|https):\/\/[^ "]+$/.test(s)||(f?.url?f?.url(t):`${t} must be a valid URL`),uppercase:(s="")=>!!s&&new RegExp("^[A-Z0-9 ]*$").test(s)||(f?.uppercase?f?.uppercase(t):`${t} must be format Uppercase`),mixedcase:(s="")=>!!s&&/[a-z]/.test(s)&&/[A-Z]/.test(s)||(f?.mixedcase?f?.mixedcase(t):`${t} must be mixed case`),specialcharacters:(s="")=>!!s&&/[^a-zA-Z0-9\s]/.test(s)||(f?.specialcharacters?f?.specialcharacters(t):`${t} must contain special characters`)}}[e];if(h){let{validate:s}=l.find(U=>U.validate)||{};typeof h=="function"?l.push({validate:{...s,...n,[e]:h}}):e==="pattern"?l.push({validate:{...s,...n,[`${e}${r}`]:h[r]}}):l.push({[e]:h});}return l};var ct=e=>{let r=useMemo(()=>generateUUID(),[]),{registerItem:t,unregisterItem:i,control:m,disabled:n,readOnly:u,formId:l,setSelected:o,useSelected:c}=y(),{name:d,formId:a,...p}=O(),{name:F,formId:T}=B(),g=useMemo(()=>{let x=e.dataField;return e.disabledHierarchy||(F&&l===T&&(x=`${F}${x}`),d&&l===a&&(x=`${d}${x}`)),x},[F,l,T,e.dataField,d,a,e.disabledHierarchy]),b=useMemo(()=>{if(e.label)return e.label;if(!e.noLabel)return labelFormatter.changeAll(g)},[e.label,e.noLabel,g]);useEffect(()=>(t({id:r,...e,dataField:g,label:b}),()=>{i(r);}),[r,e,g,b]);let f=false;typeof e.disabled=="boolean"?f=e.disabled:typeof p.disabled=="boolean"?f=p.disabled:f=!!n;let R=false;typeof e.readOnly=="boolean"?R=e.readOnly:typeof p.readOnly=="boolean"?R=p.readOnly:R=!!u;let h=false;typeof e.hidden=="boolean"&&(h=e.hidden);let s=e.validationRules;typeof e.required=="boolean"&&(typeof e.validationRules>"u"?s={required:e.required}:typeof e.validationRules=="string"&&e.validationRules==="email"?s={email:true,required:e.required}:typeof e.validationRules=="object"&&(s={...e.validationRules,required:e.required}));let U=f||R||h?{required:false}:k({...e,validationRules:s,label:b}),S=useController({name:g,control:m,disabled:f,defaultValue:e.defaultValue,shouldUnregister:e.shouldUnregister,rules:U}),ne=S.fieldState.invalid,se=S.fieldState.error?.message,ie=useWatch({name:g,control:m,defaultValue:e.defaultValue}),ae=useMemo(()=>debounce(x=>o(de=>({...de,[g]:x||null}))),[o,g]),me=c(g),le=s?.required;return {...e,setSelectedField:ae,label:b,dataField:g,controller:S,invalid:ne,messageError:se,selectedField:me,value:ie,required:le}};var Ve=(o=>(o.alphabet="alphabet",o.alphaNumber="alphanumber",o.number="number",o.lowercase="lowercase",o.url="url",o.uppercase="uppercase",o.mixedCase="mixedcase",o.specialCharacters="specialcharacters",o))(Ve||{});var yt=H;export{We as BgsFormArray,qe as BgsFormGroup,te as BgsReactFormProvider,Ve as PatternTypeEnum,yt as default,ct as useBgsController,y as useBgsForm,B as useBgsFormArray,Z as useBgsFormArrayInit,O as useBgsFormGroup,K as useBgsFormInit};
1
+ import Z,{createContext,useContext,useRef,useState,useMemo,useEffect,useCallback}from'react';import {jsx,Fragment}from'react/jsx-runtime';import {renderChildren,generateUUID,getFieldValue,mappingUndefinedtoNull,diffJson,labelFormatter,debounce,isArray,createStore}from'@bgscore/react-core';import {useForm,useWatch,useFieldArray,useController}from'react-hook-form';var k=createContext(void 0);function F(){let e=useContext(k);return e||{}}function $({children:e,controller:r,onSubmit:o}){let l=useRef([]),a=useCallback(t=>{let c=l.current.findIndex(d=>d.id===t.id);if(c>-1){let d=[...l.current];d[c]=t,l.current=[...d];}else l.current.push(t);},[l]),n=useCallback(t=>{l.current=l.current.filter(c=>c.id!==t);},[]),m=async(t,c)=>{r.setIsSubmit(true);let d=c?await r.formControl.trigger():true,i=r.getData();d&&o&&o({...i,...t},{...r});},u={...r,registerItem:a,unregisterItem:n,items:l.current,triggerSubmit:m};return jsx(k.Provider,{value:u,children:e})}var v=new WeakMap;function M(e){return v.has(e)||v.set(e,createStore({})),v.get(e)}function A(e){if(typeof e!="object"||e===null||Array.isArray(e))return e;let r={};for(let[o,l]of Object.entries(e))if(o.includes(".")){let a=o.split("."),n=r;for(let m=0;m<a.length;m++){let u=a[m];m===a.length-1?n[u]=A(l):((!n[u]||typeof n[u]!="object")&&(n[u]={}),n=n[u]);}}else r[o]=A(l);return r}var K=(e,r)=>{e||(e={}),e=A(e);let o=useRef(null),[l,a]=useState(false),n=useForm({...r,reValidateMode:"onSubmit",mode:"all",defaultValues:e}),m=M(n),u=useMemo(()=>generateUUID(),[]),t=i=>i?getFieldValue(mappingUndefinedtoNull(n.getValues()),i):mappingUndefinedtoNull(n.getValues()),d={...n,ref:o,reset:i=>{i?typeof i=="string"?n.resetField(i,{}):typeof i=="object"&&isArray(i,0)&&i.forEach(p=>n.resetField(p)):n.reset();},updateData:i=>{let p=t();n.reset(A({...p,...i}));},getData:t,formControl:n,useFieldArray:i=>useFieldArray({control:n.control,name:i}),useWatch:i=>useWatch({control:n.control,name:i}),isSubmit:l,formId:u,setIsSubmit:a,useSelected:i=>m.useStore(p=>getFieldValue(p,i)),setSelected:m.setState};return [d,d]};var Ie=({onSubmit:e,onChange:r,onInvalid:o,formData:l,controller:a,children:n,...m})=>{l&&(l=A(l));let u=a??K(),[t]=Array.isArray(u)?u:[u],c=useRef(void 0),d=async i=>{i.preventDefault(),i.stopPropagation(),t.setIsSubmit(true);let p=await t.formControl.trigger(),y=t.getData();p?e&&e({...y},{...t}):o&&o(t.formControl.formState.errors);};return useEffect(()=>{l&&diffJson(c.current||{},l)&&(t.formControl.reset(l),c.current=l);},[l,t.formControl.reset]),useEffect(()=>{if(!r)return;let i=t.formControl.watch((p,y)=>r(p,y,t));return ()=>i.unsubscribe()},[]),jsx(Fragment,{children:jsx($,{controller:{...t,disabled:m?.disabled,readOnly:m?.readOnly},onSubmit:e,children:jsx("form",{...m,id:t.formId,ref:t.ref,onSubmit:d,children:n})})})},H=Ie;var z=createContext(void 0);function B(){let e=useContext(z);return e||{}}function O({children:e,...r}){return jsx(z.Provider,{value:r,children:e})}var j=e=>{let r=F(),o=useFieldArray({control:r.control,name:e}),a={formArrayId:useMemo(()=>generateUUID(),[]),...o,...r};return [a,a]};var V=({name:e,defaultData:r,controller:o,children:l})=>{let a=o??j(e),[n]=Array.isArray(a)?a:[a];return useEffect(()=>{typeof r=="boolean"&&r?n.append({}):typeof r=="number"&&r>0?n.append([...Array(r).fill(null).map(()=>({}))]):typeof r=="object"&&r&&n.append(r);},[]),jsx(Fragment,{children:n.fields.map((m,u)=>{let t=`${e}.${u}.`,c={...n,index:u,fieldId:m.id,name:t,countFields:n.fields.length,removeItem:()=>n.remove(u),watchItem:d=>n.watch(d?`${t}${d}`:t.slice(0,-1)),setValueItem:(d,i)=>n.setValue(`${t}${d}`,i),useSelectedItem:d=>n.useSelected(`${t}${d}`)};return jsx(Z.Fragment,{children:jsx(O,{...c,children:renderChildren(l,c)})},m.id)})})};V.displayName="BgsFormArray";var We=V;Z.memo(({children:e,props:r})=>jsx(Fragment,{children:renderChildren(e,r)}));var _=createContext(void 0);function G(){let e=useContext(_);return e||{}}function W({children:e,...r}){return jsx(_.Provider,{value:r,children:e})}var Y=({children:e,...r})=>{let o=F(),l=useMemo(()=>generateUUID(),[]);return jsx(Fragment,{children:jsx(W,{...o,...r,formGroupId:l,children:e})})};Y.displayName="BgsFormGroup";var qe=Y;var ee=createContext(void 0);function re(){let e=useContext(ee);return e||{}}function te({children:e,...r}){return jsx(ee.Provider,{value:r,children:e})}var je=/^(([^<>()[\]\\.,;:\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 E({validationRules:e,label:r}){let{formControl:o,getData:l}=F(),a=[];return e&&(typeof e=="string"?oe(e,true,r,o,l,{}).forEach(n=>a.push(n)):typeof e=="object"&&Object.keys(e).forEach(n=>{let{validate:m}=a.find(t=>t.validate)||{};if(["minLength","maxLength","min","max","match","diff","regexp","pattern","required","email"].includes(n)){let t=e[n],c="";["match","diff"].includes(n)&&typeof t=="object"&&(t=e[n].dataField,c=e[n].label),t!=null&&oe(n,t,r,o,l,m,c).forEach(d=>a.push(d));}else if(typeof e[n]=="object"){let t=e[n];a.push({validate:{...m,[n]:c=>t.validation(c)||t.message&&(typeof t.message=="string"?t.message:t.message(r))}});}})),Object.assign({},...a)}var oe=(e,r,o,l,a,n,m)=>{let u=[],{validationMessage:t}=re(),{required:c,minLength:d,maxLength:i,min:p,max:y,email:T,match:g,diff:b,pattern:f}=t||{},h={required:s=>{if(!r)return true;let U=c?c(o):`${o} is required`;return typeof s=="string"&&!s.trim()||s==null?U:true},minLength:{value:r,message:d?d(o,r):`${o} must be at least ${r} characters long`},maxLength:{value:r,message:i?i(o,r):`${o} cannot be more than ${r} characters long`},min:{value:Number(r),message:p?p(o,r):`${o} should be at least ${r}`},max:{value:Number(r),message:y?y(o,r):`${o} should be at most ${r}`},regexp:(s="")=>s?new RegExp(r.regexp).test(s)||`${o} ${r.message}`:true,email:(s="")=>!r||!s?true:je.test(s)||(T?T(o):`${o} must be type email`),match:(s="")=>s?s===(a&&a(r))||(g?g(o,m||labelFormatter.changeAll(r)):`${o} must be same with ${m||labelFormatter.changeAll(r)}`):true,diff:(s="")=>s?s!==(a&&a(r))||(b?b(o,m||labelFormatter.changeAll(r)):`${o} must be different with ${m||labelFormatter.changeAll(r)}`):true,pattern:{alphabet:(s="")=>!!s&&new RegExp("^[A-Za-z ]*$").test(s)||(f?.alphabet?f?.alphabet(o):`${o} must be format Alphabet`),alphanumber:(s="")=>!!s&&new RegExp("^[A-Za-z0-9 ]*$").test(s)||(f?.alphanumber?f?.alphanumber(o):`${o} must be format Alphabet or Number`),number:(s="")=>!!s&&new RegExp("^[0-9]*$").test(s)||(f?.number?f?.number(o):`${o} must be format Number`),lowercase:(s="")=>!!s&&new RegExp("^[a-z0-9 ]*$").test(s)||(f?.lowercase?f?.lowercase(o):`${o} must be format Lowercase`),url:(s="")=>!!s&&/^(ftp|http|https):\/\/[^ "]+$/.test(s)||(f?.url?f?.url(o):`${o} must be a valid URL`),uppercase:(s="")=>!!s&&new RegExp("^[A-Z0-9 ]*$").test(s)||(f?.uppercase?f?.uppercase(o):`${o} must be format Uppercase`),mixedcase:(s="")=>!!s&&/[a-z]/.test(s)&&/[A-Z]/.test(s)||(f?.mixedcase?f?.mixedcase(o):`${o} must be mixed case`),specialcharacters:(s="")=>!!s&&/[^a-zA-Z0-9\s]/.test(s)||(f?.specialcharacters?f?.specialcharacters(o):`${o} must contain special characters`)}}[e];if(h){let{validate:s}=u.find(U=>U.validate)||{};typeof h=="function"?u.push({validate:{...s,...n,[e]:h}}):e==="pattern"?u.push({validate:{...s,...n,[`${e}${r}`]:h[r]}}):u.push({[e]:h});}return u};var ct=e=>{let r=useMemo(()=>generateUUID(),[]),{registerItem:o,unregisterItem:l,control:a,disabled:n,readOnly:m,formId:u,setSelected:t,useSelected:c}=F(),{name:d,formId:i,...p}=G(),{name:y,formId:T}=B(),g=useMemo(()=>{let x=e.dataField;return e.disabledHierarchy||(y&&u===T&&(x=`${y}${x}`),d&&u===i&&(x=`${d}${x}`)),x},[y,u,T,e.dataField,d,i,e.disabledHierarchy]),b=useMemo(()=>{if(e.label)return e.label;if(!e.noLabel)return labelFormatter.changeAll(g)},[e.label,e.noLabel,g]);useEffect(()=>(o({id:r,...e,dataField:g,label:b}),()=>{l(r);}),[r,e,g,b]);let f=false;typeof e.disabled=="boolean"?f=e.disabled:typeof p.disabled=="boolean"?f=p.disabled:f=!!n;let R=false;typeof e.readOnly=="boolean"?R=e.readOnly:typeof p.readOnly=="boolean"?R=p.readOnly:R=!!m;let h=false;typeof e.hidden=="boolean"&&(h=e.hidden);let s=e.validationRules;typeof e.required=="boolean"&&(typeof e.validationRules>"u"?s={required:e.required}:typeof e.validationRules=="string"&&e.validationRules==="email"?s={email:true,required:e.required}:typeof e.validationRules=="object"&&(s={...e.validationRules,required:e.required}));let U=f||R||h?{required:false}:E({...e,validationRules:s,label:b}),P=useController({name:g,control:a,disabled:f,defaultValue:e.defaultValue,shouldUnregister:e.shouldUnregister,rules:U}),ne=P.fieldState.invalid,se=P.fieldState.error?.message,ie=useWatch({name:g,control:a,defaultValue:e.defaultValue}),ae=useMemo(()=>debounce(x=>t(de=>({...de,[g]:x||null}))),[t,g]),me=c(g),le=s?.required;return {...e,setSelectedField:ae,label:b,dataField:g,controller:P,invalid:ne,messageError:se,selectedField:me,value:ie,required:le}};var gt=()=>{let{formControl:e,items:r}=F(),o=(a,n,m,u=0)=>{let t=[];if(Array.isArray(m))m.forEach((c,d)=>{let i=Object.entries(c||{}).map(([p,y])=>o(`${a}.${d}.${p}`,`${n}[]${p}`,y,m.length>1?d+1:0)).flat();t=[...t,...i];});else if(m&&typeof m=="object"&&!Array.isArray(m)&&!m?.ref)Object.entries(m).map(([c,d])=>{let i=o(`${a}.${c}`,`${a}.${c}`,d);t=[...t,...i];});else {let c=m?.message||"",d=r.find(i=>i.dataField===n)?.label;t.push({label:`${d||""}${u>0?` ${u}`:""}`,message:c,dataField:a});}return t};return Object.entries(e.formState.errors||{}).map(([a,n])=>o(a,a,n)).flat()};var Ye=(t=>(t.alphabet="alphabet",t.alphaNumber="alphanumber",t.number="number",t.lowercase="lowercase",t.url="url",t.uppercase="uppercase",t.mixedCase="mixedcase",t.specialCharacters="specialcharacters",t))(Ye||{});var bt=H;export{We as BgsFormArray,qe as BgsFormGroup,te as BgsReactFormProvider,Ye as PatternTypeEnum,bt as default,ct as useBgsController,F as useBgsForm,B as useBgsFormArray,j as useBgsFormArrayInit,G as useBgsFormGroup,K as useBgsFormInit,gt as useSummaryValidation};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bgscore/react-form",
3
- "version": "1.0.5",
3
+ "version": "1.0.7",
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",