@bgscore/react-form 0.0.12 → 0.0.14

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}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _react = require('react');var _jsxruntime = require('react/jsx-runtime');var k=_react.createContext.call(void 0, void 0);function F(){let r=_react.useContext.call(void 0, k);return r||{}}function $({children:r,...e}){let t=_react.useRef.call(void 0, []),l=_react.useCallback.call(void 0, m=>{let u=t.current.findIndex(i=>i.id===m.id);if(u>-1){let i=[...t.current];i[u]=m,t.current=[...i]}else t.current.push(m)},[t]),p=_react.useCallback.call(void 0, m=>{t.current=t.current.filter(u=>u.id!==m)},[]),s={...e,registerItem:l,unregisterItem:p,items:t.current};return _jsxruntime.jsx.call(void 0, k.Provider,{value:s,children:r})}function C(){let r=()=>Math.random()*16%16|0;return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>(e==="x"?r():r()&3|8).toString(16))}function A(r,e){return typeof r=="function"?r(e):r}var h={camelCase:(r="")=>(r=r.split(".").map(e=>(e=e.charAt(0).toUpperCase()+e.slice(1),e)).join(" "),r=r.replace(/([a-z0-9])([A-Z])/g,"$1 $2"),r.charAt(0).toUpperCase()+r.slice(1)),snackCase:(r="")=>{let t=r.replace(/_([a-z])/g,(l,p)=>p.toUpperCase()).replace(/([A-Z])/g," $1");return t=t.charAt(0).toUpperCase()+t.slice(1),t},changeAll:(r="",e=!1)=>{let t="";try{r=_optionalChain([r, 'optionalAccess', _2 => _2.split, 'call', _3 => _3("."), 'access', _4 => _4[_optionalChain([r, 'optionalAccess', _5 => _5.split, 'call', _6 => _6("."), 'optionalAccess', _7 => _7.length])-1]]),r=_optionalChain([r, 'optionalAccess', _8 => _8.split, 'call', _9 => _9("[]"), 'access', _10 => _10[_optionalChain([r, 'optionalAccess', _11 => _11.split, 'call', _12 => _12("[]"), 'optionalAccess', _13 => _13.length])-1]]),t=h.snackCase(h.camelCase(r)),e&&(t=_optionalChain([t, 'optionalAccess', _14 => _14.split, 'call', _15 => _15(" "), 'optionalAccess', _16 => _16.map, 'call', _17 => _17(l=>_optionalChain([l, 'optionalAccess', _18 => _18.length])<=3?_optionalChain([l, 'optionalAccess', _19 => _19.toUpperCase, 'call', _20 => _20()]):l), 'optionalAccess', _21 => _21.join, 'call', _22 => _22(" ")]))}catch (e2){}return t}};function N(r,e){try{return JSON.stringify(r)!==JSON.stringify(e)}catch (e3){return!1}}var I=r=>(Object.keys(r).forEach(e=>{r[e]===void 0&&(r[e]=null)}),r),G=(r,e)=>r?e.includes(".")?G(r[e.substring(0,e.indexOf("."))],e.substring(e.indexOf(".")+1)):r?r[e]:null:"";function S(r,e){let t=!1;return r&&typeof r=="object"&&Array.isArray(r)&&(typeof e=="number"?r.length>e&&(t=!0):t=!0),t}var _reacthookform = require('react-hook-form');var gr=_react.forwardRef.call(void 0, ({children:r,className:e,formData:t,onChange:l=()=>{},onSubmit:p},s)=>{t||(t={});let m=_react.useRef.call(void 0, void 0),u=_react.useRef.call(void 0, null),[i,x]=_react.useState.call(void 0, !1),n=_reacthookform.useForm.call(void 0, {reValidateMode:"onSubmit",mode:"all",defaultValues:t}),c=_react.useMemo.call(void 0, ()=>C(),[]);_react.useEffect.call(void 0, ()=>{t&&N(m.current||{},t)&&(n.reset(t),m.current=t)},[t,n.reset]),_react.useEffect.call(void 0, ()=>{let a=n.watch(l);return()=>a.unsubscribe()},[]);let d=async(a,f,U)=>{let{validate:y=!0,...o}=U||{};a&&(a.preventDefault(),a.stopPropagation()),x(!0);let R=y?await n.trigger():!0,tr=g();R&&p&&p({...tr,...f},{...B,...o,validate:y})},g=a=>a?G(I(n.getValues()),a):I(n.getValues()),B={...n,reset:a=>{a?typeof a=="string"?n.resetField(a,{}):typeof a=="object"&&S(a,0)&&a.forEach(f=>n.resetField(f)):n.reset()},updateData:a=>{let f=g();n.reset({...f,...a})},getData:g,triggerSubmit:(a,f)=>d(void 0,a,f),formControl:n,useFieldArray:a=>_reacthookform.useFieldArray.call(void 0, {control:n.control,name:a}),useWatch:a=>_reacthookform.useWatch.call(void 0, {control:n.control,name:a}),isSubmit:i,formId:c};return _react.useImperativeHandle.call(void 0, s,()=>B),_jsxruntime.jsx.call(void 0, $,{...B,children:_jsxruntime.jsx.call(void 0, "form",{id:c,className:e,ref:u,onSubmit:d,children:A(r,B)})})}),Z=gr;var q=_react.createContext.call(void 0, void 0);function Fr(){let r=_react.useContext.call(void 0, q);return r||{}}function w({children:r,...e}){return _jsxruntime.jsx.call(void 0, q.Provider,{value:e,children:r})}var j=_react.createContext.call(void 0, void 0);function O(){let r=_react.useContext.call(void 0, j);return r||{}}function E({children:r,...e}){return _jsxruntime.jsx.call(void 0, j.Provider,{value:e,children:r})}var H=_react.createContext.call(void 0, void 0);function K(){let r=_react.useContext.call(void 0, H);return r||{}}function J({children:r,...e}){return _jsxruntime.jsx.call(void 0, H.Provider,{value:e,children:r})}function W({validationRules:r,label:e}){let{formControl:t,getData:l}=F(),p=[];return r&&(typeof r=="string"?_(r,!0,e,t,l,{}).forEach(s=>p.push(s)):typeof r=="object"&&Object.keys(r).forEach(s=>{let{validate:m}=p.find(i=>i.validate)||{};if(["minLength","maxLength","min","max","match","diff","regexp","pattern","required","email"].includes(s)){let i=r[s],x="";if(s==="email"&&!i)return;["match","diff"].includes(s)&&typeof i=="object"&&(i=r[s].dataField,x=r[s].label),i!=null&&_(s,i,e,t,l,m,x).forEach(n=>p.push(n))}else if(typeof r[s]=="object"){let i=r[s];p.push({validate:{...m,[s]:x=>i.validation(x)||i.message&&(typeof i.message=="string"?i.message:i.message(e))}})}})),Object.assign({},...p)}var _=(r,e,t,l,p,s,m)=>{let u=[],{validationMessage:i}=K(),{required:x,minLength:n,maxLength:c,min:d,max:g,email:b,match:B,diff:a,pattern:f}=i||{},y={required:{value:!!e,message:x?x(t):`${t} is required`},minLength:{value:e,message:n?n(t,e):`${t} must be at least ${e} characters long`},maxLength:{value:e,message:c?c(t,e):`${t} cannot be more than ${e} characters long`},min:{value:Number(e),message:d?d(t,e):`${t} should be at least ${e}`},max:{value:Number(e),message:g?g(t,e):`${t} should be at most ${e}`},regexp:(o="")=>o?new RegExp(e.regexp).test(o)||`${t} ${e.message}`:!0,email:(o="")=>o?o.match(/^(([^<>()[\]\\.,;:\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,}))$/)||(b?b(t):`${t} must be type email`):!0,match:(o="")=>o?o===(p&&p(e))||(B?B(t,m||h.changeAll(e)):`${t} must be same with ${m||h.changeAll(e)}`):!0,diff:(o="")=>o?o!==(p&&p(e))||(a?a(t,m||h.changeAll(e)):`${t} must be different with ${m||h.changeAll(e)}`):!0,pattern:{alphabet:(o="")=>!!o&&new RegExp("^[A-Za-z ]*$").test(o)||(_optionalChain([f, 'optionalAccess', _23 => _23.alphabet])?_optionalChain([f, 'optionalAccess', _24 => _24.alphabet, 'call', _25 => _25(t)]):`${t} must be format Alphabet`),alphanumber:(o="")=>!!o&&new RegExp("^[A-Za-z0-9 ]*$").test(o)||(_optionalChain([f, 'optionalAccess', _26 => _26.alphanumber])?_optionalChain([f, 'optionalAccess', _27 => _27.alphanumber, 'call', _28 => _28(t)]):`${t} must be format Alphabet or Number`),number:(o="")=>!!o&&new RegExp("^[0-9]*$").test(o)||(_optionalChain([f, 'optionalAccess', _29 => _29.number])?_optionalChain([f, 'optionalAccess', _30 => _30.number, 'call', _31 => _31(t)]):`${t} must be format Number`),lowercase:(o="")=>!!o&&new RegExp("^[a-z0-9 ]*$").test(o)||(_optionalChain([f, 'optionalAccess', _32 => _32.lowercase])?_optionalChain([f, 'optionalAccess', _33 => _33.lowercase, 'call', _34 => _34(t)]):`${t} must be format Lowercase`),url:(o="")=>!!o&&/^(ftp|http|https):\/\/[^ "]+$/.test(o)||(_optionalChain([f, 'optionalAccess', _35 => _35.url])?_optionalChain([f, 'optionalAccess', _36 => _36.url, 'call', _37 => _37(t)]):`${t} must be a valid URL`),uppercase:(o="")=>!!o&&new RegExp("^[A-Z0-9 ]*$").test(o)||(_optionalChain([f, 'optionalAccess', _38 => _38.uppercase])?_optionalChain([f, 'optionalAccess', _39 => _39.uppercase, 'call', _40 => _40(t)]):`${t} must be format Uppercase`),mixedcase:(o="")=>!!o&&/[a-z]/.test(o)&&/[A-Z]/.test(o)||(_optionalChain([f, 'optionalAccess', _41 => _41.mixedcase])?_optionalChain([f, 'optionalAccess', _42 => _42.mixedcase, 'call', _43 => _43(t)]):`${t} must be mixed case`),specialcharacters:(o="")=>!!o&&/[^a-zA-Z0-9\s]/.test(o)||(_optionalChain([f, 'optionalAccess', _44 => _44.specialcharacters])?_optionalChain([f, 'optionalAccess', _45 => _45.specialcharacters, 'call', _46 => _46(t)]):`${t} must contain special characters`)}}[r];if(y){let{validate:o}=u.find(R=>R.validate)||{};typeof y=="function"?u.push({validate:{...o,...s,[r]:y}}):r==="pattern"?u.push({validate:{...o,...s,[`${r}${e}`]:y[e]}}):u.push({[r]:y})}return u};function X({children:r,...e}){let t=_react.useMemo.call(void 0, ()=>C(),[]),{registerItem:l,unregisterItem:p,formControl:s,disabled:m,readOnly:u}=F(),{name:i,formId:x,...n}=O();_react.useEffect.call(void 0, ()=>(l({id:t,...e}),()=>{p(t)}),[t,e]),!e.label&&!e.noLabel&&(e.label=h.changeAll(e.dataField));let c=!1;typeof e.disabled=="boolean"?c=e.disabled:typeof n.disabled=="boolean"?c=n.disabled:c=!!m;let d=!1;typeof e.readOnly=="boolean"?d=e.readOnly:typeof n.readOnly=="boolean"?d=n.readOnly:d=!!u;let g=!1;return typeof e.hidden=="boolean"&&(g=e.hidden),_jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:s.control&&_jsxruntime.jsx.call(void 0, _reacthookform.Controller,{name:e.dataField,control:s.control,rules:c||d||g?{required:!1}:W(e),render:b=>_jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:_jsxruntime.jsx.call(void 0, w,{...e,controller:b,children:r})})})})}var Y=_react.createContext.call(void 0, void 0);function Er(r){let e=_react.useContext.call(void 0, Y);if(r){let t=F(),l=_reacthookform.useFieldArray.call(void 0, {control:_optionalChain([t, 'optionalAccess', _47 => _47.formControl, 'access', _48 => _48.control]),name:r});return{formArrayId:"",name:r,index:-1,...l,...t,countFields:l.fields.length,removeItem:()=>{},watchItem:()=>({}),setValueItem:()=>{}}}return e||{}}function D({children:r,...e}){return _jsxruntime.jsx.call(void 0, Y.Provider,{value:e,children:r})}var V=_react.forwardRef.call(void 0, ({name:r,className:e="",defaultData:t,children:l},p)=>{let s=F(),m=_reacthookform.useFieldArray.call(void 0, {control:s.control,name:r});_react.useEffect.call(void 0, ()=>{typeof t=="boolean"&&t?m.append({}):typeof t=="number"&&t>0?m.append([...Array(t).fill(null).map(()=>({}))]):typeof t=="object"&&t&&m.append(t)},[]);let i={formArrayId:_react.useMemo.call(void 0, ()=>C(),[]),...m,...s};return _react.useImperativeHandle.call(void 0, p,()=>i),_jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:m.fields.map((x,n)=>{let c=`${r}.${n}.`,d={...i,index:n,name:c,countFields:m.fields.length,removeItem:()=>m.remove(n),watchItem:g=>s.watch(g?`${c}${g}`:c.slice(0,-1)),setValueItem:(g,b)=>s.setValue(`${c}${g}`,b)};return _jsxruntime.jsx.call(void 0, "div",{className:e,children:_jsxruntime.jsx.call(void 0, D,{...d,children:A(l,d)})},x.id)})})});V.displayName="BgsFormArray";var Nr=V;var er=({children:r,...e})=>{let t=F(),l=_react.useMemo.call(void 0, ()=>C(),[]);return _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:_jsxruntime.jsx.call(void 0, E,{...t,...e,formGroupId:l,children:r})})};er.displayName="BgsFormGroup";var vr=er;var tt=Z;exports.BgsArrayForm = Nr; exports.BgsController = X; exports.BgsGroupForm = vr; exports.BgsReactFormProvider = J; exports.default = tt; exports.useBgsArrayForm = Er; exports.useBgsControllerForm = Fr; exports.useBgsForm = F; exports.useBgsGroupForm = O;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _react = require('react');var _jsxruntime = require('react/jsx-runtime');var O=_react.createContext.call(void 0, void 0);function F(){let r=_react.useContext.call(void 0, O);return r||{}}function U({children:r,controller:e,onSubmit:t}){let i=_react.useRef.call(void 0, []),a=_react.useCallback.call(void 0, o=>{let u=i.current.findIndex(l=>l.id===o.id);if(u>-1){let l=[...i.current];l[u]=o,i.current=[...l]}else i.current.push(o)},[i]),s=_react.useCallback.call(void 0, o=>{i.current=i.current.filter(u=>u.id!==o)},[]),d=async(o,u)=>{e.setIsSubmit(!0);let l=u?await e.formControl.trigger():!0,c=e.getData();l&&t&&t({...c,...o},{...e})},m={...e,registerItem:a,unregisterItem:s,items:i.current,triggerSubmit:d};return _jsxruntime.jsx.call(void 0, O.Provider,{value:m,children:r})}function x(){let r=()=>Math.random()*16%16|0;return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>(e==="x"?r():r()&3|8).toString(16))}function k(r,e){return typeof r=="function"?r(e):r}var h={camelCase:(r="")=>(r=r.split(".").map(e=>(e=e.charAt(0).toUpperCase()+e.slice(1),e)).join(" "),r=r.replace(/([a-z0-9])([A-Z])/g,"$1 $2"),r.charAt(0).toUpperCase()+r.slice(1)),snackCase:(r="")=>{let t=r.replace(/_([a-z])/g,(i,a)=>a.toUpperCase()).replace(/([A-Z])/g," $1");return t=t.charAt(0).toUpperCase()+t.slice(1),t},changeAll:(r="",e=!1)=>{let t="";try{r=_optionalChain([r, 'optionalAccess', _2 => _2.split, 'call', _3 => _3("."), 'access', _4 => _4[_optionalChain([r, 'optionalAccess', _5 => _5.split, 'call', _6 => _6("."), 'optionalAccess', _7 => _7.length])-1]]),r=_optionalChain([r, 'optionalAccess', _8 => _8.split, 'call', _9 => _9("[]"), 'access', _10 => _10[_optionalChain([r, 'optionalAccess', _11 => _11.split, 'call', _12 => _12("[]"), 'optionalAccess', _13 => _13.length])-1]]),t=h.snackCase(h.camelCase(r)),e&&(t=_optionalChain([t, 'optionalAccess', _14 => _14.split, 'call', _15 => _15(" "), 'optionalAccess', _16 => _16.map, 'call', _17 => _17(i=>_optionalChain([i, 'optionalAccess', _18 => _18.length])<=3?_optionalChain([i, 'optionalAccess', _19 => _19.toUpperCase, 'call', _20 => _20()]):i), 'optionalAccess', _21 => _21.join, 'call', _22 => _22(" ")]))}catch (e2){}return t}};function N(r,e){try{return JSON.stringify(r)!==JSON.stringify(e)}catch (e3){return!1}}var A=r=>(Object.keys(r).forEach(e=>{r[e]===void 0&&(r[e]=null)}),r),T=(r,e,t)=>{if(!r)return"";let i=e.replace(/\[(\d+)\]/g,".$1").split("."),a=r;for(let s of i){if(a==null)return t;a=a[s]}return a===void 0?t:a};function L(r,e){let t=!1;return r&&typeof r=="object"&&Array.isArray(r)&&(typeof e=="number"?r.length>e&&(t=!0):t=!0),t}var _reacthookform = require('react-hook-form');var D=(r,e)=>{r||(r={});let t=_react.useRef.call(void 0, null),[i,a]=_react.useState.call(void 0, !1),[s,d]=_react.useState.call(void 0, {}),m=_reacthookform.useForm.call(void 0, {...e,reValidateMode:"onSubmit",mode:"all",defaultValues:r}),o=_react.useMemo.call(void 0, ()=>x(),[]),u=p=>p?T(A(m.getValues()),p):A(m.getValues()),g={...m,ref:t,reset:p=>{p?typeof p=="string"?m.resetField(p,{}):typeof p=="object"&&L(p,0)&&p.forEach(y=>m.resetField(y)):m.reset()},updateData:p=>{let y=u();m.reset({...y,...p})},getData:u,formControl:m,useFieldArray:p=>_reacthookform.useFieldArray.call(void 0, {control:m.control,name:p}),useWatch:p=>_reacthookform.useWatch.call(void 0, {control:m.control,name:p}),isSubmit:i,formId:o,setIsSubmit:a,useSelected:p=>T(s,p),setSelected:d};return[g,g]};var de=({onSubmit:r,onChange:e=()=>{},onInvalid:t=()=>{},formData:i,controller:a,children:s,...d})=>{let m=_nullishCoalesce(a, () => (D())),[o]=Array.isArray(m)?m:[m],u=_react.useRef.call(void 0, void 0),l=async c=>{c.preventDefault(),c.stopPropagation(),o.setIsSubmit(!0);let g=await o.formControl.trigger(),p=o.getData();g?r&&r({...p},{...o}):t(o.formControl.formState.errors)};return _react.useEffect.call(void 0, ()=>{i&&N(u.current||{},i)&&(o.formControl.reset(i),u.current=i)},[i,o.formControl.reset]),_react.useEffect.call(void 0, ()=>{if(!e)return;let c=o.formControl.watch(e);return()=>c.unsubscribe()},[]),_jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:_jsxruntime.jsx.call(void 0, U,{controller:o,onSubmit:r,children:_jsxruntime.jsx.call(void 0, "form",{...d,id:o.formId,ref:o.ref,onSubmit:l,children:s})})})},K=de;var z=_react.createContext.call(void 0, void 0);function Fe(){let r=_react.useContext.call(void 0, z);return r||{}}function P({children:r,...e}){return _jsxruntime.jsx.call(void 0, z.Provider,{value:e,children:r})}var Z=r=>{let e=F(),t=_reacthookform.useFieldArray.call(void 0, {control:e.control,name:r}),a={formArrayId:_react.useMemo.call(void 0, ()=>x(),[]),...t,...e};return[a,a]};var H=({name:r,defaultData:e,controller:t,children:i})=>{let a=_nullishCoalesce(t, () => (Z(r))),[s]=Array.isArray(a)?a:[a];return _react.useEffect.call(void 0, ()=>{typeof e=="boolean"&&e?s.append({}):typeof e=="number"&&e>0?s.append([...Array(e).fill(null).map(()=>({}))]):typeof e=="object"&&e&&s.append(e)},[]),_jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:s.fields.map((d,m)=>{let o=`${r}.${m}.`,u={...s,index:m,name:o,countFields:s.fields.length,removeItem:()=>s.remove(m),watchItem:l=>s.watch(l?`${o}${l}`:o.slice(0,-1)),setValueItem:(l,c)=>s.setValue(`${o}${l}`,c),useSelectedItem:l=>s.useSelected(`${o}${l}`)};return _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:_jsxruntime.jsx.call(void 0, P,{...u,children:k(i,u)},d.id)})})})};H.displayName="BgsFormArray";var Ue=H;var j=_react.createContext.call(void 0, void 0);function Re(){let r=_react.useContext.call(void 0, j);return r||{}}function S({children:r,...e}){return _jsxruntime.jsx.call(void 0, j.Provider,{value:e,children:r})}var J=_react.createContext.call(void 0, void 0);function $(){let r=_react.useContext.call(void 0, J);return r||{}}function w({children:r,...e}){return _jsxruntime.jsx.call(void 0, J.Provider,{value:e,children:r})}var _=_react.createContext.call(void 0, void 0);function Q(){let r=_react.useContext.call(void 0, _);return r||{}}function X({children:r,...e}){return _jsxruntime.jsx.call(void 0, _.Provider,{value:e,children:r})}function B({validationRules:r,label:e}){let{formControl:t,getData:i}=F(),a=[];return r&&(typeof r=="string"?Y(r,!0,e,t,i,{}).forEach(s=>a.push(s)):typeof r=="object"&&Object.keys(r).forEach(s=>{let{validate:d}=a.find(o=>o.validate)||{};if(["minLength","maxLength","min","max","match","diff","regexp","pattern","required","email"].includes(s)){let o=r[s],u="";if(s==="email"&&!o)return;["match","diff"].includes(s)&&typeof o=="object"&&(o=r[s].dataField,u=r[s].label),o!=null&&Y(s,o,e,t,i,d,u).forEach(l=>a.push(l))}else if(typeof r[s]=="object"){let o=r[s];a.push({validate:{...d,[s]:u=>o.validation(u)||o.message&&(typeof o.message=="string"?o.message:o.message(e))}})}})),Object.assign({},...a)}var Y=(r,e,t,i,a,s,d)=>{let m=[],{validationMessage:o}=Q(),{required:u,minLength:l,maxLength:c,min:g,max:p,email:y,match:W,diff:v,pattern:f}=o||{},b={required:{value:!!e,message:u?u(t):`${t} is required`},minLength:{value:e,message:l?l(t,e):`${t} must be at least ${e} characters long`},maxLength:{value:e,message:c?c(t,e):`${t} cannot be more than ${e} characters long`},min:{value:Number(e),message:g?g(t,e):`${t} should be at least ${e}`},max:{value:Number(e),message:p?p(t,e):`${t} should be at most ${e}`},regexp:(n="")=>n?new RegExp(e.regexp).test(n)||`${t} ${e.message}`:!0,email:(n="")=>n?n.match(/^(([^<>()[\]\\.,;:\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,}))$/)||(y?y(t):`${t} must be type email`):!0,match:(n="")=>n?n===(a&&a(e))||(W?W(t,d||h.changeAll(e)):`${t} must be same with ${d||h.changeAll(e)}`):!0,diff:(n="")=>n?n!==(a&&a(e))||(v?v(t,d||h.changeAll(e)):`${t} must be different with ${d||h.changeAll(e)}`):!0,pattern:{alphabet:(n="")=>!!n&&new RegExp("^[A-Za-z ]*$").test(n)||(_optionalChain([f, 'optionalAccess', _23 => _23.alphabet])?_optionalChain([f, 'optionalAccess', _24 => _24.alphabet, 'call', _25 => _25(t)]):`${t} must be format Alphabet`),alphanumber:(n="")=>!!n&&new RegExp("^[A-Za-z0-9 ]*$").test(n)||(_optionalChain([f, 'optionalAccess', _26 => _26.alphanumber])?_optionalChain([f, 'optionalAccess', _27 => _27.alphanumber, 'call', _28 => _28(t)]):`${t} must be format Alphabet or Number`),number:(n="")=>!!n&&new RegExp("^[0-9]*$").test(n)||(_optionalChain([f, 'optionalAccess', _29 => _29.number])?_optionalChain([f, 'optionalAccess', _30 => _30.number, 'call', _31 => _31(t)]):`${t} must be format Number`),lowercase:(n="")=>!!n&&new RegExp("^[a-z0-9 ]*$").test(n)||(_optionalChain([f, 'optionalAccess', _32 => _32.lowercase])?_optionalChain([f, 'optionalAccess', _33 => _33.lowercase, 'call', _34 => _34(t)]):`${t} must be format Lowercase`),url:(n="")=>!!n&&/^(ftp|http|https):\/\/[^ "]+$/.test(n)||(_optionalChain([f, 'optionalAccess', _35 => _35.url])?_optionalChain([f, 'optionalAccess', _36 => _36.url, 'call', _37 => _37(t)]):`${t} must be a valid URL`),uppercase:(n="")=>!!n&&new RegExp("^[A-Z0-9 ]*$").test(n)||(_optionalChain([f, 'optionalAccess', _38 => _38.uppercase])?_optionalChain([f, 'optionalAccess', _39 => _39.uppercase, 'call', _40 => _40(t)]):`${t} must be format Uppercase`),mixedcase:(n="")=>!!n&&/[a-z]/.test(n)&&/[A-Z]/.test(n)||(_optionalChain([f, 'optionalAccess', _41 => _41.mixedcase])?_optionalChain([f, 'optionalAccess', _42 => _42.mixedcase, 'call', _43 => _43(t)]):`${t} must be mixed case`),specialcharacters:(n="")=>!!n&&/[^a-zA-Z0-9\s]/.test(n)||(_optionalChain([f, 'optionalAccess', _44 => _44.specialcharacters])?_optionalChain([f, 'optionalAccess', _45 => _45.specialcharacters, 'call', _46 => _46(t)]):`${t} must contain special characters`)}}[r];if(b){let{validate:n}=m.find(te=>te.validate)||{};typeof b=="function"?m.push({validate:{...n,...s,[r]:b}}):r==="pattern"?m.push({validate:{...n,...s,[`${r}${e}`]:b[e]}}):m.push({[r]:b})}return m};var ke=({children:r,...e})=>{let t=_react.useMemo.call(void 0, ()=>x(),[]),{registerItem:i,unregisterItem:a,formControl:s,disabled:d,readOnly:m}=F(),{name:o,formId:u,...l}=$();_react.useEffect.call(void 0, ()=>(i({id:t,...e}),()=>{a(t)}),[t,e]),!e.label&&!e.noLabel&&(e.label=h.changeAll(e.dataField));let c=!1;typeof e.disabled=="boolean"?c=e.disabled:typeof l.disabled=="boolean"?c=l.disabled:c=!!d;let g=!1;typeof e.readOnly=="boolean"?g=e.readOnly:typeof l.readOnly=="boolean"?g=l.readOnly:g=!!m;let p=!1;return typeof e.hidden=="boolean"&&(p=e.hidden),_jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:s.control&&_jsxruntime.jsx.call(void 0, _reacthookform.Controller,{name:e.dataField,control:s.control,rules:c||g||p?{required:!1}:B(e),render:y=>_jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:_jsxruntime.jsx.call(void 0, S,{...e,controller:y,children:r})})})})},Ne= exports.BgsController =ke;var re=({children:r,...e})=>{let t=F(),i=_react.useMemo.call(void 0, ()=>x(),[]);return _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:_jsxruntime.jsx.call(void 0, w,{...t,...e,formGroupId:i,children:r})})};re.displayName="BgsFormGroup";var Ee=re;var Me=(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))(Me||{});var st=K;exports.BgsArrayForm = Ue; exports.BgsController = Ne; exports.BgsGroupForm = Ee; exports.BgsReactFormProvider = X; exports.PatternTypeEnum = Me; exports.default = st; exports.useBgsArrayForm = Fe; exports.useBgsControllerForm = Re; exports.useBgsForm = F; exports.useBgsGroupForm = $; exports.useFormArrayInit = Z; exports.useFormInit = D;
package/dist/index.d.cts CHANGED
@@ -1,34 +1,71 @@
1
- import React$1, { ReactNode, PropsWithChildren } from 'react';
2
- import { UseFormReturn, UseFieldArrayReturn, DeepPartialSkipArrayKey, EventType, UseFieldArraySwap, UseFieldArrayMove, UseFieldArrayPrepend, UseFieldArrayAppend, UseFieldArrayRemove, UseFieldArrayInsert, UseFieldArrayUpdate, UseFieldArrayReplace, FieldArrayWithId, ControllerRenderProps, FieldValues, ControllerFieldState, UseFormStateReturn } from 'react-hook-form';
3
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode, PropsWithChildren } from 'react';
3
+ import { DeepPartialSkipArrayKey, ControllerRenderProps, FieldValues, ControllerFieldState, UseFormStateReturn, UseFormReturn, UseFieldArrayReturn, EventType, FieldErrors, UseFieldArraySwap, UseFieldArrayMove, UseFieldArrayPrepend, UseFieldArrayAppend, UseFieldArrayRemove, UseFieldArrayInsert, UseFieldArrayUpdate, UseFieldArrayReplace, FieldArrayWithId, UseFormProps } from 'react-hook-form';
4
4
 
5
+ type ControllerWithKey = ControllerProps & {
6
+ id: string;
7
+ };
5
8
  interface FormDefaultProps {
6
9
  disabled?: boolean;
7
10
  readOnly?: boolean;
8
11
  name?: string;
9
12
  }
10
- interface FormProps<T = unknown> extends FormDefaultProps {
11
- children?: Children;
12
- formData?: Partial<T>;
13
+ type Children<T = unknown> = ChildFunction<T> | React.ReactNode;
14
+ type ChildFunction<T = unknown> = (props: T) => Children<T>;
15
+ interface Controller$1 {
16
+ field: ControllerRenderProps<FieldValues, string>;
17
+ fieldState: ControllerFieldState;
18
+ formState: UseFormStateReturn<FieldValues>;
19
+ }
20
+ type UseWatch<T = any> = (name: string) => DeepPartialSkipArrayKey<T>;
21
+ type NestedKeyOf<T> = T extends object ? T extends any[] ? string : {
22
+ [K in keyof T]: T[K] extends object ? T[K] extends any[] ? `${K & string}` : `${K & string}` | `${K & string}.${NestedKeyOf<T[K]>}` : `${K & string}`;
23
+ }[keyof T] : never;
24
+
25
+ type OnSubmit<T = any> = (values: T, options: UseFormInitReturn<T>) => void;
26
+ type TriggerSubmit<T = unknown> = (addValues?: T, validate?: boolean) => void;
27
+ type UseSelected<T> = <K>(key: NestedKeyOf<T>) => K | undefined;
28
+ type SelectedNested<T> = Partial<Record<NestedKeyOf<T>, any>>;
29
+ type FormProps<T = unknown> = Omit<React.FormHTMLAttributes<HTMLFormElement>, "onSubmit" | "onChange"> & FormDefaultProps & {
30
+ formData?: Partial<T> | null;
31
+ controller?: UseFormInitReturn<T> | UseFormInitReturn<T>[];
13
32
  onSubmit?: OnSubmit<T>;
14
- className?: string;
15
33
  onChange?: (values: T, event: {
16
34
  name?: string | undefined;
17
35
  type?: EventType | undefined;
18
36
  }) => void;
19
- }
20
- interface FormRef<T = unknown> extends FormDefaultProps, Omit<UseFormReturn, "reset"> {
37
+ onInvalid?: (errors: FieldErrors) => void;
38
+ };
39
+ interface UseFormInitReturn<T = unknown> extends FormDefaultProps, Omit<UseFormReturn, "reset"> {
21
40
  reset: (field?: string | string[]) => void;
22
41
  updateData: (values: Partial<T>) => void;
23
42
  getData: (field?: string) => T;
24
- triggerSubmit: (addValues?: T, options?: OptionsSubmit) => void;
25
43
  formControl: UseFormReturn;
26
44
  useFieldArray: (name: string) => UseFieldArrayReturn;
27
45
  useWatch: UseWatch<T>;
28
46
  isSubmit: boolean;
47
+ setIsSubmit: React.Dispatch<React.SetStateAction<boolean>>;
29
48
  formId: string;
30
49
  name?: string;
50
+ ref: React.RefObject<HTMLFormElement | null>;
51
+ setSelected: React.Dispatch<SelectedNested<T>>;
52
+ useSelected: UseSelected<T>;
53
+ }
54
+ interface FormArrayProps<T = unknown> {
55
+ name: string;
56
+ defaultData?: T | T[] | boolean | number;
57
+ controller?: UseFormArrayInitReturn<T> | UseFormArrayInitReturn<T>[];
58
+ children?: Children<T>;
31
59
  }
60
+ type UseFormArrayInitReturn<T> = UseFieldArrayReturn & UseBgsForm<T> & {
61
+ formArrayId: string;
62
+ };
63
+ type UseBgsForm<T = unknown> = UseFormInitReturn<T> & {
64
+ registerItem: (ref: ControllerWithKey) => void;
65
+ unregisterItem: (id: string) => void;
66
+ items: ControllerWithKey[];
67
+ triggerSubmit: TriggerSubmit<T>;
68
+ };
32
69
  interface ControllerProps {
33
70
  dataField: string;
34
71
  validationRules?: ValidationRules;
@@ -38,12 +75,17 @@ interface ControllerProps {
38
75
  hidden?: boolean;
39
76
  readOnly?: boolean;
40
77
  }
41
- type Children = ChildFunction | React.ReactNode;
42
- type ChildFunction = <T = unknown>(props: T) => Children;
43
- type BgsFormType = <T>(props: FormProps<T> & {
44
- ref?: React.RefObject<FormRef<T>>;
45
- }) => any;
46
78
  type PatternType = "alphabet" | "alphanumber" | "number" | "lowercase" | "url" | "uppercase" | "mixedcase" | "specialcharacters";
79
+ declare enum PatternTypeEnum {
80
+ alphabet = "alphabet",
81
+ alphaNumber = "alphanumber",
82
+ number = "number",
83
+ lowercase = "lowercase",
84
+ url = "url",
85
+ uppercase = "uppercase",
86
+ mixedCase = "mixedcase",
87
+ specialCharacters = "specialcharacters"
88
+ }
47
89
  interface ValidationCallback {
48
90
  message?: string | ((label: string) => string);
49
91
  validation: (value: any) => boolean | string | null | undefined | number | object;
@@ -71,33 +113,13 @@ interface ValidationOptions {
71
113
  [x: string]: ValidationCallback | string | number | undefined | boolean | object;
72
114
  }
73
115
  type ValidationRules = "required" | "email" | ValidationOptions;
74
- interface Controller$1 {
75
- field: ControllerRenderProps<FieldValues, string>;
76
- fieldState: ControllerFieldState;
77
- formState: UseFormStateReturn<FieldValues>;
78
- }
79
- interface OptionsSubmit {
80
- validate?: boolean;
81
- }
82
- interface OnSubmitOptions<T = any> extends FormRef<T>, OptionsSubmit {
83
- }
84
- type OnSubmit<T = any> = (values: T, options: OnSubmitOptions) => void;
85
- type UseWatch<T = any> = (name: string) => DeepPartialSkipArrayKey<T>;
86
- interface FormArrayProps<T = any> {
87
- name: string;
88
- className?: string;
89
- defaultData?: T | T[] | boolean | number;
90
- children?: Children;
91
- }
92
- interface FormArrayItem extends FormArrayRef {
93
- index: number;
116
+ interface FormGroupProps {
94
117
  name: string;
95
- countFields: number;
96
- watchItem<T = any>(name?: string): DeepPartialSkipArrayKey<T>;
97
- removeItem: () => void;
98
- setValueItem: (dataField: string, value: any) => void;
118
+ disabled?: boolean;
119
+ hidden?: boolean;
120
+ readOnly?: boolean;
99
121
  }
100
- interface FormArrayRef<T = any> extends FormRef<T> {
122
+ type UseFormArray<T> = UseFormArrayInitReturn<T> & {
101
123
  formArrayId: string;
102
124
  swap: UseFieldArraySwap;
103
125
  move: UseFieldArrayMove;
@@ -108,25 +130,43 @@ interface FormArrayRef<T = any> extends FormRef<T> {
108
130
  update: UseFieldArrayUpdate<any, any>;
109
131
  replace: UseFieldArrayReplace<any, any>;
110
132
  fields: FieldArrayWithId<any, any, any>[];
111
- }
112
- interface FormGroupProps {
133
+ index: number;
113
134
  name: string;
114
- disabled?: boolean;
115
- hidden?: boolean;
116
- readOnly?: boolean;
117
- }
135
+ countFields: number;
136
+ watchItem<T = any>(name?: string): DeepPartialSkipArrayKey<T>;
137
+ removeItem: () => void;
138
+ setValueItem: (dataField: string, value: any) => void;
139
+ useSelectedItem: UseSelected<T>;
140
+ };
141
+ type UseController = ControllerProps & {
142
+ controller: Controller$1;
143
+ };
118
144
 
119
- declare const BgsForm: BgsFormType;
145
+ declare const BgsForm: <T>({ onSubmit, onChange, onInvalid, formData, controller: controllerProps, children, ...others }: PropsWithChildren<FormProps<T>>) => react_jsx_runtime.JSX.Element;
120
146
 
121
- declare function Controller({ children, ...props }: PropsWithChildren<ControllerProps>): react_jsx_runtime.JSX.Element;
147
+ declare const FormArray: {
148
+ <T>({ name, defaultData, controller: controllerProps, children }: PropsWithChildren<FormArrayProps<T>>): react_jsx_runtime.JSX.Element;
149
+ displayName: string;
150
+ };
122
151
 
123
- declare const FormArray: React$1.ForwardRefExoticComponent<FormArrayProps<unknown> & React$1.RefAttributes<FormArrayRef<unknown>>>;
152
+ declare const Controller: ({ children, ...props }: PropsWithChildren<ControllerProps>) => react_jsx_runtime.JSX.Element;
124
153
 
125
154
  declare const FormGroup: {
126
155
  ({ children, ...formProps }: PropsWithChildren<FormGroupProps>): react_jsx_runtime.JSX.Element;
127
156
  displayName: string;
128
157
  };
129
158
 
159
+ declare function useFormArray<T = unknown>(): UseFormArray<T>;
160
+
161
+ declare function useController<T = unknown>(): UseController & T;
162
+
163
+ declare function useForm<T = unknown>(): UseBgsForm<T>;
164
+
165
+ type UseFormGroup = FormGroupProps & UseFormInitReturn & {
166
+ formGroupId: string;
167
+ };
168
+ declare function useFormGroup(): UseFormGroup;
169
+
130
170
  interface BgsReactFormContextData {
131
171
  validationMessage?: {
132
172
  visibleLabel?: boolean;
@@ -152,28 +192,8 @@ interface BgsReactFormContextData {
152
192
  }
153
193
  declare function BgsReactFormProvider({ children, ...value }: PropsWithChildren<BgsReactFormContextData>): react_jsx_runtime.JSX.Element;
154
194
 
155
- type ControllerWithKey = ControllerProps & {
156
- id: string;
157
- };
158
- interface BgsFormContextData<T = any> extends FormRef<T> {
159
- registerItem: (ref: ControllerWithKey) => void;
160
- unregisterItem: (id: string) => void;
161
- items: ControllerWithKey[];
162
- }
163
- declare function useBgsForm(): BgsFormContextData;
195
+ declare const useFormInit: <T = unknown>(defaultValues?: Partial<T> | undefined, options?: UseFormProps) => UseFormInitReturn<T>[];
164
196
 
165
- interface BgsFormArrayContextData extends FormArrayItem {
166
- }
167
- declare function useBgsFormArray(name?: string): BgsFormArrayContextData;
168
-
169
- type BgsFormGroupData = FormGroupProps & FormRef & {
170
- formGroupId: string;
171
- };
172
- declare function useBgsFormGroup(): BgsFormGroupData;
173
-
174
- interface BgsFormControllerContextData extends ControllerProps {
175
- controller: Controller$1;
176
- }
177
- declare function useBgsFormController<T = unknown>(): BgsFormControllerContextData & T;
197
+ declare const useFormArrayInit: <T = unknown>(name: string) => UseFormArrayInitReturn<T>[];
178
198
 
179
- export { FormArray as BgsArrayForm, Controller as BgsController, type BgsFormType, FormGroup as BgsGroupForm, BgsReactFormProvider, type Children, type Controller$1 as Controller, type ControllerProps, type FormArrayItem, type FormArrayProps, type FormArrayRef, type FormGroupProps, type FormProps, type FormRef, type OnSubmit, type OptionsSubmit, type ValidationCallback, type ValidationOptions, type ValidationRules, BgsForm as default, useBgsFormArray as useBgsArrayForm, useBgsFormController as useBgsControllerForm, useBgsForm, useBgsFormGroup as useBgsGroupForm };
199
+ export { FormArray as BgsArrayForm, Controller as BgsController, FormGroup as BgsGroupForm, BgsReactFormProvider, type ControllerProps, type FormArrayProps, type FormGroupProps, type FormProps, 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, useFormArray as useBgsArrayForm, useController as useBgsControllerForm, useForm as useBgsForm, useFormGroup as useBgsGroupForm, useFormArrayInit, useFormInit };
package/dist/index.d.ts CHANGED
@@ -1,34 +1,71 @@
1
- import React$1, { ReactNode, PropsWithChildren } from 'react';
2
- import { UseFormReturn, UseFieldArrayReturn, DeepPartialSkipArrayKey, EventType, UseFieldArraySwap, UseFieldArrayMove, UseFieldArrayPrepend, UseFieldArrayAppend, UseFieldArrayRemove, UseFieldArrayInsert, UseFieldArrayUpdate, UseFieldArrayReplace, FieldArrayWithId, ControllerRenderProps, FieldValues, ControllerFieldState, UseFormStateReturn } from 'react-hook-form';
3
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode, PropsWithChildren } from 'react';
3
+ import { DeepPartialSkipArrayKey, ControllerRenderProps, FieldValues, ControllerFieldState, UseFormStateReturn, UseFormReturn, UseFieldArrayReturn, EventType, FieldErrors, UseFieldArraySwap, UseFieldArrayMove, UseFieldArrayPrepend, UseFieldArrayAppend, UseFieldArrayRemove, UseFieldArrayInsert, UseFieldArrayUpdate, UseFieldArrayReplace, FieldArrayWithId, UseFormProps } from 'react-hook-form';
4
4
 
5
+ type ControllerWithKey = ControllerProps & {
6
+ id: string;
7
+ };
5
8
  interface FormDefaultProps {
6
9
  disabled?: boolean;
7
10
  readOnly?: boolean;
8
11
  name?: string;
9
12
  }
10
- interface FormProps<T = unknown> extends FormDefaultProps {
11
- children?: Children;
12
- formData?: Partial<T>;
13
+ type Children<T = unknown> = ChildFunction<T> | React.ReactNode;
14
+ type ChildFunction<T = unknown> = (props: T) => Children<T>;
15
+ interface Controller$1 {
16
+ field: ControllerRenderProps<FieldValues, string>;
17
+ fieldState: ControllerFieldState;
18
+ formState: UseFormStateReturn<FieldValues>;
19
+ }
20
+ type UseWatch<T = any> = (name: string) => DeepPartialSkipArrayKey<T>;
21
+ type NestedKeyOf<T> = T extends object ? T extends any[] ? string : {
22
+ [K in keyof T]: T[K] extends object ? T[K] extends any[] ? `${K & string}` : `${K & string}` | `${K & string}.${NestedKeyOf<T[K]>}` : `${K & string}`;
23
+ }[keyof T] : never;
24
+
25
+ type OnSubmit<T = any> = (values: T, options: UseFormInitReturn<T>) => void;
26
+ type TriggerSubmit<T = unknown> = (addValues?: T, validate?: boolean) => void;
27
+ type UseSelected<T> = <K>(key: NestedKeyOf<T>) => K | undefined;
28
+ type SelectedNested<T> = Partial<Record<NestedKeyOf<T>, any>>;
29
+ type FormProps<T = unknown> = Omit<React.FormHTMLAttributes<HTMLFormElement>, "onSubmit" | "onChange"> & FormDefaultProps & {
30
+ formData?: Partial<T> | null;
31
+ controller?: UseFormInitReturn<T> | UseFormInitReturn<T>[];
13
32
  onSubmit?: OnSubmit<T>;
14
- className?: string;
15
33
  onChange?: (values: T, event: {
16
34
  name?: string | undefined;
17
35
  type?: EventType | undefined;
18
36
  }) => void;
19
- }
20
- interface FormRef<T = unknown> extends FormDefaultProps, Omit<UseFormReturn, "reset"> {
37
+ onInvalid?: (errors: FieldErrors) => void;
38
+ };
39
+ interface UseFormInitReturn<T = unknown> extends FormDefaultProps, Omit<UseFormReturn, "reset"> {
21
40
  reset: (field?: string | string[]) => void;
22
41
  updateData: (values: Partial<T>) => void;
23
42
  getData: (field?: string) => T;
24
- triggerSubmit: (addValues?: T, options?: OptionsSubmit) => void;
25
43
  formControl: UseFormReturn;
26
44
  useFieldArray: (name: string) => UseFieldArrayReturn;
27
45
  useWatch: UseWatch<T>;
28
46
  isSubmit: boolean;
47
+ setIsSubmit: React.Dispatch<React.SetStateAction<boolean>>;
29
48
  formId: string;
30
49
  name?: string;
50
+ ref: React.RefObject<HTMLFormElement | null>;
51
+ setSelected: React.Dispatch<SelectedNested<T>>;
52
+ useSelected: UseSelected<T>;
53
+ }
54
+ interface FormArrayProps<T = unknown> {
55
+ name: string;
56
+ defaultData?: T | T[] | boolean | number;
57
+ controller?: UseFormArrayInitReturn<T> | UseFormArrayInitReturn<T>[];
58
+ children?: Children<T>;
31
59
  }
60
+ type UseFormArrayInitReturn<T> = UseFieldArrayReturn & UseBgsForm<T> & {
61
+ formArrayId: string;
62
+ };
63
+ type UseBgsForm<T = unknown> = UseFormInitReturn<T> & {
64
+ registerItem: (ref: ControllerWithKey) => void;
65
+ unregisterItem: (id: string) => void;
66
+ items: ControllerWithKey[];
67
+ triggerSubmit: TriggerSubmit<T>;
68
+ };
32
69
  interface ControllerProps {
33
70
  dataField: string;
34
71
  validationRules?: ValidationRules;
@@ -38,12 +75,17 @@ interface ControllerProps {
38
75
  hidden?: boolean;
39
76
  readOnly?: boolean;
40
77
  }
41
- type Children = ChildFunction | React.ReactNode;
42
- type ChildFunction = <T = unknown>(props: T) => Children;
43
- type BgsFormType = <T>(props: FormProps<T> & {
44
- ref?: React.RefObject<FormRef<T>>;
45
- }) => any;
46
78
  type PatternType = "alphabet" | "alphanumber" | "number" | "lowercase" | "url" | "uppercase" | "mixedcase" | "specialcharacters";
79
+ declare enum PatternTypeEnum {
80
+ alphabet = "alphabet",
81
+ alphaNumber = "alphanumber",
82
+ number = "number",
83
+ lowercase = "lowercase",
84
+ url = "url",
85
+ uppercase = "uppercase",
86
+ mixedCase = "mixedcase",
87
+ specialCharacters = "specialcharacters"
88
+ }
47
89
  interface ValidationCallback {
48
90
  message?: string | ((label: string) => string);
49
91
  validation: (value: any) => boolean | string | null | undefined | number | object;
@@ -71,33 +113,13 @@ interface ValidationOptions {
71
113
  [x: string]: ValidationCallback | string | number | undefined | boolean | object;
72
114
  }
73
115
  type ValidationRules = "required" | "email" | ValidationOptions;
74
- interface Controller$1 {
75
- field: ControllerRenderProps<FieldValues, string>;
76
- fieldState: ControllerFieldState;
77
- formState: UseFormStateReturn<FieldValues>;
78
- }
79
- interface OptionsSubmit {
80
- validate?: boolean;
81
- }
82
- interface OnSubmitOptions<T = any> extends FormRef<T>, OptionsSubmit {
83
- }
84
- type OnSubmit<T = any> = (values: T, options: OnSubmitOptions) => void;
85
- type UseWatch<T = any> = (name: string) => DeepPartialSkipArrayKey<T>;
86
- interface FormArrayProps<T = any> {
87
- name: string;
88
- className?: string;
89
- defaultData?: T | T[] | boolean | number;
90
- children?: Children;
91
- }
92
- interface FormArrayItem extends FormArrayRef {
93
- index: number;
116
+ interface FormGroupProps {
94
117
  name: string;
95
- countFields: number;
96
- watchItem<T = any>(name?: string): DeepPartialSkipArrayKey<T>;
97
- removeItem: () => void;
98
- setValueItem: (dataField: string, value: any) => void;
118
+ disabled?: boolean;
119
+ hidden?: boolean;
120
+ readOnly?: boolean;
99
121
  }
100
- interface FormArrayRef<T = any> extends FormRef<T> {
122
+ type UseFormArray<T> = UseFormArrayInitReturn<T> & {
101
123
  formArrayId: string;
102
124
  swap: UseFieldArraySwap;
103
125
  move: UseFieldArrayMove;
@@ -108,25 +130,43 @@ interface FormArrayRef<T = any> extends FormRef<T> {
108
130
  update: UseFieldArrayUpdate<any, any>;
109
131
  replace: UseFieldArrayReplace<any, any>;
110
132
  fields: FieldArrayWithId<any, any, any>[];
111
- }
112
- interface FormGroupProps {
133
+ index: number;
113
134
  name: string;
114
- disabled?: boolean;
115
- hidden?: boolean;
116
- readOnly?: boolean;
117
- }
135
+ countFields: number;
136
+ watchItem<T = any>(name?: string): DeepPartialSkipArrayKey<T>;
137
+ removeItem: () => void;
138
+ setValueItem: (dataField: string, value: any) => void;
139
+ useSelectedItem: UseSelected<T>;
140
+ };
141
+ type UseController = ControllerProps & {
142
+ controller: Controller$1;
143
+ };
118
144
 
119
- declare const BgsForm: BgsFormType;
145
+ declare const BgsForm: <T>({ onSubmit, onChange, onInvalid, formData, controller: controllerProps, children, ...others }: PropsWithChildren<FormProps<T>>) => react_jsx_runtime.JSX.Element;
120
146
 
121
- declare function Controller({ children, ...props }: PropsWithChildren<ControllerProps>): react_jsx_runtime.JSX.Element;
147
+ declare const FormArray: {
148
+ <T>({ name, defaultData, controller: controllerProps, children }: PropsWithChildren<FormArrayProps<T>>): react_jsx_runtime.JSX.Element;
149
+ displayName: string;
150
+ };
122
151
 
123
- declare const FormArray: React$1.ForwardRefExoticComponent<FormArrayProps<unknown> & React$1.RefAttributes<FormArrayRef<unknown>>>;
152
+ declare const Controller: ({ children, ...props }: PropsWithChildren<ControllerProps>) => react_jsx_runtime.JSX.Element;
124
153
 
125
154
  declare const FormGroup: {
126
155
  ({ children, ...formProps }: PropsWithChildren<FormGroupProps>): react_jsx_runtime.JSX.Element;
127
156
  displayName: string;
128
157
  };
129
158
 
159
+ declare function useFormArray<T = unknown>(): UseFormArray<T>;
160
+
161
+ declare function useController<T = unknown>(): UseController & T;
162
+
163
+ declare function useForm<T = unknown>(): UseBgsForm<T>;
164
+
165
+ type UseFormGroup = FormGroupProps & UseFormInitReturn & {
166
+ formGroupId: string;
167
+ };
168
+ declare function useFormGroup(): UseFormGroup;
169
+
130
170
  interface BgsReactFormContextData {
131
171
  validationMessage?: {
132
172
  visibleLabel?: boolean;
@@ -152,28 +192,8 @@ interface BgsReactFormContextData {
152
192
  }
153
193
  declare function BgsReactFormProvider({ children, ...value }: PropsWithChildren<BgsReactFormContextData>): react_jsx_runtime.JSX.Element;
154
194
 
155
- type ControllerWithKey = ControllerProps & {
156
- id: string;
157
- };
158
- interface BgsFormContextData<T = any> extends FormRef<T> {
159
- registerItem: (ref: ControllerWithKey) => void;
160
- unregisterItem: (id: string) => void;
161
- items: ControllerWithKey[];
162
- }
163
- declare function useBgsForm(): BgsFormContextData;
195
+ declare const useFormInit: <T = unknown>(defaultValues?: Partial<T> | undefined, options?: UseFormProps) => UseFormInitReturn<T>[];
164
196
 
165
- interface BgsFormArrayContextData extends FormArrayItem {
166
- }
167
- declare function useBgsFormArray(name?: string): BgsFormArrayContextData;
168
-
169
- type BgsFormGroupData = FormGroupProps & FormRef & {
170
- formGroupId: string;
171
- };
172
- declare function useBgsFormGroup(): BgsFormGroupData;
173
-
174
- interface BgsFormControllerContextData extends ControllerProps {
175
- controller: Controller$1;
176
- }
177
- declare function useBgsFormController<T = unknown>(): BgsFormControllerContextData & T;
197
+ declare const useFormArrayInit: <T = unknown>(name: string) => UseFormArrayInitReturn<T>[];
178
198
 
179
- export { FormArray as BgsArrayForm, Controller as BgsController, type BgsFormType, FormGroup as BgsGroupForm, BgsReactFormProvider, type Children, type Controller$1 as Controller, type ControllerProps, type FormArrayItem, type FormArrayProps, type FormArrayRef, type FormGroupProps, type FormProps, type FormRef, type OnSubmit, type OptionsSubmit, type ValidationCallback, type ValidationOptions, type ValidationRules, BgsForm as default, useBgsFormArray as useBgsArrayForm, useBgsFormController as useBgsControllerForm, useBgsForm, useBgsFormGroup as useBgsGroupForm };
199
+ export { FormArray as BgsArrayForm, Controller as BgsController, FormGroup as BgsGroupForm, BgsReactFormProvider, type ControllerProps, type FormArrayProps, type FormGroupProps, type FormProps, 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, useFormArray as useBgsArrayForm, useController as useBgsControllerForm, useForm as useBgsForm, useFormGroup as useBgsGroupForm, useFormArrayInit, useFormInit };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{forwardRef as ar,useEffect as M,useImperativeHandle as mr,useMemo as fr,useRef as v,useState as lr}from"react";import{createContext as or,useCallback as L,useContext as nr,useRef as sr}from"react";import{jsx as ir}from"react/jsx-runtime";var k=or(void 0);function F(){let r=nr(k);return r||{}}function $({children:r,...e}){let t=sr([]),l=L(m=>{let u=t.current.findIndex(i=>i.id===m.id);if(u>-1){let i=[...t.current];i[u]=m,t.current=[...i]}else t.current.push(m)},[t]),p=L(m=>{t.current=t.current.filter(u=>u.id!==m)},[]),s={...e,registerItem:l,unregisterItem:p,items:t.current};return ir(k.Provider,{value:s,children:r})}function C(){let r=()=>Math.random()*16%16|0;return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>(e==="x"?r():r()&3|8).toString(16))}function A(r,e){return typeof r=="function"?r(e):r}var h={camelCase:(r="")=>(r=r.split(".").map(e=>(e=e.charAt(0).toUpperCase()+e.slice(1),e)).join(" "),r=r.replace(/([a-z0-9])([A-Z])/g,"$1 $2"),r.charAt(0).toUpperCase()+r.slice(1)),snackCase:(r="")=>{let t=r.replace(/_([a-z])/g,(l,p)=>p.toUpperCase()).replace(/([A-Z])/g," $1");return t=t.charAt(0).toUpperCase()+t.slice(1),t},changeAll:(r="",e=!1)=>{let t="";try{r=r?.split(".")[r?.split(".")?.length-1],r=r?.split("[]")[r?.split("[]")?.length-1],t=h.snackCase(h.camelCase(r)),e&&(t=t?.split(" ")?.map(l=>l?.length<=3?l?.toUpperCase():l)?.join(" "))}catch{}return t}};function N(r,e){try{return JSON.stringify(r)!==JSON.stringify(e)}catch{return!1}}var I=r=>(Object.keys(r).forEach(e=>{r[e]===void 0&&(r[e]=null)}),r),G=(r,e)=>r?e.includes(".")?G(r[e.substring(0,e.indexOf("."))],e.substring(e.indexOf(".")+1)):r?r[e]:null:"";function S(r,e){let t=!1;return r&&typeof r=="object"&&Array.isArray(r)&&(typeof e=="number"?r.length>e&&(t=!0):t=!0),t}import{useFieldArray as pr,useForm as ur,useWatch as cr}from"react-hook-form";import{jsx as z}from"react/jsx-runtime";var gr=ar(({children:r,className:e,formData:t,onChange:l=()=>{},onSubmit:p},s)=>{t||(t={});let m=v(void 0),u=v(null),[i,x]=lr(!1),n=ur({reValidateMode:"onSubmit",mode:"all",defaultValues:t}),c=fr(()=>C(),[]);M(()=>{t&&N(m.current||{},t)&&(n.reset(t),m.current=t)},[t,n.reset]),M(()=>{let a=n.watch(l);return()=>a.unsubscribe()},[]);let d=async(a,f,U)=>{let{validate:y=!0,...o}=U||{};a&&(a.preventDefault(),a.stopPropagation()),x(!0);let R=y?await n.trigger():!0,tr=g();R&&p&&p({...tr,...f},{...B,...o,validate:y})},g=a=>a?G(I(n.getValues()),a):I(n.getValues()),B={...n,reset:a=>{a?typeof a=="string"?n.resetField(a,{}):typeof a=="object"&&S(a,0)&&a.forEach(f=>n.resetField(f)):n.reset()},updateData:a=>{let f=g();n.reset({...f,...a})},getData:g,triggerSubmit:(a,f)=>d(void 0,a,f),formControl:n,useFieldArray:a=>pr({control:n.control,name:a}),useWatch:a=>cr({control:n.control,name:a}),isSubmit:i,formId:c};return mr(s,()=>B),z($,{...B,children:z("form",{id:c,className:e,ref:u,onSubmit:d,children:A(r,B)})})}),Z=gr;import{useEffect as Rr,useMemo as $r}from"react";import{createContext as dr,useContext as xr}from"react";import{jsx as hr}from"react/jsx-runtime";var q=dr(void 0);function Fr(){let r=xr(q);return r||{}}function w({children:r,...e}){return hr(q.Provider,{value:e,children:r})}import{Controller as Ir}from"react-hook-form";import{createContext as yr,useContext as Cr}from"react";import{jsx as br}from"react/jsx-runtime";var j=yr(void 0);function O(){let r=Cr(j);return r||{}}function E({children:r,...e}){return br(j.Provider,{value:e,children:r})}import{createContext as Br,useContext as Ar}from"react";import{jsx as Pr}from"react/jsx-runtime";var H=Br(void 0);function K(){let r=Ar(H);return r||{}}function J({children:r,...e}){return Pr(H.Provider,{value:e,children:r})}function W({validationRules:r,label:e}){let{formControl:t,getData:l}=F(),p=[];return r&&(typeof r=="string"?_(r,!0,e,t,l,{}).forEach(s=>p.push(s)):typeof r=="object"&&Object.keys(r).forEach(s=>{let{validate:m}=p.find(i=>i.validate)||{};if(["minLength","maxLength","min","max","match","diff","regexp","pattern","required","email"].includes(s)){let i=r[s],x="";if(s==="email"&&!i)return;["match","diff"].includes(s)&&typeof i=="object"&&(i=r[s].dataField,x=r[s].label),i!=null&&_(s,i,e,t,l,m,x).forEach(n=>p.push(n))}else if(typeof r[s]=="object"){let i=r[s];p.push({validate:{...m,[s]:x=>i.validation(x)||i.message&&(typeof i.message=="string"?i.message:i.message(e))}})}})),Object.assign({},...p)}var _=(r,e,t,l,p,s,m)=>{let u=[],{validationMessage:i}=K(),{required:x,minLength:n,maxLength:c,min:d,max:g,email:b,match:B,diff:a,pattern:f}=i||{},y={required:{value:!!e,message:x?x(t):`${t} is required`},minLength:{value:e,message:n?n(t,e):`${t} must be at least ${e} characters long`},maxLength:{value:e,message:c?c(t,e):`${t} cannot be more than ${e} characters long`},min:{value:Number(e),message:d?d(t,e):`${t} should be at least ${e}`},max:{value:Number(e),message:g?g(t,e):`${t} should be at most ${e}`},regexp:(o="")=>o?new RegExp(e.regexp).test(o)||`${t} ${e.message}`:!0,email:(o="")=>o?o.match(/^(([^<>()[\]\\.,;:\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,}))$/)||(b?b(t):`${t} must be type email`):!0,match:(o="")=>o?o===(p&&p(e))||(B?B(t,m||h.changeAll(e)):`${t} must be same with ${m||h.changeAll(e)}`):!0,diff:(o="")=>o?o!==(p&&p(e))||(a?a(t,m||h.changeAll(e)):`${t} must be different with ${m||h.changeAll(e)}`):!0,pattern:{alphabet:(o="")=>!!o&&new RegExp("^[A-Za-z ]*$").test(o)||(f?.alphabet?f?.alphabet(t):`${t} must be format Alphabet`),alphanumber:(o="")=>!!o&&new RegExp("^[A-Za-z0-9 ]*$").test(o)||(f?.alphanumber?f?.alphanumber(t):`${t} must be format Alphabet or Number`),number:(o="")=>!!o&&new RegExp("^[0-9]*$").test(o)||(f?.number?f?.number(t):`${t} must be format Number`),lowercase:(o="")=>!!o&&new RegExp("^[a-z0-9 ]*$").test(o)||(f?.lowercase?f?.lowercase(t):`${t} must be format Lowercase`),url:(o="")=>!!o&&/^(ftp|http|https):\/\/[^ "]+$/.test(o)||(f?.url?f?.url(t):`${t} must be a valid URL`),uppercase:(o="")=>!!o&&new RegExp("^[A-Z0-9 ]*$").test(o)||(f?.uppercase?f?.uppercase(t):`${t} must be format Uppercase`),mixedcase:(o="")=>!!o&&/[a-z]/.test(o)&&/[A-Z]/.test(o)||(f?.mixedcase?f?.mixedcase(t):`${t} must be mixed case`),specialcharacters:(o="")=>!!o&&/[^a-zA-Z0-9\s]/.test(o)||(f?.specialcharacters?f?.specialcharacters(t):`${t} must contain special characters`)}}[r];if(y){let{validate:o}=u.find(R=>R.validate)||{};typeof y=="function"?u.push({validate:{...o,...s,[r]:y}}):r==="pattern"?u.push({validate:{...o,...s,[`${r}${e}`]:y[e]}}):u.push({[r]:y})}return u};import{Fragment as Q,jsx as P}from"react/jsx-runtime";function X({children:r,...e}){let t=$r(()=>C(),[]),{registerItem:l,unregisterItem:p,formControl:s,disabled:m,readOnly:u}=F(),{name:i,formId:x,...n}=O();Rr(()=>(l({id:t,...e}),()=>{p(t)}),[t,e]),!e.label&&!e.noLabel&&(e.label=h.changeAll(e.dataField));let c=!1;typeof e.disabled=="boolean"?c=e.disabled:typeof n.disabled=="boolean"?c=n.disabled:c=!!m;let d=!1;typeof e.readOnly=="boolean"?d=e.readOnly:typeof n.readOnly=="boolean"?d=n.readOnly:d=!!u;let g=!1;return typeof e.hidden=="boolean"&&(g=e.hidden),P(Q,{children:s.control&&P(Ir,{name:e.dataField,control:s.control,rules:c||d||g?{required:!1}:W(e),render:b=>P(Q,{children:P(w,{...e,controller:b,children:r})})})})}import{forwardRef as Dr,useEffect as Tr,useImperativeHandle as Ur,useMemo as Lr}from"react";import{useFieldArray as kr}from"react-hook-form";import{createContext as Gr,useContext as wr}from"react";import{useFieldArray as Or}from"react-hook-form";import{jsx as Wr}from"react/jsx-runtime";var Y=Gr(void 0);function Er(r){let e=wr(Y);if(r){let t=F(),l=Or({control:t?.formControl.control,name:r});return{formArrayId:"",name:r,index:-1,...l,...t,countFields:l.fields.length,removeItem:()=>{},watchItem:()=>({}),setValueItem:()=>{}}}return e||{}}function D({children:r,...e}){return Wr(Y.Provider,{value:e,children:r})}import{Fragment as Sr,jsx as T}from"react/jsx-runtime";var V=Dr(({name:r,className:e="",defaultData:t,children:l},p)=>{let s=F(),m=kr({control:s.control,name:r});Tr(()=>{typeof t=="boolean"&&t?m.append({}):typeof t=="number"&&t>0?m.append([...Array(t).fill(null).map(()=>({}))]):typeof t=="object"&&t&&m.append(t)},[]);let i={formArrayId:Lr(()=>C(),[]),...m,...s};return Ur(p,()=>i),T(Sr,{children:m.fields.map((x,n)=>{let c=`${r}.${n}.`,d={...i,index:n,name:c,countFields:m.fields.length,removeItem:()=>m.remove(n),watchItem:g=>s.watch(g?`${c}${g}`:c.slice(0,-1)),setValueItem:(g,b)=>s.setValue(`${c}${g}`,b)};return T("div",{className:e,children:T(D,{...d,children:A(l,d)})},x.id)})})});V.displayName="BgsFormArray";var Nr=V;import{useMemo as Mr}from"react";import{Fragment as zr,jsx as rr}from"react/jsx-runtime";var er=({children:r,...e})=>{let t=F(),l=Mr(()=>C(),[]);return rr(zr,{children:rr(E,{...t,...e,formGroupId:l,children:r})})};er.displayName="BgsFormGroup";var vr=er;var tt=Z;export{Nr as BgsArrayForm,X as BgsController,vr as BgsGroupForm,J as BgsReactFormProvider,tt as default,Er as useBgsArrayForm,Fr as useBgsControllerForm,F as useBgsForm,O as useBgsGroupForm};
1
+ import{useEffect as M,useRef as ce}from"react";import{createContext as oe,useCallback as G,useContext as ne,useRef as se}from"react";import{jsx as ie}from"react/jsx-runtime";var O=oe(void 0);function F(){let r=ne(O);return r||{}}function U({children:r,controller:e,onSubmit:t}){let i=se([]),a=G(o=>{let u=i.current.findIndex(l=>l.id===o.id);if(u>-1){let l=[...i.current];l[u]=o,i.current=[...l]}else i.current.push(o)},[i]),s=G(o=>{i.current=i.current.filter(u=>u.id!==o)},[]),d=async(o,u)=>{e.setIsSubmit(!0);let l=u?await e.formControl.trigger():!0,c=e.getData();l&&t&&t({...c,...o},{...e})},m={...e,registerItem:a,unregisterItem:s,items:i.current,triggerSubmit:d};return ie(O.Provider,{value:m,children:r})}function x(){let r=()=>Math.random()*16%16|0;return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>(e==="x"?r():r()&3|8).toString(16))}function k(r,e){return typeof r=="function"?r(e):r}var h={camelCase:(r="")=>(r=r.split(".").map(e=>(e=e.charAt(0).toUpperCase()+e.slice(1),e)).join(" "),r=r.replace(/([a-z0-9])([A-Z])/g,"$1 $2"),r.charAt(0).toUpperCase()+r.slice(1)),snackCase:(r="")=>{let t=r.replace(/_([a-z])/g,(i,a)=>a.toUpperCase()).replace(/([A-Z])/g," $1");return t=t.charAt(0).toUpperCase()+t.slice(1),t},changeAll:(r="",e=!1)=>{let t="";try{r=r?.split(".")[r?.split(".")?.length-1],r=r?.split("[]")[r?.split("[]")?.length-1],t=h.snackCase(h.camelCase(r)),e&&(t=t?.split(" ")?.map(i=>i?.length<=3?i?.toUpperCase():i)?.join(" "))}catch{}return t}};function N(r,e){try{return JSON.stringify(r)!==JSON.stringify(e)}catch{return!1}}var A=r=>(Object.keys(r).forEach(e=>{r[e]===void 0&&(r[e]=null)}),r),T=(r,e,t)=>{if(!r)return"";let i=e.replace(/\[(\d+)\]/g,".$1").split("."),a=r;for(let s of i){if(a==null)return t;a=a[s]}return a===void 0?t:a};function L(r,e){let t=!1;return r&&typeof r=="object"&&Array.isArray(r)&&(typeof e=="number"?r.length>e&&(t=!0):t=!0),t}import{useFieldArray as ae,useForm as me,useWatch as le}from"react-hook-form";import{useMemo as pe,useRef as ue,useState as E}from"react";var D=(r,e)=>{r||(r={});let t=ue(null),[i,a]=E(!1),[s,d]=E({}),m=me({...e,reValidateMode:"onSubmit",mode:"all",defaultValues:r}),o=pe(()=>x(),[]),u=p=>p?T(A(m.getValues()),p):A(m.getValues()),g={...m,ref:t,reset:p=>{p?typeof p=="string"?m.resetField(p,{}):typeof p=="object"&&L(p,0)&&p.forEach(y=>m.resetField(y)):m.reset()},updateData:p=>{let y=u();m.reset({...y,...p})},getData:u,formControl:m,useFieldArray:p=>ae({control:m.control,name:p}),useWatch:p=>le({control:m.control,name:p}),isSubmit:i,formId:o,setIsSubmit:a,useSelected:p=>T(s,p),setSelected:d};return[g,g]};import{Fragment as fe,jsx as R}from"react/jsx-runtime";var de=({onSubmit:r,onChange:e=()=>{},onInvalid:t=()=>{},formData:i,controller:a,children:s,...d})=>{let m=a??D(),[o]=Array.isArray(m)?m:[m],u=ce(void 0),l=async c=>{c.preventDefault(),c.stopPropagation(),o.setIsSubmit(!0);let g=await o.formControl.trigger(),p=o.getData();g?r&&r({...p},{...o}):t(o.formControl.formState.errors)};return M(()=>{i&&N(u.current||{},i)&&(o.formControl.reset(i),u.current=i)},[i,o.formControl.reset]),M(()=>{if(!e)return;let c=o.formControl.watch(e);return()=>c.unsubscribe()},[]),R(fe,{children:R(U,{controller:o,onSubmit:r,children:R("form",{...d,id:o.formId,ref:o.ref,onSubmit:l,children:s})})})},K=de;import{useEffect as Ce}from"react";import{createContext as ge,useContext as ye}from"react";import{jsx as he}from"react/jsx-runtime";var z=ge(void 0);function Fe(){let r=ye(z);return r||{}}function P({children:r,...e}){return he(z.Provider,{value:e,children:r})}import{useFieldArray as xe}from"react-hook-form";import{useMemo as be}from"react";var Z=r=>{let e=F(),t=xe({control:e.control,name:r}),a={formArrayId:be(()=>x(),[]),...t,...e};return[a,a]};import{Fragment as q,jsx as I}from"react/jsx-runtime";var H=({name:r,defaultData:e,controller:t,children:i})=>{let a=t??Z(r),[s]=Array.isArray(a)?a:[a];return Ce(()=>{typeof e=="boolean"&&e?s.append({}):typeof e=="number"&&e>0?s.append([...Array(e).fill(null).map(()=>({}))]):typeof e=="object"&&e&&s.append(e)},[]),I(q,{children:s.fields.map((d,m)=>{let o=`${r}.${m}.`,u={...s,index:m,name:o,countFields:s.fields.length,removeItem:()=>s.remove(m),watchItem:l=>s.watch(l?`${o}${l}`:o.slice(0,-1)),setValueItem:(l,c)=>s.setValue(`${o}${l}`,c),useSelectedItem:l=>s.useSelected(`${o}${l}`)};return I(q,{children:I(P,{...u,children:k(i,u)},d.id)})})})};H.displayName="BgsFormArray";var Ue=H;import{useEffect as ve,useMemo as Ge}from"react";import{createContext as Ae,useContext as Te}from"react";import{jsx as Pe}from"react/jsx-runtime";var j=Ae(void 0);function Re(){let r=Te(j);return r||{}}function S({children:r,...e}){return Pe(j.Provider,{value:e,children:r})}import{Controller as Oe}from"react-hook-form";import{createContext as Ie,useContext as Se}from"react";import{jsx as $e}from"react/jsx-runtime";var J=Ie(void 0);function $(){let r=Se(J);return r||{}}function w({children:r,...e}){return $e(J.Provider,{value:e,children:r})}import{createContext as we,useContext as Be}from"react";import{jsx as We}from"react/jsx-runtime";var _=we(void 0);function Q(){let r=Be(_);return r||{}}function X({children:r,...e}){return We(_.Provider,{value:e,children:r})}function B({validationRules:r,label:e}){let{formControl:t,getData:i}=F(),a=[];return r&&(typeof r=="string"?Y(r,!0,e,t,i,{}).forEach(s=>a.push(s)):typeof r=="object"&&Object.keys(r).forEach(s=>{let{validate:d}=a.find(o=>o.validate)||{};if(["minLength","maxLength","min","max","match","diff","regexp","pattern","required","email"].includes(s)){let o=r[s],u="";if(s==="email"&&!o)return;["match","diff"].includes(s)&&typeof o=="object"&&(o=r[s].dataField,u=r[s].label),o!=null&&Y(s,o,e,t,i,d,u).forEach(l=>a.push(l))}else if(typeof r[s]=="object"){let o=r[s];a.push({validate:{...d,[s]:u=>o.validation(u)||o.message&&(typeof o.message=="string"?o.message:o.message(e))}})}})),Object.assign({},...a)}var Y=(r,e,t,i,a,s,d)=>{let m=[],{validationMessage:o}=Q(),{required:u,minLength:l,maxLength:c,min:g,max:p,email:y,match:W,diff:v,pattern:f}=o||{},b={required:{value:!!e,message:u?u(t):`${t} is required`},minLength:{value:e,message:l?l(t,e):`${t} must be at least ${e} characters long`},maxLength:{value:e,message:c?c(t,e):`${t} cannot be more than ${e} characters long`},min:{value:Number(e),message:g?g(t,e):`${t} should be at least ${e}`},max:{value:Number(e),message:p?p(t,e):`${t} should be at most ${e}`},regexp:(n="")=>n?new RegExp(e.regexp).test(n)||`${t} ${e.message}`:!0,email:(n="")=>n?n.match(/^(([^<>()[\]\\.,;:\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,}))$/)||(y?y(t):`${t} must be type email`):!0,match:(n="")=>n?n===(a&&a(e))||(W?W(t,d||h.changeAll(e)):`${t} must be same with ${d||h.changeAll(e)}`):!0,diff:(n="")=>n?n!==(a&&a(e))||(v?v(t,d||h.changeAll(e)):`${t} must be different with ${d||h.changeAll(e)}`):!0,pattern:{alphabet:(n="")=>!!n&&new RegExp("^[A-Za-z ]*$").test(n)||(f?.alphabet?f?.alphabet(t):`${t} must be format Alphabet`),alphanumber:(n="")=>!!n&&new RegExp("^[A-Za-z0-9 ]*$").test(n)||(f?.alphanumber?f?.alphanumber(t):`${t} must be format Alphabet or Number`),number:(n="")=>!!n&&new RegExp("^[0-9]*$").test(n)||(f?.number?f?.number(t):`${t} must be format Number`),lowercase:(n="")=>!!n&&new RegExp("^[a-z0-9 ]*$").test(n)||(f?.lowercase?f?.lowercase(t):`${t} must be format Lowercase`),url:(n="")=>!!n&&/^(ftp|http|https):\/\/[^ "]+$/.test(n)||(f?.url?f?.url(t):`${t} must be a valid URL`),uppercase:(n="")=>!!n&&new RegExp("^[A-Z0-9 ]*$").test(n)||(f?.uppercase?f?.uppercase(t):`${t} must be format Uppercase`),mixedcase:(n="")=>!!n&&/[a-z]/.test(n)&&/[A-Z]/.test(n)||(f?.mixedcase?f?.mixedcase(t):`${t} must be mixed case`),specialcharacters:(n="")=>!!n&&/[^a-zA-Z0-9\s]/.test(n)||(f?.specialcharacters?f?.specialcharacters(t):`${t} must contain special characters`)}}[r];if(b){let{validate:n}=m.find(te=>te.validate)||{};typeof b=="function"?m.push({validate:{...n,...s,[r]:b}}):r==="pattern"?m.push({validate:{...n,...s,[`${r}${e}`]:b[e]}}):m.push({[r]:b})}return m};import{Fragment as V,jsx as C}from"react/jsx-runtime";var ke=({children:r,...e})=>{let t=Ge(()=>x(),[]),{registerItem:i,unregisterItem:a,formControl:s,disabled:d,readOnly:m}=F(),{name:o,formId:u,...l}=$();ve(()=>(i({id:t,...e}),()=>{a(t)}),[t,e]),!e.label&&!e.noLabel&&(e.label=h.changeAll(e.dataField));let c=!1;typeof e.disabled=="boolean"?c=e.disabled:typeof l.disabled=="boolean"?c=l.disabled:c=!!d;let g=!1;typeof e.readOnly=="boolean"?g=e.readOnly:typeof l.readOnly=="boolean"?g=l.readOnly:g=!!m;let p=!1;return typeof e.hidden=="boolean"&&(p=e.hidden),C(V,{children:s.control&&C(Oe,{name:e.dataField,control:s.control,rules:c||g||p?{required:!1}:B(e),render:y=>C(V,{children:C(S,{...e,controller:y,children:r})})})})},Ne=ke;import{useMemo as Le}from"react";import{Fragment as De,jsx as ee}from"react/jsx-runtime";var re=({children:r,...e})=>{let t=F(),i=Le(()=>x(),[]);return ee(De,{children:ee(w,{...t,...e,formGroupId:i,children:r})})};re.displayName="BgsFormGroup";var Ee=re;var Me=(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))(Me||{});var st=K;export{Ue as BgsArrayForm,Ne as BgsController,Ee as BgsGroupForm,X as BgsReactFormProvider,Me as PatternTypeEnum,st as default,Fe as useBgsArrayForm,Re as useBgsControllerForm,F as useBgsForm,$ as useBgsGroupForm,Z as useFormArrayInit,D as useFormInit};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bgscore/react-form",
3
- "version": "0.0.12",
3
+ "version": "0.0.14",
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",