@josercl/form-maker 1.4.1 → 1.4.3

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.
@@ -1 +1 @@
1
- var FormMaker=function(e){"use strict";const E=["onSubmit"],S={key:0},w=["disabled"],j=e.defineComponent({__name:"FormMaker",props:{loading:{type:Boolean,default:!1},hasActions:{type:Boolean,default:!0},modelValue:{default:()=>({})},fields:{default:()=>[]},hideDivider:{type:Boolean,default:!1},rowClass:{default:null},columnClass:{default:null},labelClass:{default:null},inputGroupClass:{default:null},inputWrapperClass:{default:null},inputErrorClass:{default:null},inputClass:{default:null},errorClass:{default:null},helpTextClass:{default:null},submitButtonClass:{default:null},submitButtonText:{default:"Submit"},unlabeledTypes:{}},emits:["submit","update:modelValue"],setup(n,{emit:r}){const l=n,i=r,t=()=>i("submit"),a=e.computed(()=>l.fields.length>0?l.fields.map(o=>{let u=o;return Array.isArray(o)||(u=[o]),u.map(k=>({...k,id:k.id||`formMaker_${new Date().getTime()}_${k.name}`}))}):Object.keys(l.modelValue).map(o=>[{name:o,label:o,id:`formMaker_${o}`}]));e.provide("labelClass",l.labelClass||e.inject("form-label")),e.provide("inputGroupClass",l.inputGroupClass||e.inject("input-group")),e.provide("inputWrapperClass",l.inputWrapperClass||e.inject("input-wrapper")),e.provide("inputErrorClass",l.inputErrorClass||e.inject("input-error")),e.provide("inputClass",l.inputClass||e.inject("input")),e.provide("errorClass",l.errorClass||e.inject("error")),e.provide("helpTextClass",l.helpTextClass||e.inject("help-text")),e.provide("unlabeledTypes",l.unlabeledTypes||e.inject("unlabeled-types"));const s=l.rowClass||e.inject("form-row"),p=l.columnClass||e.inject("form-column"),b=l.submitButtonClass||e.inject("submit-button"),m=o=>{const u=o.split(".");let k=l.modelValue;for(let h=0;h<u.length-1;h+=1){const y=k[u[h]];if(!y)break;k=y}return k},d=o=>{const u=o.split(".");return u[u.length-1]};return(o,u)=>{const k=e.resolveComponent("form-maker-input");return e.openBlock(),e.createElementBlock("form",{class:"form-maker",onSubmit:e.withModifiers(t,["prevent"])},[o.loading?e.renderSlot(o.$slots,"loading",{key:0},()=>[e.createTextVNode(" Loading... ")]):e.createCommentVNode("",!0),e.renderSlot(o.$slots,"default",{},()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(a.value,(h,y)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(e.unref(s)),key:`fieldRow_${y}`},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(h,(C,g)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass([e.unref(p),C.columnClass]),key:`field_${y}_${g}`},[e.renderSlot(o.$slots,`${C.name}`,{field:C},()=>[e.createVNode(k,e.mergeProps({modelValue:m(C.name)[d(C.name)],"onUpdate:modelValue":c=>m(C.name)[d(C.name)]=c},C),null,16,["modelValue","onUpdate:modelValue"])])],2))),128))],2))),128))]),e.renderSlot(o.$slots,"extra"),e.renderSlot(o.$slots,"divider",{},()=>[o.hasActions&&!o.hideDivider?(e.openBlock(),e.createElementBlock("hr",S)):e.createCommentVNode("",!0)]),o.hasActions?e.renderSlot(o.$slots,"actions",{key:1},()=>[e.renderSlot(o.$slots,"submit-button",{},()=>[e.createElementVNode("button",{class:e.normalizeClass(e.unref(b)),disabled:o.loading,type:"submit"},e.toDisplayString(o.submitButtonText),11,w)]),e.renderSlot(o.$slots,"extra-buttons")]):e.createCommentVNode("",!0)],40,E)}}}),N=()=>{const n=e.inject("labelClass",null),r=e.inject("inputClass",null),l=e.inject("inputWrapperClass",null),i=e.inject("inputGroupClass",null),t=e.inject("inputErrorClass",null),a=e.inject("errorClass",null),s=e.inject("helpTextClass",null);return{labelClass:n,inputClass:r,inputWrapperClass:l,inputGroupClass:i,inputErrorClass:t,errorClass:a,helpTextClass:s}},F=(n,r=[])=>{const l=e.toRaw(r),i=e.ref(null);return e.watch(n,(t,a)=>{if(i.value=null,t!==a)for(let s=0;s<l.length;s+=1){const p=l[s];if(!p.validator(t)){i.value=p.message;break}}},{immediate:!0}),i};function B(n,r,l){const i=l??"modelValue";return e.computed({get:()=>n(),set:t=>r(`update:${i}`,t)})}const D=e.defineComponent({inheritAttrs:!1,__name:"FormMakerInput",props:{loading:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},modelValue:{},error:{default:void 0},helpText:{default:void 0},label:{default:void 0},id:{default:void 0},type:{default:"text"},rules:{default:()=>[]}},emits:["update:modelValue"],setup(n,{emit:r}){const l=n,t=B(()=>l.modelValue,r),{labelClass:a,inputClass:s,inputWrapperClass:p,inputErrorClass:b,errorClass:m,helpTextClass:d}=N(),o=e.computed(()=>!!l.label),u=e.computed(()=>!!l.helpText),k=F(t,l.rules),h=e.computed(()=>!!l.error||!!k.value),y=e.computed(()=>l.error?l.error:k.value),C=e.inject("unlabeledTypes",[]),g=e.computed(()=>!new Set(C).has(l.type));return(c,T)=>{const J=e.resolveComponent("form-maker-label"),K=e.resolveComponent("form-maker-help"),Q=e.resolveComponent("form-maker-error"),X=e.resolveComponent("form-maker-input-wrapper");return e.openBlock(),e.createBlock(X,{class:e.normalizeClass([h.value&&e.unref(b),e.unref(p)])},{default:e.withCtx(()=>[g.value?e.renderSlot(c.$slots,"label",{key:0},()=>[o.value?(e.openBlock(),e.createBlock(J,{key:0,id:c.id,class:e.normalizeClass(e.unref(a)),label:c.label},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(c.label),1)]),_:1},8,["id","class","label"])):e.createCommentVNode("",!0)]):e.createCommentVNode("",!0),e.renderSlot(c.$slots,"default",{},()=>[e.renderSlot(c.$slots,"before"),(e.openBlock(),e.createBlock(e.resolveDynamicComponent(`form-maker-input-${c.type}`),e.mergeProps({...c.$props,...c.$attrs},{class:[c.type!=="checkbox"&&e.unref(s),h.value&&e.unref(b)],modelValue:e.unref(t),"onUpdate:modelValue":T[0]||(T[0]=Y=>e.isRef(t)?t.value=Y:null)}),null,16,["class","modelValue"])),e.renderSlot(c.$slots,"after")]),e.renderSlot(c.$slots,"help",{},()=>[u.value?(e.openBlock(),e.createBlock(K,{key:0,class:e.normalizeClass(e.unref(d))},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(c.helpText),1)]),_:1},8,["class"])):e.createCommentVNode("",!0)]),e.renderSlot(c.$slots,"errors",{},()=>[h.value?(e.openBlock(),e.createBlock(Q,{key:0,class:e.normalizeClass(e.unref(m))},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(y.value),1)]),_:1},8,["class"])):e.createCommentVNode("",!0)])]),_:3},8,["class"])}}}),M=["checked","value","onClick"],A=e.defineComponent({__name:"CheckboxInput",props:{options:{type:[Boolean,Array],default:()=>[]},loading:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},modelValue:{},error:{default:void 0},helpText:{default:void 0},label:{default:void 0},type:{},rules:{default:()=>[]}},emits:["update:modelValue"],setup(n,{emit:r}){const l=n,i=r,t=e.computed(()=>Array.isArray(l.options)&&l.options.length===0),a=e.computed(()=>l.modelValue),s=e.computed(()=>(Array.isArray(a.value)?a.value:[a.value]).filter(d=>!!d)),p=e.computed(()=>t.value?[{label:l.label,value:!0}]:l.options),b=m=>{let d=[...s.value];d.indexOf(m)===-1?d.push(m):d=d.filter(o=>o!==m),t.value?i("update:modelValue",d.length>0):i("update:modelValue",d)};return(m,d)=>(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(p.value,(o,u)=>(e.openBlock(),e.createElementBlock("div",{key:`option_${u}`},[e.createElementVNode("label",null,[e.createElementVNode("input",e.mergeProps(m.$props,{checked:s.value.indexOf(o.value)!==-1,value:o.value,type:"checkbox",onClick:()=>b(o.value)}),null,16,M),e.createTextVNode(" "+e.toDisplayString(o.label),1)])]))),128))}}),L=e.defineComponent({__name:"FileInput",props:{loading:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},modelValue:{},error:{default:void 0},helpText:{default:void 0},label:{default:void 0},id:{default:void 0},type:{},rules:{default:()=>[]}},emits:["update:modelValue"],setup(n,{emit:r}){const l=r,i=t=>{const a=t.currentTarget;if(a.files&&a.files.length){const s=a.files[0];l("update:modelValue",s)}};return(t,a)=>(e.openBlock(),e.createElementBlock("input",e.mergeProps(t.$props,{type:"file",onChange:i}),null,16))}});function V(n,r){return e.h(`${n.as??"div"}`,r.attrs,r.slots)}V.props={as:{type:String,required:!1,default:"div"}};function $(n,{slots:r,attrs:l}){return e.h("label",{...l,for:n.id},r.default())}$.props={id:{type:String,default:null}};const G=$,I=["checked","value","onChange"],O=e.defineComponent({__name:"RadioInput",props:{options:{default:()=>[]},loading:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},modelValue:{},error:{default:void 0},helpText:{default:void 0},label:{default:void 0},type:{},rules:{},id:{default:void 0}},emits:["update:modelValue"],setup(n,{emit:r}){const l=r,i=t=>{l("update:modelValue",t)};return(t,a)=>(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.options,(s,p)=>(e.openBlock(),e.createElementBlock("div",{key:`option_${p}`},[e.createElementVNode("label",null,[e.createElementVNode("input",e.mergeProps(t.$props,{checked:s.value===t.modelValue,value:s.value,type:"radio",onChange:b=>i(s.value)}),null,16,I),e.createTextVNode(" "+e.toDisplayString(s.label),1)])]))),128))}}),P=["id","disabled","name","placeholder"],R=["label"],x=["value"],z=["value"],U=e.defineComponent({__name:"SelectInput",props:{options:{default:()=>[]},optionGroups:{default:()=>({})},loading:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},modelValue:{},error:{default:void 0},helpText:{default:void 0},label:{default:void 0},id:{default:void 0},type:{},rules:{default:()=>[]}},emits:["update:modelValue"],setup(n,{emit:r}){const l=n,t=B(()=>l.modelValue,r),a=Object.keys(l.optionGroups).length>0,s=e.computed(()=>l.options.map(p=>typeof p=="object"?p:{label:p,value:p}));return(p,b)=>e.withDirectives((e.openBlock(),e.createElementBlock("select",{id:p.id,"onUpdate:modelValue":b[0]||(b[0]=m=>e.isRef(t)?t.value=m:null),disabled:p.disabled,name:p.name,placeholder:p.placeholder},[a?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:0},e.renderList(p.optionGroups,(m,d)=>(e.openBlock(),e.createElementBlock("optgroup",{key:`optGroup_${d}`,label:d},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(m,(o,u)=>(e.openBlock(),e.createElementBlock("option",{key:`option_${o}`,value:u},e.toDisplayString(o),9,x))),128))],8,R))),128)):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:1},e.renderList(s.value,(m,d)=>(e.openBlock(),e.createElementBlock("option",{key:`option_${d}`,value:m.value},e.toDisplayString(m.label),9,z))),128))],8,P)),[[e.vModelSelect,e.unref(t)]])}}),W=["id"],q=e.defineComponent({__name:"TextAreaInput",props:{modelValue:{}},emits:["update:modelValue"],setup(n,{emit:r}){const l=n,t=B(()=>l.modelValue,r);return(a,s)=>e.withDirectives((e.openBlock(),e.createElementBlock("textarea",e.mergeProps({id:a.id,"onUpdate:modelValue":s[0]||(s[0]=p=>e.isRef(t)?t.value=p:null)},{...a.$props,...a.$attrs}),null,16,W)),[[e.vModelText,e.unref(t)]])}}),H=["type"],f=e.defineComponent({__name:"BasicInput",props:{loading:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},modelValue:{},error:{default:void 0},helpText:{default:void 0},label:{default:void 0},id:{default:void 0},type:{default:"text"},rules:{default:()=>[]}},emits:["update:modelValue"],setup(n,{emit:r}){const l=n,t=B(()=>l.modelValue,r);return(a,s)=>e.withDirectives((e.openBlock(),e.createElementBlock("input",e.mergeProps({"onUpdate:modelValue":s[0]||(s[0]=p=>e.isRef(t)?t.value=p:null),type:a.type},{...a.$props,...a.$attrs}),null,16,H)),[[e.vModelDynamic,e.unref(t)]])}}),_={unlabeledTypes:[],classes:{"form-row":"form-maker-row","form-column":"form-maker-column","form-label":"form-maker-label","input-wrapper":"form-maker-input-wrapper","input-error":"form-maker-input-error",input:"form-maker-input",error:"form-maker-error","help-text":"form-maker-help-text","submit-button":"form-maker-submit"},components:{"form-maker-input-color":f,"form-maker-input-date":f,"form-maker-input-email":f,"form-maker-input-month":f,"form-maker-input-number":f,"form-maker-input-password":f,"form-maker-input-search":f,"form-maker-input-tel":f,"form-maker-input-time":f,"form-maker-input-text":f,"form-maker-input-url":f,"form-maker-input-week":f,"form-maker-input-range":f,"form-maker-input-file":L,"form-maker-input-textarea":q,"form-maker-input-select":U,"form-maker-input-checkbox":A,"form-maker-input-radio":O,"form-maker-label":G,"form-maker-help":V,"form-maker-error":V,"form-maker-input-wrapper":V}};return{install:(n,r={})=>{const l={unlabeledTypes:r.unlabeledTypes!==void 0?r.unlabeledTypes:_.unlabeledTypes,classes:{..._.classes,...r.classes},components:{..._.components,...r.components}};n.component("FormMaker",j),n.component("FormMakerInput",D),n.provide("unlabeled-types",l.unlabeledTypes),Object.keys(l.classes).forEach(i=>{n.provide(i,l.classes[i])}),Object.keys(l.components).forEach(i=>{n.component(i,l.components[i])})}}}(Vue);
1
+ var FormMaker=function(e){"use strict";const E=["onSubmit"],S={key:0},w=["disabled"],j=e.defineComponent({__name:"FormMaker",props:{loading:{type:Boolean,default:!1},hasActions:{type:Boolean,default:!0},modelValue:{default:()=>({})},fields:{default:()=>[]},hideDivider:{type:Boolean,default:!1},rowClass:{default:null},columnClass:{default:null},labelClass:{default:null},inputGroupClass:{default:null},inputWrapperClass:{default:null},inputErrorClass:{default:null},inputClass:{default:null},errorClass:{default:null},helpTextClass:{default:null},submitButtonClass:{default:null},submitButtonText:{default:"Submit"},unlabeledTypes:{}},emits:["submit","submit-error","update:modelValue"],setup(n,{emit:r}){const l=n,a=r,t=e.computed(()=>l.fields.length>0?l.fields.map(o=>{let u=o;return Array.isArray(o)||(u=[o]),u.map(m=>({...m,id:m.id||`formMaker_${new Date().getTime()}_${m.field}`}))}):Object.keys(l.modelValue).map(o=>[{field:o,label:o,id:`formMaker_${o}`}]));e.provide("labelClass",l.labelClass||e.inject("form-label")),e.provide("inputGroupClass",l.inputGroupClass||e.inject("input-group")),e.provide("inputWrapperClass",l.inputWrapperClass||e.inject("input-wrapper")),e.provide("inputErrorClass",l.inputErrorClass||e.inject("input-error")),e.provide("inputClass",l.inputClass||e.inject("input")),e.provide("errorClass",l.errorClass||e.inject("error")),e.provide("helpTextClass",l.helpTextClass||e.inject("help-text")),e.provide("unlabeledTypes",l.unlabeledTypes||e.inject("unlabeled-types"));const s=l.rowClass||e.inject("form-row"),i=l.columnClass||e.inject("form-column"),p=l.submitButtonClass||e.inject("submit-button"),C=o=>{const u=o.split(".");let m=l.modelValue;for(let h=0;h<u.length-1;h+=1){const y=m[u[h]];if(!y)break;m=y}return m},d=o=>{const u=o.split(".");return u[u.length-1]},c=()=>{for(const o in t.value)for(const u in t.value[o]){const m=t.value[o][u];if(m.rules===void 0||m.rules.length===0)continue;const h=C(m.field)[d(m.field)];for(const y in m.rules){const k=m.rules[y];if(!k.validator(h)){console.error(`${k.message}`),a("submit-error",k.message);return}}}a("submit")};return(o,u)=>{const m=e.resolveComponent("form-maker-input");return e.openBlock(),e.createElementBlock("form",{class:"form-maker",onSubmit:e.withModifiers(c,["prevent","stop"])},[o.loading?e.renderSlot(o.$slots,"loading",{key:0},()=>[e.createTextVNode(" Loading... ")]):e.createCommentVNode("",!0),e.renderSlot(o.$slots,"default",{},()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.value,(h,y)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(e.unref(s)),key:`fieldRow_${y}`},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(h,(k,_)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass([e.unref(i),k.columnClass]),key:`field_${y}_${_}`},[e.renderSlot(o.$slots,`${k.field}`,{field:k},()=>[e.createVNode(m,e.mergeProps({modelValue:C(k.field)[d(k.field)],"onUpdate:modelValue":f=>C(k.field)[d(k.field)]=f},k),null,16,["modelValue","onUpdate:modelValue"])])],2))),128))],2))),128))]),e.renderSlot(o.$slots,"extra"),e.renderSlot(o.$slots,"divider",{},()=>[o.hasActions&&!o.hideDivider?(e.openBlock(),e.createElementBlock("hr",S)):e.createCommentVNode("",!0)]),o.hasActions?e.renderSlot(o.$slots,"actions",{key:1},()=>[e.renderSlot(o.$slots,"submit-button",{},()=>[e.createElementVNode("button",{class:e.normalizeClass(e.unref(p)),disabled:o.loading,type:"submit"},e.toDisplayString(o.submitButtonText),11,w)]),e.renderSlot(o.$slots,"extra-buttons")]):e.createCommentVNode("",!0)],40,E)}}}),N=()=>{const n=e.inject("labelClass",null),r=e.inject("inputClass",null),l=e.inject("inputWrapperClass",null),a=e.inject("inputGroupClass",null),t=e.inject("inputErrorClass",null),s=e.inject("errorClass",null),i=e.inject("helpTextClass",null);return{labelClass:n,inputClass:r,inputWrapperClass:l,inputGroupClass:a,inputErrorClass:t,errorClass:s,helpTextClass:i}},F=(n,r=[])=>{const l=e.toRaw(r),a=e.ref(null);return e.watch(n,(t,s)=>{if(a.value=null,t!==s)for(let i=0;i<l.length;i+=1){const p=l[i];if(!p.validator(t)){a.value=p.message;break}}},{immediate:!0}),a};function B(n,r,l){const a=l??"modelValue";return e.computed({get:()=>n(),set:t=>r(`update:${a}`,t)})}const D=e.defineComponent({inheritAttrs:!1,__name:"FormMakerInput",props:{loading:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},modelValue:{},error:{default:void 0},helpText:{default:void 0},label:{default:void 0},id:{default:void 0},type:{default:"text"},rules:{default:()=>[]}},emits:["update:modelValue"],setup(n,{emit:r}){const l=n,t=B(()=>l.modelValue,r),{labelClass:s,inputClass:i,inputWrapperClass:p,inputErrorClass:C,errorClass:d,helpTextClass:c}=N(),o=e.computed(()=>!!l.label),u=e.computed(()=>!!l.helpText),m=F(t,l.rules),h=e.computed(()=>!!l.error||!!m.value),y=e.computed(()=>l.error?l.error:m.value),k=e.inject("unlabeledTypes",[]),_=e.computed(()=>!new Set(k).has(l.type));return(f,T)=>{const J=e.resolveComponent("form-maker-label"),K=e.resolveComponent("form-maker-help"),Q=e.resolveComponent("form-maker-error"),X=e.resolveComponent("form-maker-input-wrapper");return e.openBlock(),e.createBlock(X,{class:e.normalizeClass([h.value&&e.unref(C),e.unref(p)])},{default:e.withCtx(()=>[_.value?e.renderSlot(f.$slots,"label",{key:0},()=>[o.value?(e.openBlock(),e.createBlock(J,{key:0,id:f.id,class:e.normalizeClass(e.unref(s)),label:f.label},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(f.label),1)]),_:1},8,["id","class","label"])):e.createCommentVNode("",!0)]):e.createCommentVNode("",!0),e.renderSlot(f.$slots,"default",{},()=>[e.renderSlot(f.$slots,"before"),(e.openBlock(),e.createBlock(e.resolveDynamicComponent(`form-maker-input-${f.type}`),e.mergeProps({...f.$props,...f.$attrs},{class:[f.type!=="checkbox"&&e.unref(i),h.value&&e.unref(C)],modelValue:e.unref(t),"onUpdate:modelValue":T[0]||(T[0]=Y=>e.isRef(t)?t.value=Y:null)}),null,16,["class","modelValue"])),e.renderSlot(f.$slots,"after")]),e.renderSlot(f.$slots,"help",{},()=>[u.value?(e.openBlock(),e.createBlock(K,{key:0,class:e.normalizeClass(e.unref(c))},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(f.helpText),1)]),_:1},8,["class"])):e.createCommentVNode("",!0)]),e.renderSlot(f.$slots,"errors",{},()=>[h.value?(e.openBlock(),e.createBlock(Q,{key:0,class:e.normalizeClass(e.unref(d))},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(y.value),1)]),_:1},8,["class"])):e.createCommentVNode("",!0)])]),_:3},8,["class"])}}}),M=["checked","value","onClick"],A=e.defineComponent({__name:"CheckboxInput",props:{options:{type:[Boolean,Array],default:()=>[]},loading:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},modelValue:{},error:{default:void 0},helpText:{default:void 0},label:{default:void 0},type:{},rules:{default:()=>[]}},emits:["update:modelValue"],setup(n,{emit:r}){const l=n,a=r,t=e.computed(()=>Array.isArray(l.options)&&l.options.length===0),s=e.computed(()=>l.modelValue),i=e.computed(()=>(Array.isArray(s.value)?s.value:[s.value]).filter(c=>!!c)),p=e.computed(()=>t.value?[{label:l.label,value:!0}]:l.options),C=d=>{let c=[...i.value];c.indexOf(d)===-1?c.push(d):c=c.filter(o=>o!==d),t.value?a("update:modelValue",c.length>0):a("update:modelValue",c)};return(d,c)=>(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(p.value,(o,u)=>(e.openBlock(),e.createElementBlock("div",{key:`option_${u}`},[e.createElementVNode("label",null,[e.createElementVNode("input",e.mergeProps(d.$props,{checked:i.value.indexOf(o.value)!==-1,value:o.value,type:"checkbox",onClick:()=>C(o.value)}),null,16,M),e.createTextVNode(" "+e.toDisplayString(o.label),1)])]))),128))}}),L=e.defineComponent({__name:"FileInput",props:{loading:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},modelValue:{},error:{default:void 0},helpText:{default:void 0},label:{default:void 0},id:{default:void 0},type:{},rules:{default:()=>[]}},emits:["update:modelValue"],setup(n,{emit:r}){const l=r,a=t=>{const s=t.currentTarget;if(s.files&&s.files.length){const i=s.files[0];l("update:modelValue",i)}};return(t,s)=>(e.openBlock(),e.createElementBlock("input",e.mergeProps(t.$props,{type:"file",onChange:a}),null,16))}});function V(n,r){return e.h(`${n.as??"div"}`,r.attrs,r.slots)}V.props={as:{type:String,required:!1,default:"div"}};function $(n,{slots:r,attrs:l}){return e.h("label",{...l,for:n.id},r.default())}$.props={id:{type:String,default:null}};const G=$,I=["checked","value","onChange"],O=e.defineComponent({__name:"RadioInput",props:{options:{default:()=>[]},loading:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},modelValue:{},error:{default:void 0},helpText:{default:void 0},label:{default:void 0},type:{},rules:{},id:{default:void 0}},emits:["update:modelValue"],setup(n,{emit:r}){const l=r,a=t=>{l("update:modelValue",t)};return(t,s)=>(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.options,(i,p)=>(e.openBlock(),e.createElementBlock("div",{key:`option_${p}`},[e.createElementVNode("label",null,[e.createElementVNode("input",e.mergeProps(t.$props,{checked:i.value===t.modelValue,value:i.value,type:"radio",onChange:C=>a(i.value)}),null,16,I),e.createTextVNode(" "+e.toDisplayString(i.label),1)])]))),128))}}),P=["id","disabled","name","placeholder"],R=["label"],x=["value"],z=["value"],U=e.defineComponent({__name:"SelectInput",props:{options:{default:()=>[]},optionGroups:{default:()=>({})},loading:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},modelValue:{},error:{default:void 0},helpText:{default:void 0},label:{default:void 0},id:{default:void 0},type:{},rules:{default:()=>[]}},emits:["update:modelValue"],setup(n,{emit:r}){const l=n,t=B(()=>l.modelValue,r),s=Object.keys(l.optionGroups).length>0,i=e.computed(()=>l.options.map(p=>typeof p=="object"?p:{label:p,value:p}));return(p,C)=>e.withDirectives((e.openBlock(),e.createElementBlock("select",{id:p.id,"onUpdate:modelValue":C[0]||(C[0]=d=>e.isRef(t)?t.value=d:null),disabled:p.disabled,name:p.name,placeholder:p.placeholder},[s?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:0},e.renderList(p.optionGroups,(d,c)=>(e.openBlock(),e.createElementBlock("optgroup",{key:`optGroup_${c}`,label:c},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(d,(o,u)=>(e.openBlock(),e.createElementBlock("option",{key:`option_${o}`,value:u},e.toDisplayString(o),9,x))),128))],8,R))),128)):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:1},e.renderList(i.value,(d,c)=>(e.openBlock(),e.createElementBlock("option",{key:`option_${c}`,value:d.value},e.toDisplayString(d.label),9,z))),128))],8,P)),[[e.vModelSelect,e.unref(t)]])}}),W=["id"],q=e.defineComponent({__name:"TextAreaInput",props:{modelValue:{}},emits:["update:modelValue"],setup(n,{emit:r}){const l=n,t=B(()=>l.modelValue,r);return(s,i)=>e.withDirectives((e.openBlock(),e.createElementBlock("textarea",e.mergeProps({id:s.id,"onUpdate:modelValue":i[0]||(i[0]=p=>e.isRef(t)?t.value=p:null)},{...s.$props,...s.$attrs}),null,16,W)),[[e.vModelText,e.unref(t)]])}}),H=["type"],b=e.defineComponent({__name:"BasicInput",props:{loading:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},modelValue:{},error:{default:void 0},helpText:{default:void 0},label:{default:void 0},id:{default:void 0},type:{default:"text"},rules:{default:()=>[]}},emits:["update:modelValue"],setup(n,{emit:r}){const l=n,t=B(()=>l.modelValue,r);return(s,i)=>e.withDirectives((e.openBlock(),e.createElementBlock("input",e.mergeProps({"onUpdate:modelValue":i[0]||(i[0]=p=>e.isRef(t)?t.value=p:null),type:s.type},{...s.$props,...s.$attrs}),null,16,H)),[[e.vModelDynamic,e.unref(t)]])}}),g={unlabeledTypes:[],classes:{"form-row":"form-maker-row","form-column":"form-maker-column","form-label":"form-maker-label","input-wrapper":"form-maker-input-wrapper","input-error":"form-maker-input-error",input:"form-maker-input",error:"form-maker-error","help-text":"form-maker-help-text","submit-button":"form-maker-submit"},components:{"form-maker-input-color":b,"form-maker-input-date":b,"form-maker-input-email":b,"form-maker-input-month":b,"form-maker-input-number":b,"form-maker-input-password":b,"form-maker-input-search":b,"form-maker-input-tel":b,"form-maker-input-time":b,"form-maker-input-text":b,"form-maker-input-url":b,"form-maker-input-week":b,"form-maker-input-range":b,"form-maker-input-file":L,"form-maker-input-textarea":q,"form-maker-input-select":U,"form-maker-input-checkbox":A,"form-maker-input-radio":O,"form-maker-label":G,"form-maker-help":V,"form-maker-error":V,"form-maker-input-wrapper":V}};return{install:(n,r={})=>{const l={unlabeledTypes:r.unlabeledTypes!==void 0?r.unlabeledTypes:g.unlabeledTypes,classes:{...g.classes,...r.classes},components:{...g.components,...r.components}};n.component("FormMaker",j),n.component("FormMakerInput",D),n.provide("unlabeled-types",l.unlabeledTypes),Object.keys(l.classes).forEach(a=>{n.provide(a,l.classes[a])}),Object.keys(l.components).forEach(a=>{n.component(a,l.components[a])})}}}(Vue);
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { defineComponent as B, computed as C, provide as g, inject as m, resolveComponent as O, openBlock as i, createElementBlock as p, withModifiers as Y, renderSlot as v, createTextVNode as G, createCommentVNode as E, Fragment as A, renderList as S, normalizeClass as M, unref as k, createVNode as Z, mergeProps as F, createElementVNode as j, toDisplayString as T, toRaw as ee, ref as le, watch as te, createBlock as I, withCtx as D, resolveDynamicComponent as ae, isRef as U, h as z, withDirectives as P, vModelSelect as oe, vModelText as re, vModelDynamic as se } from "vue";
2
- const ne = ["onSubmit"], ue = { key: 0 }, ie = ["disabled"], pe = /* @__PURE__ */ B({
1
+ import { defineComponent as w, computed as $, provide as T, inject as f, resolveComponent as O, openBlock as i, createElementBlock as d, withModifiers as Y, renderSlot as k, createTextVNode as G, createCommentVNode as E, Fragment as A, renderList as S, normalizeClass as M, unref as y, createVNode as Z, mergeProps as F, createElementVNode as j, toDisplayString as B, toRaw as ee, ref as le, watch as te, createBlock as I, withCtx as R, resolveDynamicComponent as ae, isRef as W, h as z, withDirectives as P, vModelSelect as oe, vModelText as re, vModelDynamic as se } from "vue";
2
+ const ne = ["onSubmit"], ue = { key: 0 }, ie = ["disabled"], de = /* @__PURE__ */ w({
3
3
  __name: "FormMaker",
4
4
  props: {
5
5
  loading: { type: Boolean, default: !1 },
@@ -20,116 +20,132 @@ const ne = ["onSubmit"], ue = { key: 0 }, ie = ["disabled"], pe = /* @__PURE__ *
20
20
  submitButtonText: { default: "Submit" },
21
21
  unlabeledTypes: {}
22
22
  },
23
- emits: ["submit", "update:modelValue"],
23
+ emits: ["submit", "submit-error", "update:modelValue"],
24
24
  setup(o, { emit: a }) {
25
- const e = o, n = a, l = () => n("submit"), r = C(() => e.fields.length > 0 ? e.fields.map((t) => {
25
+ const e = o, r = a, l = $(() => e.fields.length > 0 ? e.fields.map((t) => {
26
26
  let b = t;
27
- return Array.isArray(t) || (b = [t]), b.map((y) => ({
28
- ...y,
29
- id: y.id || `formMaker_${(/* @__PURE__ */ new Date()).getTime()}_${y.name}`
27
+ return Array.isArray(t) || (b = [t]), b.map((m) => ({
28
+ ...m,
29
+ id: m.id || `formMaker_${(/* @__PURE__ */ new Date()).getTime()}_${m.field}`
30
30
  }));
31
31
  }) : Object.keys(e.modelValue).map((t) => [
32
32
  {
33
- name: t,
33
+ field: t,
34
34
  label: t,
35
35
  id: `formMaker_${t}`
36
36
  }
37
37
  ]));
38
- g("labelClass", e.labelClass || m("form-label")), g("inputGroupClass", e.inputGroupClass || m("input-group")), g("inputWrapperClass", e.inputWrapperClass || m("input-wrapper")), g("inputErrorClass", e.inputErrorClass || m("input-error")), g("inputClass", e.inputClass || m("input")), g("errorClass", e.errorClass || m("error")), g("helpTextClass", e.helpTextClass || m("help-text")), g("unlabeledTypes", e.unlabeledTypes || m("unlabeled-types"));
39
- const s = e.rowClass || m("form-row"), u = e.columnClass || m("form-column"), _ = e.submitButtonClass || m("submit-button"), f = (t) => {
38
+ T("labelClass", e.labelClass || f("form-label")), T("inputGroupClass", e.inputGroupClass || f("input-group")), T("inputWrapperClass", e.inputWrapperClass || f("input-wrapper")), T("inputErrorClass", e.inputErrorClass || f("input-error")), T("inputClass", e.inputClass || f("input")), T("errorClass", e.errorClass || f("error")), T("helpTextClass", e.helpTextClass || f("help-text")), T("unlabeledTypes", e.unlabeledTypes || f("unlabeled-types"));
39
+ const s = e.rowClass || f("form-row"), n = e.columnClass || f("form-column"), u = e.submitButtonClass || f("submit-button"), C = (t) => {
40
40
  const b = t.split(".");
41
- let y = e.modelValue;
41
+ let m = e.modelValue;
42
42
  for (let V = 0; V < b.length - 1; V += 1) {
43
- const w = y[b[V]];
44
- if (!w)
43
+ const g = m[b[V]];
44
+ if (!g)
45
45
  break;
46
- y = w;
46
+ m = g;
47
47
  }
48
- return y;
49
- }, d = (t) => {
48
+ return m;
49
+ }, p = (t) => {
50
50
  const b = t.split(".");
51
51
  return b[b.length - 1];
52
+ }, c = () => {
53
+ for (const t in l.value)
54
+ for (const b in l.value[t]) {
55
+ const m = l.value[t][b];
56
+ if (m.rules === void 0 || m.rules.length === 0)
57
+ continue;
58
+ const V = C(m.field)[p(m.field)];
59
+ for (const g in m.rules) {
60
+ const h = m.rules[g];
61
+ if (!h.validator(V)) {
62
+ console.error(`${h.message}`), r("submit-error", h.message);
63
+ return;
64
+ }
65
+ }
66
+ }
67
+ r("submit");
52
68
  };
53
69
  return (t, b) => {
54
- const y = O("form-maker-input");
55
- return i(), p("form", {
70
+ const m = O("form-maker-input");
71
+ return i(), d("form", {
56
72
  class: "form-maker",
57
- onSubmit: Y(l, ["prevent"])
73
+ onSubmit: Y(c, ["prevent", "stop"])
58
74
  }, [
59
- t.loading ? v(t.$slots, "loading", { key: 0 }, () => [
75
+ t.loading ? k(t.$slots, "loading", { key: 0 }, () => [
60
76
  G(" Loading... ")
61
77
  ]) : E("", !0),
62
- v(t.$slots, "default", {}, () => [
63
- (i(!0), p(A, null, S(r.value, (V, w) => (i(), p("div", {
64
- class: M(k(s)),
65
- key: `fieldRow_${w}`
78
+ k(t.$slots, "default", {}, () => [
79
+ (i(!0), d(A, null, S(l.value, (V, g) => (i(), d("div", {
80
+ class: M(y(s)),
81
+ key: `fieldRow_${g}`
66
82
  }, [
67
- (i(!0), p(A, null, S(V, ($, L) => (i(), p("div", {
68
- class: M([k(u), $.columnClass]),
69
- key: `field_${w}_${L}`
83
+ (i(!0), d(A, null, S(V, (h, D) => (i(), d("div", {
84
+ class: M([y(n), h.columnClass]),
85
+ key: `field_${g}_${D}`
70
86
  }, [
71
- v(t.$slots, `${$.name}`, { field: $ }, () => [
72
- Z(y, F({
73
- modelValue: f($.name)[d($.name)],
74
- "onUpdate:modelValue": (c) => f($.name)[d($.name)] = c
75
- }, $), null, 16, ["modelValue", "onUpdate:modelValue"])
87
+ k(t.$slots, `${h.field}`, { field: h }, () => [
88
+ Z(m, F({
89
+ modelValue: C(h.field)[p(h.field)],
90
+ "onUpdate:modelValue": (v) => C(h.field)[p(h.field)] = v
91
+ }, h), null, 16, ["modelValue", "onUpdate:modelValue"])
76
92
  ])
77
93
  ], 2))), 128))
78
94
  ], 2))), 128))
79
95
  ]),
80
- v(t.$slots, "extra"),
81
- v(t.$slots, "divider", {}, () => [
82
- t.hasActions && !t.hideDivider ? (i(), p("hr", ue)) : E("", !0)
96
+ k(t.$slots, "extra"),
97
+ k(t.$slots, "divider", {}, () => [
98
+ t.hasActions && !t.hideDivider ? (i(), d("hr", ue)) : E("", !0)
83
99
  ]),
84
- t.hasActions ? v(t.$slots, "actions", { key: 1 }, () => [
85
- v(t.$slots, "submit-button", {}, () => [
100
+ t.hasActions ? k(t.$slots, "actions", { key: 1 }, () => [
101
+ k(t.$slots, "submit-button", {}, () => [
86
102
  j("button", {
87
- class: M(k(_)),
103
+ class: M(y(u)),
88
104
  disabled: t.loading,
89
105
  type: "submit"
90
- }, T(t.submitButtonText), 11, ie)
106
+ }, B(t.submitButtonText), 11, ie)
91
107
  ]),
92
- v(t.$slots, "extra-buttons")
108
+ k(t.$slots, "extra-buttons")
93
109
  ]) : E("", !0)
94
110
  ], 40, ne);
95
111
  };
96
112
  }
97
- }), de = () => {
98
- const o = m("labelClass", null), a = m("inputClass", null), e = m("inputWrapperClass", null), n = m("inputGroupClass", null), l = m("inputErrorClass", null), r = m("errorClass", null), s = m("helpTextClass", null);
113
+ }), pe = () => {
114
+ const o = f("labelClass", null), a = f("inputClass", null), e = f("inputWrapperClass", null), r = f("inputGroupClass", null), l = f("inputErrorClass", null), s = f("errorClass", null), n = f("helpTextClass", null);
99
115
  return {
100
116
  labelClass: o,
101
117
  inputClass: a,
102
118
  inputWrapperClass: e,
103
- inputGroupClass: n,
119
+ inputGroupClass: r,
104
120
  inputErrorClass: l,
105
- errorClass: r,
106
- helpTextClass: s
121
+ errorClass: s,
122
+ helpTextClass: n
107
123
  };
108
124
  }, me = (o, a = []) => {
109
- const e = ee(a), n = le(null);
125
+ const e = ee(a), r = le(null);
110
126
  return te(
111
127
  o,
112
- (l, r) => {
113
- if (n.value = null, l !== r)
114
- for (let s = 0; s < e.length; s += 1) {
115
- const u = e[s];
128
+ (l, s) => {
129
+ if (r.value = null, l !== s)
130
+ for (let n = 0; n < e.length; n += 1) {
131
+ const u = e[n];
116
132
  if (!u.validator(l)) {
117
- n.value = u.message;
133
+ r.value = u.message;
118
134
  break;
119
135
  }
120
136
  }
121
137
  },
122
138
  { immediate: !0 }
123
- ), n;
139
+ ), r;
124
140
  };
125
- function W(o, a, e) {
126
- const n = e ?? "modelValue";
127
- return C({
141
+ function L(o, a, e) {
142
+ const r = e ?? "modelValue";
143
+ return $({
128
144
  get: () => o(),
129
- set: (l) => a(`update:${n}`, l)
145
+ set: (l) => a(`update:${r}`, l)
130
146
  });
131
147
  }
132
- const fe = /* @__PURE__ */ B({
148
+ const fe = /* @__PURE__ */ w({
133
149
  inheritAttrs: !1,
134
150
  __name: "FormMakerInput",
135
151
  props: {
@@ -145,60 +161,60 @@ const fe = /* @__PURE__ */ B({
145
161
  },
146
162
  emits: ["update:modelValue"],
147
163
  setup(o, { emit: a }) {
148
- const e = o, l = W(() => e.modelValue, a), {
149
- labelClass: r,
150
- inputClass: s,
164
+ const e = o, l = L(() => e.modelValue, a), {
165
+ labelClass: s,
166
+ inputClass: n,
151
167
  inputWrapperClass: u,
152
- inputErrorClass: _,
153
- errorClass: f,
154
- helpTextClass: d
155
- } = de(), t = C(() => !!e.label), b = C(() => !!e.helpText), y = me(l, e.rules), V = C(() => !!e.error || !!y.value), w = C(() => e.error ? e.error : y.value), $ = m("unlabeledTypes", []), L = C(() => !new Set($).has(e.type));
156
- return (c, q) => {
168
+ inputErrorClass: C,
169
+ errorClass: p,
170
+ helpTextClass: c
171
+ } = pe(), t = $(() => !!e.label), b = $(() => !!e.helpText), m = me(l, e.rules), V = $(() => !!e.error || !!m.value), g = $(() => e.error ? e.error : m.value), h = f("unlabeledTypes", []), D = $(() => !new Set(h).has(e.type));
172
+ return (v, q) => {
157
173
  const x = O("form-maker-label"), J = O("form-maker-help"), K = O("form-maker-error"), Q = O("form-maker-input-wrapper");
158
174
  return i(), I(Q, {
159
- class: M([V.value && k(_), k(u)])
175
+ class: M([V.value && y(C), y(u)])
160
176
  }, {
161
- default: D(() => [
162
- L.value ? v(c.$slots, "label", { key: 0 }, () => [
177
+ default: R(() => [
178
+ D.value ? k(v.$slots, "label", { key: 0 }, () => [
163
179
  t.value ? (i(), I(x, {
164
180
  key: 0,
165
- id: c.id,
166
- class: M(k(r)),
167
- label: c.label
181
+ id: v.id,
182
+ class: M(y(s)),
183
+ label: v.label
168
184
  }, {
169
- default: D(() => [
170
- G(T(c.label), 1)
185
+ default: R(() => [
186
+ G(B(v.label), 1)
171
187
  ]),
172
188
  _: 1
173
189
  }, 8, ["id", "class", "label"])) : E("", !0)
174
190
  ]) : E("", !0),
175
- v(c.$slots, "default", {}, () => [
176
- v(c.$slots, "before"),
177
- (i(), I(ae(`form-maker-input-${c.type}`), F({ ...c.$props, ...c.$attrs }, {
178
- class: [c.type !== "checkbox" && k(s), V.value && k(_)],
179
- modelValue: k(l),
180
- "onUpdate:modelValue": q[0] || (q[0] = (X) => U(l) ? l.value = X : null)
191
+ k(v.$slots, "default", {}, () => [
192
+ k(v.$slots, "before"),
193
+ (i(), I(ae(`form-maker-input-${v.type}`), F({ ...v.$props, ...v.$attrs }, {
194
+ class: [v.type !== "checkbox" && y(n), V.value && y(C)],
195
+ modelValue: y(l),
196
+ "onUpdate:modelValue": q[0] || (q[0] = (X) => W(l) ? l.value = X : null)
181
197
  }), null, 16, ["class", "modelValue"])),
182
- v(c.$slots, "after")
198
+ k(v.$slots, "after")
183
199
  ]),
184
- v(c.$slots, "help", {}, () => [
200
+ k(v.$slots, "help", {}, () => [
185
201
  b.value ? (i(), I(J, {
186
202
  key: 0,
187
- class: M(k(d))
203
+ class: M(y(c))
188
204
  }, {
189
- default: D(() => [
190
- G(T(c.helpText), 1)
205
+ default: R(() => [
206
+ G(B(v.helpText), 1)
191
207
  ]),
192
208
  _: 1
193
209
  }, 8, ["class"])) : E("", !0)
194
210
  ]),
195
- v(c.$slots, "errors", {}, () => [
211
+ k(v.$slots, "errors", {}, () => [
196
212
  V.value ? (i(), I(K, {
197
213
  key: 0,
198
- class: M(k(f))
214
+ class: M(y(p))
199
215
  }, {
200
- default: D(() => [
201
- G(T(w.value), 1)
216
+ default: R(() => [
217
+ G(B(g.value), 1)
202
218
  ]),
203
219
  _: 1
204
220
  }, 8, ["class"])) : E("", !0)
@@ -208,7 +224,7 @@ const fe = /* @__PURE__ */ B({
208
224
  }, 8, ["class"]);
209
225
  };
210
226
  }
211
- }), ce = ["checked", "value", "onClick"], be = /* @__PURE__ */ B({
227
+ }), ce = ["checked", "value", "onClick"], be = /* @__PURE__ */ w({
212
228
  __name: "CheckboxInput",
213
229
  props: {
214
230
  options: { type: [Boolean, Array], default: () => [] },
@@ -223,30 +239,30 @@ const fe = /* @__PURE__ */ B({
223
239
  },
224
240
  emits: ["update:modelValue"],
225
241
  setup(o, { emit: a }) {
226
- const e = o, n = a, l = C(() => Array.isArray(e.options) && e.options.length === 0), r = C(() => e.modelValue), s = C(() => (Array.isArray(r.value) ? r.value : [r.value]).filter((d) => !!d)), u = C(() => l.value ? [
242
+ const e = o, r = a, l = $(() => Array.isArray(e.options) && e.options.length === 0), s = $(() => e.modelValue), n = $(() => (Array.isArray(s.value) ? s.value : [s.value]).filter((c) => !!c)), u = $(() => l.value ? [
227
243
  {
228
244
  label: e.label,
229
245
  value: !0
230
246
  }
231
- ] : e.options), _ = (f) => {
232
- let d = [...s.value];
233
- d.indexOf(f) === -1 ? d.push(f) : d = d.filter((t) => t !== f), l.value ? n("update:modelValue", d.length > 0) : n("update:modelValue", d);
247
+ ] : e.options), C = (p) => {
248
+ let c = [...n.value];
249
+ c.indexOf(p) === -1 ? c.push(p) : c = c.filter((t) => t !== p), l.value ? r("update:modelValue", c.length > 0) : r("update:modelValue", c);
234
250
  };
235
- return (f, d) => (i(!0), p(A, null, S(u.value, (t, b) => (i(), p("div", {
251
+ return (p, c) => (i(!0), d(A, null, S(u.value, (t, b) => (i(), d("div", {
236
252
  key: `option_${b}`
237
253
  }, [
238
254
  j("label", null, [
239
- j("input", F(f.$props, {
240
- checked: s.value.indexOf(t.value) !== -1,
255
+ j("input", F(p.$props, {
256
+ checked: n.value.indexOf(t.value) !== -1,
241
257
  value: t.value,
242
258
  type: "checkbox",
243
- onClick: () => _(t.value)
259
+ onClick: () => C(t.value)
244
260
  }), null, 16, ce),
245
- G(" " + T(t.label), 1)
261
+ G(" " + B(t.label), 1)
246
262
  ])
247
263
  ]))), 128));
248
264
  }
249
- }), ve = /* @__PURE__ */ B({
265
+ }), ve = /* @__PURE__ */ w({
250
266
  __name: "FileInput",
251
267
  props: {
252
268
  loading: { type: Boolean, default: !1 },
@@ -261,23 +277,23 @@ const fe = /* @__PURE__ */ B({
261
277
  },
262
278
  emits: ["update:modelValue"],
263
279
  setup(o, { emit: a }) {
264
- const e = a, n = (l) => {
265
- const r = l.currentTarget;
266
- if (r.files && r.files.length) {
267
- const s = r.files[0];
268
- e("update:modelValue", s);
280
+ const e = a, r = (l) => {
281
+ const s = l.currentTarget;
282
+ if (s.files && s.files.length) {
283
+ const n = s.files[0];
284
+ e("update:modelValue", n);
269
285
  }
270
286
  };
271
- return (l, r) => (i(), p("input", F(l.$props, {
287
+ return (l, s) => (i(), d("input", F(l.$props, {
272
288
  type: "file",
273
- onChange: n
289
+ onChange: r
274
290
  }), null, 16));
275
291
  }
276
292
  });
277
- function R(o, a) {
293
+ function U(o, a) {
278
294
  return z(`${o.as ?? "div"}`, a.attrs, a.slots);
279
295
  }
280
- R.props = {
296
+ U.props = {
281
297
  as: {
282
298
  type: String,
283
299
  required: !1,
@@ -293,7 +309,7 @@ H.props = {
293
309
  default: null
294
310
  }
295
311
  };
296
- const ke = H, he = ["checked", "value", "onChange"], ye = /* @__PURE__ */ B({
312
+ const he = H, ke = ["checked", "value", "onChange"], ye = /* @__PURE__ */ w({
297
313
  __name: "RadioInput",
298
314
  props: {
299
315
  options: { default: () => [] },
@@ -309,24 +325,24 @@ const ke = H, he = ["checked", "value", "onChange"], ye = /* @__PURE__ */ B({
309
325
  },
310
326
  emits: ["update:modelValue"],
311
327
  setup(o, { emit: a }) {
312
- const e = a, n = (l) => {
328
+ const e = a, r = (l) => {
313
329
  e("update:modelValue", l);
314
330
  };
315
- return (l, r) => (i(!0), p(A, null, S(l.options, (s, u) => (i(), p("div", {
331
+ return (l, s) => (i(!0), d(A, null, S(l.options, (n, u) => (i(), d("div", {
316
332
  key: `option_${u}`
317
333
  }, [
318
334
  j("label", null, [
319
335
  j("input", F(l.$props, {
320
- checked: s.value === l.modelValue,
321
- value: s.value,
336
+ checked: n.value === l.modelValue,
337
+ value: n.value,
322
338
  type: "radio",
323
- onChange: (_) => n(s.value)
324
- }), null, 16, he),
325
- G(" " + T(s.label), 1)
339
+ onChange: (C) => r(n.value)
340
+ }), null, 16, ke),
341
+ G(" " + B(n.label), 1)
326
342
  ])
327
343
  ]))), 128));
328
344
  }
329
- }), Ce = ["id", "disabled", "name", "placeholder"], _e = ["label"], $e = ["value"], Ve = ["value"], ge = /* @__PURE__ */ B({
345
+ }), Ce = ["id", "disabled", "name", "placeholder"], _e = ["label"], $e = ["value"], Ve = ["value"], ge = /* @__PURE__ */ w({
330
346
  __name: "SelectInput",
331
347
  props: {
332
348
  options: { default: () => [] },
@@ -343,49 +359,49 @@ const ke = H, he = ["checked", "value", "onChange"], ye = /* @__PURE__ */ B({
343
359
  },
344
360
  emits: ["update:modelValue"],
345
361
  setup(o, { emit: a }) {
346
- const e = o, l = W(() => e.modelValue, a), r = Object.keys(e.optionGroups).length > 0, s = C(() => e.options.map((u) => typeof u == "object" ? u : {
362
+ const e = o, l = L(() => e.modelValue, a), s = Object.keys(e.optionGroups).length > 0, n = $(() => e.options.map((u) => typeof u == "object" ? u : {
347
363
  label: u,
348
364
  value: u
349
365
  }));
350
- return (u, _) => P((i(), p("select", {
366
+ return (u, C) => P((i(), d("select", {
351
367
  id: u.id,
352
- "onUpdate:modelValue": _[0] || (_[0] = (f) => U(l) ? l.value = f : null),
368
+ "onUpdate:modelValue": C[0] || (C[0] = (p) => W(l) ? l.value = p : null),
353
369
  disabled: u.disabled,
354
370
  name: u.name,
355
371
  placeholder: u.placeholder
356
372
  }, [
357
- r ? (i(!0), p(A, { key: 0 }, S(u.optionGroups, (f, d) => (i(), p("optgroup", {
358
- key: `optGroup_${d}`,
359
- label: d
373
+ s ? (i(!0), d(A, { key: 0 }, S(u.optionGroups, (p, c) => (i(), d("optgroup", {
374
+ key: `optGroup_${c}`,
375
+ label: c
360
376
  }, [
361
- (i(!0), p(A, null, S(f, (t, b) => (i(), p("option", {
377
+ (i(!0), d(A, null, S(p, (t, b) => (i(), d("option", {
362
378
  key: `option_${t}`,
363
379
  value: b
364
- }, T(t), 9, $e))), 128))
365
- ], 8, _e))), 128)) : (i(!0), p(A, { key: 1 }, S(s.value, (f, d) => (i(), p("option", {
366
- key: `option_${d}`,
367
- value: f.value
368
- }, T(f.label), 9, Ve))), 128))
380
+ }, B(t), 9, $e))), 128))
381
+ ], 8, _e))), 128)) : (i(!0), d(A, { key: 1 }, S(n.value, (p, c) => (i(), d("option", {
382
+ key: `option_${c}`,
383
+ value: p.value
384
+ }, B(p.label), 9, Ve))), 128))
369
385
  ], 8, Ce)), [
370
- [oe, k(l)]
386
+ [oe, y(l)]
371
387
  ]);
372
388
  }
373
- }), Te = ["id"], Be = /* @__PURE__ */ B({
389
+ }), Te = ["id"], Be = /* @__PURE__ */ w({
374
390
  __name: "TextAreaInput",
375
391
  props: {
376
392
  modelValue: {}
377
393
  },
378
394
  emits: ["update:modelValue"],
379
395
  setup(o, { emit: a }) {
380
- const e = o, l = W(() => e.modelValue, a);
381
- return (r, s) => P((i(), p("textarea", F({
382
- id: r.id,
383
- "onUpdate:modelValue": s[0] || (s[0] = (u) => U(l) ? l.value = u : null)
384
- }, { ...r.$props, ...r.$attrs }), null, 16, Te)), [
385
- [re, k(l)]
396
+ const e = o, l = L(() => e.modelValue, a);
397
+ return (s, n) => P((i(), d("textarea", F({
398
+ id: s.id,
399
+ "onUpdate:modelValue": n[0] || (n[0] = (u) => W(l) ? l.value = u : null)
400
+ }, { ...s.$props, ...s.$attrs }), null, 16, Te)), [
401
+ [re, y(l)]
386
402
  ]);
387
403
  }
388
- }), we = ["type"], h = /* @__PURE__ */ B({
404
+ }), we = ["type"], _ = /* @__PURE__ */ w({
389
405
  __name: "BasicInput",
390
406
  props: {
391
407
  loading: { type: Boolean, default: !1 },
@@ -400,12 +416,12 @@ const ke = H, he = ["checked", "value", "onChange"], ye = /* @__PURE__ */ B({
400
416
  },
401
417
  emits: ["update:modelValue"],
402
418
  setup(o, { emit: a }) {
403
- const e = o, l = W(() => e.modelValue, a);
404
- return (r, s) => P((i(), p("input", F({
405
- "onUpdate:modelValue": s[0] || (s[0] = (u) => U(l) ? l.value = u : null),
406
- type: r.type
407
- }, { ...r.$props, ...r.$attrs }), null, 16, we)), [
408
- [se, k(l)]
419
+ const e = o, l = L(() => e.modelValue, a);
420
+ return (s, n) => P((i(), d("input", F({
421
+ "onUpdate:modelValue": n[0] || (n[0] = (u) => W(l) ? l.value = u : null),
422
+ type: s.type
423
+ }, { ...s.$props, ...s.$attrs }), null, 16, we)), [
424
+ [se, y(l)]
409
425
  ]);
410
426
  }
411
427
  }), N = {
@@ -422,28 +438,28 @@ const ke = H, he = ["checked", "value", "onChange"], ye = /* @__PURE__ */ B({
422
438
  "submit-button": "form-maker-submit"
423
439
  },
424
440
  components: {
425
- "form-maker-input-color": h,
426
- "form-maker-input-date": h,
427
- "form-maker-input-email": h,
428
- "form-maker-input-month": h,
429
- "form-maker-input-number": h,
430
- "form-maker-input-password": h,
431
- "form-maker-input-search": h,
432
- "form-maker-input-tel": h,
433
- "form-maker-input-time": h,
434
- "form-maker-input-text": h,
435
- "form-maker-input-url": h,
436
- "form-maker-input-week": h,
437
- "form-maker-input-range": h,
441
+ "form-maker-input-color": _,
442
+ "form-maker-input-date": _,
443
+ "form-maker-input-email": _,
444
+ "form-maker-input-month": _,
445
+ "form-maker-input-number": _,
446
+ "form-maker-input-password": _,
447
+ "form-maker-input-search": _,
448
+ "form-maker-input-tel": _,
449
+ "form-maker-input-time": _,
450
+ "form-maker-input-text": _,
451
+ "form-maker-input-url": _,
452
+ "form-maker-input-week": _,
453
+ "form-maker-input-range": _,
438
454
  "form-maker-input-file": ve,
439
455
  "form-maker-input-textarea": Be,
440
456
  "form-maker-input-select": ge,
441
457
  "form-maker-input-checkbox": be,
442
458
  "form-maker-input-radio": ye,
443
- "form-maker-label": ke,
444
- "form-maker-help": R,
445
- "form-maker-error": R,
446
- "form-maker-input-wrapper": R
459
+ "form-maker-label": he,
460
+ "form-maker-help": U,
461
+ "form-maker-error": U,
462
+ "form-maker-input-wrapper": U
447
463
  }
448
464
  }, Me = {
449
465
  install: (o, a = {}) => {
@@ -455,10 +471,10 @@ const ke = H, he = ["checked", "value", "onChange"], ye = /* @__PURE__ */ B({
455
471
  ...a.components
456
472
  }
457
473
  };
458
- o.component("FormMaker", pe), o.component("FormMakerInput", fe), o.provide("unlabeled-types", e.unlabeledTypes), Object.keys(e.classes).forEach((n) => {
459
- o.provide(n, e.classes[n]);
460
- }), Object.keys(e.components).forEach((n) => {
461
- o.component(n, e.components[n]);
474
+ o.component("FormMaker", de), o.component("FormMakerInput", fe), o.provide("unlabeled-types", e.unlabeledTypes), Object.keys(e.classes).forEach((r) => {
475
+ o.provide(r, e.classes[r]);
476
+ }), Object.keys(e.components).forEach((r) => {
477
+ o.component(r, e.components[r]);
462
478
  });
463
479
  }
464
480
  };
@@ -1 +1 @@
1
- (function(e,B){typeof exports=="object"&&typeof module<"u"?module.exports=B(require("vue")):typeof define=="function"&&define.amd?define(["vue"],B):(e=typeof globalThis<"u"?globalThis:e||self,e.FormMaker=B(e.Vue))})(this,function(e){"use strict";const B=["onSubmit"],S={key:0},w=["disabled"],j=e.defineComponent({__name:"FormMaker",props:{loading:{type:Boolean,default:!1},hasActions:{type:Boolean,default:!0},modelValue:{default:()=>({})},fields:{default:()=>[]},hideDivider:{type:Boolean,default:!1},rowClass:{default:null},columnClass:{default:null},labelClass:{default:null},inputGroupClass:{default:null},inputWrapperClass:{default:null},inputErrorClass:{default:null},inputClass:{default:null},errorClass:{default:null},helpTextClass:{default:null},submitButtonClass:{default:null},submitButtonText:{default:"Submit"},unlabeledTypes:{}},emits:["submit","update:modelValue"],setup(n,{emit:r}){const t=n,i=r,l=()=>i("submit"),a=e.computed(()=>t.fields.length>0?t.fields.map(o=>{let u=o;return Array.isArray(o)||(u=[o]),u.map(k=>({...k,id:k.id||`formMaker_${new Date().getTime()}_${k.name}`}))}):Object.keys(t.modelValue).map(o=>[{name:o,label:o,id:`formMaker_${o}`}]));e.provide("labelClass",t.labelClass||e.inject("form-label")),e.provide("inputGroupClass",t.inputGroupClass||e.inject("input-group")),e.provide("inputWrapperClass",t.inputWrapperClass||e.inject("input-wrapper")),e.provide("inputErrorClass",t.inputErrorClass||e.inject("input-error")),e.provide("inputClass",t.inputClass||e.inject("input")),e.provide("errorClass",t.errorClass||e.inject("error")),e.provide("helpTextClass",t.helpTextClass||e.inject("help-text")),e.provide("unlabeledTypes",t.unlabeledTypes||e.inject("unlabeled-types"));const s=t.rowClass||e.inject("form-row"),p=t.columnClass||e.inject("form-column"),b=t.submitButtonClass||e.inject("submit-button"),m=o=>{const u=o.split(".");let k=t.modelValue;for(let h=0;h<u.length-1;h+=1){const y=k[u[h]];if(!y)break;k=y}return k},d=o=>{const u=o.split(".");return u[u.length-1]};return(o,u)=>{const k=e.resolveComponent("form-maker-input");return e.openBlock(),e.createElementBlock("form",{class:"form-maker",onSubmit:e.withModifiers(l,["prevent"])},[o.loading?e.renderSlot(o.$slots,"loading",{key:0},()=>[e.createTextVNode(" Loading... ")]):e.createCommentVNode("",!0),e.renderSlot(o.$slots,"default",{},()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(a.value,(h,y)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(e.unref(s)),key:`fieldRow_${y}`},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(h,(C,$)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass([e.unref(p),C.columnClass]),key:`field_${y}_${$}`},[e.renderSlot(o.$slots,`${C.name}`,{field:C},()=>[e.createVNode(k,e.mergeProps({modelValue:m(C.name)[d(C.name)],"onUpdate:modelValue":c=>m(C.name)[d(C.name)]=c},C),null,16,["modelValue","onUpdate:modelValue"])])],2))),128))],2))),128))]),e.renderSlot(o.$slots,"extra"),e.renderSlot(o.$slots,"divider",{},()=>[o.hasActions&&!o.hideDivider?(e.openBlock(),e.createElementBlock("hr",S)):e.createCommentVNode("",!0)]),o.hasActions?e.renderSlot(o.$slots,"actions",{key:1},()=>[e.renderSlot(o.$slots,"submit-button",{},()=>[e.createElementVNode("button",{class:e.normalizeClass(e.unref(b)),disabled:o.loading,type:"submit"},e.toDisplayString(o.submitButtonText),11,w)]),e.renderSlot(o.$slots,"extra-buttons")]):e.createCommentVNode("",!0)],40,B)}}}),N=()=>{const n=e.inject("labelClass",null),r=e.inject("inputClass",null),t=e.inject("inputWrapperClass",null),i=e.inject("inputGroupClass",null),l=e.inject("inputErrorClass",null),a=e.inject("errorClass",null),s=e.inject("helpTextClass",null);return{labelClass:n,inputClass:r,inputWrapperClass:t,inputGroupClass:i,inputErrorClass:l,errorClass:a,helpTextClass:s}},F=(n,r=[])=>{const t=e.toRaw(r),i=e.ref(null);return e.watch(n,(l,a)=>{if(i.value=null,l!==a)for(let s=0;s<t.length;s+=1){const p=t[s];if(!p.validator(l)){i.value=p.message;break}}},{immediate:!0}),i};function V(n,r,t){const i=t??"modelValue";return e.computed({get:()=>n(),set:l=>r(`update:${i}`,l)})}const D=e.defineComponent({inheritAttrs:!1,__name:"FormMakerInput",props:{loading:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},modelValue:{},error:{default:void 0},helpText:{default:void 0},label:{default:void 0},id:{default:void 0},type:{default:"text"},rules:{default:()=>[]}},emits:["update:modelValue"],setup(n,{emit:r}){const t=n,l=V(()=>t.modelValue,r),{labelClass:a,inputClass:s,inputWrapperClass:p,inputErrorClass:b,errorClass:m,helpTextClass:d}=N(),o=e.computed(()=>!!t.label),u=e.computed(()=>!!t.helpText),k=F(l,t.rules),h=e.computed(()=>!!t.error||!!k.value),y=e.computed(()=>t.error?t.error:k.value),C=e.inject("unlabeledTypes",[]),$=e.computed(()=>!new Set(C).has(t.type));return(c,E)=>{const J=e.resolveComponent("form-maker-label"),K=e.resolveComponent("form-maker-help"),Q=e.resolveComponent("form-maker-error"),X=e.resolveComponent("form-maker-input-wrapper");return e.openBlock(),e.createBlock(X,{class:e.normalizeClass([h.value&&e.unref(b),e.unref(p)])},{default:e.withCtx(()=>[$.value?e.renderSlot(c.$slots,"label",{key:0},()=>[o.value?(e.openBlock(),e.createBlock(J,{key:0,id:c.id,class:e.normalizeClass(e.unref(a)),label:c.label},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(c.label),1)]),_:1},8,["id","class","label"])):e.createCommentVNode("",!0)]):e.createCommentVNode("",!0),e.renderSlot(c.$slots,"default",{},()=>[e.renderSlot(c.$slots,"before"),(e.openBlock(),e.createBlock(e.resolveDynamicComponent(`form-maker-input-${c.type}`),e.mergeProps({...c.$props,...c.$attrs},{class:[c.type!=="checkbox"&&e.unref(s),h.value&&e.unref(b)],modelValue:e.unref(l),"onUpdate:modelValue":E[0]||(E[0]=Y=>e.isRef(l)?l.value=Y:null)}),null,16,["class","modelValue"])),e.renderSlot(c.$slots,"after")]),e.renderSlot(c.$slots,"help",{},()=>[u.value?(e.openBlock(),e.createBlock(K,{key:0,class:e.normalizeClass(e.unref(d))},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(c.helpText),1)]),_:1},8,["class"])):e.createCommentVNode("",!0)]),e.renderSlot(c.$slots,"errors",{},()=>[h.value?(e.openBlock(),e.createBlock(Q,{key:0,class:e.normalizeClass(e.unref(m))},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(y.value),1)]),_:1},8,["class"])):e.createCommentVNode("",!0)])]),_:3},8,["class"])}}}),M=["checked","value","onClick"],A=e.defineComponent({__name:"CheckboxInput",props:{options:{type:[Boolean,Array],default:()=>[]},loading:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},modelValue:{},error:{default:void 0},helpText:{default:void 0},label:{default:void 0},type:{},rules:{default:()=>[]}},emits:["update:modelValue"],setup(n,{emit:r}){const t=n,i=r,l=e.computed(()=>Array.isArray(t.options)&&t.options.length===0),a=e.computed(()=>t.modelValue),s=e.computed(()=>(Array.isArray(a.value)?a.value:[a.value]).filter(d=>!!d)),p=e.computed(()=>l.value?[{label:t.label,value:!0}]:t.options),b=m=>{let d=[...s.value];d.indexOf(m)===-1?d.push(m):d=d.filter(o=>o!==m),l.value?i("update:modelValue",d.length>0):i("update:modelValue",d)};return(m,d)=>(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(p.value,(o,u)=>(e.openBlock(),e.createElementBlock("div",{key:`option_${u}`},[e.createElementVNode("label",null,[e.createElementVNode("input",e.mergeProps(m.$props,{checked:s.value.indexOf(o.value)!==-1,value:o.value,type:"checkbox",onClick:()=>b(o.value)}),null,16,M),e.createTextVNode(" "+e.toDisplayString(o.label),1)])]))),128))}}),L=e.defineComponent({__name:"FileInput",props:{loading:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},modelValue:{},error:{default:void 0},helpText:{default:void 0},label:{default:void 0},id:{default:void 0},type:{},rules:{default:()=>[]}},emits:["update:modelValue"],setup(n,{emit:r}){const t=r,i=l=>{const a=l.currentTarget;if(a.files&&a.files.length){const s=a.files[0];t("update:modelValue",s)}};return(l,a)=>(e.openBlock(),e.createElementBlock("input",e.mergeProps(l.$props,{type:"file",onChange:i}),null,16))}});function _(n,r){return e.h(`${n.as??"div"}`,r.attrs,r.slots)}_.props={as:{type:String,required:!1,default:"div"}};function T(n,{slots:r,attrs:t}){return e.h("label",{...t,for:n.id},r.default())}T.props={id:{type:String,default:null}};const G=T,x=["checked","value","onChange"],I=e.defineComponent({__name:"RadioInput",props:{options:{default:()=>[]},loading:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},modelValue:{},error:{default:void 0},helpText:{default:void 0},label:{default:void 0},type:{},rules:{},id:{default:void 0}},emits:["update:modelValue"],setup(n,{emit:r}){const t=r,i=l=>{t("update:modelValue",l)};return(l,a)=>(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.options,(s,p)=>(e.openBlock(),e.createElementBlock("div",{key:`option_${p}`},[e.createElementVNode("label",null,[e.createElementVNode("input",e.mergeProps(l.$props,{checked:s.value===l.modelValue,value:s.value,type:"radio",onChange:b=>i(s.value)}),null,16,x),e.createTextVNode(" "+e.toDisplayString(s.label),1)])]))),128))}}),O=["id","disabled","name","placeholder"],P=["label"],R=["value"],z=["value"],U=e.defineComponent({__name:"SelectInput",props:{options:{default:()=>[]},optionGroups:{default:()=>({})},loading:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},modelValue:{},error:{default:void 0},helpText:{default:void 0},label:{default:void 0},id:{default:void 0},type:{},rules:{default:()=>[]}},emits:["update:modelValue"],setup(n,{emit:r}){const t=n,l=V(()=>t.modelValue,r),a=Object.keys(t.optionGroups).length>0,s=e.computed(()=>t.options.map(p=>typeof p=="object"?p:{label:p,value:p}));return(p,b)=>e.withDirectives((e.openBlock(),e.createElementBlock("select",{id:p.id,"onUpdate:modelValue":b[0]||(b[0]=m=>e.isRef(l)?l.value=m:null),disabled:p.disabled,name:p.name,placeholder:p.placeholder},[a?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:0},e.renderList(p.optionGroups,(m,d)=>(e.openBlock(),e.createElementBlock("optgroup",{key:`optGroup_${d}`,label:d},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(m,(o,u)=>(e.openBlock(),e.createElementBlock("option",{key:`option_${o}`,value:u},e.toDisplayString(o),9,R))),128))],8,P))),128)):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:1},e.renderList(s.value,(m,d)=>(e.openBlock(),e.createElementBlock("option",{key:`option_${d}`,value:m.value},e.toDisplayString(m.label),9,z))),128))],8,O)),[[e.vModelSelect,e.unref(l)]])}}),W=["id"],q=e.defineComponent({__name:"TextAreaInput",props:{modelValue:{}},emits:["update:modelValue"],setup(n,{emit:r}){const t=n,l=V(()=>t.modelValue,r);return(a,s)=>e.withDirectives((e.openBlock(),e.createElementBlock("textarea",e.mergeProps({id:a.id,"onUpdate:modelValue":s[0]||(s[0]=p=>e.isRef(l)?l.value=p:null)},{...a.$props,...a.$attrs}),null,16,W)),[[e.vModelText,e.unref(l)]])}}),H=["type"],f=e.defineComponent({__name:"BasicInput",props:{loading:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},modelValue:{},error:{default:void 0},helpText:{default:void 0},label:{default:void 0},id:{default:void 0},type:{default:"text"},rules:{default:()=>[]}},emits:["update:modelValue"],setup(n,{emit:r}){const t=n,l=V(()=>t.modelValue,r);return(a,s)=>e.withDirectives((e.openBlock(),e.createElementBlock("input",e.mergeProps({"onUpdate:modelValue":s[0]||(s[0]=p=>e.isRef(l)?l.value=p:null),type:a.type},{...a.$props,...a.$attrs}),null,16,H)),[[e.vModelDynamic,e.unref(l)]])}}),g={unlabeledTypes:[],classes:{"form-row":"form-maker-row","form-column":"form-maker-column","form-label":"form-maker-label","input-wrapper":"form-maker-input-wrapper","input-error":"form-maker-input-error",input:"form-maker-input",error:"form-maker-error","help-text":"form-maker-help-text","submit-button":"form-maker-submit"},components:{"form-maker-input-color":f,"form-maker-input-date":f,"form-maker-input-email":f,"form-maker-input-month":f,"form-maker-input-number":f,"form-maker-input-password":f,"form-maker-input-search":f,"form-maker-input-tel":f,"form-maker-input-time":f,"form-maker-input-text":f,"form-maker-input-url":f,"form-maker-input-week":f,"form-maker-input-range":f,"form-maker-input-file":L,"form-maker-input-textarea":q,"form-maker-input-select":U,"form-maker-input-checkbox":A,"form-maker-input-radio":I,"form-maker-label":G,"form-maker-help":_,"form-maker-error":_,"form-maker-input-wrapper":_}};return{install:(n,r={})=>{const t={unlabeledTypes:r.unlabeledTypes!==void 0?r.unlabeledTypes:g.unlabeledTypes,classes:{...g.classes,...r.classes},components:{...g.components,...r.components}};n.component("FormMaker",j),n.component("FormMakerInput",D),n.provide("unlabeled-types",t.unlabeledTypes),Object.keys(t.classes).forEach(i=>{n.provide(i,t.classes[i])}),Object.keys(t.components).forEach(i=>{n.component(i,t.components[i])})}}});
1
+ (function(e,B){typeof exports=="object"&&typeof module<"u"?module.exports=B(require("vue")):typeof define=="function"&&define.amd?define(["vue"],B):(e=typeof globalThis<"u"?globalThis:e||self,e.FormMaker=B(e.Vue))})(this,function(e){"use strict";const B=["onSubmit"],S={key:0},w=["disabled"],j=e.defineComponent({__name:"FormMaker",props:{loading:{type:Boolean,default:!1},hasActions:{type:Boolean,default:!0},modelValue:{default:()=>({})},fields:{default:()=>[]},hideDivider:{type:Boolean,default:!1},rowClass:{default:null},columnClass:{default:null},labelClass:{default:null},inputGroupClass:{default:null},inputWrapperClass:{default:null},inputErrorClass:{default:null},inputClass:{default:null},errorClass:{default:null},helpTextClass:{default:null},submitButtonClass:{default:null},submitButtonText:{default:"Submit"},unlabeledTypes:{}},emits:["submit","submit-error","update:modelValue"],setup(n,{emit:r}){const l=n,a=r,t=e.computed(()=>l.fields.length>0?l.fields.map(o=>{let u=o;return Array.isArray(o)||(u=[o]),u.map(m=>({...m,id:m.id||`formMaker_${new Date().getTime()}_${m.field}`}))}):Object.keys(l.modelValue).map(o=>[{field:o,label:o,id:`formMaker_${o}`}]));e.provide("labelClass",l.labelClass||e.inject("form-label")),e.provide("inputGroupClass",l.inputGroupClass||e.inject("input-group")),e.provide("inputWrapperClass",l.inputWrapperClass||e.inject("input-wrapper")),e.provide("inputErrorClass",l.inputErrorClass||e.inject("input-error")),e.provide("inputClass",l.inputClass||e.inject("input")),e.provide("errorClass",l.errorClass||e.inject("error")),e.provide("helpTextClass",l.helpTextClass||e.inject("help-text")),e.provide("unlabeledTypes",l.unlabeledTypes||e.inject("unlabeled-types"));const s=l.rowClass||e.inject("form-row"),i=l.columnClass||e.inject("form-column"),d=l.submitButtonClass||e.inject("submit-button"),C=o=>{const u=o.split(".");let m=l.modelValue;for(let h=0;h<u.length-1;h+=1){const y=m[u[h]];if(!y)break;m=y}return m},p=o=>{const u=o.split(".");return u[u.length-1]},c=()=>{for(const o in t.value)for(const u in t.value[o]){const m=t.value[o][u];if(m.rules===void 0||m.rules.length===0)continue;const h=C(m.field)[p(m.field)];for(const y in m.rules){const k=m.rules[y];if(!k.validator(h)){console.error(`${k.message}`),a("submit-error",k.message);return}}}a("submit")};return(o,u)=>{const m=e.resolveComponent("form-maker-input");return e.openBlock(),e.createElementBlock("form",{class:"form-maker",onSubmit:e.withModifiers(c,["prevent","stop"])},[o.loading?e.renderSlot(o.$slots,"loading",{key:0},()=>[e.createTextVNode(" Loading... ")]):e.createCommentVNode("",!0),e.renderSlot(o.$slots,"default",{},()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.value,(h,y)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(e.unref(s)),key:`fieldRow_${y}`},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(h,(k,g)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass([e.unref(i),k.columnClass]),key:`field_${y}_${g}`},[e.renderSlot(o.$slots,`${k.field}`,{field:k},()=>[e.createVNode(m,e.mergeProps({modelValue:C(k.field)[p(k.field)],"onUpdate:modelValue":f=>C(k.field)[p(k.field)]=f},k),null,16,["modelValue","onUpdate:modelValue"])])],2))),128))],2))),128))]),e.renderSlot(o.$slots,"extra"),e.renderSlot(o.$slots,"divider",{},()=>[o.hasActions&&!o.hideDivider?(e.openBlock(),e.createElementBlock("hr",S)):e.createCommentVNode("",!0)]),o.hasActions?e.renderSlot(o.$slots,"actions",{key:1},()=>[e.renderSlot(o.$slots,"submit-button",{},()=>[e.createElementVNode("button",{class:e.normalizeClass(e.unref(d)),disabled:o.loading,type:"submit"},e.toDisplayString(o.submitButtonText),11,w)]),e.renderSlot(o.$slots,"extra-buttons")]):e.createCommentVNode("",!0)],40,B)}}}),N=()=>{const n=e.inject("labelClass",null),r=e.inject("inputClass",null),l=e.inject("inputWrapperClass",null),a=e.inject("inputGroupClass",null),t=e.inject("inputErrorClass",null),s=e.inject("errorClass",null),i=e.inject("helpTextClass",null);return{labelClass:n,inputClass:r,inputWrapperClass:l,inputGroupClass:a,inputErrorClass:t,errorClass:s,helpTextClass:i}},F=(n,r=[])=>{const l=e.toRaw(r),a=e.ref(null);return e.watch(n,(t,s)=>{if(a.value=null,t!==s)for(let i=0;i<l.length;i+=1){const d=l[i];if(!d.validator(t)){a.value=d.message;break}}},{immediate:!0}),a};function V(n,r,l){const a=l??"modelValue";return e.computed({get:()=>n(),set:t=>r(`update:${a}`,t)})}const D=e.defineComponent({inheritAttrs:!1,__name:"FormMakerInput",props:{loading:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},modelValue:{},error:{default:void 0},helpText:{default:void 0},label:{default:void 0},id:{default:void 0},type:{default:"text"},rules:{default:()=>[]}},emits:["update:modelValue"],setup(n,{emit:r}){const l=n,t=V(()=>l.modelValue,r),{labelClass:s,inputClass:i,inputWrapperClass:d,inputErrorClass:C,errorClass:p,helpTextClass:c}=N(),o=e.computed(()=>!!l.label),u=e.computed(()=>!!l.helpText),m=F(t,l.rules),h=e.computed(()=>!!l.error||!!m.value),y=e.computed(()=>l.error?l.error:m.value),k=e.inject("unlabeledTypes",[]),g=e.computed(()=>!new Set(k).has(l.type));return(f,E)=>{const J=e.resolveComponent("form-maker-label"),K=e.resolveComponent("form-maker-help"),Q=e.resolveComponent("form-maker-error"),X=e.resolveComponent("form-maker-input-wrapper");return e.openBlock(),e.createBlock(X,{class:e.normalizeClass([h.value&&e.unref(C),e.unref(d)])},{default:e.withCtx(()=>[g.value?e.renderSlot(f.$slots,"label",{key:0},()=>[o.value?(e.openBlock(),e.createBlock(J,{key:0,id:f.id,class:e.normalizeClass(e.unref(s)),label:f.label},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(f.label),1)]),_:1},8,["id","class","label"])):e.createCommentVNode("",!0)]):e.createCommentVNode("",!0),e.renderSlot(f.$slots,"default",{},()=>[e.renderSlot(f.$slots,"before"),(e.openBlock(),e.createBlock(e.resolveDynamicComponent(`form-maker-input-${f.type}`),e.mergeProps({...f.$props,...f.$attrs},{class:[f.type!=="checkbox"&&e.unref(i),h.value&&e.unref(C)],modelValue:e.unref(t),"onUpdate:modelValue":E[0]||(E[0]=Y=>e.isRef(t)?t.value=Y:null)}),null,16,["class","modelValue"])),e.renderSlot(f.$slots,"after")]),e.renderSlot(f.$slots,"help",{},()=>[u.value?(e.openBlock(),e.createBlock(K,{key:0,class:e.normalizeClass(e.unref(c))},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(f.helpText),1)]),_:1},8,["class"])):e.createCommentVNode("",!0)]),e.renderSlot(f.$slots,"errors",{},()=>[h.value?(e.openBlock(),e.createBlock(Q,{key:0,class:e.normalizeClass(e.unref(p))},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(y.value),1)]),_:1},8,["class"])):e.createCommentVNode("",!0)])]),_:3},8,["class"])}}}),M=["checked","value","onClick"],A=e.defineComponent({__name:"CheckboxInput",props:{options:{type:[Boolean,Array],default:()=>[]},loading:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},modelValue:{},error:{default:void 0},helpText:{default:void 0},label:{default:void 0},type:{},rules:{default:()=>[]}},emits:["update:modelValue"],setup(n,{emit:r}){const l=n,a=r,t=e.computed(()=>Array.isArray(l.options)&&l.options.length===0),s=e.computed(()=>l.modelValue),i=e.computed(()=>(Array.isArray(s.value)?s.value:[s.value]).filter(c=>!!c)),d=e.computed(()=>t.value?[{label:l.label,value:!0}]:l.options),C=p=>{let c=[...i.value];c.indexOf(p)===-1?c.push(p):c=c.filter(o=>o!==p),t.value?a("update:modelValue",c.length>0):a("update:modelValue",c)};return(p,c)=>(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(d.value,(o,u)=>(e.openBlock(),e.createElementBlock("div",{key:`option_${u}`},[e.createElementVNode("label",null,[e.createElementVNode("input",e.mergeProps(p.$props,{checked:i.value.indexOf(o.value)!==-1,value:o.value,type:"checkbox",onClick:()=>C(o.value)}),null,16,M),e.createTextVNode(" "+e.toDisplayString(o.label),1)])]))),128))}}),L=e.defineComponent({__name:"FileInput",props:{loading:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},modelValue:{},error:{default:void 0},helpText:{default:void 0},label:{default:void 0},id:{default:void 0},type:{},rules:{default:()=>[]}},emits:["update:modelValue"],setup(n,{emit:r}){const l=r,a=t=>{const s=t.currentTarget;if(s.files&&s.files.length){const i=s.files[0];l("update:modelValue",i)}};return(t,s)=>(e.openBlock(),e.createElementBlock("input",e.mergeProps(t.$props,{type:"file",onChange:a}),null,16))}});function _(n,r){return e.h(`${n.as??"div"}`,r.attrs,r.slots)}_.props={as:{type:String,required:!1,default:"div"}};function T(n,{slots:r,attrs:l}){return e.h("label",{...l,for:n.id},r.default())}T.props={id:{type:String,default:null}};const G=T,x=["checked","value","onChange"],I=e.defineComponent({__name:"RadioInput",props:{options:{default:()=>[]},loading:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},modelValue:{},error:{default:void 0},helpText:{default:void 0},label:{default:void 0},type:{},rules:{},id:{default:void 0}},emits:["update:modelValue"],setup(n,{emit:r}){const l=r,a=t=>{l("update:modelValue",t)};return(t,s)=>(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.options,(i,d)=>(e.openBlock(),e.createElementBlock("div",{key:`option_${d}`},[e.createElementVNode("label",null,[e.createElementVNode("input",e.mergeProps(t.$props,{checked:i.value===t.modelValue,value:i.value,type:"radio",onChange:C=>a(i.value)}),null,16,x),e.createTextVNode(" "+e.toDisplayString(i.label),1)])]))),128))}}),O=["id","disabled","name","placeholder"],P=["label"],R=["value"],z=["value"],U=e.defineComponent({__name:"SelectInput",props:{options:{default:()=>[]},optionGroups:{default:()=>({})},loading:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},modelValue:{},error:{default:void 0},helpText:{default:void 0},label:{default:void 0},id:{default:void 0},type:{},rules:{default:()=>[]}},emits:["update:modelValue"],setup(n,{emit:r}){const l=n,t=V(()=>l.modelValue,r),s=Object.keys(l.optionGroups).length>0,i=e.computed(()=>l.options.map(d=>typeof d=="object"?d:{label:d,value:d}));return(d,C)=>e.withDirectives((e.openBlock(),e.createElementBlock("select",{id:d.id,"onUpdate:modelValue":C[0]||(C[0]=p=>e.isRef(t)?t.value=p:null),disabled:d.disabled,name:d.name,placeholder:d.placeholder},[s?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:0},e.renderList(d.optionGroups,(p,c)=>(e.openBlock(),e.createElementBlock("optgroup",{key:`optGroup_${c}`,label:c},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(p,(o,u)=>(e.openBlock(),e.createElementBlock("option",{key:`option_${o}`,value:u},e.toDisplayString(o),9,R))),128))],8,P))),128)):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:1},e.renderList(i.value,(p,c)=>(e.openBlock(),e.createElementBlock("option",{key:`option_${c}`,value:p.value},e.toDisplayString(p.label),9,z))),128))],8,O)),[[e.vModelSelect,e.unref(t)]])}}),W=["id"],q=e.defineComponent({__name:"TextAreaInput",props:{modelValue:{}},emits:["update:modelValue"],setup(n,{emit:r}){const l=n,t=V(()=>l.modelValue,r);return(s,i)=>e.withDirectives((e.openBlock(),e.createElementBlock("textarea",e.mergeProps({id:s.id,"onUpdate:modelValue":i[0]||(i[0]=d=>e.isRef(t)?t.value=d:null)},{...s.$props,...s.$attrs}),null,16,W)),[[e.vModelText,e.unref(t)]])}}),H=["type"],b=e.defineComponent({__name:"BasicInput",props:{loading:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},modelValue:{},error:{default:void 0},helpText:{default:void 0},label:{default:void 0},id:{default:void 0},type:{default:"text"},rules:{default:()=>[]}},emits:["update:modelValue"],setup(n,{emit:r}){const l=n,t=V(()=>l.modelValue,r);return(s,i)=>e.withDirectives((e.openBlock(),e.createElementBlock("input",e.mergeProps({"onUpdate:modelValue":i[0]||(i[0]=d=>e.isRef(t)?t.value=d:null),type:s.type},{...s.$props,...s.$attrs}),null,16,H)),[[e.vModelDynamic,e.unref(t)]])}}),$={unlabeledTypes:[],classes:{"form-row":"form-maker-row","form-column":"form-maker-column","form-label":"form-maker-label","input-wrapper":"form-maker-input-wrapper","input-error":"form-maker-input-error",input:"form-maker-input",error:"form-maker-error","help-text":"form-maker-help-text","submit-button":"form-maker-submit"},components:{"form-maker-input-color":b,"form-maker-input-date":b,"form-maker-input-email":b,"form-maker-input-month":b,"form-maker-input-number":b,"form-maker-input-password":b,"form-maker-input-search":b,"form-maker-input-tel":b,"form-maker-input-time":b,"form-maker-input-text":b,"form-maker-input-url":b,"form-maker-input-week":b,"form-maker-input-range":b,"form-maker-input-file":L,"form-maker-input-textarea":q,"form-maker-input-select":U,"form-maker-input-checkbox":A,"form-maker-input-radio":I,"form-maker-label":G,"form-maker-help":_,"form-maker-error":_,"form-maker-input-wrapper":_}};return{install:(n,r={})=>{const l={unlabeledTypes:r.unlabeledTypes!==void 0?r.unlabeledTypes:$.unlabeledTypes,classes:{...$.classes,...r.classes},components:{...$.components,...r.components}};n.component("FormMaker",j),n.component("FormMakerInput",D),n.provide("unlabeled-types",l.unlabeledTypes),Object.keys(l.classes).forEach(a=>{n.provide(a,l.classes[a])}),Object.keys(l.components).forEach(a=>{n.component(a,l.components[a])})}}});
@@ -1,11 +1,6 @@
1
1
  <script setup lang="ts">
2
- import type { FormMakerProps, InputType } from 'lib/model';
3
- import {
4
- computed,
5
- inject,
6
- provide,
7
- type ComputedRef
8
- } from 'vue';
2
+ import type {FormMakerProps, InputType} from 'lib/model';
3
+ import {computed, type ComputedRef, inject, provide} from 'vue';
9
4
 
10
5
  const props = withDefaults(defineProps<FormMakerProps>(), {
11
6
  loading: false,
@@ -26,9 +21,7 @@ const props = withDefaults(defineProps<FormMakerProps>(), {
26
21
  submitButtonText: 'Submit',
27
22
  })
28
23
 
29
- const emit = defineEmits(['submit', 'update:modelValue']);
30
-
31
- const handleSubmit = () => emit('submit');
24
+ const emit = defineEmits(['submit', 'submit-error', 'update:modelValue']);
32
25
 
33
26
  const formFields: ComputedRef<InputType[][]> = computed(() => {
34
27
  if (props.fields.length > 0) {
@@ -40,7 +33,7 @@ const formFields: ComputedRef<InputType[][]> = computed(() => {
40
33
  return newRow.map((fieldSpec: InputType) => {
41
34
  return {
42
35
  ...fieldSpec,
43
- id: fieldSpec.id || `formMaker_${new Date().getTime()}_${fieldSpec.name}`,
36
+ id: fieldSpec.id || `formMaker_${new Date().getTime()}_${fieldSpec.field}`,
44
37
  };
45
38
  });
46
39
  });
@@ -48,7 +41,7 @@ const formFields: ComputedRef<InputType[][]> = computed(() => {
48
41
 
49
42
  return Object.keys(props.modelValue).map(key => ([
50
43
  {
51
- name: key,
44
+ field: key,
52
45
  label: key,
53
46
  id: `formMaker_${key}`,
54
47
  }
@@ -86,23 +79,44 @@ const getProp = (fieldName: string) => {
86
79
  return fields[fields.length - 1];
87
80
  };
88
81
 
82
+ const handleSubmit = () => {
83
+ for (const row in formFields.value) {
84
+ for (const f in formFields.value[row]) {
85
+ const field = formFields.value[row][f];
86
+ if (field.rules === undefined || field.rules.length === 0) continue
87
+
88
+ const value = getObject(field.field)[getProp(field.field)]
89
+ for (const rn in field.rules) {
90
+ const rule = field.rules[rn]
91
+ const isValid = rule.validator(value);
92
+ if (!isValid) {
93
+ console.error(`${rule.message}`)
94
+ emit('submit-error', rule.message)
95
+ return
96
+ }
97
+ }
98
+ }
99
+ }
100
+
101
+ emit('submit');
102
+ };
89
103
  </script>
90
104
 
91
105
  <template>
92
- <form class="form-maker" @submit.prevent="handleSubmit">
106
+ <form class="form-maker" @submit.prevent.stop="handleSubmit">
93
107
  <slot v-if="loading" name="loading">
94
108
  Loading...
95
109
  </slot>
96
110
  <slot>
97
111
  <div v-for="(fieldRow, i) in formFields" :class="realRowClass" :key="`fieldRow_${i}`">
98
112
  <div v-for="(field, j) in fieldRow" :class="[realColumnClass, field.columnClass]" :key="`field_${i}_${j}`">
99
- <slot :field="field" :name="`${field.name}`">
100
- <form-maker-input v-model="getObject(field.name)[getProp(field.name)]" v-bind="field" />
113
+ <slot :field="field" :name="`${field.field}`">
114
+ <form-maker-input v-model="getObject(field.field)[getProp(field.field)]" v-bind="field"/>
101
115
  </slot>
102
116
  </div>
103
117
  </div>
104
118
  </slot>
105
- <slot name="extra" />
119
+ <slot name="extra"/>
106
120
  <slot name="divider">
107
121
  <hr v-if="hasActions && !hideDivider">
108
122
  </slot>
@@ -112,7 +126,7 @@ const getProp = (fieldName: string) => {
112
126
  {{ submitButtonText }}
113
127
  </button>
114
128
  </slot>
115
- <slot name="extra-buttons" />
129
+ <slot name="extra-buttons"/>
116
130
  </slot>
117
131
  </form>
118
132
  </template>
package/lib/model.d.ts CHANGED
@@ -13,10 +13,11 @@ export interface FormMakerPluginOptions {
13
13
 
14
14
  export interface InputType {
15
15
  id?: string | null
16
- name: string
16
+ field: string
17
17
  type?: string | null
18
18
  label?: string | null
19
19
  columnClass?: string | null
20
+ rules?: RuleValidator[]
20
21
  }
21
22
 
22
23
  export interface FormMakerProps {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@josercl/form-maker",
3
- "version": "1.4.1",
3
+ "version": "1.4.3",
4
4
  "type": "module",
5
5
  "description": "Form generator using vue 3",
6
6
  "author": "Jose Carrero <josercl@gmail.com>",
@@ -13,6 +13,7 @@
13
13
  ],
14
14
  "exports": {
15
15
  ".": {
16
+ "types": "./lib/model.d.ts",
16
17
  "import": "./dist/index.js",
17
18
  "require": "./dist/index.umd.cjs"
18
19
  }