@josercl/form-maker 1.1.0-beta05 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/components/FormMakerInput.vue +7 -8
- package/lib/components/inputs/BasicInput.vue +3 -3
- package/lib/components/inputs/CheckboxInput.vue +1 -1
- package/lib/components/inputs/FileInput.vue +1 -1
- package/lib/components/inputs/RadioInput.vue +1 -1
- package/lib/components/inputs/SelectInput.vue +3 -3
- package/lib/components/inputs/TextAreaInput.vue +3 -3
- package/lib/components/texts/FormMakerInputError.vue +1 -1
- package/lib/components/texts/FormMakerInputHelp.vue +1 -1
- package/lib/composables/useVModel.js +8 -0
- package/lib/composables/useValidator.js +28 -0
- package/lib/utils.js +3 -35
- package/package.json +4 -3
- package/umd/index.umd.js +1 -1
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
<script setup>
|
|
2
2
|
import { computed } from 'vue';
|
|
3
|
-
import
|
|
3
|
+
import useValidator from '../composables/useValidator';
|
|
4
|
+
import useVModel from '../composables/useVModel';
|
|
5
|
+
import { FormInputMixin, injectFormClasses } from './inputs/FormInputMixin.js';
|
|
4
6
|
|
|
5
|
-
|
|
7
|
+
defineOptions({
|
|
8
|
+
inheritAttrs: false,
|
|
9
|
+
});
|
|
6
10
|
|
|
7
11
|
const props = defineProps({
|
|
8
12
|
...FormInputMixin.props,
|
|
@@ -13,7 +17,7 @@ const props = defineProps({
|
|
|
13
17
|
});
|
|
14
18
|
const emit = defineEmits(FormInputMixin.emits);
|
|
15
19
|
|
|
16
|
-
const value =
|
|
20
|
+
const value = useVModel(props, emit);
|
|
17
21
|
|
|
18
22
|
const {
|
|
19
23
|
labelClass,
|
|
@@ -39,11 +43,6 @@ const realError = computed(() => {
|
|
|
39
43
|
return validationError.value;
|
|
40
44
|
});
|
|
41
45
|
|
|
42
|
-
</script>
|
|
43
|
-
<script>
|
|
44
|
-
export default {
|
|
45
|
-
inheritAttrs: false,
|
|
46
|
-
};
|
|
47
46
|
</script>
|
|
48
47
|
|
|
49
48
|
<template>
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
<script setup>
|
|
2
|
-
import
|
|
3
|
-
import { FormInputMixin } from './FormInputMixin';
|
|
2
|
+
import useVModel from '../../composables/useVModel';
|
|
3
|
+
import { FormInputMixin } from './FormInputMixin.js';
|
|
4
4
|
|
|
5
5
|
const props = defineProps(FormInputMixin.props);
|
|
6
6
|
const emit = defineEmits(FormInputMixin.emits);
|
|
7
7
|
|
|
8
|
-
const value =
|
|
8
|
+
const value = useVModel(props, emit);
|
|
9
9
|
</script>
|
|
10
10
|
|
|
11
11
|
<template>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<script setup>
|
|
2
2
|
import { computed } from 'vue';
|
|
3
|
-
import { FormInputMixin } from './FormInputMixin';
|
|
4
|
-
import
|
|
3
|
+
import { FormInputMixin } from './FormInputMixin.js';
|
|
4
|
+
import useVModel from '../../composables/useVModel';
|
|
5
5
|
|
|
6
6
|
const props = defineProps({
|
|
7
7
|
...FormInputMixin.props,
|
|
@@ -17,7 +17,7 @@ const props = defineProps({
|
|
|
17
17
|
|
|
18
18
|
const emit = defineEmits(FormInputMixin.emits);
|
|
19
19
|
|
|
20
|
-
const value =
|
|
20
|
+
const value = useVModel(props, emit);
|
|
21
21
|
|
|
22
22
|
const hasGroups = Object.keys(props.optionGroups).length > 0;
|
|
23
23
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
<script setup>
|
|
2
|
-
import
|
|
3
|
-
import { FormInputMixin } from './FormInputMixin';
|
|
2
|
+
import useVModel from '../../composables/useVModel';
|
|
3
|
+
import { FormInputMixin } from './FormInputMixin.js';
|
|
4
4
|
|
|
5
5
|
const props = defineProps(FormInputMixin.props);
|
|
6
6
|
const emit = defineEmits(FormInputMixin.emits);
|
|
7
7
|
|
|
8
|
-
const value =
|
|
8
|
+
const value = useVModel(props, emit);
|
|
9
9
|
</script>
|
|
10
10
|
|
|
11
11
|
<template>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { ref, toRaw, watch } from 'vue';
|
|
2
|
+
|
|
3
|
+
const useValidator = (propValue, rulesArr) => {
|
|
4
|
+
const rules = toRaw(rulesArr);
|
|
5
|
+
const error = ref(null);
|
|
6
|
+
|
|
7
|
+
watch(
|
|
8
|
+
propValue,
|
|
9
|
+
(newVal, oldVal) => {
|
|
10
|
+
error.value = null;
|
|
11
|
+
if (newVal === oldVal) return;
|
|
12
|
+
|
|
13
|
+
for (let i = 0; i < rules.length; i += 1) {
|
|
14
|
+
const rule = rules[i];
|
|
15
|
+
const isValid = rule.validator(newVal);
|
|
16
|
+
if (!isValid) {
|
|
17
|
+
error.value = rule.message;
|
|
18
|
+
break;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
{ immediate: true }
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
return error;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export default useValidator;
|
package/lib/utils.js
CHANGED
|
@@ -1,41 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
computed, h, ref, toRaw, watch
|
|
3
|
-
} from 'vue';
|
|
1
|
+
import { h } from 'vue';
|
|
4
2
|
|
|
5
|
-
const
|
|
6
|
-
get: () => props[propName],
|
|
7
|
-
set: value => emit(`update:${propName}`, value),
|
|
8
|
-
});
|
|
9
|
-
|
|
10
|
-
export default setupVModel;
|
|
11
|
-
|
|
12
|
-
export const simpleComponent = () => ({
|
|
3
|
+
const simpleComponent = () => ({
|
|
13
4
|
setup(props, { slots, attrs }) {
|
|
14
5
|
return () => h('div', attrs, slots.default());
|
|
15
6
|
},
|
|
16
7
|
});
|
|
17
8
|
|
|
18
|
-
export
|
|
19
|
-
const rules = toRaw(rulesArr);
|
|
20
|
-
const error = ref(null);
|
|
21
|
-
|
|
22
|
-
watch(
|
|
23
|
-
propValue,
|
|
24
|
-
(newVal, oldVal) => {
|
|
25
|
-
error.value = null;
|
|
26
|
-
if (newVal === oldVal) return;
|
|
27
|
-
|
|
28
|
-
for (let i = 0; i < rules.length; i += 1) {
|
|
29
|
-
const rule = rules[i];
|
|
30
|
-
const isValid = rule.validator(newVal);
|
|
31
|
-
if (!isValid) {
|
|
32
|
-
error.value = rule.message;
|
|
33
|
-
break;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
},
|
|
37
|
-
{ immediate: true }
|
|
38
|
-
);
|
|
39
|
-
|
|
40
|
-
return error;
|
|
41
|
-
};
|
|
9
|
+
export default simpleComponent;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@josercl/form-maker",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "Form generator using vue 3",
|
|
5
5
|
"author": "Jose Carrero <josercl@gmail.com>",
|
|
6
6
|
"scripts": {
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
],
|
|
20
20
|
"homepage": "https://josercl.gitlab.io/form-maker",
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"vue": "^3.
|
|
22
|
+
"vue": "^3.3.4"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"@babel/core": "^7.17.5",
|
|
@@ -33,13 +33,14 @@
|
|
|
33
33
|
"@vitejs/plugin-vue": "^2.2.2",
|
|
34
34
|
"@vue/eslint-config-airbnb": "^6.0.0",
|
|
35
35
|
"autoprefixer": "^10.4.2",
|
|
36
|
+
"cssnano": "^5.1.14",
|
|
36
37
|
"eslint": "^8.10.0",
|
|
37
38
|
"eslint-plugin-vue": "^8.5.0",
|
|
38
39
|
"highlight.js": "^10.2.1",
|
|
39
40
|
"postcss": "^8.4.7",
|
|
40
41
|
"tailwindcss": "^3.0.23",
|
|
41
42
|
"vite": "^2.8.4",
|
|
42
|
-
"vue-router": "^4.
|
|
43
|
+
"vue-router": "^4.2.4"
|
|
43
44
|
},
|
|
44
45
|
"keywords": [
|
|
45
46
|
"vue 3",
|
package/umd/index.umd.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var pe=Object.defineProperty,me=Object.defineProperties;var ce=Object.getOwnPropertyDescriptors;var R=Object.getOwnPropertySymbols;var de=Object.prototype.hasOwnProperty,ue=Object.prototype.propertyIsEnumerable;var x=(e,p,h)=>p in e?pe(e,p,{enumerable:!0,configurable:!0,writable:!0,value:h}):e[p]=h,C=(e,p)=>{for(var h in p||(p={}))de.call(p,h)&&x(e,h,p[h]);if(R)for(var h of R(p))ue.call(p,h)&&x(e,h,p[h]);return e},_=(e,p)=>me(e,ce(p));(function(e,p){typeof exports=="object"&&typeof module!="undefined"?module.exports=p(require("vue")):typeof define=="function"&&define.amd?define(["vue"],p):(e=typeof globalThis!="undefined"?globalThis:e||self,e.FormMaker=p(e.Vue))})(this,function(e){"use strict";const p=["onSubmit"],h=e.createTextVNode(" Loading... "),L={key:0},z=["disabled"],P={props:{loading:{type:Boolean,default:!1},hasActions:{type:Boolean,default:!0},modelValue:{type:Object,default:()=>({})},fields:{type:Array,default:()=>[]},hideDivider:{type:Boolean,default:!1},rowClass:{type:String,default:null},columnClass:{type:String,default:null},labelClass:{type:String,default:null},inputGroupClass:{type:String,default:null},inputWrapperClass:{type:String,default:null},inputErrorClass:{type:String,default:null},inputClass:{type:String,default:null},errorClass:{type:String,default:null},helpTextClass:{type:String,default:null},submitButtonClass:{type:String,default:null},submitButtonText:{type:String,default:"Submit"}},emits:["submit","update:modelValue"],setup(r,{emit:o}){const l=r,t=()=>o("submit"),s=e.computed(()=>l.fields.length>0?l.fields.map(i=>{let k=i;return Array.isArray(i)||(k=[i]),k.map($=>$.id?$:_(C({},$),{id:`formMaker_${new Date().getTime()}_${$.name}`}))}):Object.keys(l.modelValue).map(i=>[{name:i,label:i,id:`formMaker_${i}`}])),{rowClass:a,columnClass:n,labelClass:y,inputGroupClass:d,inputWrapperClass:g,inputErrorClass:b,inputClass:c,errorClass:B,helpTextClass:V,submitButtonClass:E,modelValue:O}=e.toRefs(l);e.provide("labelClass",y.value||e.inject("form-label")),e.provide("inputGroupClass",d.value||e.inject("input-group")),e.provide("inputWrapperClass",g.value||e.inject("input-wrapper")),e.provide("inputErrorClass",b.value||e.inject("input-error")),e.provide("inputClass",c.value||e.inject("input")),e.provide("errorClass",B.value||e.inject("error")),e.provide("helpTextClass",V.value||e.inject("help-text"));const m=a.value||e.inject("form-row"),j=n.value||e.inject("form-column"),A=E.value||e.inject("submit-button"),D=i=>{const k=i.split(".");let $=O.value;for(let T=0;T<k.length-1;T+=1){const w=$[k[T]];if(!w)break;$=w}return $},F=i=>{const k=i.split(".");return k[k.length-1]};return(i,k)=>{const $=e.resolveComponent("form-maker-input");return e.openBlock(),e.createElementBlock("form",{class:"form-maker",onSubmit:e.withModifiers(t,["prevent"])},[r.loading?e.renderSlot(i.$slots,"loading",{key:0},()=>[h]):e.createCommentVNode("",!0),e.renderSlot(i.$slots,"default",{},()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(s),(T,w)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(e.unref(m)),key:`fieldRow_${w}`},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(T,(S,ae)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass([e.unref(j),S.columnClass]),key:`field_${w}_${ae}`},[e.renderSlot(i.$slots,`${S.name}`,{field:S},()=>[e.createVNode($,e.mergeProps({modelValue:D(S.name)[F(S.name)],"onUpdate:modelValue":ie=>D(S.name)[F(S.name)]=ie},S),null,16,["modelValue","onUpdate:modelValue"])])],2))),128))],2))),128))]),e.renderSlot(i.$slots,"extra"),e.renderSlot(i.$slots,"divider",{},()=>[r.hasActions&&!r.hideDivider?(e.openBlock(),e.createElementBlock("hr",L)):e.createCommentVNode("",!0)]),r.hasActions?e.renderSlot(i.$slots,"actions",{key:1},()=>[e.renderSlot(i.$slots,"submit-button",{},()=>[e.createElementVNode("button",{class:e.normalizeClass(e.unref(A)),disabled:r.loading,type:"submit"},e.toDisplayString(r.submitButtonText),11,z)]),e.renderSlot(i.$slots,"extra-buttons")]):e.createCommentVNode("",!0)],40,p)}}},N=(r,o,l="modelValue")=>e.computed({get:()=>r[l],set:t=>o(`update:${l}`,t)}),M=()=>({setup(r,{slots:o,attrs:l}){return()=>e.h("div",l,o.default())}}),U=(r,o)=>{const l=e.toRaw(o),t=e.ref(null);return e.watch(r,(s,a)=>{if(t.value=null,s!==a)for(let n=0;n<l.length;n+=1){const y=l[n];if(!y.validator(s)){t.value=y.message;break}}},{immediate:!0}),t},W=()=>{const r=e.inject("labelClass",null),o=e.inject("inputClass",null),l=e.inject("inputWrapperClass",null),t=e.inject("inputGroupClass",null),s=e.inject("inputErrorClass",null),a=e.inject("errorClass",null),n=e.inject("helpTextClass",null);return{labelClass:r,inputClass:o,inputWrapperClass:l,inputGroupClass:t,inputErrorClass:s,errorClass:a,helpTextClass:n}},u={emits:["update:modelValue"],props:{loading:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},modelValue:{default:null},error:{type:String,default:null},helpText:{type:String,default:null},id:{type:String,default:null},label:{type:String,default:null},name:{type:String,default:null},placeholder:{type:String,default:null},type:{type:String,default:"text"}}},I=Object.assign({inheritAttrs:!1},{props:_(C({},u.props),{rules:{type:Array,default:()=>[]}}),emits:u.emits,setup(r,{emit:o}){const l=r,t=N(l,o),{labelClass:s,inputClass:a,inputWrapperClass:n,inputGroupClass:y,inputErrorClass:d,errorClass:g,helpTextClass:b}=W(),c=e.computed(()=>Boolean(l.label)),B=e.computed(()=>Boolean(l.helpText)),V=U(t,l.rules),E=e.computed(()=>Boolean(l.error)||Boolean(V.value)),O=e.computed(()=>l.error?l.error:V.value);return(m,j)=>{const A=e.resolveComponent("form-maker-label"),D=e.resolveComponent("form-maker-help"),F=e.resolveComponent("form-maker-error"),i=e.resolveComponent("rule-evaluator");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass([e.unref(E)&&e.unref(d),e.unref(n)])},[m.type!=="checkbox"?e.renderSlot(m.$slots,"label",{key:0},()=>[e.unref(c)?(e.openBlock(),e.createBlock(A,{key:0,id:m.id,class:e.normalizeClass(e.unref(s))},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(m.label),1)]),_:1},8,["id","class"])):e.createCommentVNode("",!0)]):e.createCommentVNode("",!0),e.renderSlot(m.$slots,"default",{},()=>[e.createElementVNode("div",{class:e.normalizeClass([e.unref(y),e.unref(E)&&e.unref(d)])},[e.renderSlot(m.$slots,"before"),(e.openBlock(),e.createBlock(e.resolveDynamicComponent(`form-maker-input-${m.type}`),e.mergeProps({modelValue:e.unref(t),"onUpdate:modelValue":j[0]||(j[0]=k=>e.isRef(t)?t.value=k:null)},C(C({},m.$props),m.$attrs),{class:[m.type!=="checkbox"&&e.unref(a),e.unref(E)&&e.unref(d)],label:m.label}),null,16,["modelValue","class","label"])),e.renderSlot(m.$slots,"after")],2)]),e.renderSlot(m.$slots,"help",{},()=>[e.unref(B)?(e.openBlock(),e.createBlock(D,{key:0,class:e.normalizeClass(e.unref(b))},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(m.helpText),1)]),_:1},8,["class"])):e.createCommentVNode("",!0)]),e.renderSlot(m.$slots,"errors",{},()=>[e.unref(E)?(e.openBlock(),e.createBlock(F,{key:0,class:e.normalizeClass(e.unref(g))},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(e.unref(O)),1)]),_:1},8,["class"])):e.createCommentVNode("",!0),r.rules.length?(e.openBlock(),e.createBlock(i,{key:1,rules:r.rules,value:m.modelValue,modelValue:e.unref(V),"onUpdate:modelValue":j[1]||(j[1]=k=>e.isRef(V)?V.value=k:null)},null,8,["rules","value","modelValue"])):e.createCommentVNode("",!0)])],2)}}}),q=["checked","value","onClick"],H={props:_(C({},u.props),{options:{type:Array,default:()=>[]}}),emits:u.emits,setup(r,{emit:o}){const l=r,{options:t,label:s}=e.toRefs(l),a=e.computed(()=>t.value.length===0),n=e.computed(()=>l.modelValue),y=e.computed(()=>(Array.isArray(n.value)?n.value:[n.value]).filter(c=>!!c)),d=e.computed(()=>a.value?[{label:s.value,value:!0}]:t.value),g=b=>{let c=[...y.value];c.indexOf(b)===-1?c.push(b):c=c.filter(B=>B!==b),a.value?o("update:modelValue",c.length>0):o("update:modelValue",c)};return(b,c)=>(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(d),(B,V)=>(e.openBlock(),e.createElementBlock("div",{key:`option_${V}`},[e.createElementVNode("label",null,[e.createElementVNode("input",e.mergeProps(b.$props,{checked:e.unref(y).indexOf(B.value)!==-1,value:B.value,type:"checkbox",onClick:()=>g(B.value)}),null,16,q),e.createTextVNode(" "+e.toDisplayString(B.label),1)])]))),128))}},J={props:u.props,emits:u.emits,setup(r,{emit:o}){const l=t=>{if(t.target.files.length){const s=t.target.files[0];o("update:modelValue",s)}};return(t,s)=>(e.openBlock(),e.createElementBlock("input",e.mergeProps(t.$props,{type:"file",onChange:l}),null,16))}},K=M(),Q=M(),X={props:{id:{type:String,default:null}},setup(r,{slots:o,attrs:l}){return()=>e.h("label",_(C({},l),{for:r.id}),o.default())}},Y=["checked","value"],Z={props:_(C({},u.props),{options:{type:Array,default:()=>[]}}),emits:u.emits,setup(r,{emit:o}){const l=t=>o("update:modelValue",t.target.value);return(t,s)=>(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.options,(a,n)=>(e.openBlock(),e.createElementBlock("div",{key:`option_${n}`},[e.createElementVNode("label",null,[e.createElementVNode("input",e.mergeProps(t.$props,{checked:a.value===t.modelValue,value:a.value,type:"radio",onChange:l}),null,16,Y),e.createTextVNode(" "+e.toDisplayString(a.label),1)])]))),128))}},v=["id","disabled","name","placeholder"],ee=["label"],te=["value"],le=["value"],re={props:_(C({},u.props),{options:{type:Array,default:()=>[]},optionGroups:{type:Object,default:()=>({})}}),emits:u.emits,setup(r,{emit:o}){const l=r,t=N(l,o),s=Object.keys(l.optionGroups).length>0,a=e.computed(()=>l.options.map(n=>typeof n=="object"?n:{label:n,value:n}));return(n,y)=>e.withDirectives((e.openBlock(),e.createElementBlock("select",{id:n.id,"onUpdate:modelValue":y[0]||(y[0]=d=>e.isRef(t)?t.value=d:null),disabled:n.disabled,name:n.name,placeholder:n.placeholder},[s?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:0},e.renderList(r.optionGroups,(d,g)=>(e.openBlock(),e.createElementBlock("optgroup",{key:`optGroup_${g}`,label:g},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(d,(b,c)=>(e.openBlock(),e.createElementBlock("option",{key:`option_${c}`,value:c},e.toDisplayString(b),9,te))),128))],8,ee))),128)):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:1},e.renderList(e.unref(a),(d,g)=>(e.openBlock(),e.createElementBlock("option",{key:`option_${g}`,value:d.value},e.toDisplayString(d.label),9,le))),128))],8,v)),[[e.vModelSelect,e.unref(t)]])}},oe=["id","disabled","name","placeholder"],ne={props:u.props,emits:u.emits,setup(r,{emit:o}){const t=N(r,o);return(s,a)=>e.withDirectives((e.openBlock(),e.createElementBlock("textarea",{id:s.id,"onUpdate:modelValue":a[0]||(a[0]=n=>e.isRef(t)?t.value=n:null),disabled:s.disabled,name:s.name,placeholder:s.placeholder},null,8,oe)),[[e.vModelText,e.unref(t)]])}},se=["type"],f={props:u.props,emits:u.emits,setup(r,{emit:o}){const t=N(r,o);return(s,a)=>e.withDirectives((e.openBlock(),e.createElementBlock("input",e.mergeProps({"onUpdate:modelValue":a[0]||(a[0]=n=>e.isRef(t)?t.value=n:null),type:s.type},s.$props),null,16,se)),[[e.vModelDynamic,e.unref(t)]])}},G={classes:{"form-row":"form-maker-row","form-column":"form-maker-column","form-label":"form-maker-label","input-group":"form-maker-input-group","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":J,"form-maker-input-textarea":ne,"form-maker-input-select":re,"form-maker-input-checkbox":H,"form-maker-input-radio":Z,"form-maker-label":X,"form-maker-help":Q,"form-maker-error":K}};return{install:(r,o={})=>{const l={classes:C(C({},G.classes),o.classes),components:C(C({},G.components),o.components)};r.component("FormMaker",P),r.component("FormMakerInput",I),Object.keys(l.classes).forEach(t=>{r.provide(t,l.classes[t])}),Object.keys(l.components).forEach(t=>{r.component(t,l.components[t])})}}});
|
|
1
|
+
(function(e,S){typeof exports=="object"&&typeof module!="undefined"?module.exports=S(require("vue")):typeof define=="function"&&define.amd?define(["vue"],S):(e=typeof globalThis!="undefined"?globalThis:e||self,e.FormMaker=S(e.Vue))})(this,function(e){"use strict";const S=["onSubmit"],A={key:0},O=["disabled"],x={__name:"FormMaker",props:{loading:{type:Boolean,default:!1},hasActions:{type:Boolean,default:!0},modelValue:{type:Object,default:()=>({})},fields:{type:Array,default:()=>[]},hideDivider:{type:Boolean,default:!1},rowClass:{type:String,default:null},columnClass:{type:String,default:null},labelClass:{type:String,default:null},inputGroupClass:{type:String,default:null},inputWrapperClass:{type:String,default:null},inputErrorClass:{type:String,default:null},inputClass:{type:String,default:null},errorClass:{type:String,default:null},helpTextClass:{type:String,default:null},submitButtonClass:{type:String,default:null},submitButtonText:{type:String,default:"Submit"}},emits:["submit","update:modelValue"],setup(r,{emit:o}){const l=r,t=()=>o("submit"),a=e.computed(()=>l.fields.length>0?l.fields.map(i=>{let f=i;return Array.isArray(i)||(f=[i]),f.map(b=>b.id?b:{...b,id:`formMaker_${new Date().getTime()}_${b.name}`})}):Object.keys(l.modelValue).map(i=>[{name:i,label:i,id:`formMaker_${i}`}])),{rowClass:s,columnClass:n,labelClass:k,inputGroupClass:c,inputWrapperClass:h,inputErrorClass:C,inputClass:m,errorClass:y,helpTextClass:g,submitButtonClass:$,modelValue:N}=e.toRefs(l);e.provide("labelClass",k.value||e.inject("form-label")),e.provide("inputGroupClass",c.value||e.inject("input-group")),e.provide("inputWrapperClass",h.value||e.inject("input-wrapper")),e.provide("inputErrorClass",C.value||e.inject("input-error")),e.provide("inputClass",m.value||e.inject("input")),e.provide("errorClass",y.value||e.inject("error")),e.provide("helpTextClass",g.value||e.inject("help-text"));const p=s.value||e.inject("form-row"),V=n.value||e.inject("form-column"),F=$.value||e.inject("submit-button"),T=i=>{const f=i.split(".");let b=N.value;for(let _=0;_<f.length-1;_+=1){const E=b[f[_]];if(!E)break;b=E}return b},w=i=>{const f=i.split(".");return f[f.length-1]};return(i,f)=>{const b=e.resolveComponent("form-maker-input");return e.openBlock(),e.createElementBlock("form",{class:"form-maker",onSubmit:e.withModifiers(t,["prevent"])},[r.loading?e.renderSlot(i.$slots,"loading",{key:0},()=>[e.createTextVNode(" Loading... ")]):e.createCommentVNode("",!0),e.renderSlot(i.$slots,"default",{},()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(a.value,(_,E)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(e.unref(p)),key:`fieldRow_${E}`},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(_,(B,le)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass([e.unref(V),B.columnClass]),key:`field_${E}_${le}`},[e.renderSlot(i.$slots,`${B.name}`,{field:B},()=>[e.createVNode(b,e.mergeProps({modelValue:T(B.name)[w(B.name)],"onUpdate:modelValue":re=>T(B.name)[w(B.name)]=re},B),null,16,["modelValue","onUpdate:modelValue"])])],2))),128))],2))),128))]),e.renderSlot(i.$slots,"extra"),e.renderSlot(i.$slots,"divider",{},()=>[r.hasActions&&!r.hideDivider?(e.openBlock(),e.createElementBlock("hr",A)):e.createCommentVNode("",!0)]),r.hasActions?e.renderSlot(i.$slots,"actions",{key:1},()=>[e.renderSlot(i.$slots,"submit-button",{},()=>[e.createElementVNode("button",{class:e.normalizeClass(e.unref(F)),disabled:r.loading,type:"submit"},e.toDisplayString(r.submitButtonText),11,O)]),e.renderSlot(i.$slots,"extra-buttons")]):e.createCommentVNode("",!0)],40,S)}}},R=(r,o)=>{const l=e.toRaw(o),t=e.ref(null);return e.watch(r,(a,s)=>{if(t.value=null,a!==s)for(let n=0;n<l.length;n+=1){const k=l[n];if(!k.validator(a)){t.value=k.message;break}}},{immediate:!0}),t};function j(r,o,l="modelValue"){return e.computed({get:()=>r[l],set:t=>o(`update:${l}`,t)})}const G=()=>{const r=e.inject("labelClass",null),o=e.inject("inputClass",null),l=e.inject("inputWrapperClass",null),t=e.inject("inputGroupClass",null),a=e.inject("inputErrorClass",null),s=e.inject("errorClass",null),n=e.inject("helpTextClass",null);return{labelClass:r,inputClass:o,inputWrapperClass:l,inputGroupClass:t,inputErrorClass:a,errorClass:s,helpTextClass:n}},d={emits:["update:modelValue"],props:{loading:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},modelValue:{default:null},error:{type:String,default:null},helpText:{type:String,default:null},id:{type:String,default:null},label:{type:String,default:null},name:{type:String,default:null},placeholder:{type:String,default:null},type:{type:String,default:"text"}}},I=Object.assign({inheritAttrs:!1},{__name:"FormMakerInput",props:{...d.props,rules:{type:Array,default:()=>[]}},emits:d.emits,setup(r,{emit:o}){const l=r,t=j(l,o),{labelClass:a,inputClass:s,inputWrapperClass:n,inputGroupClass:k,inputErrorClass:c,errorClass:h,helpTextClass:C}=G(),m=e.computed(()=>Boolean(l.label)),y=e.computed(()=>Boolean(l.helpText)),g=R(t,l.rules),$=e.computed(()=>Boolean(l.error)||Boolean(g.value)),N=e.computed(()=>l.error?l.error:g.value);return(p,V)=>{const F=e.resolveComponent("form-maker-label"),T=e.resolveComponent("form-maker-help"),w=e.resolveComponent("form-maker-error"),i=e.resolveComponent("rule-evaluator");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass([$.value&&e.unref(c),e.unref(n)])},[p.type!=="checkbox"?e.renderSlot(p.$slots,"label",{key:0},()=>[m.value?(e.openBlock(),e.createBlock(F,{key:0,id:p.id,class:e.normalizeClass(e.unref(a))},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(p.label),1)]),_:1},8,["id","class"])):e.createCommentVNode("",!0)]):e.createCommentVNode("",!0),e.renderSlot(p.$slots,"default",{},()=>[e.createElementVNode("div",{class:e.normalizeClass([e.unref(k),$.value&&e.unref(c)])},[e.renderSlot(p.$slots,"before"),(e.openBlock(),e.createBlock(e.resolveDynamicComponent(`form-maker-input-${p.type}`),e.mergeProps({modelValue:e.unref(t),"onUpdate:modelValue":V[0]||(V[0]=f=>e.isRef(t)?t.value=f:null)},{...p.$props,...p.$attrs},{class:[p.type!=="checkbox"&&e.unref(s),$.value&&e.unref(c)],label:p.label}),null,16,["modelValue","class","label"])),e.renderSlot(p.$slots,"after")],2)]),e.renderSlot(p.$slots,"help",{},()=>[y.value?(e.openBlock(),e.createBlock(T,{key:0,class:e.normalizeClass(e.unref(C))},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(p.helpText),1)]),_:1},8,["class"])):e.createCommentVNode("",!0)]),e.renderSlot(p.$slots,"errors",{},()=>[$.value?(e.openBlock(),e.createBlock(w,{key:0,class:e.normalizeClass(e.unref(h))},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(N.value),1)]),_:1},8,["class"])):e.createCommentVNode("",!0),r.rules.length?(e.openBlock(),e.createBlock(i,{key:1,rules:r.rules,value:p.modelValue,modelValue:e.unref(g),"onUpdate:modelValue":V[1]||(V[1]=f=>e.isRef(g)?g.value=f:null)},null,8,["rules","value","modelValue"])):e.createCommentVNode("",!0)])],2)}}}),L=["checked","value","onClick"],z={__name:"CheckboxInput",props:{...d.props,options:{type:Array,default:()=>[]}},emits:d.emits,setup(r,{emit:o}){const l=r,{options:t,label:a}=e.toRefs(l),s=e.computed(()=>t.value.length===0),n=e.computed(()=>l.modelValue),k=e.computed(()=>(Array.isArray(n.value)?n.value:[n.value]).filter(m=>!!m)),c=e.computed(()=>s.value?[{label:a.value,value:!0}]:t.value),h=C=>{let m=[...k.value];m.indexOf(C)===-1?m.push(C):m=m.filter(y=>y!==C),s.value?o("update:modelValue",m.length>0):o("update:modelValue",m)};return(C,m)=>(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(c.value,(y,g)=>(e.openBlock(),e.createElementBlock("div",{key:`option_${g}`},[e.createElementVNode("label",null,[e.createElementVNode("input",e.mergeProps(C.$props,{checked:k.value.indexOf(y.value)!==-1,value:y.value,type:"checkbox",onClick:()=>h(y.value)}),null,16,L),e.createTextVNode(" "+e.toDisplayString(y.label),1)])]))),128))}},P={__name:"FileInput",props:d.props,emits:d.emits,setup(r,{emit:o}){const l=t=>{if(t.target.files.length){const a=t.target.files[0];o("update:modelValue",a)}};return(t,a)=>(e.openBlock(),e.createElementBlock("input",e.mergeProps(t.$props,{type:"file",onChange:l}),null,16))}},D=()=>({setup(r,{slots:o,attrs:l}){return()=>e.h("div",l,o.default())}}),U=D(),W=D(),q={props:{id:{type:String,default:null}},setup(r,{slots:o,attrs:l}){return()=>e.h("label",{...l,for:r.id},o.default())}},H=["checked","value"],J={__name:"RadioInput",props:{...d.props,options:{type:Array,default:()=>[]}},emits:d.emits,setup(r,{emit:o}){const l=t=>o("update:modelValue",t.target.value);return(t,a)=>(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.options,(s,n)=>(e.openBlock(),e.createElementBlock("div",{key:`option_${n}`},[e.createElementVNode("label",null,[e.createElementVNode("input",e.mergeProps(t.$props,{checked:s.value===t.modelValue,value:s.value,type:"radio",onChange:l}),null,16,H),e.createTextVNode(" "+e.toDisplayString(s.label),1)])]))),128))}},K=["id","disabled","name","placeholder"],Q=["label"],X=["value"],Y=["value"],Z={__name:"SelectInput",props:{...d.props,options:{type:Array,default:()=>[]},optionGroups:{type:Object,default:()=>({})}},emits:d.emits,setup(r,{emit:o}){const l=r,t=j(l,o),a=Object.keys(l.optionGroups).length>0,s=e.computed(()=>l.options.map(n=>typeof n=="object"?n:{label:n,value:n}));return(n,k)=>e.withDirectives((e.openBlock(),e.createElementBlock("select",{id:n.id,"onUpdate:modelValue":k[0]||(k[0]=c=>e.isRef(t)?t.value=c:null),disabled:n.disabled,name:n.name,placeholder:n.placeholder},[a?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:0},e.renderList(r.optionGroups,(c,h)=>(e.openBlock(),e.createElementBlock("optgroup",{key:`optGroup_${h}`,label:h},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(c,(C,m)=>(e.openBlock(),e.createElementBlock("option",{key:`option_${m}`,value:m},e.toDisplayString(C),9,X))),128))],8,Q))),128)):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:1},e.renderList(s.value,(c,h)=>(e.openBlock(),e.createElementBlock("option",{key:`option_${h}`,value:c.value},e.toDisplayString(c.label),9,Y))),128))],8,K)),[[e.vModelSelect,e.unref(t)]])}},v=["id","disabled","name","placeholder"],ee={__name:"TextAreaInput",props:d.props,emits:d.emits,setup(r,{emit:o}){const t=j(r,o);return(a,s)=>e.withDirectives((e.openBlock(),e.createElementBlock("textarea",{id:a.id,"onUpdate:modelValue":s[0]||(s[0]=n=>e.isRef(t)?t.value=n:null),disabled:a.disabled,name:a.name,placeholder:a.placeholder},null,8,v)),[[e.vModelText,e.unref(t)]])}},te=["type"],u={__name:"BasicInput",props:d.props,emits:d.emits,setup(r,{emit:o}){const t=j(r,o);return(a,s)=>e.withDirectives((e.openBlock(),e.createElementBlock("input",e.mergeProps({"onUpdate:modelValue":s[0]||(s[0]=n=>e.isRef(t)?t.value=n:null),type:a.type},a.$props),null,16,te)),[[e.vModelDynamic,e.unref(t)]])}},M={classes:{"form-row":"form-maker-row","form-column":"form-maker-column","form-label":"form-maker-label","input-group":"form-maker-input-group","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":u,"form-maker-input-date":u,"form-maker-input-email":u,"form-maker-input-month":u,"form-maker-input-number":u,"form-maker-input-password":u,"form-maker-input-search":u,"form-maker-input-tel":u,"form-maker-input-time":u,"form-maker-input-text":u,"form-maker-input-url":u,"form-maker-input-week":u,"form-maker-input-range":u,"form-maker-input-file":P,"form-maker-input-textarea":ee,"form-maker-input-select":Z,"form-maker-input-checkbox":z,"form-maker-input-radio":J,"form-maker-label":q,"form-maker-help":W,"form-maker-error":U}};return{install:(r,o={})=>{const l={classes:{...M.classes,...o.classes},components:{...M.components,...o.components}};r.component("FormMaker",x),r.component("FormMakerInput",I),Object.keys(l.classes).forEach(t=>{r.provide(t,l.classes[t])}),Object.keys(l.components).forEach(t=>{r.component(t,l.components[t])})}}});
|