formvuelate
Version:
Schema Form Generator
1 lines • 6.26 kB
JavaScript
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("vue")):"function"==typeof define&&define.amd?define(["exports","vue"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Formvuelate={},e.Vue)}(this,(function(e,t){"use strict";const n=e=>e.filter((e=>e.schema)),o=(e,t)=>{const a=(e=>{for(const t of e){const e=n(t);if(e.length)return e}return[]})(t),c=t=>t?.model===e;if(!a.length)return null;for(const t of a){if(c(t))return t;const n=o(e,r(t.schema));if(c(n))return n}return null},r=e=>(Array.isArray(e)?e:Object.keys(e).map((t=>({...e[t],model:t})))).map((e=>Array.isArray(e)?e:[e]));function a(e,n){const{getID:a}=function(){let e=Math.floor(1e9*Math.random());const t=new Map;return{UUID:e,UUIDBindings:t,getID:function(n){return t.has(n)?t.get(n):(e++,t.set(n,e),e)}}}();return{parsedSchema:t.computed((()=>{const c=t.unref(e);let l=r(c);if(n){const e=o(n,l);e&&(l=r(e.schema))}return l.map((e=>e.map((e=>({...e,uuid:a(e.model)})))))}))}}const c="fvl_isSchemaWizard",l="fvl_parentSchemaExists",s="fvl_injectedSchema",d="fvl_schemaModelPath",m="fvl_formModel",i="fvl_findNestedFormModelProp",u="fvl_updateFormModel",f="fvl_deleteFormModelProp";var p=Object.freeze({__proto__:null,IS_SCHEMA_WIZARD:c,PARENT_SCHEMA_EXISTS:l,INJECTED_SCHEMA:s,SCHEMA_MODEL_PATH:d,FORM_MODEL:m,FIND_NESTED_FORM_MODEL_PROP:i,UPDATE_FORM_MODEL:u,DELETE_FORM_MODEL_PROP:f}),h={name:"SchemaField",props:{field:{type:Object,required:!0},sharedConfig:{type:Object,default:()=>({})},preventModelCleanupOnSchemaChange:{type:Boolean,default:!1}},setup(e){const n=t.computed((()=>e.field.schema?{...e.field,nestedSchemaModel:e.field.model}:{...e.sharedConfig,...e.field})),o=t.inject(m,{}),r=t.inject(d,null),a=t.inject(i),c=t.computed((()=>r?a(r)[e.field.model]:o.value[e.field.model])),l=t.inject(u),s=t.inject(f),p=t.computed((()=>{const t=e.field.condition;return!t||"function"!=typeof t||t(o.value)}));return t.watch(p,(t=>{t||e.preventModelCleanupOnSchemaChange||s(e.field.model,r)})),{binds:n,fieldValue:c,update:t=>{l(e.field.model,t,r)},schemaCondition:p}}};h.render=function(e,n,o,r,a,c){return r.schemaCondition?(t.openBlock(),t.createBlock(t.resolveDynamicComponent(o.field.component),t.mergeProps({key:0},r.binds,{modelValue:r.fieldValue,"onUpdate:modelValue":r.update,class:"schema-col"}),null,16,["modelValue","onUpdate:modelValue"])):t.createCommentVNode("v-if",!0)},h.__file="packages/formvuelate/src/SchemaField.vue";var S={name:"SchemaForm",components:{SchemaField:h},props:{schema:{type:[Object,Array],required:!0,validator:e=>!Array.isArray(e)||0===e.filter((e=>!Array.isArray(e)&&!e.model&&!e.schema)).length},sharedConfig:{type:Object,default:()=>({})},preventModelCleanupOnSchemaChange:{type:Boolean,default:!1},nestedSchemaModel:{type:String,default:""},schemaRowClasses:{type:[String,Object,Array],default:null}},emits:["submit","update:modelValue"],setup(e,{emit:n,attrs:o}){const{behaveLikeParentSchema:r,hasParentSchema:i}=function(){const e=t.inject(c,!1),n=t.inject(l,!1);return n||t.provide(l,!0),{behaveLikeParentSchema:t.computed((()=>!e&&!n)),hasParentSchema:n,isChildOfWizard:e}}(),{schema:u}=function(e,n){const{schema:o}=t.toRefs(e);let r=t.inject(s,!1);if(n&&(t.provide(s,o),r=o),e.nestedSchemaModel){const n=t.inject(d,""),o=n?`${n}.${e.nestedSchemaModel}`:e.nestedSchemaModel;t.provide(d,o)}return{schema:r}}(e,r),{parsedSchema:f}=a(u,o.model);!function(e,n){const o=t.inject(m,{});t.watch(n,((t,n)=>{if(e.preventModelCleanupOnSchemaChange)return;const r=(e,t)=>e.concat(t.map((e=>e.model))),a=t.reduce(r,[]),c=n.reduce(r,[]).filter((e=>!a.includes(e)));if(c.length)for(const e of c)delete o.value[e]}))}(e,f);const p=t.computed((()=>i?{}:{onSubmit:e=>{e.preventDefault(),n("submit",e)}})),h=t.computed((()=>({})));return{behaveLikeParentSchema:r,parsedSchema:f,hasParentSchema:i,formBinds:p,slotBinds:h}}};S.render=function(e,n,o,r,a,c){const l=t.resolveComponent("SchemaField");return t.openBlock(),t.createBlock(t.resolveDynamicComponent(r.behaveLikeParentSchema?"form":"div"),r.formBinds,{default:t.withCtx((()=>[r.behaveLikeParentSchema?t.renderSlot(e.$slots,"beforeForm",t.mergeProps({key:0},r.slotBinds)):t.createCommentVNode("v-if",!0),(t.openBlock(!0),t.createBlock(t.Fragment,null,t.renderList(r.parsedSchema,((e,n)=>(t.openBlock(),t.createBlock("div",{class:["schema-row",o.schemaRowClasses],key:n},[(t.openBlock(!0),t.createBlock(t.Fragment,null,t.renderList(e,(e=>(t.openBlock(),t.createBlock(l,{key:e.model,field:e,sharedConfig:o.sharedConfig,preventModelCleanupOnSchemaChange:o.preventModelCleanupOnSchemaChange,class:"schema-col"},null,8,["field","sharedConfig","preventModelCleanupOnSchemaChange"])))),128))],2)))),128)),r.behaveLikeParentSchema?t.renderSlot(e.$slots,"afterForm",t.mergeProps({key:1},r.slotBinds)):t.createCommentVNode("v-if",!0)])),_:3},16)},S.__file="packages/formvuelate/src/SchemaForm.vue";var v={name:"SchemaWizard",components:{SchemaForm:S},props:{schema:{type:Array,required:!0},step:{type:Number,required:!0,default:0}},emits:["submit"],setup(e){t.provide(c,!0);return{currentSchema:t.computed((()=>e.schema[e.step]))}}};v.render=function(e,n,o,r,a,c){const l=t.resolveComponent("SchemaForm");return t.openBlock(),t.createBlock("form",{onSubmit:n[1]||(n[1]=t.withModifiers((t=>e.$emit("submit",t)),["prevent"]))},[t.renderSlot(e.$slots,"beforeForm"),t.createVNode(l,{schema:r.currentSchema,preventModelCleanupOnSchemaChange:""},null,8,["schema"]),t.renderSlot(e.$slots,"afterForm")],32)},v.__file="packages/formvuelate/src/SchemaWizard.vue";const C=(e,t)=>(e[t]||(e[t]={}),e[t]);e.SchemaForm=S,e.SchemaFormFactory=function(e=[],t=null){const n=S.setup,o={...h,components:{...t,...h.components}};return{...S,components:{...t,...S.components,SchemaField:o},setup:function(t,o){const r=n(t,o);return e.length?e.reduce(((e,n)=>n(e,t,o)),r):r}}},e.SchemaWizard=v,e.constants=p,e.default=S,e.useSchemaForm=function(e={}){const n=t.isRef(e)?e:t.ref(e),o=e=>{const t=e.split(".");let o=C(n.value,t[0]);for(let e=1;e<t.length;e++)o=C(o,t[e]);return o};return t.provide(u,((e,t,r)=>{r?o(r)[e]=t:n.value[e]=t})),t.provide(f,((e,t)=>{t?delete o(t)[e]:delete n.value[e]})),t.provide(i,o),t.provide(m,n),{formModel:n}},Object.defineProperty(e,"__esModule",{value:!0})}));