@j-solution/components 1.1.0 → 1.1.1
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/components/molecules/JAlert.vue.cjs +1 -1
- package/components/molecules/JAlert.vue.cjs.map +1 -1
- package/components/molecules/JAlert.vue.js +6 -5
- package/components/molecules/JAlert.vue.js.map +1 -1
- package/components/molecules/JFormField.vue.cjs +1 -1
- package/components/molecules/JFormField.vue.cjs.map +1 -1
- package/components/molecules/JFormField.vue.js +3 -2
- package/components/molecules/JFormField.vue.js.map +1 -1
- package/components/molecules/JTitlebar.vue.cjs +1 -1
- package/components/molecules/JTitlebar.vue.cjs.map +1 -1
- package/components/molecules/JTitlebar.vue.js +10 -9
- package/components/molecules/JTitlebar.vue.js.map +1 -1
- package/components/organisms/JDynamicForm.vue2.cjs +1 -1
- package/components/organisms/JDynamicForm.vue2.cjs.map +1 -1
- package/components/organisms/JDynamicForm.vue2.js +3 -2
- package/components/organisms/JDynamicForm.vue2.js.map +1 -1
- package/components/organisms/JFormModal.vue.cjs +1 -1
- package/components/organisms/JFormModal.vue.cjs.map +1 -1
- package/components/organisms/JFormModal.vue.js +3 -2
- package/components/organisms/JFormModal.vue.js.map +1 -1
- package/components/organisms/JModal.vue.cjs +1 -1
- package/components/organisms/JModal.vue.cjs.map +1 -1
- package/components/organisms/JModal.vue.js +17 -16
- package/components/organisms/JModal.vue.js.map +1 -1
- package/components/organisms/JSearchPanel.vue2.cjs +1 -1
- package/components/organisms/JSearchPanel.vue2.cjs.map +1 -1
- package/components/organisms/JSearchPanel.vue2.js +17 -16
- package/components/organisms/JSearchPanel.vue2.js.map +1 -1
- package/index.cjs +1 -1
- package/index.js +51 -49
- package/package.json +1 -1
- package/types/index.d.ts +4 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const l=require("vue"),A=require("../molecules/JFormField.vue.cjs");;/* empty css */require("../shadcn/index.cjs");require("@vueuse/core");require("reka-ui");require("clsx");require("tailwind-merge");require("lucide-vue-next");;/* empty css */;/* empty css */;/* empty css */const W=require("../molecules/JCard.vue.cjs");require("@internationalized/date");require("../shadcn/badge-variants.cjs");;/* empty css */require("../shadcn/avatar-variants.cjs");require("ag-grid-vue3");require("ag-grid-community");require("ag-grid-enterprise");;/* empty css */;/* empty css */;/* empty css */;/* empty css */const M=require("../../lib/styleTypePreset.cjs"),D={key:1,class:"space-y-6"},R={key:2,class:"space-y-4"},Y={class:"font-semibold text-lg"},j={key:0,class:"text-muted-foreground text-sm mb-2"},J=l.defineComponent({__name:"JDynamicForm",props:{schema:{},modelValue:{}},emits:["update:modelValue","submit","change","error"],setup(u,{expose:L,emit:F}){const s=u,p=F,d=["checkbox","switch"],a=l.reactive({});l.watch(()=>s.modelValue,e=>{e&&Object.assign(a,e)},{immediate:!0,deep:!0});function y(e,o){return e.controlId||e.controlName||e.name||e.label||`field-${o}`}function h(e){return e.controlName||e.name||""}function b(e){return e.isRequired!==void 0?e.isRequired:e.required||!1}l.watch(()=>s.schema,e=>{const o=[];e.type==="simple"&&e.fields?o.push(...e.fields):e.type==="sectioned"&&e.sections?e.sections.forEach(t=>{t.fields&&o.push(...t.fields)}):e.type==="wizard"&&e.steps&&e.steps.forEach(t=>{t.fields&&o.push(...t.fields)}),o.forEach(t=>{const r=h(t);if(r&&a[r]===void 0)if(d.includes(t.type))a[r]="N";else if(t.type==="radio")a[r]=t.options?.[0]?.value??"";else if(t.type==="select"||t.type==="searchcombo"){const c=t.addAll!==void 0?t.addAll:t.allowAll||!1;a[r]=c?"ALL":"SELECT"}else a[r]=""})},{immediate:!0}),l.watch(a,e=>p("update:modelValue",e),{deep:!0});function N(){p("submit",{...a}),typeof s.schema.events?.onSubmit=="function"&&s.schema.events.onSubmit({...a})}function T(e,o){p("change",{field:e,value:o}),typeof s.schema.events?.onChange=="function"&&s.schema.events.onChange(e,o)}function $(e){p("error",e),typeof s.schema.events?.onError=="function"&&s.schema.events.onError(e)}function f(e){return e.filter(t=>t.isVisible!==!1).sort((t,r)=>{if(t.sortOrder!==void 0&&r.sortOrder!==void 0&&t.sortOrder!==r.sortOrder)return t.sortOrder-r.sortOrder;const c=t.controlName||t.name||t.label||"",g=r.controlName||r.name||r.label||"";return c.localeCompare(g)})}const w=l.computed(()=>{const e=s.schema.globalStyle?.colCount||(s.schema.layout?.columns?`row-${s.schema.layout.columns}`:"row-1"),o=z(e);let t="";switch(e){case"row-1":t=`flex flex-col ${o}`;break;case"row":case"row-2":t=`flex flex-col md:grid md:grid-flow-row md:items-start ${o} md:grid-cols-2 auto-rows-min`;break;case"row-3":t=`flex flex-col md:grid md:grid-flow-row md:items-start ${o} md:grid-cols-2 lg:grid-cols-3 auto-rows-min`;break;case"row-4":t=`flex flex-col md:grid md:grid-flow-row md:items-start ${o} md:grid-cols-2 lg:grid-cols-4 auto-rows-min`;break;case"row-5":t=`flex flex-col md:grid md:grid-flow-row md:items-start ${o} md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-5 auto-rows-min`;break;case"row-6":t=`flex flex-col md:grid md:grid-flow-row md:items-start ${o} md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-6 auto-rows-min`;break;case"row-7":t=`flex flex-col md:grid md:grid-flow-row md:items-start ${o} md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-7 auto-rows-min`;break;case"row-8":t=`flex flex-col md:grid md:grid-flow-row md:items-start ${o} md:grid-cols-2 lg:grid-cols-4 xl:grid-cols-8 auto-rows-min`;break;default:t=`flex flex-col ${o}`}return t});function k(e){return d.includes(e.type)?"min-w-0 w-auto inline-flex items-center":"min-w-0 w-full"}function C(e){switch(e){case"row":case"row-2":return 2;case"row-3":return 3;case"row-4":return 4;case"row-5":return 5;case"row-6":return 6;case"row-7":return 7;case"row-8":return 8;default:return 1}}function z(e){switch(e){case"row-1":return"gap-6";case"row":case"row-2":return"gap-4";case"row-3":return"gap-4";case"row-4":return"gap-3";case"row-5":return"gap-2";case"row-6":return"gap-2";case"row-7":return"gap-2";case"row-8":return"gap-2";default:return"gap-6"}}function v(){const e=s.schema.globalStyle?.colCount||(s.schema.layout?.columns?`row-${s.schema.layout.columns}`:"row-1"),o=C(e);return o>=6?"6rem":o>=5?"7rem":"8rem"}function x(){return s.schema.globalStyle?.labelPosition||"horizontal"}function E(){return s.schema.globalStyle?.labelAlign||"left"}function q(e){const o=s.schema.globalStyle?.colCount||(s.schema.layout?.columns?`row-${s.schema.layout.columns}`:"row-1"),t=C(o);return{gridColumn:`span ${Math.min(t,Math.max(1,e.colSpan||1))}`}}function B(e){const o=h(e),t=e.isDisabled!==void 0?e.isDisabled:e.disabled||!1,r=e.isReadonly!==void 0?e.isReadonly:e.readonly||!1,c=d.includes(e.type)?"inline-flex items-center gap-2 w-auto":"w-full",g=M.resolveGlobalStyle(s.schema.globalStyle),P=s.schema.globalStyle?.colCount||(s.schema.layout?.columns?`row-${s.schema.layout.columns}`:"row-1"),S=C(P);let i=g.controlSize;S>=6||S>=5?i="sm":S>=4&&g.controlSize==="lg"&&(i="md");const m=(n,V)=>{if(o&&(a[o]=V,T(o,V)),e.events?.[n]){const U=e.events[n];console.log(`Event ${n}: Calling handler "${U}" with value:`,V)}};return d.includes(e.type)?{modelValue:a[o]==="Y"?"Y":"N",disabled:t,styleType:i,class:c,"onUpdate:modelValue":n=>{o&&(a[o]=n),m("onChange",n==="Y")}}:e.type==="radio"?{modelValue:String(a[o]??""),options:e.options??[],multiple:e.multiple,disabled:t,styleType:i,class:c,"onUpdate:modelValue":n=>{m("onChange",n)}}:e.type==="select"||e.type==="combo"?{modelValue:String(a[o]??""),options:_(e),multiple:e.multiple,disabled:t,styleType:i,class:c,"onUpdate:modelValue":n=>{m("onChange",n)}}:e.type==="searchcombo"?{modelValue:String(a[o]??""),options:_(e),disabled:t,styleType:i,class:c,"onUpdate:modelValue":n=>{m("onChange",n)}}:e.type==="textarea"?{modelValue:String(a[o]??""),placeholder:e.placeholder??"",disabled:t,readonly:r,styleType:i,class:c,"onUpdate:modelValue":n=>{m("onChange",n)}}:e.type==="datepicker"?{modelValue:String(a[o]??""),placeholder:e.placeholder??"",disabled:t,readonly:r,styleType:i,class:c,"onUpdate:modelValue":n=>{m("onChange",n)}}:{modelValue:String(a[o]??""),inputType:e.inputType||(e.dataType==="number"?"number":"text"),placeholder:e.placeholder??"",disabled:t,readonly:r,styleType:i,class:c,"onUpdate:modelValue":n=>{m("onChange",n)}}}function _(e){const o=e.addAll!==void 0?e.addAll:e.allowAll||!1;return[{value:o?"ALL":"SELECT",label:o?"전체":"선택"},...e.options||[]]}function O(){Object.keys(a).forEach(o=>{delete a[o]});const e=[];s.schema.type==="simple"&&s.schema.fields?e.push(...s.schema.fields):s.schema.type==="sectioned"&&s.schema.sections?s.schema.sections.forEach(o=>{o.fields&&e.push(...o.fields)}):s.schema.type==="wizard"&&s.schema.steps&&s.schema.steps.forEach(o=>{o.fields&&e.push(...o.fields)}),e.forEach(o=>{const t=h(o);if(t)if(d.includes(o.type))a[t]="N";else if(o.type==="radio")a[t]=o.options?.[0]?.value??"";else if(o.type==="select"||o.type==="searchcombo"){const r=o.addAll!==void 0?o.addAll:o.allowAll||!1;a[t]=r?"ALL":"SELECT"}else a[t]=""})}return L({formState:a,submit:N,reset:O,handleError:$}),(e,o)=>(l.openBlock(),l.createElementBlock("form",{onSubmit:l.withModifiers(N,["prevent"]),class:l.normalizeClass(w.value)},[u.schema.type==="simple"?(l.openBlock(!0),l.createElementBlock(l.Fragment,{key:0},l.renderList(f(u.schema.fields||[]),(t,r)=>(l.openBlock(),l.createElementBlock("div",{key:y(t,r),class:l.normalizeClass(k(t)),style:l.normalizeStyle(q(t))},[l.createVNode(l.unref(A.default),l.mergeProps({label:t.label,required:b(t),orientation:x(),labelAlign:E(),labelWidth:v(),type:t.type==="searchcombo"?"searchCombo":t.type,"input-type":t.inputType,description:t.description,"inline-label":t.inlineLabel},{ref_for:!0},B(t)),null,16,["label","required","orientation","labelAlign","labelWidth","type","input-type","description","inline-label"])],6))),128)):u.schema.type==="sectioned"?(l.openBlock(),l.createElementBlock("div",D,[(l.openBlock(!0),l.createElementBlock(l.Fragment,null,l.renderList(u.schema.sections,t=>(l.openBlock(),l.createBlock(l.unref(W.default),{key:t.id,title:t.title,collapsible:t.collapsible,"default-collapsed":t.defaultCollapsed},{default:l.withCtx(()=>[l.createElementVNode("div",{class:l.normalizeClass(w.value)},[(l.openBlock(!0),l.createElementBlock(l.Fragment,null,l.renderList(f(t.fields||[]),(r,c)=>(l.openBlock(),l.createElementBlock("div",{key:y(r,c),class:l.normalizeClass(k(r)),style:l.normalizeStyle(q(r))},[l.createVNode(l.unref(A.default),l.mergeProps({label:r.label,required:b(r),orientation:x(),labelAlign:E(),labelWidth:v(),type:r.type==="searchcombo"?"searchCombo":r.type,"input-type":r.inputType,description:r.description,"inline-label":r.inlineLabel},{ref_for:!0},B(r)),null,16,["label","required","orientation","labelAlign","labelWidth","type","input-type","description","inline-label"])],6))),128))],2)]),_:2},1032,["title","collapsible","default-collapsed"]))),128))])):u.schema.type==="wizard"?(l.openBlock(),l.createElementBlock("div",R,[(l.openBlock(!0),l.createElementBlock(l.Fragment,null,l.renderList(u.schema.steps,t=>(l.openBlock(),l.createElementBlock("div",{key:t.id,class:"p-4 border rounded-xl"},[l.createElementVNode("h3",Y,l.toDisplayString(t.title),1),t.description?(l.openBlock(),l.createElementBlock("p",j,l.toDisplayString(t.description),1)):l.createCommentVNode("",!0),l.createElementVNode("div",{class:l.normalizeClass(w.value)},[(l.openBlock(!0),l.createElementBlock(l.Fragment,null,l.renderList(f(t.fields||[]),(r,c)=>(l.openBlock(),l.createElementBlock("div",{key:y(r,c),class:l.normalizeClass(k(r)),style:l.normalizeStyle(q(r))},[l.createVNode(l.unref(A.default),l.mergeProps({label:r.label,required:b(r),orientation:x(),labelAlign:E(),labelWidth:v(),type:r.type==="searchcombo"?"searchCombo":r.type,"input-type":r.inputType,description:r.description,"inline-label":r.inlineLabel},{ref_for:!0},B(r)),null,16,["label","required","orientation","labelAlign","labelWidth","type","input-type","description","inline-label"])],6))),128))],2)]))),128))])):l.createCommentVNode("",!0)],34))}});exports.default=J;
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const l=require("vue"),A=require("../molecules/JFormField.vue.cjs");;/* empty css */require("../shadcn/index.cjs");require("@vueuse/core");require("reka-ui");require("clsx");require("tailwind-merge");require("lucide-vue-next");;/* empty css */;/* empty css */;/* empty css */const W=require("../molecules/JCard.vue.cjs");require("@internationalized/date");require("../shadcn/badge-variants.cjs");;/* empty css */require("../shadcn/avatar-variants.cjs");require("ag-grid-vue3");require("ag-grid-community");require("ag-grid-enterprise");;/* empty css */;/* empty css */;/* empty css */;/* empty css */require("vue-sonner");const M=require("../../lib/styleTypePreset.cjs"),D={key:1,class:"space-y-6"},R={key:2,class:"space-y-4"},Y={class:"font-semibold text-lg"},j={key:0,class:"text-muted-foreground text-sm mb-2"},J=l.defineComponent({__name:"JDynamicForm",props:{schema:{},modelValue:{}},emits:["update:modelValue","submit","change","error"],setup(u,{expose:L,emit:F}){const s=u,p=F,d=["checkbox","switch"],a=l.reactive({});l.watch(()=>s.modelValue,e=>{e&&Object.assign(a,e)},{immediate:!0,deep:!0});function y(e,o){return e.controlId||e.controlName||e.name||e.label||`field-${o}`}function h(e){return e.controlName||e.name||""}function b(e){return e.isRequired!==void 0?e.isRequired:e.required||!1}l.watch(()=>s.schema,e=>{const o=[];e.type==="simple"&&e.fields?o.push(...e.fields):e.type==="sectioned"&&e.sections?e.sections.forEach(t=>{t.fields&&o.push(...t.fields)}):e.type==="wizard"&&e.steps&&e.steps.forEach(t=>{t.fields&&o.push(...t.fields)}),o.forEach(t=>{const r=h(t);if(r&&a[r]===void 0)if(d.includes(t.type))a[r]="N";else if(t.type==="radio")a[r]=t.options?.[0]?.value??"";else if(t.type==="select"||t.type==="searchcombo"){const i=t.addAll!==void 0?t.addAll:t.allowAll||!1;a[r]=i?"ALL":"SELECT"}else a[r]=""})},{immediate:!0}),l.watch(a,e=>p("update:modelValue",e),{deep:!0});function N(){p("submit",{...a}),typeof s.schema.events?.onSubmit=="function"&&s.schema.events.onSubmit({...a})}function T(e,o){p("change",{field:e,value:o}),typeof s.schema.events?.onChange=="function"&&s.schema.events.onChange(e,o)}function $(e){p("error",e),typeof s.schema.events?.onError=="function"&&s.schema.events.onError(e)}function f(e){return e.filter(t=>t.isVisible!==!1).sort((t,r)=>{if(t.sortOrder!==void 0&&r.sortOrder!==void 0&&t.sortOrder!==r.sortOrder)return t.sortOrder-r.sortOrder;const i=t.controlName||t.name||t.label||"",g=r.controlName||r.name||r.label||"";return i.localeCompare(g)})}const w=l.computed(()=>{const e=s.schema.globalStyle?.colCount||(s.schema.layout?.columns?`row-${s.schema.layout.columns}`:"row-1"),o=z(e);let t="";switch(e){case"row-1":t=`flex flex-col ${o}`;break;case"row":case"row-2":t=`flex flex-col md:grid md:grid-flow-row md:items-start ${o} md:grid-cols-2 auto-rows-min`;break;case"row-3":t=`flex flex-col md:grid md:grid-flow-row md:items-start ${o} md:grid-cols-2 lg:grid-cols-3 auto-rows-min`;break;case"row-4":t=`flex flex-col md:grid md:grid-flow-row md:items-start ${o} md:grid-cols-2 lg:grid-cols-4 auto-rows-min`;break;case"row-5":t=`flex flex-col md:grid md:grid-flow-row md:items-start ${o} md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-5 auto-rows-min`;break;case"row-6":t=`flex flex-col md:grid md:grid-flow-row md:items-start ${o} md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-6 auto-rows-min`;break;case"row-7":t=`flex flex-col md:grid md:grid-flow-row md:items-start ${o} md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-7 auto-rows-min`;break;case"row-8":t=`flex flex-col md:grid md:grid-flow-row md:items-start ${o} md:grid-cols-2 lg:grid-cols-4 xl:grid-cols-8 auto-rows-min`;break;default:t=`flex flex-col ${o}`}return t});function k(e){return d.includes(e.type)?"min-w-0 w-auto inline-flex items-center":"min-w-0 w-full"}function C(e){switch(e){case"row":case"row-2":return 2;case"row-3":return 3;case"row-4":return 4;case"row-5":return 5;case"row-6":return 6;case"row-7":return 7;case"row-8":return 8;default:return 1}}function z(e){switch(e){case"row-1":return"gap-6";case"row":case"row-2":return"gap-4";case"row-3":return"gap-4";case"row-4":return"gap-3";case"row-5":return"gap-2";case"row-6":return"gap-2";case"row-7":return"gap-2";case"row-8":return"gap-2";default:return"gap-6"}}function v(){const e=s.schema.globalStyle?.colCount||(s.schema.layout?.columns?`row-${s.schema.layout.columns}`:"row-1"),o=C(e);return o>=6?"6rem":o>=5?"7rem":"8rem"}function x(){return s.schema.globalStyle?.labelPosition||"horizontal"}function q(){return s.schema.globalStyle?.labelAlign||"left"}function E(e){const o=s.schema.globalStyle?.colCount||(s.schema.layout?.columns?`row-${s.schema.layout.columns}`:"row-1"),t=C(o);return{gridColumn:`span ${Math.min(t,Math.max(1,e.colSpan||1))}`}}function B(e){const o=h(e),t=e.isDisabled!==void 0?e.isDisabled:e.disabled||!1,r=e.isReadonly!==void 0?e.isReadonly:e.readonly||!1,i=d.includes(e.type)?"inline-flex items-center gap-2 w-auto":"w-full",g=M.resolveGlobalStyle(s.schema.globalStyle),P=s.schema.globalStyle?.colCount||(s.schema.layout?.columns?`row-${s.schema.layout.columns}`:"row-1"),S=C(P);let c=g.controlSize;S>=6||S>=5?c="sm":S>=4&&g.controlSize==="lg"&&(c="md");const m=(n,V)=>{if(o&&(a[o]=V,T(o,V)),e.events?.[n]){const U=e.events[n];console.log(`Event ${n}: Calling handler "${U}" with value:`,V)}};return d.includes(e.type)?{modelValue:a[o]==="Y"?"Y":"N",disabled:t,styleType:c,class:i,"onUpdate:modelValue":n=>{o&&(a[o]=n),m("onChange",n==="Y")}}:e.type==="radio"?{modelValue:String(a[o]??""),options:e.options??[],multiple:e.multiple,disabled:t,styleType:c,class:i,"onUpdate:modelValue":n=>{m("onChange",n)}}:e.type==="select"||e.type==="combo"?{modelValue:String(a[o]??""),options:_(e),multiple:e.multiple,disabled:t,styleType:c,class:i,"onUpdate:modelValue":n=>{m("onChange",n)}}:e.type==="searchcombo"?{modelValue:String(a[o]??""),options:_(e),disabled:t,styleType:c,class:i,"onUpdate:modelValue":n=>{m("onChange",n)}}:e.type==="textarea"?{modelValue:String(a[o]??""),placeholder:e.placeholder??"",disabled:t,readonly:r,styleType:c,class:i,"onUpdate:modelValue":n=>{m("onChange",n)}}:e.type==="datepicker"?{modelValue:String(a[o]??""),placeholder:e.placeholder??"",disabled:t,readonly:r,styleType:c,class:i,"onUpdate:modelValue":n=>{m("onChange",n)}}:{modelValue:String(a[o]??""),inputType:e.inputType||(e.dataType==="number"?"number":"text"),placeholder:e.placeholder??"",disabled:t,readonly:r,styleType:c,class:i,"onUpdate:modelValue":n=>{m("onChange",n)}}}function _(e){const o=e.addAll!==void 0?e.addAll:e.allowAll||!1;return[{value:o?"ALL":"SELECT",label:o?"전체":"선택"},...e.options||[]]}function O(){Object.keys(a).forEach(o=>{delete a[o]});const e=[];s.schema.type==="simple"&&s.schema.fields?e.push(...s.schema.fields):s.schema.type==="sectioned"&&s.schema.sections?s.schema.sections.forEach(o=>{o.fields&&e.push(...o.fields)}):s.schema.type==="wizard"&&s.schema.steps&&s.schema.steps.forEach(o=>{o.fields&&e.push(...o.fields)}),e.forEach(o=>{const t=h(o);if(t)if(d.includes(o.type))a[t]="N";else if(o.type==="radio")a[t]=o.options?.[0]?.value??"";else if(o.type==="select"||o.type==="searchcombo"){const r=o.addAll!==void 0?o.addAll:o.allowAll||!1;a[t]=r?"ALL":"SELECT"}else a[t]=""})}return L({formState:a,submit:N,reset:O,handleError:$}),(e,o)=>(l.openBlock(),l.createElementBlock("form",{onSubmit:l.withModifiers(N,["prevent"]),class:l.normalizeClass(w.value)},[u.schema.type==="simple"?(l.openBlock(!0),l.createElementBlock(l.Fragment,{key:0},l.renderList(f(u.schema.fields||[]),(t,r)=>(l.openBlock(),l.createElementBlock("div",{key:y(t,r),class:l.normalizeClass(k(t)),style:l.normalizeStyle(E(t))},[l.createVNode(l.unref(A.default),l.mergeProps({label:t.label,required:b(t),orientation:x(),labelAlign:q(),labelWidth:v(),type:t.type==="searchcombo"?"searchCombo":t.type,"input-type":t.inputType,description:t.description,"inline-label":t.inlineLabel},{ref_for:!0},B(t)),null,16,["label","required","orientation","labelAlign","labelWidth","type","input-type","description","inline-label"])],6))),128)):u.schema.type==="sectioned"?(l.openBlock(),l.createElementBlock("div",D,[(l.openBlock(!0),l.createElementBlock(l.Fragment,null,l.renderList(u.schema.sections,t=>(l.openBlock(),l.createBlock(l.unref(W.default),{key:t.id,title:t.title,collapsible:t.collapsible,"default-collapsed":t.defaultCollapsed},{default:l.withCtx(()=>[l.createElementVNode("div",{class:l.normalizeClass(w.value)},[(l.openBlock(!0),l.createElementBlock(l.Fragment,null,l.renderList(f(t.fields||[]),(r,i)=>(l.openBlock(),l.createElementBlock("div",{key:y(r,i),class:l.normalizeClass(k(r)),style:l.normalizeStyle(E(r))},[l.createVNode(l.unref(A.default),l.mergeProps({label:r.label,required:b(r),orientation:x(),labelAlign:q(),labelWidth:v(),type:r.type==="searchcombo"?"searchCombo":r.type,"input-type":r.inputType,description:r.description,"inline-label":r.inlineLabel},{ref_for:!0},B(r)),null,16,["label","required","orientation","labelAlign","labelWidth","type","input-type","description","inline-label"])],6))),128))],2)]),_:2},1032,["title","collapsible","default-collapsed"]))),128))])):u.schema.type==="wizard"?(l.openBlock(),l.createElementBlock("div",R,[(l.openBlock(!0),l.createElementBlock(l.Fragment,null,l.renderList(u.schema.steps,t=>(l.openBlock(),l.createElementBlock("div",{key:t.id,class:"p-4 border rounded-xl"},[l.createElementVNode("h3",Y,l.toDisplayString(t.title),1),t.description?(l.openBlock(),l.createElementBlock("p",j,l.toDisplayString(t.description),1)):l.createCommentVNode("",!0),l.createElementVNode("div",{class:l.normalizeClass(w.value)},[(l.openBlock(!0),l.createElementBlock(l.Fragment,null,l.renderList(f(t.fields||[]),(r,i)=>(l.openBlock(),l.createElementBlock("div",{key:y(r,i),class:l.normalizeClass(k(r)),style:l.normalizeStyle(E(r))},[l.createVNode(l.unref(A.default),l.mergeProps({label:r.label,required:b(r),orientation:x(),labelAlign:q(),labelWidth:v(),type:r.type==="searchcombo"?"searchCombo":r.type,"input-type":r.inputType,description:r.description,"inline-label":r.inlineLabel},{ref_for:!0},B(r)),null,16,["label","required","orientation","labelAlign","labelWidth","type","input-type","description","inline-label"])],6))),128))],2)]))),128))])):l.createCommentVNode("",!0)],34))}});exports.default=J;
|
|
2
2
|
//# sourceMappingURL=JDynamicForm.vue2.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JDynamicForm.vue2.cjs","sources":["../../../../src/components/organisms/JDynamicForm.vue"],"sourcesContent":["<template>\n <form @submit.prevent=\"handleSubmit\" :class=\"formClasses\">\n <!-- 🧱 단순형 폼 -->\n <template v-if=\"schema.type === 'simple'\">\n <div\n v-for=\"(field, index) in getOrderedFields(schema.fields || [])\"\n :key=\"getFieldKey(field, index)\"\n :class=\"fieldBaseClass(field)\"\n :style=\"getFieldStyle(field)\"\n >\n <JFormField\n :label=\"field.label\"\n :required=\"getFieldRequired(field)\"\n :orientation=\"getLabelPosition()\"\n :labelAlign=\"getLabelAlign()\"\n :labelWidth=\"getLabelWidth()\"\n :type=\"(field.type === 'searchcombo' ? 'searchCombo' : field.type) as any\"\n :input-type=\"field.inputType\"\n :description=\"field.description\"\n :inline-label=\"field.inlineLabel\"\n v-bind=\"getFieldProps(field)\"\n />\n </div>\n </template>\n\n <!-- 📦 섹션형 폼 -->\n <template v-else-if=\"schema.type === 'sectioned'\">\n <div class=\"space-y-6\">\n <JCard\n v-for=\"section in schema.sections\"\n :key=\"section.id\"\n :title=\"section.title\"\n :collapsible=\"section.collapsible\"\n :default-collapsed=\"section.defaultCollapsed\"\n >\n <div :class=\"formClasses\">\n <div\n v-for=\"(field, index) in getOrderedFields(section.fields || [])\"\n :key=\"getFieldKey(field, index)\"\n :class=\"fieldBaseClass(field)\"\n :style=\"getFieldStyle(field)\"\n >\n <JFormField\n :label=\"field.label\"\n :required=\"getFieldRequired(field)\"\n :orientation=\"getLabelPosition()\"\n :labelAlign=\"getLabelAlign()\"\n :labelWidth=\"getLabelWidth()\"\n :type=\"(field.type === 'searchcombo' ? 'searchCombo' : field.type) as any\"\n :input-type=\"field.inputType\"\n :description=\"field.description\"\n :inline-label=\"field.inlineLabel\"\n v-bind=\"getFieldProps(field)\"\n />\n </div>\n </div>\n </JCard>\n </div>\n </template>\n\n <!-- 🪜 스텝형 (Wizard) -->\n <template v-else-if=\"schema.type === 'wizard'\">\n <div class=\"space-y-4\">\n <div\n v-for=\"step in schema.steps\"\n :key=\"step.id\"\n class=\"p-4 border rounded-xl\"\n >\n <h3 class=\"font-semibold text-lg\">{{ step.title }}</h3>\n <p v-if=\"step.description\" class=\"text-muted-foreground text-sm mb-2\">\n {{ step.description }}\n </p>\n <div :class=\"formClasses\">\n <div\n v-for=\"(field, index) in getOrderedFields(step.fields || [])\"\n :key=\"getFieldKey(field, index)\"\n :class=\"fieldBaseClass(field)\"\n :style=\"getFieldStyle(field)\"\n >\n <JFormField\n :label=\"field.label\"\n :required=\"getFieldRequired(field)\"\n :orientation=\"getLabelPosition()\"\n :labelAlign=\"getLabelAlign()\"\n :labelWidth=\"getLabelWidth()\"\n :type=\"(field.type === 'searchcombo' ? 'searchCombo' : field.type) as any\"\n :input-type=\"field.inputType\"\n :description=\"field.description\"\n :inline-label=\"field.inlineLabel\"\n v-bind=\"getFieldProps(field)\"\n />\n </div>\n </div>\n </div>\n </div>\n </template>\n\n </form>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, reactive, watch } from 'vue';\nimport { JFormField, JCard } from '@/components/molecules';\nimport type { FormSchema, DynamicFormField } from '@/types/dynamic-form';\nimport { resolveGlobalStyle } from '@/lib/styleTypePreset';\n\n// props\nconst props = defineProps<{\n schema: FormSchema;\n modelValue?: Record<string, any>;\n}>();\n\nconst emit = defineEmits(['update:modelValue', 'submit', 'change', 'error']);\n\nconst BOOLEAN_TYPES: Array<DynamicFormField['type']> = ['checkbox', 'switch'];\n\n// 폼 상태 관리\nconst formState = reactive<Record<string, any>>({});\n\n// 초기값 설정\nwatch(\n () => props.modelValue,\n (newValues) => {\n if (newValues) {\n Object.assign(formState, newValues);\n }\n },\n { immediate: true, deep: true }\n);\n\n// 필드 키 가져오기 (controlId > controlName > name > label 순서)\nfunction getFieldKey(field: DynamicFormField, index: number): string {\n return field.controlId || field.controlName || (field as any).name || field.label || `field-${index}`;\n}\n\n// 필드 이름 가져오기 (controlName > name 순서)\nfunction getFieldName(field: DynamicFormField): string {\n return field.controlName || (field as any).name || '';\n}\n\n// 필드 required 가져오기 (isRequired > required 순서)\nfunction getFieldRequired(field: DynamicFormField): boolean {\n return field.isRequired !== undefined ? field.isRequired : ((field as any).required || false);\n}\n\n// 필드 초기화\nwatch(\n () => props.schema,\n (newSchema) => {\n const allFields: DynamicFormField[] = [];\n \n if (newSchema.type === 'simple' && newSchema.fields) {\n allFields.push(...newSchema.fields);\n } else if (newSchema.type === 'sectioned' && newSchema.sections) {\n newSchema.sections.forEach(section => {\n if (section.fields) allFields.push(...section.fields);\n });\n } else if (newSchema.type === 'wizard' && newSchema.steps) {\n newSchema.steps.forEach(step => {\n if (step.fields) allFields.push(...step.fields);\n });\n }\n \n allFields.forEach((field) => {\n const fieldName = getFieldName(field);\n if (fieldName && formState[fieldName] === undefined) {\n if (BOOLEAN_TYPES.includes(field.type)) {\n formState[fieldName] = 'N';\n } else if (field.type === 'radio') {\n formState[fieldName] = field.options?.[0]?.value ?? '';\n } else if (field.type === 'select' || field.type === 'searchcombo') {\n const addAll = field.addAll !== undefined ? field.addAll : ((field as any).allowAll || false);\n formState[fieldName] = addAll ? 'ALL' : 'SELECT';\n } else {\n formState[fieldName] = '';\n }\n }\n });\n },\n { immediate: true }\n);\n\n// 값 변경 감지 → 상위 emit\nwatch(formState, (val) => emit('update:modelValue', val), { deep: true });\n\n// 이벤트 핸들러\nfunction handleSubmit() {\n emit('submit', { ...formState });\n if (typeof props.schema.events?.onSubmit === 'function') {\n props.schema.events.onSubmit({ ...formState });\n }\n}\n\nfunction handleChange(field: string, value: any) {\n emit('change', { field, value });\n if (typeof props.schema.events?.onChange === 'function') {\n props.schema.events.onChange(field, value);\n }\n}\n\nfunction handleError(errs: any) {\n emit('error', errs);\n if (typeof props.schema.events?.onError === 'function') {\n props.schema.events.onError(errs);\n }\n}\n\n// 정렬된 필드 가져오기\nfunction getOrderedFields(fields: DynamicFormField[]): DynamicFormField[] {\n const visibleFields = fields.filter((field) => field.isVisible !== false);\n return visibleFields.sort((a, b) => {\n // sortOrder 기준으로 정렬\n if (a.sortOrder !== undefined && b.sortOrder !== undefined) {\n if (a.sortOrder !== b.sortOrder) {\n return a.sortOrder - b.sortOrder;\n }\n }\n const aName = a.controlName || (a as any).name || a.label || '';\n const bName = b.controlName || (b as any).name || b.label || '';\n return aName.localeCompare(bName);\n });\n}\n\n// 폼 클래스 계산\nconst formClasses = computed(() => {\n const colCount = props.schema.globalStyle?.colCount || \n (props.schema.layout?.columns ? `row-${props.schema.layout.columns}` : 'row-1');\n const gapClass = getGapClass(colCount);\n \n // 반응형: 화면 크기에 따라 열 수 자동 조정\n let classes = '';\n switch (colCount) {\n case 'row-1':\n classes = `flex flex-col ${gapClass}`;\n break;\n case 'row':\n case 'row-2':\n classes = `flex flex-col md:grid md:grid-flow-row md:items-start ${gapClass} md:grid-cols-2 auto-rows-min`;\n break;\n case 'row-3':\n classes = `flex flex-col md:grid md:grid-flow-row md:items-start ${gapClass} md:grid-cols-2 lg:grid-cols-3 auto-rows-min`;\n break;\n case 'row-4':\n classes = `flex flex-col md:grid md:grid-flow-row md:items-start ${gapClass} md:grid-cols-2 lg:grid-cols-4 auto-rows-min`;\n break;\n case 'row-5':\n classes = `flex flex-col md:grid md:grid-flow-row md:items-start ${gapClass} md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-5 auto-rows-min`;\n break;\n case 'row-6':\n classes = `flex flex-col md:grid md:grid-flow-row md:items-start ${gapClass} md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-6 auto-rows-min`;\n break;\n case 'row-7':\n classes = `flex flex-col md:grid md:grid-flow-row md:items-start ${gapClass} md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-7 auto-rows-min`;\n break;\n case 'row-8':\n classes = `flex flex-col md:grid md:grid-flow-row md:items-start ${gapClass} md:grid-cols-2 lg:grid-cols-4 xl:grid-cols-8 auto-rows-min`;\n break;\n default:\n classes = `flex flex-col ${gapClass}`;\n }\n \n return classes;\n});\n\n// 필드 기본 클래스\nfunction fieldBaseClass(field: DynamicFormField): string {\n return BOOLEAN_TYPES.includes(field.type)\n ? 'min-w-0 w-auto inline-flex items-center'\n : 'min-w-0 w-full';\n}\n\n// 최대 열 수 계산\nfunction getMaxCols(colCount?: string): number {\n switch (colCount) {\n case 'row':\n case 'row-2': return 2;\n case 'row-3': return 3;\n case 'row-4': return 4;\n case 'row-5': return 5;\n case 'row-6': return 6;\n case 'row-7': return 7;\n case 'row-8': return 8;\n default: return 1;\n }\n}\n\n// 열 수에 따른 gap 계산\nfunction getGapClass(colCount: string): string {\n switch (colCount) {\n case 'row-1': return 'gap-6';\n case 'row':\n case 'row-2': return 'gap-4';\n case 'row-3': return 'gap-4';\n case 'row-4': return 'gap-3';\n case 'row-5': return 'gap-2';\n case 'row-6': return 'gap-2';\n case 'row-7': return 'gap-2';\n case 'row-8': return 'gap-2';\n default: return 'gap-6';\n }\n}\n\n// 열 수에 따른 라벨 너비 계산\nfunction getLabelWidth(): string {\n const colCount = props.schema.globalStyle?.colCount || \n (props.schema.layout?.columns ? `row-${props.schema.layout.columns}` : 'row-1');\n const maxCols = getMaxCols(colCount);\n if (maxCols >= 6) return '6rem';\n if (maxCols >= 5) return '7rem';\n return '8rem';\n}\n\n// 라벨 위치 가져오기\nfunction getLabelPosition(): 'horizontal' | 'vertical' {\n return props.schema.globalStyle?.labelPosition || 'horizontal';\n}\n\n// 라벨 정렬 가져오기\nfunction getLabelAlign(): 'left' | 'middle' | 'right' {\n return props.schema.globalStyle?.labelAlign || 'left';\n}\n\n// 필드 스타일 계산\nfunction getFieldStyle(field: DynamicFormField): Record<string, string> {\n const colCount = props.schema.globalStyle?.colCount || \n (props.schema.layout?.columns ? `row-${props.schema.layout.columns}` : 'row-1');\n const maxCols = getMaxCols(colCount);\n const span = Math.min(maxCols, Math.max(1, field.colSpan || 1));\n return {\n gridColumn: `span ${span}`\n };\n}\n\n// 필드 props 생성\nfunction getFieldProps(field: DynamicFormField) {\n const fieldName = getFieldName(field);\n const disabled = field.isDisabled !== undefined ? field.isDisabled : ((field as any).disabled || false);\n const readonly = field.isReadonly !== undefined ? field.isReadonly : ((field as any).readonly || false);\n \n // baseClass 조정\n const baseClass = BOOLEAN_TYPES.includes(field.type)\n ? 'inline-flex items-center gap-2 w-auto'\n : 'w-full';\n \n // 전역 스타일 해결\n const resolvedStyle = resolveGlobalStyle(props.schema.globalStyle);\n \n // 열 수에 따라 컨트롤 크기 동적 조정\n const colCount = props.schema.globalStyle?.colCount || \n (props.schema.layout?.columns ? `row-${props.schema.layout.columns}` : 'row-1');\n const maxCols = getMaxCols(colCount);\n let finalSize = resolvedStyle.controlSize;\n \n // 4열 이상일 때 컨트롤 크기를 작게 조정\n if (maxCols >= 6) {\n finalSize = 'sm';\n } else if (maxCols >= 5) {\n finalSize = 'sm';\n } else if (maxCols >= 4) {\n if (resolvedStyle.controlSize === 'lg') {\n finalSize = 'md';\n }\n }\n\n const createEventHandler = (eventType: string, value: any) => {\n if (fieldName) {\n formState[fieldName] = value;\n handleChange(fieldName, value);\n }\n \n if (field.events?.[eventType as keyof typeof field.events]) {\n const handlerName = field.events[eventType as keyof typeof field.events];\n console.log(`Event ${eventType}: Calling handler \"${handlerName}\" with value:`, value);\n }\n };\n\n if (BOOLEAN_TYPES.includes(field.type)) {\n return {\n modelValue: formState[fieldName] === 'Y' ? 'Y' : 'N',\n disabled,\n styleType: finalSize,\n class: baseClass,\n 'onUpdate:modelValue': (value: string) => {\n if (fieldName) {\n formState[fieldName] = value;\n }\n createEventHandler('onChange', value === 'Y');\n }\n };\n }\n\n if (field.type === 'radio') {\n return {\n modelValue: String(formState[fieldName] ?? ''),\n options: field.options ?? [],\n multiple: field.multiple,\n disabled,\n styleType: finalSize,\n class: baseClass,\n 'onUpdate:modelValue': (value: string) => {\n createEventHandler('onChange', value);\n }\n };\n }\n\n if (field.type === 'select' || field.type === 'combo') {\n return {\n modelValue: String(formState[fieldName] ?? ''),\n options: getSelectOptions(field),\n multiple: field.multiple,\n disabled,\n styleType: finalSize,\n class: baseClass,\n 'onUpdate:modelValue': (value: string) => {\n createEventHandler('onChange', value);\n }\n };\n }\n\n if (field.type === 'searchcombo') {\n return {\n modelValue: String(formState[fieldName] ?? ''),\n options: getSelectOptions(field),\n disabled,\n styleType: finalSize,\n class: baseClass,\n 'onUpdate:modelValue': (value: string) => {\n createEventHandler('onChange', value);\n }\n };\n }\n\n if (field.type === 'textarea') {\n return {\n modelValue: String(formState[fieldName] ?? ''),\n placeholder: field.placeholder ?? '',\n disabled,\n readonly,\n styleType: finalSize,\n class: baseClass,\n 'onUpdate:modelValue': (value: string) => {\n createEventHandler('onChange', value);\n }\n };\n }\n\n if (field.type === 'datepicker') {\n return {\n modelValue: String(formState[fieldName] ?? ''),\n placeholder: field.placeholder ?? '',\n disabled,\n readonly,\n styleType: finalSize,\n class: baseClass,\n 'onUpdate:modelValue': (value: string) => {\n createEventHandler('onChange', value);\n }\n };\n }\n\n // 기본 input\n return {\n modelValue: String(formState[fieldName] ?? ''),\n inputType: field.inputType || (field.dataType === 'number' ? 'number' : 'text'),\n placeholder: field.placeholder ?? '',\n disabled,\n readonly,\n styleType: finalSize,\n class: baseClass,\n 'onUpdate:modelValue': (value: string | number) => {\n createEventHandler('onChange', value);\n }\n };\n}\n\n// Select 옵션 생성\nfunction getSelectOptions(field: DynamicFormField) {\n const addAll = field.addAll !== undefined ? field.addAll : ((field as any).allowAll || false);\n const defaultOption = {\n value: addAll ? 'ALL' : 'SELECT',\n label: addAll ? '전체' : '선택'\n };\n return [defaultOption, ...(field.options || [])];\n}\n\n// 폼 리셋\nfunction reset() {\n Object.keys(formState).forEach(key => {\n delete formState[key];\n });\n \n // 모든 필드 수집\n const allFields: DynamicFormField[] = [];\n \n if (props.schema.type === 'simple' && props.schema.fields) {\n allFields.push(...props.schema.fields);\n } else if (props.schema.type === 'sectioned' && props.schema.sections) {\n props.schema.sections.forEach(section => {\n if (section.fields) allFields.push(...section.fields);\n });\n } else if (props.schema.type === 'wizard' && props.schema.steps) {\n props.schema.steps.forEach(step => {\n if (step.fields) allFields.push(...step.fields);\n });\n }\n \n // 초기값으로 재설정\n allFields.forEach((field) => {\n const fieldName = getFieldName(field);\n if (fieldName) {\n if (BOOLEAN_TYPES.includes(field.type)) {\n formState[fieldName] = 'N';\n } else if (field.type === 'radio') {\n formState[fieldName] = field.options?.[0]?.value ?? '';\n } else if (field.type === 'select' || field.type === 'searchcombo') {\n const addAll = field.addAll !== undefined ? field.addAll : ((field as any).allowAll || false);\n formState[fieldName] = addAll ? 'ALL' : 'SELECT';\n } else {\n formState[fieldName] = '';\n }\n }\n });\n}\n\n// 폼 상태 노출\ndefineExpose({\n formState,\n submit: handleSubmit,\n reset,\n handleError\n});\n</script>\n\n<style scoped>\nform {\n width: 100%;\n}\n</style>\n"],"names":["props","__props","emit","__emit","BOOLEAN_TYPES","formState","reactive","watch","newValues","getFieldKey","field","index","getFieldName","getFieldRequired","newSchema","allFields","section","step","fieldName","addAll","val","handleSubmit","handleChange","value","handleError","errs","getOrderedFields","fields","a","b","aName","bName","formClasses","computed","colCount","gapClass","getGapClass","classes","fieldBaseClass","getMaxCols","getLabelWidth","maxCols","getLabelPosition","getLabelAlign","getFieldStyle","getFieldProps","disabled","readonly","baseClass","resolvedStyle","resolveGlobalStyle","finalSize","createEventHandler","eventType","handlerName","getSelectOptions","reset","key","__expose","_createElementBlock","_Fragment","_renderList","_normalizeClass","_normalizeStyle","_createVNode","_unref","_mergeProps","_openBlock","_hoisted_1","_createBlock","JCard","_createElementVNode","_hoisted_2","_hoisted_3","_toDisplayString","_hoisted_4"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"JDynamicForm.vue2.cjs","sources":["../../../../src/components/organisms/JDynamicForm.vue"],"sourcesContent":["<template>\n <form @submit.prevent=\"handleSubmit\" :class=\"formClasses\">\n <!-- 🧱 단순형 폼 -->\n <template v-if=\"schema.type === 'simple'\">\n <div\n v-for=\"(field, index) in getOrderedFields(schema.fields || [])\"\n :key=\"getFieldKey(field, index)\"\n :class=\"fieldBaseClass(field)\"\n :style=\"getFieldStyle(field)\"\n >\n <JFormField\n :label=\"field.label\"\n :required=\"getFieldRequired(field)\"\n :orientation=\"getLabelPosition()\"\n :labelAlign=\"getLabelAlign()\"\n :labelWidth=\"getLabelWidth()\"\n :type=\"(field.type === 'searchcombo' ? 'searchCombo' : field.type) as any\"\n :input-type=\"field.inputType\"\n :description=\"field.description\"\n :inline-label=\"field.inlineLabel\"\n v-bind=\"getFieldProps(field)\"\n />\n </div>\n </template>\n\n <!-- 📦 섹션형 폼 -->\n <template v-else-if=\"schema.type === 'sectioned'\">\n <div class=\"space-y-6\">\n <JCard\n v-for=\"section in schema.sections\"\n :key=\"section.id\"\n :title=\"section.title\"\n :collapsible=\"section.collapsible\"\n :default-collapsed=\"section.defaultCollapsed\"\n >\n <div :class=\"formClasses\">\n <div\n v-for=\"(field, index) in getOrderedFields(section.fields || [])\"\n :key=\"getFieldKey(field, index)\"\n :class=\"fieldBaseClass(field)\"\n :style=\"getFieldStyle(field)\"\n >\n <JFormField\n :label=\"field.label\"\n :required=\"getFieldRequired(field)\"\n :orientation=\"getLabelPosition()\"\n :labelAlign=\"getLabelAlign()\"\n :labelWidth=\"getLabelWidth()\"\n :type=\"(field.type === 'searchcombo' ? 'searchCombo' : field.type) as any\"\n :input-type=\"field.inputType\"\n :description=\"field.description\"\n :inline-label=\"field.inlineLabel\"\n v-bind=\"getFieldProps(field)\"\n />\n </div>\n </div>\n </JCard>\n </div>\n </template>\n\n <!-- 🪜 스텝형 (Wizard) -->\n <template v-else-if=\"schema.type === 'wizard'\">\n <div class=\"space-y-4\">\n <div\n v-for=\"step in schema.steps\"\n :key=\"step.id\"\n class=\"p-4 border rounded-xl\"\n >\n <h3 class=\"font-semibold text-lg\">{{ step.title }}</h3>\n <p v-if=\"step.description\" class=\"text-muted-foreground text-sm mb-2\">\n {{ step.description }}\n </p>\n <div :class=\"formClasses\">\n <div\n v-for=\"(field, index) in getOrderedFields(step.fields || [])\"\n :key=\"getFieldKey(field, index)\"\n :class=\"fieldBaseClass(field)\"\n :style=\"getFieldStyle(field)\"\n >\n <JFormField\n :label=\"field.label\"\n :required=\"getFieldRequired(field)\"\n :orientation=\"getLabelPosition()\"\n :labelAlign=\"getLabelAlign()\"\n :labelWidth=\"getLabelWidth()\"\n :type=\"(field.type === 'searchcombo' ? 'searchCombo' : field.type) as any\"\n :input-type=\"field.inputType\"\n :description=\"field.description\"\n :inline-label=\"field.inlineLabel\"\n v-bind=\"getFieldProps(field)\"\n />\n </div>\n </div>\n </div>\n </div>\n </template>\n\n </form>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, reactive, watch } from 'vue';\nimport { JFormField, JCard } from '@/components/molecules';\nimport type { FormSchema, DynamicFormField } from '@/types/dynamic-form';\nimport { resolveGlobalStyle } from '@/lib/styleTypePreset';\n\n// props\nconst props = defineProps<{\n schema: FormSchema;\n modelValue?: Record<string, any>;\n}>();\n\nconst emit = defineEmits(['update:modelValue', 'submit', 'change', 'error']);\n\nconst BOOLEAN_TYPES: Array<DynamicFormField['type']> = ['checkbox', 'switch'];\n\n// 폼 상태 관리\nconst formState = reactive<Record<string, any>>({});\n\n// 초기값 설정\nwatch(\n () => props.modelValue,\n (newValues) => {\n if (newValues) {\n Object.assign(formState, newValues);\n }\n },\n { immediate: true, deep: true }\n);\n\n// 필드 키 가져오기 (controlId > controlName > name > label 순서)\nfunction getFieldKey(field: DynamicFormField, index: number): string {\n return field.controlId || field.controlName || (field as any).name || field.label || `field-${index}`;\n}\n\n// 필드 이름 가져오기 (controlName > name 순서)\nfunction getFieldName(field: DynamicFormField): string {\n return field.controlName || (field as any).name || '';\n}\n\n// 필드 required 가져오기 (isRequired > required 순서)\nfunction getFieldRequired(field: DynamicFormField): boolean {\n return field.isRequired !== undefined ? field.isRequired : ((field as any).required || false);\n}\n\n// 필드 초기화\nwatch(\n () => props.schema,\n (newSchema) => {\n const allFields: DynamicFormField[] = [];\n \n if (newSchema.type === 'simple' && newSchema.fields) {\n allFields.push(...newSchema.fields);\n } else if (newSchema.type === 'sectioned' && newSchema.sections) {\n newSchema.sections.forEach(section => {\n if (section.fields) allFields.push(...section.fields);\n });\n } else if (newSchema.type === 'wizard' && newSchema.steps) {\n newSchema.steps.forEach(step => {\n if (step.fields) allFields.push(...step.fields);\n });\n }\n \n allFields.forEach((field) => {\n const fieldName = getFieldName(field);\n if (fieldName && formState[fieldName] === undefined) {\n if (BOOLEAN_TYPES.includes(field.type)) {\n formState[fieldName] = 'N';\n } else if (field.type === 'radio') {\n formState[fieldName] = field.options?.[0]?.value ?? '';\n } else if (field.type === 'select' || field.type === 'searchcombo') {\n const addAll = field.addAll !== undefined ? field.addAll : ((field as any).allowAll || false);\n formState[fieldName] = addAll ? 'ALL' : 'SELECT';\n } else {\n formState[fieldName] = '';\n }\n }\n });\n },\n { immediate: true }\n);\n\n// 값 변경 감지 → 상위 emit\nwatch(formState, (val) => emit('update:modelValue', val), { deep: true });\n\n// 이벤트 핸들러\nfunction handleSubmit() {\n emit('submit', { ...formState });\n if (typeof props.schema.events?.onSubmit === 'function') {\n props.schema.events.onSubmit({ ...formState });\n }\n}\n\nfunction handleChange(field: string, value: any) {\n emit('change', { field, value });\n if (typeof props.schema.events?.onChange === 'function') {\n props.schema.events.onChange(field, value);\n }\n}\n\nfunction handleError(errs: any) {\n emit('error', errs);\n if (typeof props.schema.events?.onError === 'function') {\n props.schema.events.onError(errs);\n }\n}\n\n// 정렬된 필드 가져오기\nfunction getOrderedFields(fields: DynamicFormField[]): DynamicFormField[] {\n const visibleFields = fields.filter((field) => field.isVisible !== false);\n return visibleFields.sort((a, b) => {\n // sortOrder 기준으로 정렬\n if (a.sortOrder !== undefined && b.sortOrder !== undefined) {\n if (a.sortOrder !== b.sortOrder) {\n return a.sortOrder - b.sortOrder;\n }\n }\n const aName = a.controlName || (a as any).name || a.label || '';\n const bName = b.controlName || (b as any).name || b.label || '';\n return aName.localeCompare(bName);\n });\n}\n\n// 폼 클래스 계산\nconst formClasses = computed(() => {\n const colCount = props.schema.globalStyle?.colCount || \n (props.schema.layout?.columns ? `row-${props.schema.layout.columns}` : 'row-1');\n const gapClass = getGapClass(colCount);\n \n // 반응형: 화면 크기에 따라 열 수 자동 조정\n let classes = '';\n switch (colCount) {\n case 'row-1':\n classes = `flex flex-col ${gapClass}`;\n break;\n case 'row':\n case 'row-2':\n classes = `flex flex-col md:grid md:grid-flow-row md:items-start ${gapClass} md:grid-cols-2 auto-rows-min`;\n break;\n case 'row-3':\n classes = `flex flex-col md:grid md:grid-flow-row md:items-start ${gapClass} md:grid-cols-2 lg:grid-cols-3 auto-rows-min`;\n break;\n case 'row-4':\n classes = `flex flex-col md:grid md:grid-flow-row md:items-start ${gapClass} md:grid-cols-2 lg:grid-cols-4 auto-rows-min`;\n break;\n case 'row-5':\n classes = `flex flex-col md:grid md:grid-flow-row md:items-start ${gapClass} md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-5 auto-rows-min`;\n break;\n case 'row-6':\n classes = `flex flex-col md:grid md:grid-flow-row md:items-start ${gapClass} md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-6 auto-rows-min`;\n break;\n case 'row-7':\n classes = `flex flex-col md:grid md:grid-flow-row md:items-start ${gapClass} md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-7 auto-rows-min`;\n break;\n case 'row-8':\n classes = `flex flex-col md:grid md:grid-flow-row md:items-start ${gapClass} md:grid-cols-2 lg:grid-cols-4 xl:grid-cols-8 auto-rows-min`;\n break;\n default:\n classes = `flex flex-col ${gapClass}`;\n }\n \n return classes;\n});\n\n// 필드 기본 클래스\nfunction fieldBaseClass(field: DynamicFormField): string {\n return BOOLEAN_TYPES.includes(field.type)\n ? 'min-w-0 w-auto inline-flex items-center'\n : 'min-w-0 w-full';\n}\n\n// 최대 열 수 계산\nfunction getMaxCols(colCount?: string): number {\n switch (colCount) {\n case 'row':\n case 'row-2': return 2;\n case 'row-3': return 3;\n case 'row-4': return 4;\n case 'row-5': return 5;\n case 'row-6': return 6;\n case 'row-7': return 7;\n case 'row-8': return 8;\n default: return 1;\n }\n}\n\n// 열 수에 따른 gap 계산\nfunction getGapClass(colCount: string): string {\n switch (colCount) {\n case 'row-1': return 'gap-6';\n case 'row':\n case 'row-2': return 'gap-4';\n case 'row-3': return 'gap-4';\n case 'row-4': return 'gap-3';\n case 'row-5': return 'gap-2';\n case 'row-6': return 'gap-2';\n case 'row-7': return 'gap-2';\n case 'row-8': return 'gap-2';\n default: return 'gap-6';\n }\n}\n\n// 열 수에 따른 라벨 너비 계산\nfunction getLabelWidth(): string {\n const colCount = props.schema.globalStyle?.colCount || \n (props.schema.layout?.columns ? `row-${props.schema.layout.columns}` : 'row-1');\n const maxCols = getMaxCols(colCount);\n if (maxCols >= 6) return '6rem';\n if (maxCols >= 5) return '7rem';\n return '8rem';\n}\n\n// 라벨 위치 가져오기\nfunction getLabelPosition(): 'horizontal' | 'vertical' {\n return props.schema.globalStyle?.labelPosition || 'horizontal';\n}\n\n// 라벨 정렬 가져오기\nfunction getLabelAlign(): 'left' | 'middle' | 'right' {\n return props.schema.globalStyle?.labelAlign || 'left';\n}\n\n// 필드 스타일 계산\nfunction getFieldStyle(field: DynamicFormField): Record<string, string> {\n const colCount = props.schema.globalStyle?.colCount || \n (props.schema.layout?.columns ? `row-${props.schema.layout.columns}` : 'row-1');\n const maxCols = getMaxCols(colCount);\n const span = Math.min(maxCols, Math.max(1, field.colSpan || 1));\n return {\n gridColumn: `span ${span}`\n };\n}\n\n// 필드 props 생성\nfunction getFieldProps(field: DynamicFormField) {\n const fieldName = getFieldName(field);\n const disabled = field.isDisabled !== undefined ? field.isDisabled : ((field as any).disabled || false);\n const readonly = field.isReadonly !== undefined ? field.isReadonly : ((field as any).readonly || false);\n \n // baseClass 조정\n const baseClass = BOOLEAN_TYPES.includes(field.type)\n ? 'inline-flex items-center gap-2 w-auto'\n : 'w-full';\n \n // 전역 스타일 해결\n const resolvedStyle = resolveGlobalStyle(props.schema.globalStyle);\n \n // 열 수에 따라 컨트롤 크기 동적 조정\n const colCount = props.schema.globalStyle?.colCount || \n (props.schema.layout?.columns ? `row-${props.schema.layout.columns}` : 'row-1');\n const maxCols = getMaxCols(colCount);\n let finalSize = resolvedStyle.controlSize;\n \n // 4열 이상일 때 컨트롤 크기를 작게 조정\n if (maxCols >= 6) {\n finalSize = 'sm';\n } else if (maxCols >= 5) {\n finalSize = 'sm';\n } else if (maxCols >= 4) {\n if (resolvedStyle.controlSize === 'lg') {\n finalSize = 'md';\n }\n }\n\n const createEventHandler = (eventType: string, value: any) => {\n if (fieldName) {\n formState[fieldName] = value;\n handleChange(fieldName, value);\n }\n \n if (field.events?.[eventType as keyof typeof field.events]) {\n const handlerName = field.events[eventType as keyof typeof field.events];\n console.log(`Event ${eventType}: Calling handler \"${handlerName}\" with value:`, value);\n }\n };\n\n if (BOOLEAN_TYPES.includes(field.type)) {\n return {\n modelValue: formState[fieldName] === 'Y' ? 'Y' : 'N',\n disabled,\n styleType: finalSize,\n class: baseClass,\n 'onUpdate:modelValue': (value: string) => {\n if (fieldName) {\n formState[fieldName] = value;\n }\n createEventHandler('onChange', value === 'Y');\n }\n };\n }\n\n if (field.type === 'radio') {\n return {\n modelValue: String(formState[fieldName] ?? ''),\n options: field.options ?? [],\n multiple: field.multiple,\n disabled,\n styleType: finalSize,\n class: baseClass,\n 'onUpdate:modelValue': (value: string) => {\n createEventHandler('onChange', value);\n }\n };\n }\n\n if (field.type === 'select' || field.type === 'combo') {\n return {\n modelValue: String(formState[fieldName] ?? ''),\n options: getSelectOptions(field),\n multiple: field.multiple,\n disabled,\n styleType: finalSize,\n class: baseClass,\n 'onUpdate:modelValue': (value: string) => {\n createEventHandler('onChange', value);\n }\n };\n }\n\n if (field.type === 'searchcombo') {\n return {\n modelValue: String(formState[fieldName] ?? ''),\n options: getSelectOptions(field),\n disabled,\n styleType: finalSize,\n class: baseClass,\n 'onUpdate:modelValue': (value: string) => {\n createEventHandler('onChange', value);\n }\n };\n }\n\n if (field.type === 'textarea') {\n return {\n modelValue: String(formState[fieldName] ?? ''),\n placeholder: field.placeholder ?? '',\n disabled,\n readonly,\n styleType: finalSize,\n class: baseClass,\n 'onUpdate:modelValue': (value: string) => {\n createEventHandler('onChange', value);\n }\n };\n }\n\n if (field.type === 'datepicker') {\n return {\n modelValue: String(formState[fieldName] ?? ''),\n placeholder: field.placeholder ?? '',\n disabled,\n readonly,\n styleType: finalSize,\n class: baseClass,\n 'onUpdate:modelValue': (value: string) => {\n createEventHandler('onChange', value);\n }\n };\n }\n\n // 기본 input\n return {\n modelValue: String(formState[fieldName] ?? ''),\n inputType: field.inputType || (field.dataType === 'number' ? 'number' : 'text'),\n placeholder: field.placeholder ?? '',\n disabled,\n readonly,\n styleType: finalSize,\n class: baseClass,\n 'onUpdate:modelValue': (value: string | number) => {\n createEventHandler('onChange', value);\n }\n };\n}\n\n// Select 옵션 생성\nfunction getSelectOptions(field: DynamicFormField) {\n const addAll = field.addAll !== undefined ? field.addAll : ((field as any).allowAll || false);\n const defaultOption = {\n value: addAll ? 'ALL' : 'SELECT',\n label: addAll ? '전체' : '선택'\n };\n return [defaultOption, ...(field.options || [])];\n}\n\n// 폼 리셋\nfunction reset() {\n Object.keys(formState).forEach(key => {\n delete formState[key];\n });\n \n // 모든 필드 수집\n const allFields: DynamicFormField[] = [];\n \n if (props.schema.type === 'simple' && props.schema.fields) {\n allFields.push(...props.schema.fields);\n } else if (props.schema.type === 'sectioned' && props.schema.sections) {\n props.schema.sections.forEach(section => {\n if (section.fields) allFields.push(...section.fields);\n });\n } else if (props.schema.type === 'wizard' && props.schema.steps) {\n props.schema.steps.forEach(step => {\n if (step.fields) allFields.push(...step.fields);\n });\n }\n \n // 초기값으로 재설정\n allFields.forEach((field) => {\n const fieldName = getFieldName(field);\n if (fieldName) {\n if (BOOLEAN_TYPES.includes(field.type)) {\n formState[fieldName] = 'N';\n } else if (field.type === 'radio') {\n formState[fieldName] = field.options?.[0]?.value ?? '';\n } else if (field.type === 'select' || field.type === 'searchcombo') {\n const addAll = field.addAll !== undefined ? field.addAll : ((field as any).allowAll || false);\n formState[fieldName] = addAll ? 'ALL' : 'SELECT';\n } else {\n formState[fieldName] = '';\n }\n }\n });\n}\n\n// 폼 상태 노출\ndefineExpose({\n formState,\n submit: handleSubmit,\n reset,\n handleError\n});\n</script>\n\n<style scoped>\nform {\n width: 100%;\n}\n</style>\n"],"names":["props","__props","emit","__emit","BOOLEAN_TYPES","formState","reactive","watch","newValues","getFieldKey","field","index","getFieldName","getFieldRequired","newSchema","allFields","section","step","fieldName","addAll","val","handleSubmit","handleChange","value","handleError","errs","getOrderedFields","fields","a","b","aName","bName","formClasses","computed","colCount","gapClass","getGapClass","classes","fieldBaseClass","getMaxCols","getLabelWidth","maxCols","getLabelPosition","getLabelAlign","getFieldStyle","getFieldProps","disabled","readonly","baseClass","resolvedStyle","resolveGlobalStyle","finalSize","createEventHandler","eventType","handlerName","getSelectOptions","reset","key","__expose","_createElementBlock","_Fragment","_renderList","_normalizeClass","_normalizeStyle","_createVNode","_unref","_mergeProps","_openBlock","_hoisted_1","_createBlock","JCard","_createElementVNode","_hoisted_2","_hoisted_3","_toDisplayString","_hoisted_4"],"mappings":"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"}
|
|
@@ -22,6 +22,7 @@ import "ag-grid-enterprise";
|
|
|
22
22
|
/* empty css */
|
|
23
23
|
/* empty css */
|
|
24
24
|
/* empty css */
|
|
25
|
+
import "vue-sonner";
|
|
25
26
|
import { resolveGlobalStyle as se } from "../../lib/styleTypePreset.js";
|
|
26
27
|
const ae = {
|
|
27
28
|
key: 1,
|
|
@@ -32,7 +33,7 @@ const ae = {
|
|
|
32
33
|
}, ie = { class: "font-semibold text-lg" }, ce = {
|
|
33
34
|
key: 0,
|
|
34
35
|
class: "text-muted-foreground text-sm mb-2"
|
|
35
|
-
},
|
|
36
|
+
}, ze = /* @__PURE__ */ X({
|
|
36
37
|
__name: "JDynamicForm",
|
|
37
38
|
props: {
|
|
38
39
|
schema: {},
|
|
@@ -396,6 +397,6 @@ const ae = {
|
|
|
396
397
|
}
|
|
397
398
|
});
|
|
398
399
|
export {
|
|
399
|
-
|
|
400
|
+
ze as default
|
|
400
401
|
};
|
|
401
402
|
//# sourceMappingURL=JDynamicForm.vue2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JDynamicForm.vue2.js","sources":["../../../../src/components/organisms/JDynamicForm.vue"],"sourcesContent":["<template>\n <form @submit.prevent=\"handleSubmit\" :class=\"formClasses\">\n <!-- 🧱 단순형 폼 -->\n <template v-if=\"schema.type === 'simple'\">\n <div\n v-for=\"(field, index) in getOrderedFields(schema.fields || [])\"\n :key=\"getFieldKey(field, index)\"\n :class=\"fieldBaseClass(field)\"\n :style=\"getFieldStyle(field)\"\n >\n <JFormField\n :label=\"field.label\"\n :required=\"getFieldRequired(field)\"\n :orientation=\"getLabelPosition()\"\n :labelAlign=\"getLabelAlign()\"\n :labelWidth=\"getLabelWidth()\"\n :type=\"(field.type === 'searchcombo' ? 'searchCombo' : field.type) as any\"\n :input-type=\"field.inputType\"\n :description=\"field.description\"\n :inline-label=\"field.inlineLabel\"\n v-bind=\"getFieldProps(field)\"\n />\n </div>\n </template>\n\n <!-- 📦 섹션형 폼 -->\n <template v-else-if=\"schema.type === 'sectioned'\">\n <div class=\"space-y-6\">\n <JCard\n v-for=\"section in schema.sections\"\n :key=\"section.id\"\n :title=\"section.title\"\n :collapsible=\"section.collapsible\"\n :default-collapsed=\"section.defaultCollapsed\"\n >\n <div :class=\"formClasses\">\n <div\n v-for=\"(field, index) in getOrderedFields(section.fields || [])\"\n :key=\"getFieldKey(field, index)\"\n :class=\"fieldBaseClass(field)\"\n :style=\"getFieldStyle(field)\"\n >\n <JFormField\n :label=\"field.label\"\n :required=\"getFieldRequired(field)\"\n :orientation=\"getLabelPosition()\"\n :labelAlign=\"getLabelAlign()\"\n :labelWidth=\"getLabelWidth()\"\n :type=\"(field.type === 'searchcombo' ? 'searchCombo' : field.type) as any\"\n :input-type=\"field.inputType\"\n :description=\"field.description\"\n :inline-label=\"field.inlineLabel\"\n v-bind=\"getFieldProps(field)\"\n />\n </div>\n </div>\n </JCard>\n </div>\n </template>\n\n <!-- 🪜 스텝형 (Wizard) -->\n <template v-else-if=\"schema.type === 'wizard'\">\n <div class=\"space-y-4\">\n <div\n v-for=\"step in schema.steps\"\n :key=\"step.id\"\n class=\"p-4 border rounded-xl\"\n >\n <h3 class=\"font-semibold text-lg\">{{ step.title }}</h3>\n <p v-if=\"step.description\" class=\"text-muted-foreground text-sm mb-2\">\n {{ step.description }}\n </p>\n <div :class=\"formClasses\">\n <div\n v-for=\"(field, index) in getOrderedFields(step.fields || [])\"\n :key=\"getFieldKey(field, index)\"\n :class=\"fieldBaseClass(field)\"\n :style=\"getFieldStyle(field)\"\n >\n <JFormField\n :label=\"field.label\"\n :required=\"getFieldRequired(field)\"\n :orientation=\"getLabelPosition()\"\n :labelAlign=\"getLabelAlign()\"\n :labelWidth=\"getLabelWidth()\"\n :type=\"(field.type === 'searchcombo' ? 'searchCombo' : field.type) as any\"\n :input-type=\"field.inputType\"\n :description=\"field.description\"\n :inline-label=\"field.inlineLabel\"\n v-bind=\"getFieldProps(field)\"\n />\n </div>\n </div>\n </div>\n </div>\n </template>\n\n </form>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, reactive, watch } from 'vue';\nimport { JFormField, JCard } from '@/components/molecules';\nimport type { FormSchema, DynamicFormField } from '@/types/dynamic-form';\nimport { resolveGlobalStyle } from '@/lib/styleTypePreset';\n\n// props\nconst props = defineProps<{\n schema: FormSchema;\n modelValue?: Record<string, any>;\n}>();\n\nconst emit = defineEmits(['update:modelValue', 'submit', 'change', 'error']);\n\nconst BOOLEAN_TYPES: Array<DynamicFormField['type']> = ['checkbox', 'switch'];\n\n// 폼 상태 관리\nconst formState = reactive<Record<string, any>>({});\n\n// 초기값 설정\nwatch(\n () => props.modelValue,\n (newValues) => {\n if (newValues) {\n Object.assign(formState, newValues);\n }\n },\n { immediate: true, deep: true }\n);\n\n// 필드 키 가져오기 (controlId > controlName > name > label 순서)\nfunction getFieldKey(field: DynamicFormField, index: number): string {\n return field.controlId || field.controlName || (field as any).name || field.label || `field-${index}`;\n}\n\n// 필드 이름 가져오기 (controlName > name 순서)\nfunction getFieldName(field: DynamicFormField): string {\n return field.controlName || (field as any).name || '';\n}\n\n// 필드 required 가져오기 (isRequired > required 순서)\nfunction getFieldRequired(field: DynamicFormField): boolean {\n return field.isRequired !== undefined ? field.isRequired : ((field as any).required || false);\n}\n\n// 필드 초기화\nwatch(\n () => props.schema,\n (newSchema) => {\n const allFields: DynamicFormField[] = [];\n \n if (newSchema.type === 'simple' && newSchema.fields) {\n allFields.push(...newSchema.fields);\n } else if (newSchema.type === 'sectioned' && newSchema.sections) {\n newSchema.sections.forEach(section => {\n if (section.fields) allFields.push(...section.fields);\n });\n } else if (newSchema.type === 'wizard' && newSchema.steps) {\n newSchema.steps.forEach(step => {\n if (step.fields) allFields.push(...step.fields);\n });\n }\n \n allFields.forEach((field) => {\n const fieldName = getFieldName(field);\n if (fieldName && formState[fieldName] === undefined) {\n if (BOOLEAN_TYPES.includes(field.type)) {\n formState[fieldName] = 'N';\n } else if (field.type === 'radio') {\n formState[fieldName] = field.options?.[0]?.value ?? '';\n } else if (field.type === 'select' || field.type === 'searchcombo') {\n const addAll = field.addAll !== undefined ? field.addAll : ((field as any).allowAll || false);\n formState[fieldName] = addAll ? 'ALL' : 'SELECT';\n } else {\n formState[fieldName] = '';\n }\n }\n });\n },\n { immediate: true }\n);\n\n// 값 변경 감지 → 상위 emit\nwatch(formState, (val) => emit('update:modelValue', val), { deep: true });\n\n// 이벤트 핸들러\nfunction handleSubmit() {\n emit('submit', { ...formState });\n if (typeof props.schema.events?.onSubmit === 'function') {\n props.schema.events.onSubmit({ ...formState });\n }\n}\n\nfunction handleChange(field: string, value: any) {\n emit('change', { field, value });\n if (typeof props.schema.events?.onChange === 'function') {\n props.schema.events.onChange(field, value);\n }\n}\n\nfunction handleError(errs: any) {\n emit('error', errs);\n if (typeof props.schema.events?.onError === 'function') {\n props.schema.events.onError(errs);\n }\n}\n\n// 정렬된 필드 가져오기\nfunction getOrderedFields(fields: DynamicFormField[]): DynamicFormField[] {\n const visibleFields = fields.filter((field) => field.isVisible !== false);\n return visibleFields.sort((a, b) => {\n // sortOrder 기준으로 정렬\n if (a.sortOrder !== undefined && b.sortOrder !== undefined) {\n if (a.sortOrder !== b.sortOrder) {\n return a.sortOrder - b.sortOrder;\n }\n }\n const aName = a.controlName || (a as any).name || a.label || '';\n const bName = b.controlName || (b as any).name || b.label || '';\n return aName.localeCompare(bName);\n });\n}\n\n// 폼 클래스 계산\nconst formClasses = computed(() => {\n const colCount = props.schema.globalStyle?.colCount || \n (props.schema.layout?.columns ? `row-${props.schema.layout.columns}` : 'row-1');\n const gapClass = getGapClass(colCount);\n \n // 반응형: 화면 크기에 따라 열 수 자동 조정\n let classes = '';\n switch (colCount) {\n case 'row-1':\n classes = `flex flex-col ${gapClass}`;\n break;\n case 'row':\n case 'row-2':\n classes = `flex flex-col md:grid md:grid-flow-row md:items-start ${gapClass} md:grid-cols-2 auto-rows-min`;\n break;\n case 'row-3':\n classes = `flex flex-col md:grid md:grid-flow-row md:items-start ${gapClass} md:grid-cols-2 lg:grid-cols-3 auto-rows-min`;\n break;\n case 'row-4':\n classes = `flex flex-col md:grid md:grid-flow-row md:items-start ${gapClass} md:grid-cols-2 lg:grid-cols-4 auto-rows-min`;\n break;\n case 'row-5':\n classes = `flex flex-col md:grid md:grid-flow-row md:items-start ${gapClass} md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-5 auto-rows-min`;\n break;\n case 'row-6':\n classes = `flex flex-col md:grid md:grid-flow-row md:items-start ${gapClass} md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-6 auto-rows-min`;\n break;\n case 'row-7':\n classes = `flex flex-col md:grid md:grid-flow-row md:items-start ${gapClass} md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-7 auto-rows-min`;\n break;\n case 'row-8':\n classes = `flex flex-col md:grid md:grid-flow-row md:items-start ${gapClass} md:grid-cols-2 lg:grid-cols-4 xl:grid-cols-8 auto-rows-min`;\n break;\n default:\n classes = `flex flex-col ${gapClass}`;\n }\n \n return classes;\n});\n\n// 필드 기본 클래스\nfunction fieldBaseClass(field: DynamicFormField): string {\n return BOOLEAN_TYPES.includes(field.type)\n ? 'min-w-0 w-auto inline-flex items-center'\n : 'min-w-0 w-full';\n}\n\n// 최대 열 수 계산\nfunction getMaxCols(colCount?: string): number {\n switch (colCount) {\n case 'row':\n case 'row-2': return 2;\n case 'row-3': return 3;\n case 'row-4': return 4;\n case 'row-5': return 5;\n case 'row-6': return 6;\n case 'row-7': return 7;\n case 'row-8': return 8;\n default: return 1;\n }\n}\n\n// 열 수에 따른 gap 계산\nfunction getGapClass(colCount: string): string {\n switch (colCount) {\n case 'row-1': return 'gap-6';\n case 'row':\n case 'row-2': return 'gap-4';\n case 'row-3': return 'gap-4';\n case 'row-4': return 'gap-3';\n case 'row-5': return 'gap-2';\n case 'row-6': return 'gap-2';\n case 'row-7': return 'gap-2';\n case 'row-8': return 'gap-2';\n default: return 'gap-6';\n }\n}\n\n// 열 수에 따른 라벨 너비 계산\nfunction getLabelWidth(): string {\n const colCount = props.schema.globalStyle?.colCount || \n (props.schema.layout?.columns ? `row-${props.schema.layout.columns}` : 'row-1');\n const maxCols = getMaxCols(colCount);\n if (maxCols >= 6) return '6rem';\n if (maxCols >= 5) return '7rem';\n return '8rem';\n}\n\n// 라벨 위치 가져오기\nfunction getLabelPosition(): 'horizontal' | 'vertical' {\n return props.schema.globalStyle?.labelPosition || 'horizontal';\n}\n\n// 라벨 정렬 가져오기\nfunction getLabelAlign(): 'left' | 'middle' | 'right' {\n return props.schema.globalStyle?.labelAlign || 'left';\n}\n\n// 필드 스타일 계산\nfunction getFieldStyle(field: DynamicFormField): Record<string, string> {\n const colCount = props.schema.globalStyle?.colCount || \n (props.schema.layout?.columns ? `row-${props.schema.layout.columns}` : 'row-1');\n const maxCols = getMaxCols(colCount);\n const span = Math.min(maxCols, Math.max(1, field.colSpan || 1));\n return {\n gridColumn: `span ${span}`\n };\n}\n\n// 필드 props 생성\nfunction getFieldProps(field: DynamicFormField) {\n const fieldName = getFieldName(field);\n const disabled = field.isDisabled !== undefined ? field.isDisabled : ((field as any).disabled || false);\n const readonly = field.isReadonly !== undefined ? field.isReadonly : ((field as any).readonly || false);\n \n // baseClass 조정\n const baseClass = BOOLEAN_TYPES.includes(field.type)\n ? 'inline-flex items-center gap-2 w-auto'\n : 'w-full';\n \n // 전역 스타일 해결\n const resolvedStyle = resolveGlobalStyle(props.schema.globalStyle);\n \n // 열 수에 따라 컨트롤 크기 동적 조정\n const colCount = props.schema.globalStyle?.colCount || \n (props.schema.layout?.columns ? `row-${props.schema.layout.columns}` : 'row-1');\n const maxCols = getMaxCols(colCount);\n let finalSize = resolvedStyle.controlSize;\n \n // 4열 이상일 때 컨트롤 크기를 작게 조정\n if (maxCols >= 6) {\n finalSize = 'sm';\n } else if (maxCols >= 5) {\n finalSize = 'sm';\n } else if (maxCols >= 4) {\n if (resolvedStyle.controlSize === 'lg') {\n finalSize = 'md';\n }\n }\n\n const createEventHandler = (eventType: string, value: any) => {\n if (fieldName) {\n formState[fieldName] = value;\n handleChange(fieldName, value);\n }\n \n if (field.events?.[eventType as keyof typeof field.events]) {\n const handlerName = field.events[eventType as keyof typeof field.events];\n console.log(`Event ${eventType}: Calling handler \"${handlerName}\" with value:`, value);\n }\n };\n\n if (BOOLEAN_TYPES.includes(field.type)) {\n return {\n modelValue: formState[fieldName] === 'Y' ? 'Y' : 'N',\n disabled,\n styleType: finalSize,\n class: baseClass,\n 'onUpdate:modelValue': (value: string) => {\n if (fieldName) {\n formState[fieldName] = value;\n }\n createEventHandler('onChange', value === 'Y');\n }\n };\n }\n\n if (field.type === 'radio') {\n return {\n modelValue: String(formState[fieldName] ?? ''),\n options: field.options ?? [],\n multiple: field.multiple,\n disabled,\n styleType: finalSize,\n class: baseClass,\n 'onUpdate:modelValue': (value: string) => {\n createEventHandler('onChange', value);\n }\n };\n }\n\n if (field.type === 'select' || field.type === 'combo') {\n return {\n modelValue: String(formState[fieldName] ?? ''),\n options: getSelectOptions(field),\n multiple: field.multiple,\n disabled,\n styleType: finalSize,\n class: baseClass,\n 'onUpdate:modelValue': (value: string) => {\n createEventHandler('onChange', value);\n }\n };\n }\n\n if (field.type === 'searchcombo') {\n return {\n modelValue: String(formState[fieldName] ?? ''),\n options: getSelectOptions(field),\n disabled,\n styleType: finalSize,\n class: baseClass,\n 'onUpdate:modelValue': (value: string) => {\n createEventHandler('onChange', value);\n }\n };\n }\n\n if (field.type === 'textarea') {\n return {\n modelValue: String(formState[fieldName] ?? ''),\n placeholder: field.placeholder ?? '',\n disabled,\n readonly,\n styleType: finalSize,\n class: baseClass,\n 'onUpdate:modelValue': (value: string) => {\n createEventHandler('onChange', value);\n }\n };\n }\n\n if (field.type === 'datepicker') {\n return {\n modelValue: String(formState[fieldName] ?? ''),\n placeholder: field.placeholder ?? '',\n disabled,\n readonly,\n styleType: finalSize,\n class: baseClass,\n 'onUpdate:modelValue': (value: string) => {\n createEventHandler('onChange', value);\n }\n };\n }\n\n // 기본 input\n return {\n modelValue: String(formState[fieldName] ?? ''),\n inputType: field.inputType || (field.dataType === 'number' ? 'number' : 'text'),\n placeholder: field.placeholder ?? '',\n disabled,\n readonly,\n styleType: finalSize,\n class: baseClass,\n 'onUpdate:modelValue': (value: string | number) => {\n createEventHandler('onChange', value);\n }\n };\n}\n\n// Select 옵션 생성\nfunction getSelectOptions(field: DynamicFormField) {\n const addAll = field.addAll !== undefined ? field.addAll : ((field as any).allowAll || false);\n const defaultOption = {\n value: addAll ? 'ALL' : 'SELECT',\n label: addAll ? '전체' : '선택'\n };\n return [defaultOption, ...(field.options || [])];\n}\n\n// 폼 리셋\nfunction reset() {\n Object.keys(formState).forEach(key => {\n delete formState[key];\n });\n \n // 모든 필드 수집\n const allFields: DynamicFormField[] = [];\n \n if (props.schema.type === 'simple' && props.schema.fields) {\n allFields.push(...props.schema.fields);\n } else if (props.schema.type === 'sectioned' && props.schema.sections) {\n props.schema.sections.forEach(section => {\n if (section.fields) allFields.push(...section.fields);\n });\n } else if (props.schema.type === 'wizard' && props.schema.steps) {\n props.schema.steps.forEach(step => {\n if (step.fields) allFields.push(...step.fields);\n });\n }\n \n // 초기값으로 재설정\n allFields.forEach((field) => {\n const fieldName = getFieldName(field);\n if (fieldName) {\n if (BOOLEAN_TYPES.includes(field.type)) {\n formState[fieldName] = 'N';\n } else if (field.type === 'radio') {\n formState[fieldName] = field.options?.[0]?.value ?? '';\n } else if (field.type === 'select' || field.type === 'searchcombo') {\n const addAll = field.addAll !== undefined ? field.addAll : ((field as any).allowAll || false);\n formState[fieldName] = addAll ? 'ALL' : 'SELECT';\n } else {\n formState[fieldName] = '';\n }\n }\n });\n}\n\n// 폼 상태 노출\ndefineExpose({\n formState,\n submit: handleSubmit,\n reset,\n handleError\n});\n</script>\n\n<style scoped>\nform {\n width: 100%;\n}\n</style>\n"],"names":["props","__props","emit","__emit","BOOLEAN_TYPES","formState","reactive","watch","newValues","getFieldKey","field","index","getFieldName","getFieldRequired","newSchema","allFields","section","step","fieldName","addAll","val","handleSubmit","handleChange","value","handleError","errs","getOrderedFields","fields","a","b","aName","bName","formClasses","computed","colCount","gapClass","getGapClass","classes","fieldBaseClass","getMaxCols","getLabelWidth","maxCols","getLabelPosition","getLabelAlign","getFieldStyle","getFieldProps","disabled","readonly","baseClass","resolvedStyle","resolveGlobalStyle","finalSize","createEventHandler","eventType","handlerName","getSelectOptions","reset","key","__expose","_createElementBlock","_Fragment","_renderList","_normalizeClass","_normalizeStyle","_createVNode","_unref","_mergeProps","_openBlock","_hoisted_1","_createBlock","JCard","_createElementVNode","_hoisted_2","_hoisted_3","_toDisplayString","_hoisted_4"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"JDynamicForm.vue2.js","sources":["../../../../src/components/organisms/JDynamicForm.vue"],"sourcesContent":["<template>\n <form @submit.prevent=\"handleSubmit\" :class=\"formClasses\">\n <!-- 🧱 단순형 폼 -->\n <template v-if=\"schema.type === 'simple'\">\n <div\n v-for=\"(field, index) in getOrderedFields(schema.fields || [])\"\n :key=\"getFieldKey(field, index)\"\n :class=\"fieldBaseClass(field)\"\n :style=\"getFieldStyle(field)\"\n >\n <JFormField\n :label=\"field.label\"\n :required=\"getFieldRequired(field)\"\n :orientation=\"getLabelPosition()\"\n :labelAlign=\"getLabelAlign()\"\n :labelWidth=\"getLabelWidth()\"\n :type=\"(field.type === 'searchcombo' ? 'searchCombo' : field.type) as any\"\n :input-type=\"field.inputType\"\n :description=\"field.description\"\n :inline-label=\"field.inlineLabel\"\n v-bind=\"getFieldProps(field)\"\n />\n </div>\n </template>\n\n <!-- 📦 섹션형 폼 -->\n <template v-else-if=\"schema.type === 'sectioned'\">\n <div class=\"space-y-6\">\n <JCard\n v-for=\"section in schema.sections\"\n :key=\"section.id\"\n :title=\"section.title\"\n :collapsible=\"section.collapsible\"\n :default-collapsed=\"section.defaultCollapsed\"\n >\n <div :class=\"formClasses\">\n <div\n v-for=\"(field, index) in getOrderedFields(section.fields || [])\"\n :key=\"getFieldKey(field, index)\"\n :class=\"fieldBaseClass(field)\"\n :style=\"getFieldStyle(field)\"\n >\n <JFormField\n :label=\"field.label\"\n :required=\"getFieldRequired(field)\"\n :orientation=\"getLabelPosition()\"\n :labelAlign=\"getLabelAlign()\"\n :labelWidth=\"getLabelWidth()\"\n :type=\"(field.type === 'searchcombo' ? 'searchCombo' : field.type) as any\"\n :input-type=\"field.inputType\"\n :description=\"field.description\"\n :inline-label=\"field.inlineLabel\"\n v-bind=\"getFieldProps(field)\"\n />\n </div>\n </div>\n </JCard>\n </div>\n </template>\n\n <!-- 🪜 스텝형 (Wizard) -->\n <template v-else-if=\"schema.type === 'wizard'\">\n <div class=\"space-y-4\">\n <div\n v-for=\"step in schema.steps\"\n :key=\"step.id\"\n class=\"p-4 border rounded-xl\"\n >\n <h3 class=\"font-semibold text-lg\">{{ step.title }}</h3>\n <p v-if=\"step.description\" class=\"text-muted-foreground text-sm mb-2\">\n {{ step.description }}\n </p>\n <div :class=\"formClasses\">\n <div\n v-for=\"(field, index) in getOrderedFields(step.fields || [])\"\n :key=\"getFieldKey(field, index)\"\n :class=\"fieldBaseClass(field)\"\n :style=\"getFieldStyle(field)\"\n >\n <JFormField\n :label=\"field.label\"\n :required=\"getFieldRequired(field)\"\n :orientation=\"getLabelPosition()\"\n :labelAlign=\"getLabelAlign()\"\n :labelWidth=\"getLabelWidth()\"\n :type=\"(field.type === 'searchcombo' ? 'searchCombo' : field.type) as any\"\n :input-type=\"field.inputType\"\n :description=\"field.description\"\n :inline-label=\"field.inlineLabel\"\n v-bind=\"getFieldProps(field)\"\n />\n </div>\n </div>\n </div>\n </div>\n </template>\n\n </form>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, reactive, watch } from 'vue';\nimport { JFormField, JCard } from '@/components/molecules';\nimport type { FormSchema, DynamicFormField } from '@/types/dynamic-form';\nimport { resolveGlobalStyle } from '@/lib/styleTypePreset';\n\n// props\nconst props = defineProps<{\n schema: FormSchema;\n modelValue?: Record<string, any>;\n}>();\n\nconst emit = defineEmits(['update:modelValue', 'submit', 'change', 'error']);\n\nconst BOOLEAN_TYPES: Array<DynamicFormField['type']> = ['checkbox', 'switch'];\n\n// 폼 상태 관리\nconst formState = reactive<Record<string, any>>({});\n\n// 초기값 설정\nwatch(\n () => props.modelValue,\n (newValues) => {\n if (newValues) {\n Object.assign(formState, newValues);\n }\n },\n { immediate: true, deep: true }\n);\n\n// 필드 키 가져오기 (controlId > controlName > name > label 순서)\nfunction getFieldKey(field: DynamicFormField, index: number): string {\n return field.controlId || field.controlName || (field as any).name || field.label || `field-${index}`;\n}\n\n// 필드 이름 가져오기 (controlName > name 순서)\nfunction getFieldName(field: DynamicFormField): string {\n return field.controlName || (field as any).name || '';\n}\n\n// 필드 required 가져오기 (isRequired > required 순서)\nfunction getFieldRequired(field: DynamicFormField): boolean {\n return field.isRequired !== undefined ? field.isRequired : ((field as any).required || false);\n}\n\n// 필드 초기화\nwatch(\n () => props.schema,\n (newSchema) => {\n const allFields: DynamicFormField[] = [];\n \n if (newSchema.type === 'simple' && newSchema.fields) {\n allFields.push(...newSchema.fields);\n } else if (newSchema.type === 'sectioned' && newSchema.sections) {\n newSchema.sections.forEach(section => {\n if (section.fields) allFields.push(...section.fields);\n });\n } else if (newSchema.type === 'wizard' && newSchema.steps) {\n newSchema.steps.forEach(step => {\n if (step.fields) allFields.push(...step.fields);\n });\n }\n \n allFields.forEach((field) => {\n const fieldName = getFieldName(field);\n if (fieldName && formState[fieldName] === undefined) {\n if (BOOLEAN_TYPES.includes(field.type)) {\n formState[fieldName] = 'N';\n } else if (field.type === 'radio') {\n formState[fieldName] = field.options?.[0]?.value ?? '';\n } else if (field.type === 'select' || field.type === 'searchcombo') {\n const addAll = field.addAll !== undefined ? field.addAll : ((field as any).allowAll || false);\n formState[fieldName] = addAll ? 'ALL' : 'SELECT';\n } else {\n formState[fieldName] = '';\n }\n }\n });\n },\n { immediate: true }\n);\n\n// 값 변경 감지 → 상위 emit\nwatch(formState, (val) => emit('update:modelValue', val), { deep: true });\n\n// 이벤트 핸들러\nfunction handleSubmit() {\n emit('submit', { ...formState });\n if (typeof props.schema.events?.onSubmit === 'function') {\n props.schema.events.onSubmit({ ...formState });\n }\n}\n\nfunction handleChange(field: string, value: any) {\n emit('change', { field, value });\n if (typeof props.schema.events?.onChange === 'function') {\n props.schema.events.onChange(field, value);\n }\n}\n\nfunction handleError(errs: any) {\n emit('error', errs);\n if (typeof props.schema.events?.onError === 'function') {\n props.schema.events.onError(errs);\n }\n}\n\n// 정렬된 필드 가져오기\nfunction getOrderedFields(fields: DynamicFormField[]): DynamicFormField[] {\n const visibleFields = fields.filter((field) => field.isVisible !== false);\n return visibleFields.sort((a, b) => {\n // sortOrder 기준으로 정렬\n if (a.sortOrder !== undefined && b.sortOrder !== undefined) {\n if (a.sortOrder !== b.sortOrder) {\n return a.sortOrder - b.sortOrder;\n }\n }\n const aName = a.controlName || (a as any).name || a.label || '';\n const bName = b.controlName || (b as any).name || b.label || '';\n return aName.localeCompare(bName);\n });\n}\n\n// 폼 클래스 계산\nconst formClasses = computed(() => {\n const colCount = props.schema.globalStyle?.colCount || \n (props.schema.layout?.columns ? `row-${props.schema.layout.columns}` : 'row-1');\n const gapClass = getGapClass(colCount);\n \n // 반응형: 화면 크기에 따라 열 수 자동 조정\n let classes = '';\n switch (colCount) {\n case 'row-1':\n classes = `flex flex-col ${gapClass}`;\n break;\n case 'row':\n case 'row-2':\n classes = `flex flex-col md:grid md:grid-flow-row md:items-start ${gapClass} md:grid-cols-2 auto-rows-min`;\n break;\n case 'row-3':\n classes = `flex flex-col md:grid md:grid-flow-row md:items-start ${gapClass} md:grid-cols-2 lg:grid-cols-3 auto-rows-min`;\n break;\n case 'row-4':\n classes = `flex flex-col md:grid md:grid-flow-row md:items-start ${gapClass} md:grid-cols-2 lg:grid-cols-4 auto-rows-min`;\n break;\n case 'row-5':\n classes = `flex flex-col md:grid md:grid-flow-row md:items-start ${gapClass} md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-5 auto-rows-min`;\n break;\n case 'row-6':\n classes = `flex flex-col md:grid md:grid-flow-row md:items-start ${gapClass} md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-6 auto-rows-min`;\n break;\n case 'row-7':\n classes = `flex flex-col md:grid md:grid-flow-row md:items-start ${gapClass} md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-7 auto-rows-min`;\n break;\n case 'row-8':\n classes = `flex flex-col md:grid md:grid-flow-row md:items-start ${gapClass} md:grid-cols-2 lg:grid-cols-4 xl:grid-cols-8 auto-rows-min`;\n break;\n default:\n classes = `flex flex-col ${gapClass}`;\n }\n \n return classes;\n});\n\n// 필드 기본 클래스\nfunction fieldBaseClass(field: DynamicFormField): string {\n return BOOLEAN_TYPES.includes(field.type)\n ? 'min-w-0 w-auto inline-flex items-center'\n : 'min-w-0 w-full';\n}\n\n// 최대 열 수 계산\nfunction getMaxCols(colCount?: string): number {\n switch (colCount) {\n case 'row':\n case 'row-2': return 2;\n case 'row-3': return 3;\n case 'row-4': return 4;\n case 'row-5': return 5;\n case 'row-6': return 6;\n case 'row-7': return 7;\n case 'row-8': return 8;\n default: return 1;\n }\n}\n\n// 열 수에 따른 gap 계산\nfunction getGapClass(colCount: string): string {\n switch (colCount) {\n case 'row-1': return 'gap-6';\n case 'row':\n case 'row-2': return 'gap-4';\n case 'row-3': return 'gap-4';\n case 'row-4': return 'gap-3';\n case 'row-5': return 'gap-2';\n case 'row-6': return 'gap-2';\n case 'row-7': return 'gap-2';\n case 'row-8': return 'gap-2';\n default: return 'gap-6';\n }\n}\n\n// 열 수에 따른 라벨 너비 계산\nfunction getLabelWidth(): string {\n const colCount = props.schema.globalStyle?.colCount || \n (props.schema.layout?.columns ? `row-${props.schema.layout.columns}` : 'row-1');\n const maxCols = getMaxCols(colCount);\n if (maxCols >= 6) return '6rem';\n if (maxCols >= 5) return '7rem';\n return '8rem';\n}\n\n// 라벨 위치 가져오기\nfunction getLabelPosition(): 'horizontal' | 'vertical' {\n return props.schema.globalStyle?.labelPosition || 'horizontal';\n}\n\n// 라벨 정렬 가져오기\nfunction getLabelAlign(): 'left' | 'middle' | 'right' {\n return props.schema.globalStyle?.labelAlign || 'left';\n}\n\n// 필드 스타일 계산\nfunction getFieldStyle(field: DynamicFormField): Record<string, string> {\n const colCount = props.schema.globalStyle?.colCount || \n (props.schema.layout?.columns ? `row-${props.schema.layout.columns}` : 'row-1');\n const maxCols = getMaxCols(colCount);\n const span = Math.min(maxCols, Math.max(1, field.colSpan || 1));\n return {\n gridColumn: `span ${span}`\n };\n}\n\n// 필드 props 생성\nfunction getFieldProps(field: DynamicFormField) {\n const fieldName = getFieldName(field);\n const disabled = field.isDisabled !== undefined ? field.isDisabled : ((field as any).disabled || false);\n const readonly = field.isReadonly !== undefined ? field.isReadonly : ((field as any).readonly || false);\n \n // baseClass 조정\n const baseClass = BOOLEAN_TYPES.includes(field.type)\n ? 'inline-flex items-center gap-2 w-auto'\n : 'w-full';\n \n // 전역 스타일 해결\n const resolvedStyle = resolveGlobalStyle(props.schema.globalStyle);\n \n // 열 수에 따라 컨트롤 크기 동적 조정\n const colCount = props.schema.globalStyle?.colCount || \n (props.schema.layout?.columns ? `row-${props.schema.layout.columns}` : 'row-1');\n const maxCols = getMaxCols(colCount);\n let finalSize = resolvedStyle.controlSize;\n \n // 4열 이상일 때 컨트롤 크기를 작게 조정\n if (maxCols >= 6) {\n finalSize = 'sm';\n } else if (maxCols >= 5) {\n finalSize = 'sm';\n } else if (maxCols >= 4) {\n if (resolvedStyle.controlSize === 'lg') {\n finalSize = 'md';\n }\n }\n\n const createEventHandler = (eventType: string, value: any) => {\n if (fieldName) {\n formState[fieldName] = value;\n handleChange(fieldName, value);\n }\n \n if (field.events?.[eventType as keyof typeof field.events]) {\n const handlerName = field.events[eventType as keyof typeof field.events];\n console.log(`Event ${eventType}: Calling handler \"${handlerName}\" with value:`, value);\n }\n };\n\n if (BOOLEAN_TYPES.includes(field.type)) {\n return {\n modelValue: formState[fieldName] === 'Y' ? 'Y' : 'N',\n disabled,\n styleType: finalSize,\n class: baseClass,\n 'onUpdate:modelValue': (value: string) => {\n if (fieldName) {\n formState[fieldName] = value;\n }\n createEventHandler('onChange', value === 'Y');\n }\n };\n }\n\n if (field.type === 'radio') {\n return {\n modelValue: String(formState[fieldName] ?? ''),\n options: field.options ?? [],\n multiple: field.multiple,\n disabled,\n styleType: finalSize,\n class: baseClass,\n 'onUpdate:modelValue': (value: string) => {\n createEventHandler('onChange', value);\n }\n };\n }\n\n if (field.type === 'select' || field.type === 'combo') {\n return {\n modelValue: String(formState[fieldName] ?? ''),\n options: getSelectOptions(field),\n multiple: field.multiple,\n disabled,\n styleType: finalSize,\n class: baseClass,\n 'onUpdate:modelValue': (value: string) => {\n createEventHandler('onChange', value);\n }\n };\n }\n\n if (field.type === 'searchcombo') {\n return {\n modelValue: String(formState[fieldName] ?? ''),\n options: getSelectOptions(field),\n disabled,\n styleType: finalSize,\n class: baseClass,\n 'onUpdate:modelValue': (value: string) => {\n createEventHandler('onChange', value);\n }\n };\n }\n\n if (field.type === 'textarea') {\n return {\n modelValue: String(formState[fieldName] ?? ''),\n placeholder: field.placeholder ?? '',\n disabled,\n readonly,\n styleType: finalSize,\n class: baseClass,\n 'onUpdate:modelValue': (value: string) => {\n createEventHandler('onChange', value);\n }\n };\n }\n\n if (field.type === 'datepicker') {\n return {\n modelValue: String(formState[fieldName] ?? ''),\n placeholder: field.placeholder ?? '',\n disabled,\n readonly,\n styleType: finalSize,\n class: baseClass,\n 'onUpdate:modelValue': (value: string) => {\n createEventHandler('onChange', value);\n }\n };\n }\n\n // 기본 input\n return {\n modelValue: String(formState[fieldName] ?? ''),\n inputType: field.inputType || (field.dataType === 'number' ? 'number' : 'text'),\n placeholder: field.placeholder ?? '',\n disabled,\n readonly,\n styleType: finalSize,\n class: baseClass,\n 'onUpdate:modelValue': (value: string | number) => {\n createEventHandler('onChange', value);\n }\n };\n}\n\n// Select 옵션 생성\nfunction getSelectOptions(field: DynamicFormField) {\n const addAll = field.addAll !== undefined ? field.addAll : ((field as any).allowAll || false);\n const defaultOption = {\n value: addAll ? 'ALL' : 'SELECT',\n label: addAll ? '전체' : '선택'\n };\n return [defaultOption, ...(field.options || [])];\n}\n\n// 폼 리셋\nfunction reset() {\n Object.keys(formState).forEach(key => {\n delete formState[key];\n });\n \n // 모든 필드 수집\n const allFields: DynamicFormField[] = [];\n \n if (props.schema.type === 'simple' && props.schema.fields) {\n allFields.push(...props.schema.fields);\n } else if (props.schema.type === 'sectioned' && props.schema.sections) {\n props.schema.sections.forEach(section => {\n if (section.fields) allFields.push(...section.fields);\n });\n } else if (props.schema.type === 'wizard' && props.schema.steps) {\n props.schema.steps.forEach(step => {\n if (step.fields) allFields.push(...step.fields);\n });\n }\n \n // 초기값으로 재설정\n allFields.forEach((field) => {\n const fieldName = getFieldName(field);\n if (fieldName) {\n if (BOOLEAN_TYPES.includes(field.type)) {\n formState[fieldName] = 'N';\n } else if (field.type === 'radio') {\n formState[fieldName] = field.options?.[0]?.value ?? '';\n } else if (field.type === 'select' || field.type === 'searchcombo') {\n const addAll = field.addAll !== undefined ? field.addAll : ((field as any).allowAll || false);\n formState[fieldName] = addAll ? 'ALL' : 'SELECT';\n } else {\n formState[fieldName] = '';\n }\n }\n });\n}\n\n// 폼 상태 노출\ndefineExpose({\n formState,\n submit: handleSubmit,\n reset,\n handleError\n});\n</script>\n\n<style scoped>\nform {\n width: 100%;\n}\n</style>\n"],"names":["props","__props","emit","__emit","BOOLEAN_TYPES","formState","reactive","watch","newValues","getFieldKey","field","index","getFieldName","getFieldRequired","newSchema","allFields","section","step","fieldName","addAll","val","handleSubmit","handleChange","value","handleError","errs","getOrderedFields","fields","a","b","aName","bName","formClasses","computed","colCount","gapClass","getGapClass","classes","fieldBaseClass","getMaxCols","getLabelWidth","maxCols","getLabelPosition","getLabelAlign","getFieldStyle","getFieldProps","disabled","readonly","baseClass","resolvedStyle","resolveGlobalStyle","finalSize","createEventHandler","eventType","handlerName","getSelectOptions","reset","key","__expose","_createElementBlock","_Fragment","_renderList","_normalizeClass","_normalizeStyle","_createVNode","_unref","_mergeProps","_openBlock","_hoisted_1","_createBlock","JCard","_createElementVNode","_hoisted_2","_hoisted_3","_toDisplayString","_hoisted_4"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("vue");require("../shadcn/index.cjs");const i=require("../atoms/JButton.vue.cjs");require("lucide-vue-next");require("clsx");require("tailwind-merge");require("@internationalized/date");require("../shadcn/badge-variants.cjs");require("@vueuse/core");require("reka-ui");;/* empty css */require("../shadcn/avatar-variants.cjs");require("ag-grid-vue3");require("ag-grid-community");require("ag-grid-enterprise");;/* empty css */;/* empty css */;/* empty css */;/* empty css
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("vue");require("../shadcn/index.cjs");const i=require("../atoms/JButton.vue.cjs");require("lucide-vue-next");require("clsx");require("tailwind-merge");require("@internationalized/date");require("../shadcn/badge-variants.cjs");require("@vueuse/core");require("reka-ui");;/* empty css */require("../shadcn/avatar-variants.cjs");require("ag-grid-vue3");require("ag-grid-community");require("ag-grid-enterprise");;/* empty css */;/* empty css */;/* empty css */;/* empty css */require("vue-sonner");;/* empty css */;/* empty css */;/* empty css */;/* empty css */const x=require("./JDynamicForm.vue.cjs");;/* empty css */require("vue-router");;/* empty css */;/* empty css */const h=require("../shadcn/Dialog.vue.cjs"),y=require("../shadcn/DialogContent.vue.cjs"),C=require("../shadcn/DialogHeader.vue.cjs"),V=require("../shadcn/DialogTitle.vue.cjs"),b=require("../shadcn/DialogBody.vue.cjs"),k=require("../shadcn/DialogFooter.vue.cjs"),w={class:"space-y-4"},D={key:0,class:"text-sm text-muted-foreground"},N=e.defineComponent({__name:"JFormModal",props:{open:{type:Boolean,default:!1},title:{},description:{},schema:{},modelValue:{},size:{default:"lg"},buttonType:{default:"OkCancel"},confirmText:{default:"확인"},cancelText:{default:"취소"},confirmVariant:{default:"default"},confirmDisabled:{type:Boolean,default:!1}},emits:["update:open","update:modelValue","confirm","cancel","submit","change","error"],setup(r,{expose:d,emit:s}){const o=r,l=s,a=e.ref(null),u=e.ref(o.modelValue||{}),n=e.ref(!1),m=e.computed(()=>({sm:"!max-w-sm",md:"!max-w-md",lg:"!max-w-2xl",xl:"!max-w-4xl","2xl":"!max-w-6xl",full:"!max-w-[95vw]"})[o.size]);e.watch(()=>o.modelValue,t=>{t!=null?u.value={...t}:u.value={}},{deep:!0});const f=t=>{u.value=t,l("update:modelValue",t)},v=t=>{l("change",t)},_=t=>{l("submit",t),n.value&&(l("confirm",t),n.value=!1)},p=t=>{l("error",t),n.value=!1},q=t=>{l("update:open",t)},c=()=>{n.value=!0,a.value&&a.value.submit()},g=()=>{l("cancel"),a.value&&a.value.reset()};return d({reset:()=>a.value?.reset(),submit:()=>a.value?.submit(),formState:e.computed(()=>a.value?.formState)}),(t,B)=>(e.openBlock(),e.createBlock(e.unref(h.default),{open:r.open,"onUpdate:open":q,class:e.normalizeClass(m.value)},{default:e.withCtx(()=>[e.createVNode(e.unref(y.default),null,{default:e.withCtx(()=>[r.title?(e.openBlock(),e.createBlock(e.unref(C.default),{key:0,class:"bg-muted/50 border-b"},{default:e.withCtx(()=>[e.createVNode(e.unref(V.default),null,{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(r.title),1)]),_:1})]),_:1})):e.createCommentVNode("",!0),e.createVNode(e.unref(b.default),{class:"max-h-[70vh] overflow-y-auto"},{default:e.withCtx(()=>[e.createElementVNode("div",w,[r.description?(e.openBlock(),e.createElementBlock("p",D,e.toDisplayString(r.description),1)):e.createCommentVNode("",!0),e.createVNode(e.unref(x.default),{ref_key:"dynamicFormRef",ref:a,schema:r.schema,"model-value":u.value,"onUpdate:modelValue":f,onSubmit:_,onChange:v,onError:p},null,8,["schema","model-value"]),e.renderSlot(t.$slots,"body")])]),_:3}),e.createVNode(e.unref(k.default),null,{default:e.withCtx(()=>[r.buttonType==="OkCancel"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createVNode(e.unref(i.default),{variant:"outline",onClick:g},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(r.cancelText),1)]),_:1}),e.createVNode(e.unref(i.default),{variant:r.confirmVariant,disabled:r.confirmDisabled,onClick:c},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(r.confirmText),1)]),_:1},8,["variant","disabled"])],64)):r.buttonType==="Ok"?(e.openBlock(),e.createBlock(e.unref(i.default),{key:1,variant:r.confirmVariant,disabled:r.confirmDisabled,onClick:c,class:"w-full"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(r.confirmText),1)]),_:1},8,["variant","disabled"])):e.createCommentVNode("",!0),e.renderSlot(t.$slots,"footer")]),_:3})]),_:3})]),_:3},8,["open","class"]))}});exports.default=N;
|
|
2
2
|
//# sourceMappingURL=JFormModal.vue.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JFormModal.vue.cjs","sources":["../../../../src/components/organisms/JFormModal.vue"],"sourcesContent":["<template>\r\n <Dialog\r\n :open=\"open\"\r\n @update:open=\"onOpenChange\"\r\n :class=\"sizeClass\"\r\n >\r\n <DialogContent>\r\n <!-- Header -->\r\n <DialogHeader v-if=\"title\" class=\"bg-muted/50 border-b\">\r\n <DialogTitle>\r\n {{ title }}\r\n </DialogTitle>\r\n </DialogHeader>\r\n\r\n <!-- Body -->\r\n <DialogBody class=\"max-h-[70vh] overflow-y-auto\">\r\n <div class=\"space-y-4\">\r\n <!-- Description -->\r\n <p v-if=\"description\" class=\"text-sm text-muted-foreground\">\r\n {{ description }}\r\n </p>\r\n\r\n <!-- JDynamicForm -->\r\n <JDynamicForm\r\n ref=\"dynamicFormRef\"\r\n :schema=\"schema\"\r\n :model-value=\"internalFormValue\"\r\n @update:model-value=\"handleFormChange\"\r\n @submit=\"handleFormSubmit\"\r\n @change=\"handleFieldChange\"\r\n @error=\"handleFormError\"\r\n />\r\n\r\n <!-- 커스텀 컨텐츠 슬롯 -->\r\n <slot name=\"body\" />\r\n </div>\r\n </DialogBody>\r\n\r\n <!-- Footer -->\r\n <DialogFooter>\r\n <!-- 확인/취소 버튼 -->\r\n <template v-if=\"buttonType === 'OkCancel'\">\r\n <JButton\r\n variant=\"outline\"\r\n @click=\"handleCancel\"\r\n >\r\n {{ cancelText }}\r\n </JButton>\r\n <JButton\r\n :variant=\"confirmVariant\"\r\n :disabled=\"confirmDisabled\"\r\n @click=\"handleConfirm\"\r\n >\r\n {{ confirmText }}\r\n </JButton>\r\n </template>\r\n \r\n <!-- 확인 버튼만 -->\r\n <template v-else-if=\"buttonType === 'Ok'\">\r\n <JButton\r\n :variant=\"confirmVariant\"\r\n :disabled=\"confirmDisabled\"\r\n @click=\"handleConfirm\"\r\n class=\"w-full\"\r\n >\r\n {{ confirmText }}\r\n </JButton>\r\n </template>\r\n\r\n <!-- 커스텀 푸터 슬롯 -->\r\n <slot name=\"footer\" />\r\n </DialogFooter>\r\n </DialogContent>\r\n </Dialog>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, ref, watch } from 'vue'\r\nimport {\r\n Dialog,\r\n DialogBody,\r\n DialogContent,\r\n DialogFooter,\r\n DialogHeader,\r\n DialogTitle,\r\n} from '@/components/shadcn'\r\nimport { JButton } from '@/components/atoms'\r\nimport { JDynamicForm } from '@/components/organisms'\r\nimport type { FormSchema } from '@/types/dynamic-form'\r\n\r\nexport interface JFormModalProps {\r\n // 모달 표시 여부\r\n open: boolean\r\n // 헤더\r\n title?: string\r\n description?: string\r\n // 다이나믹 폼 스키마 (필수)\r\n schema: FormSchema\r\n // 폼 값\r\n modelValue?: Record<string, any>\r\n // 모달 사이즈 (유동적)\r\n size?: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full'\r\n // 버튼 설정\r\n buttonType?: 'Ok' | 'OkCancel'\r\n confirmText?: string\r\n cancelText?: string\r\n confirmVariant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link'\r\n confirmDisabled?: boolean\r\n}\r\n\r\nconst props = withDefaults(defineProps<JFormModalProps>(), {\r\n open: false,\r\n size: 'lg',\r\n buttonType: 'OkCancel',\r\n confirmText: '확인',\r\n cancelText: '취소',\r\n confirmVariant: 'default',\r\n confirmDisabled: false,\r\n})\r\n\r\nconst emit = defineEmits<{\r\n 'update:open': [value: boolean]\r\n 'update:modelValue': [value: Record<string, any>]\r\n 'confirm': [value: Record<string, any>]\r\n 'cancel': []\r\n 'submit': [value: Record<string, any>]\r\n 'change': [data: { field: string; value: any }]\r\n 'error': [errors: any]\r\n}>()\r\n\r\n// 다이나믹 폼 ref\r\nconst dynamicFormRef = ref<InstanceType<typeof JDynamicForm> | null>(null)\r\n\r\n// 내부 폼 값 관리\r\nconst internalFormValue = ref<Record<string, any>>(props.modelValue || {})\r\n// 확인 버튼 클릭 이후 검증 성공 시점에만 confirm 이벤트를 방출하기 위한 플래그\r\nconst isConfirming = ref<boolean>(false)\r\n\r\n// 사이즈 클래스 계산\r\nconst sizeClass = computed(() => {\r\n // Dialog.vue에 기본 max-w-lg가 하드코딩되어 있어 !max-w-*로 오버라이드\r\n const sizeMap: Record<NonNullable<JFormModalProps['size']>, string> = {\r\n 'sm': '!max-w-sm',\r\n 'md': '!max-w-md',\r\n 'lg': '!max-w-2xl',\r\n 'xl': '!max-w-4xl',\r\n '2xl': '!max-w-6xl',\r\n 'full': '!max-w-[95vw]'\r\n }\r\n return sizeMap[props.size]\r\n})\r\n\r\n// props.modelValue 변경 감지\r\nwatch(() => props.modelValue, (newValue) => {\r\n if (newValue != null) {\r\n internalFormValue.value = { ...newValue }\r\n } else {\r\n internalFormValue.value = {}\r\n }\r\n}, { deep: true })\r\n\r\n// 폼 변경 핸들러\r\nconst handleFormChange = (value: Record<string, any>) => {\r\n internalFormValue.value = value\r\n emit('update:modelValue', value)\r\n}\r\n\r\n// 필드 변경 핸들러\r\nconst handleFieldChange = (data: { field: string; value: any }) => {\r\n emit('change', data)\r\n}\r\n\r\n// 폼 제출 핸들러\r\nconst handleFormSubmit = (value: Record<string, any>) => {\r\n emit('submit', value)\r\n if (isConfirming.value) {\r\n emit('confirm', value)\r\n isConfirming.value = false\r\n }\r\n}\r\n\r\n// 폼 에러 핸들러\r\nconst handleFormError = (errors: any) => {\r\n emit('error', errors)\r\n // 검증 실패 시 confirm 방출을 차단\r\n isConfirming.value = false\r\n}\r\n\r\n// 모달 열기/닫기 핸들러\r\nconst onOpenChange = (value: boolean) => {\r\n emit('update:open', value)\r\n}\r\n\r\n// 확인 버튼 핸들러\r\nconst handleConfirm = () => {\r\n // 폼 제출 트리거 (검증 성공 시점에 handleFormSubmit에서 confirm 방출)\r\n isConfirming.value = true\r\n if (dynamicFormRef.value) {\r\n dynamicFormRef.value.submit()\r\n }\r\n}\r\n\r\n// 취소 버튼 핸들러\r\nconst handleCancel = () => {\r\n emit('cancel')\r\n // 폼 리셋\r\n if (dynamicFormRef.value) {\r\n dynamicFormRef.value.reset()\r\n }\r\n}\r\n\r\n// 외부에서 접근 가능한 메서드\r\ndefineExpose({\r\n reset: () => dynamicFormRef.value?.reset(),\r\n submit: () => dynamicFormRef.value?.submit(),\r\n formState: computed(() => dynamicFormRef.value?.formState),\r\n})\r\n</script>\r\n"],"names":["props","__props","emit","__emit","dynamicFormRef","ref","internalFormValue","isConfirming","sizeClass","computed","watch","newValue","handleFormChange","value","handleFieldChange","data","handleFormSubmit","handleFormError","errors","onOpenChange","handleConfirm","handleCancel","__expose","_createBlock","_unref","Dialog","_createVNode","DialogContent","DialogHeader","DialogTitle","DialogBody","_createElementVNode","_hoisted_1","_createElementBlock","_hoisted_2","_toDisplayString","JDynamicForm","_renderSlot","_ctx","DialogFooter","_Fragment","JButton"],"mappings":"
|
|
1
|
+
{"version":3,"file":"JFormModal.vue.cjs","sources":["../../../../src/components/organisms/JFormModal.vue"],"sourcesContent":["<template>\r\n <Dialog\r\n :open=\"open\"\r\n @update:open=\"onOpenChange\"\r\n :class=\"sizeClass\"\r\n >\r\n <DialogContent>\r\n <!-- Header -->\r\n <DialogHeader v-if=\"title\" class=\"bg-muted/50 border-b\">\r\n <DialogTitle>\r\n {{ title }}\r\n </DialogTitle>\r\n </DialogHeader>\r\n\r\n <!-- Body -->\r\n <DialogBody class=\"max-h-[70vh] overflow-y-auto\">\r\n <div class=\"space-y-4\">\r\n <!-- Description -->\r\n <p v-if=\"description\" class=\"text-sm text-muted-foreground\">\r\n {{ description }}\r\n </p>\r\n\r\n <!-- JDynamicForm -->\r\n <JDynamicForm\r\n ref=\"dynamicFormRef\"\r\n :schema=\"schema\"\r\n :model-value=\"internalFormValue\"\r\n @update:model-value=\"handleFormChange\"\r\n @submit=\"handleFormSubmit\"\r\n @change=\"handleFieldChange\"\r\n @error=\"handleFormError\"\r\n />\r\n\r\n <!-- 커스텀 컨텐츠 슬롯 -->\r\n <slot name=\"body\" />\r\n </div>\r\n </DialogBody>\r\n\r\n <!-- Footer -->\r\n <DialogFooter>\r\n <!-- 확인/취소 버튼 -->\r\n <template v-if=\"buttonType === 'OkCancel'\">\r\n <JButton\r\n variant=\"outline\"\r\n @click=\"handleCancel\"\r\n >\r\n {{ cancelText }}\r\n </JButton>\r\n <JButton\r\n :variant=\"confirmVariant\"\r\n :disabled=\"confirmDisabled\"\r\n @click=\"handleConfirm\"\r\n >\r\n {{ confirmText }}\r\n </JButton>\r\n </template>\r\n \r\n <!-- 확인 버튼만 -->\r\n <template v-else-if=\"buttonType === 'Ok'\">\r\n <JButton\r\n :variant=\"confirmVariant\"\r\n :disabled=\"confirmDisabled\"\r\n @click=\"handleConfirm\"\r\n class=\"w-full\"\r\n >\r\n {{ confirmText }}\r\n </JButton>\r\n </template>\r\n\r\n <!-- 커스텀 푸터 슬롯 -->\r\n <slot name=\"footer\" />\r\n </DialogFooter>\r\n </DialogContent>\r\n </Dialog>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, ref, watch } from 'vue'\r\nimport {\r\n Dialog,\r\n DialogBody,\r\n DialogContent,\r\n DialogFooter,\r\n DialogHeader,\r\n DialogTitle,\r\n} from '@/components/shadcn'\r\nimport { JButton } from '@/components/atoms'\r\nimport { JDynamicForm } from '@/components/organisms'\r\nimport type { FormSchema } from '@/types/dynamic-form'\r\n\r\nexport interface JFormModalProps {\r\n // 모달 표시 여부\r\n open: boolean\r\n // 헤더\r\n title?: string\r\n description?: string\r\n // 다이나믹 폼 스키마 (필수)\r\n schema: FormSchema\r\n // 폼 값\r\n modelValue?: Record<string, any>\r\n // 모달 사이즈 (유동적)\r\n size?: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full'\r\n // 버튼 설정\r\n buttonType?: 'Ok' | 'OkCancel'\r\n confirmText?: string\r\n cancelText?: string\r\n confirmVariant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link'\r\n confirmDisabled?: boolean\r\n}\r\n\r\nconst props = withDefaults(defineProps<JFormModalProps>(), {\r\n open: false,\r\n size: 'lg',\r\n buttonType: 'OkCancel',\r\n confirmText: '확인',\r\n cancelText: '취소',\r\n confirmVariant: 'default',\r\n confirmDisabled: false,\r\n})\r\n\r\nconst emit = defineEmits<{\r\n 'update:open': [value: boolean]\r\n 'update:modelValue': [value: Record<string, any>]\r\n 'confirm': [value: Record<string, any>]\r\n 'cancel': []\r\n 'submit': [value: Record<string, any>]\r\n 'change': [data: { field: string; value: any }]\r\n 'error': [errors: any]\r\n}>()\r\n\r\n// 다이나믹 폼 ref\r\nconst dynamicFormRef = ref<InstanceType<typeof JDynamicForm> | null>(null)\r\n\r\n// 내부 폼 값 관리\r\nconst internalFormValue = ref<Record<string, any>>(props.modelValue || {})\r\n// 확인 버튼 클릭 이후 검증 성공 시점에만 confirm 이벤트를 방출하기 위한 플래그\r\nconst isConfirming = ref<boolean>(false)\r\n\r\n// 사이즈 클래스 계산\r\nconst sizeClass = computed(() => {\r\n // Dialog.vue에 기본 max-w-lg가 하드코딩되어 있어 !max-w-*로 오버라이드\r\n const sizeMap: Record<NonNullable<JFormModalProps['size']>, string> = {\r\n 'sm': '!max-w-sm',\r\n 'md': '!max-w-md',\r\n 'lg': '!max-w-2xl',\r\n 'xl': '!max-w-4xl',\r\n '2xl': '!max-w-6xl',\r\n 'full': '!max-w-[95vw]'\r\n }\r\n return sizeMap[props.size]\r\n})\r\n\r\n// props.modelValue 변경 감지\r\nwatch(() => props.modelValue, (newValue) => {\r\n if (newValue != null) {\r\n internalFormValue.value = { ...newValue }\r\n } else {\r\n internalFormValue.value = {}\r\n }\r\n}, { deep: true })\r\n\r\n// 폼 변경 핸들러\r\nconst handleFormChange = (value: Record<string, any>) => {\r\n internalFormValue.value = value\r\n emit('update:modelValue', value)\r\n}\r\n\r\n// 필드 변경 핸들러\r\nconst handleFieldChange = (data: { field: string; value: any }) => {\r\n emit('change', data)\r\n}\r\n\r\n// 폼 제출 핸들러\r\nconst handleFormSubmit = (value: Record<string, any>) => {\r\n emit('submit', value)\r\n if (isConfirming.value) {\r\n emit('confirm', value)\r\n isConfirming.value = false\r\n }\r\n}\r\n\r\n// 폼 에러 핸들러\r\nconst handleFormError = (errors: any) => {\r\n emit('error', errors)\r\n // 검증 실패 시 confirm 방출을 차단\r\n isConfirming.value = false\r\n}\r\n\r\n// 모달 열기/닫기 핸들러\r\nconst onOpenChange = (value: boolean) => {\r\n emit('update:open', value)\r\n}\r\n\r\n// 확인 버튼 핸들러\r\nconst handleConfirm = () => {\r\n // 폼 제출 트리거 (검증 성공 시점에 handleFormSubmit에서 confirm 방출)\r\n isConfirming.value = true\r\n if (dynamicFormRef.value) {\r\n dynamicFormRef.value.submit()\r\n }\r\n}\r\n\r\n// 취소 버튼 핸들러\r\nconst handleCancel = () => {\r\n emit('cancel')\r\n // 폼 리셋\r\n if (dynamicFormRef.value) {\r\n dynamicFormRef.value.reset()\r\n }\r\n}\r\n\r\n// 외부에서 접근 가능한 메서드\r\ndefineExpose({\r\n reset: () => dynamicFormRef.value?.reset(),\r\n submit: () => dynamicFormRef.value?.submit(),\r\n formState: computed(() => dynamicFormRef.value?.formState),\r\n})\r\n</script>\r\n"],"names":["props","__props","emit","__emit","dynamicFormRef","ref","internalFormValue","isConfirming","sizeClass","computed","watch","newValue","handleFormChange","value","handleFieldChange","data","handleFormSubmit","handleFormError","errors","onOpenChange","handleConfirm","handleCancel","__expose","_createBlock","_unref","Dialog","_createVNode","DialogContent","DialogHeader","DialogTitle","DialogBody","_createElementVNode","_hoisted_1","_createElementBlock","_hoisted_2","_toDisplayString","JDynamicForm","_renderSlot","_ctx","DialogFooter","_Fragment","JButton"],"mappings":"uiEA8GA,MAAMA,EAAQC,EAURC,EAAOC,EAWPC,EAAiBC,EAAAA,IAA8C,IAAI,EAGnEC,EAAoBD,EAAAA,IAAyBL,EAAM,YAAc,CAAA,CAAE,EAEnEO,EAAeF,EAAAA,IAAa,EAAK,EAGjCG,EAAYC,EAAAA,SAAS,KAE6C,CACpE,GAAM,YACN,GAAM,YACN,GAAM,aACN,GAAM,aACN,MAAO,aACP,KAAQ,eAAA,GAEKT,EAAM,IAAI,CAC1B,EAGDU,EAAAA,MAAM,IAAMV,EAAM,WAAaW,GAAa,CACtCA,GAAY,KACdL,EAAkB,MAAQ,CAAE,GAAGK,CAAA,EAE/BL,EAAkB,MAAQ,CAAA,CAE9B,EAAG,CAAE,KAAM,GAAM,EAGjB,MAAMM,EAAoBC,GAA+B,CACvDP,EAAkB,MAAQO,EAC1BX,EAAK,oBAAqBW,CAAK,CACjC,EAGMC,EAAqBC,GAAwC,CACjEb,EAAK,SAAUa,CAAI,CACrB,EAGMC,EAAoBH,GAA+B,CACvDX,EAAK,SAAUW,CAAK,EAChBN,EAAa,QACfL,EAAK,UAAWW,CAAK,EACrBN,EAAa,MAAQ,GAEzB,EAGMU,EAAmBC,GAAgB,CACvChB,EAAK,QAASgB,CAAM,EAEpBX,EAAa,MAAQ,EACvB,EAGMY,EAAgBN,GAAmB,CACvCX,EAAK,cAAeW,CAAK,CAC3B,EAGMO,EAAgB,IAAM,CAE1Bb,EAAa,MAAQ,GACjBH,EAAe,OACjBA,EAAe,MAAM,OAAA,CAEzB,EAGMiB,EAAe,IAAM,CACzBnB,EAAK,QAAQ,EAETE,EAAe,OACjBA,EAAe,MAAM,MAAA,CAEzB,EAGA,OAAAkB,EAAa,CACX,MAAO,IAAMlB,EAAe,OAAO,MAAA,EACnC,OAAQ,IAAMA,EAAe,OAAO,OAAA,EACpC,UAAWK,EAAAA,SAAS,IAAML,EAAe,OAAO,SAAS,CAAA,CAC1D,wBAvNCmB,EAAAA,YAwESC,EAAAA,MAAAC,EAAAA,OAAA,EAAA,CAvEN,KAAMxB,EAAA,KACN,gBAAakB,EACb,uBAAOX,EAAA,KAAS,CAAA,qBAEjB,IAkEgB,CAlEhBkB,EAAAA,YAkEgBF,EAAAA,MAAAG,SAAA,EAAA,KAAA,mBAhEd,IAIe,CAJK1B,EAAA,qBAApBsB,EAAAA,YAIeC,EAAAA,MAAAI,EAAAA,OAAA,EAAA,OAJY,MAAM,sBAAA,qBAC/B,IAEc,CAFdF,EAAAA,YAEcF,EAAAA,MAAAK,SAAA,EAAA,KAAA,mBADZ,IAAW,qCAAR5B,EAAA,KAAK,EAAA,CAAA,CAAA,8CAKZyB,EAAAA,YAqBaF,EAAAA,MAAAM,EAAAA,OAAA,EAAA,CArBD,MAAM,gCAA8B,mBAC9C,IAmBM,CAnBNC,EAAAA,mBAmBM,MAnBNC,EAmBM,CAjBK/B,EAAA,2BAATgC,EAAAA,mBAEI,IAFJC,EAEIC,EAAAA,gBADClC,EAAA,WAAW,EAAA,CAAA,+BAIhByB,cAQEF,EAAAA,MAAAY,EAAAA,OAAA,EAAA,SAPI,iBAAJ,IAAIhC,EACH,OAAQH,EAAA,OACR,cAAaK,EAAA,MACb,sBAAoBM,EACpB,SAAQI,EACR,SAAQF,EACR,QAAOG,CAAA,mCAIVoB,aAAoBC,EAAA,OAAA,MAAA,CAAA,WAKxBZ,EAAAA,YAgCeF,EAAAA,MAAAe,SAAA,EAAA,KAAA,mBA9Bb,IAcW,CAdKtC,EAAA,aAAU,0BAA1BgC,EAAAA,mBAcWO,WAAA,CAAA,IAAA,GAAA,CAbTd,cAKUF,EAAAA,MAAAiB,EAAAA,OAAA,EAAA,CAJR,QAAQ,UACP,QAAOpB,CAAA,qBAER,IAAgB,qCAAbpB,EAAA,UAAU,EAAA,CAAA,CAAA,SAEfyB,cAMUF,EAAAA,MAAAiB,EAAAA,OAAA,EAAA,CALP,QAASxC,EAAA,eACT,SAAUA,EAAA,gBACV,QAAOmB,CAAA,qBAER,IAAiB,qCAAdnB,EAAA,WAAW,EAAA,CAAA,CAAA,wCAKGA,EAAA,aAAU,oBAC7BsB,EAAAA,YAOUC,QAAAiB,EAAAA,OAAA,EAAA,OANP,QAASxC,EAAA,eACT,SAAUA,EAAA,gBACV,QAAOmB,EACR,MAAM,QAAA,qBAEN,IAAiB,qCAAdnB,EAAA,WAAW,EAAA,CAAA,CAAA,+DAKlBoC,aAAsBC,EAAA,OAAA,QAAA,CAAA"}
|
|
@@ -17,6 +17,7 @@ import "ag-grid-enterprise";
|
|
|
17
17
|
/* empty css */
|
|
18
18
|
/* empty css */
|
|
19
19
|
/* empty css */
|
|
20
|
+
import "vue-sonner";
|
|
20
21
|
/* empty css */
|
|
21
22
|
/* empty css */
|
|
22
23
|
/* empty css */
|
|
@@ -35,7 +36,7 @@ import q from "../shadcn/DialogFooter.vue.js";
|
|
|
35
36
|
const A = { class: "space-y-4" }, G = {
|
|
36
37
|
key: 0,
|
|
37
38
|
class: "text-sm text-muted-foreground"
|
|
38
|
-
},
|
|
39
|
+
}, Te = /* @__PURE__ */ B({
|
|
39
40
|
__name: "JFormModal",
|
|
40
41
|
props: {
|
|
41
42
|
open: { type: Boolean, default: !1 },
|
|
@@ -170,6 +171,6 @@ const A = { class: "space-y-4" }, G = {
|
|
|
170
171
|
}
|
|
171
172
|
});
|
|
172
173
|
export {
|
|
173
|
-
|
|
174
|
+
Te as default
|
|
174
175
|
};
|
|
175
176
|
//# sourceMappingURL=JFormModal.vue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JFormModal.vue.js","sources":["../../../../src/components/organisms/JFormModal.vue"],"sourcesContent":["<template>\r\n <Dialog\r\n :open=\"open\"\r\n @update:open=\"onOpenChange\"\r\n :class=\"sizeClass\"\r\n >\r\n <DialogContent>\r\n <!-- Header -->\r\n <DialogHeader v-if=\"title\" class=\"bg-muted/50 border-b\">\r\n <DialogTitle>\r\n {{ title }}\r\n </DialogTitle>\r\n </DialogHeader>\r\n\r\n <!-- Body -->\r\n <DialogBody class=\"max-h-[70vh] overflow-y-auto\">\r\n <div class=\"space-y-4\">\r\n <!-- Description -->\r\n <p v-if=\"description\" class=\"text-sm text-muted-foreground\">\r\n {{ description }}\r\n </p>\r\n\r\n <!-- JDynamicForm -->\r\n <JDynamicForm\r\n ref=\"dynamicFormRef\"\r\n :schema=\"schema\"\r\n :model-value=\"internalFormValue\"\r\n @update:model-value=\"handleFormChange\"\r\n @submit=\"handleFormSubmit\"\r\n @change=\"handleFieldChange\"\r\n @error=\"handleFormError\"\r\n />\r\n\r\n <!-- 커스텀 컨텐츠 슬롯 -->\r\n <slot name=\"body\" />\r\n </div>\r\n </DialogBody>\r\n\r\n <!-- Footer -->\r\n <DialogFooter>\r\n <!-- 확인/취소 버튼 -->\r\n <template v-if=\"buttonType === 'OkCancel'\">\r\n <JButton\r\n variant=\"outline\"\r\n @click=\"handleCancel\"\r\n >\r\n {{ cancelText }}\r\n </JButton>\r\n <JButton\r\n :variant=\"confirmVariant\"\r\n :disabled=\"confirmDisabled\"\r\n @click=\"handleConfirm\"\r\n >\r\n {{ confirmText }}\r\n </JButton>\r\n </template>\r\n \r\n <!-- 확인 버튼만 -->\r\n <template v-else-if=\"buttonType === 'Ok'\">\r\n <JButton\r\n :variant=\"confirmVariant\"\r\n :disabled=\"confirmDisabled\"\r\n @click=\"handleConfirm\"\r\n class=\"w-full\"\r\n >\r\n {{ confirmText }}\r\n </JButton>\r\n </template>\r\n\r\n <!-- 커스텀 푸터 슬롯 -->\r\n <slot name=\"footer\" />\r\n </DialogFooter>\r\n </DialogContent>\r\n </Dialog>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, ref, watch } from 'vue'\r\nimport {\r\n Dialog,\r\n DialogBody,\r\n DialogContent,\r\n DialogFooter,\r\n DialogHeader,\r\n DialogTitle,\r\n} from '@/components/shadcn'\r\nimport { JButton } from '@/components/atoms'\r\nimport { JDynamicForm } from '@/components/organisms'\r\nimport type { FormSchema } from '@/types/dynamic-form'\r\n\r\nexport interface JFormModalProps {\r\n // 모달 표시 여부\r\n open: boolean\r\n // 헤더\r\n title?: string\r\n description?: string\r\n // 다이나믹 폼 스키마 (필수)\r\n schema: FormSchema\r\n // 폼 값\r\n modelValue?: Record<string, any>\r\n // 모달 사이즈 (유동적)\r\n size?: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full'\r\n // 버튼 설정\r\n buttonType?: 'Ok' | 'OkCancel'\r\n confirmText?: string\r\n cancelText?: string\r\n confirmVariant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link'\r\n confirmDisabled?: boolean\r\n}\r\n\r\nconst props = withDefaults(defineProps<JFormModalProps>(), {\r\n open: false,\r\n size: 'lg',\r\n buttonType: 'OkCancel',\r\n confirmText: '확인',\r\n cancelText: '취소',\r\n confirmVariant: 'default',\r\n confirmDisabled: false,\r\n})\r\n\r\nconst emit = defineEmits<{\r\n 'update:open': [value: boolean]\r\n 'update:modelValue': [value: Record<string, any>]\r\n 'confirm': [value: Record<string, any>]\r\n 'cancel': []\r\n 'submit': [value: Record<string, any>]\r\n 'change': [data: { field: string; value: any }]\r\n 'error': [errors: any]\r\n}>()\r\n\r\n// 다이나믹 폼 ref\r\nconst dynamicFormRef = ref<InstanceType<typeof JDynamicForm> | null>(null)\r\n\r\n// 내부 폼 값 관리\r\nconst internalFormValue = ref<Record<string, any>>(props.modelValue || {})\r\n// 확인 버튼 클릭 이후 검증 성공 시점에만 confirm 이벤트를 방출하기 위한 플래그\r\nconst isConfirming = ref<boolean>(false)\r\n\r\n// 사이즈 클래스 계산\r\nconst sizeClass = computed(() => {\r\n // Dialog.vue에 기본 max-w-lg가 하드코딩되어 있어 !max-w-*로 오버라이드\r\n const sizeMap: Record<NonNullable<JFormModalProps['size']>, string> = {\r\n 'sm': '!max-w-sm',\r\n 'md': '!max-w-md',\r\n 'lg': '!max-w-2xl',\r\n 'xl': '!max-w-4xl',\r\n '2xl': '!max-w-6xl',\r\n 'full': '!max-w-[95vw]'\r\n }\r\n return sizeMap[props.size]\r\n})\r\n\r\n// props.modelValue 변경 감지\r\nwatch(() => props.modelValue, (newValue) => {\r\n if (newValue != null) {\r\n internalFormValue.value = { ...newValue }\r\n } else {\r\n internalFormValue.value = {}\r\n }\r\n}, { deep: true })\r\n\r\n// 폼 변경 핸들러\r\nconst handleFormChange = (value: Record<string, any>) => {\r\n internalFormValue.value = value\r\n emit('update:modelValue', value)\r\n}\r\n\r\n// 필드 변경 핸들러\r\nconst handleFieldChange = (data: { field: string; value: any }) => {\r\n emit('change', data)\r\n}\r\n\r\n// 폼 제출 핸들러\r\nconst handleFormSubmit = (value: Record<string, any>) => {\r\n emit('submit', value)\r\n if (isConfirming.value) {\r\n emit('confirm', value)\r\n isConfirming.value = false\r\n }\r\n}\r\n\r\n// 폼 에러 핸들러\r\nconst handleFormError = (errors: any) => {\r\n emit('error', errors)\r\n // 검증 실패 시 confirm 방출을 차단\r\n isConfirming.value = false\r\n}\r\n\r\n// 모달 열기/닫기 핸들러\r\nconst onOpenChange = (value: boolean) => {\r\n emit('update:open', value)\r\n}\r\n\r\n// 확인 버튼 핸들러\r\nconst handleConfirm = () => {\r\n // 폼 제출 트리거 (검증 성공 시점에 handleFormSubmit에서 confirm 방출)\r\n isConfirming.value = true\r\n if (dynamicFormRef.value) {\r\n dynamicFormRef.value.submit()\r\n }\r\n}\r\n\r\n// 취소 버튼 핸들러\r\nconst handleCancel = () => {\r\n emit('cancel')\r\n // 폼 리셋\r\n if (dynamicFormRef.value) {\r\n dynamicFormRef.value.reset()\r\n }\r\n}\r\n\r\n// 외부에서 접근 가능한 메서드\r\ndefineExpose({\r\n reset: () => dynamicFormRef.value?.reset(),\r\n submit: () => dynamicFormRef.value?.submit(),\r\n formState: computed(() => dynamicFormRef.value?.formState),\r\n})\r\n</script>\r\n"],"names":["props","__props","emit","__emit","dynamicFormRef","ref","internalFormValue","isConfirming","sizeClass","computed","watch","newValue","handleFormChange","value","handleFieldChange","data","handleFormSubmit","handleFormError","errors","onOpenChange","handleConfirm","handleCancel","__expose","_createBlock","_unref","Dialog","_createVNode","DialogContent","DialogHeader","DialogTitle","DialogBody","_createElementVNode","_hoisted_1","_createElementBlock","_hoisted_2","_toDisplayString","JDynamicForm","_renderSlot","_ctx","DialogFooter","_Fragment","JButton"],"mappings":"
|
|
1
|
+
{"version":3,"file":"JFormModal.vue.js","sources":["../../../../src/components/organisms/JFormModal.vue"],"sourcesContent":["<template>\r\n <Dialog\r\n :open=\"open\"\r\n @update:open=\"onOpenChange\"\r\n :class=\"sizeClass\"\r\n >\r\n <DialogContent>\r\n <!-- Header -->\r\n <DialogHeader v-if=\"title\" class=\"bg-muted/50 border-b\">\r\n <DialogTitle>\r\n {{ title }}\r\n </DialogTitle>\r\n </DialogHeader>\r\n\r\n <!-- Body -->\r\n <DialogBody class=\"max-h-[70vh] overflow-y-auto\">\r\n <div class=\"space-y-4\">\r\n <!-- Description -->\r\n <p v-if=\"description\" class=\"text-sm text-muted-foreground\">\r\n {{ description }}\r\n </p>\r\n\r\n <!-- JDynamicForm -->\r\n <JDynamicForm\r\n ref=\"dynamicFormRef\"\r\n :schema=\"schema\"\r\n :model-value=\"internalFormValue\"\r\n @update:model-value=\"handleFormChange\"\r\n @submit=\"handleFormSubmit\"\r\n @change=\"handleFieldChange\"\r\n @error=\"handleFormError\"\r\n />\r\n\r\n <!-- 커스텀 컨텐츠 슬롯 -->\r\n <slot name=\"body\" />\r\n </div>\r\n </DialogBody>\r\n\r\n <!-- Footer -->\r\n <DialogFooter>\r\n <!-- 확인/취소 버튼 -->\r\n <template v-if=\"buttonType === 'OkCancel'\">\r\n <JButton\r\n variant=\"outline\"\r\n @click=\"handleCancel\"\r\n >\r\n {{ cancelText }}\r\n </JButton>\r\n <JButton\r\n :variant=\"confirmVariant\"\r\n :disabled=\"confirmDisabled\"\r\n @click=\"handleConfirm\"\r\n >\r\n {{ confirmText }}\r\n </JButton>\r\n </template>\r\n \r\n <!-- 확인 버튼만 -->\r\n <template v-else-if=\"buttonType === 'Ok'\">\r\n <JButton\r\n :variant=\"confirmVariant\"\r\n :disabled=\"confirmDisabled\"\r\n @click=\"handleConfirm\"\r\n class=\"w-full\"\r\n >\r\n {{ confirmText }}\r\n </JButton>\r\n </template>\r\n\r\n <!-- 커스텀 푸터 슬롯 -->\r\n <slot name=\"footer\" />\r\n </DialogFooter>\r\n </DialogContent>\r\n </Dialog>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, ref, watch } from 'vue'\r\nimport {\r\n Dialog,\r\n DialogBody,\r\n DialogContent,\r\n DialogFooter,\r\n DialogHeader,\r\n DialogTitle,\r\n} from '@/components/shadcn'\r\nimport { JButton } from '@/components/atoms'\r\nimport { JDynamicForm } from '@/components/organisms'\r\nimport type { FormSchema } from '@/types/dynamic-form'\r\n\r\nexport interface JFormModalProps {\r\n // 모달 표시 여부\r\n open: boolean\r\n // 헤더\r\n title?: string\r\n description?: string\r\n // 다이나믹 폼 스키마 (필수)\r\n schema: FormSchema\r\n // 폼 값\r\n modelValue?: Record<string, any>\r\n // 모달 사이즈 (유동적)\r\n size?: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full'\r\n // 버튼 설정\r\n buttonType?: 'Ok' | 'OkCancel'\r\n confirmText?: string\r\n cancelText?: string\r\n confirmVariant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link'\r\n confirmDisabled?: boolean\r\n}\r\n\r\nconst props = withDefaults(defineProps<JFormModalProps>(), {\r\n open: false,\r\n size: 'lg',\r\n buttonType: 'OkCancel',\r\n confirmText: '확인',\r\n cancelText: '취소',\r\n confirmVariant: 'default',\r\n confirmDisabled: false,\r\n})\r\n\r\nconst emit = defineEmits<{\r\n 'update:open': [value: boolean]\r\n 'update:modelValue': [value: Record<string, any>]\r\n 'confirm': [value: Record<string, any>]\r\n 'cancel': []\r\n 'submit': [value: Record<string, any>]\r\n 'change': [data: { field: string; value: any }]\r\n 'error': [errors: any]\r\n}>()\r\n\r\n// 다이나믹 폼 ref\r\nconst dynamicFormRef = ref<InstanceType<typeof JDynamicForm> | null>(null)\r\n\r\n// 내부 폼 값 관리\r\nconst internalFormValue = ref<Record<string, any>>(props.modelValue || {})\r\n// 확인 버튼 클릭 이후 검증 성공 시점에만 confirm 이벤트를 방출하기 위한 플래그\r\nconst isConfirming = ref<boolean>(false)\r\n\r\n// 사이즈 클래스 계산\r\nconst sizeClass = computed(() => {\r\n // Dialog.vue에 기본 max-w-lg가 하드코딩되어 있어 !max-w-*로 오버라이드\r\n const sizeMap: Record<NonNullable<JFormModalProps['size']>, string> = {\r\n 'sm': '!max-w-sm',\r\n 'md': '!max-w-md',\r\n 'lg': '!max-w-2xl',\r\n 'xl': '!max-w-4xl',\r\n '2xl': '!max-w-6xl',\r\n 'full': '!max-w-[95vw]'\r\n }\r\n return sizeMap[props.size]\r\n})\r\n\r\n// props.modelValue 변경 감지\r\nwatch(() => props.modelValue, (newValue) => {\r\n if (newValue != null) {\r\n internalFormValue.value = { ...newValue }\r\n } else {\r\n internalFormValue.value = {}\r\n }\r\n}, { deep: true })\r\n\r\n// 폼 변경 핸들러\r\nconst handleFormChange = (value: Record<string, any>) => {\r\n internalFormValue.value = value\r\n emit('update:modelValue', value)\r\n}\r\n\r\n// 필드 변경 핸들러\r\nconst handleFieldChange = (data: { field: string; value: any }) => {\r\n emit('change', data)\r\n}\r\n\r\n// 폼 제출 핸들러\r\nconst handleFormSubmit = (value: Record<string, any>) => {\r\n emit('submit', value)\r\n if (isConfirming.value) {\r\n emit('confirm', value)\r\n isConfirming.value = false\r\n }\r\n}\r\n\r\n// 폼 에러 핸들러\r\nconst handleFormError = (errors: any) => {\r\n emit('error', errors)\r\n // 검증 실패 시 confirm 방출을 차단\r\n isConfirming.value = false\r\n}\r\n\r\n// 모달 열기/닫기 핸들러\r\nconst onOpenChange = (value: boolean) => {\r\n emit('update:open', value)\r\n}\r\n\r\n// 확인 버튼 핸들러\r\nconst handleConfirm = () => {\r\n // 폼 제출 트리거 (검증 성공 시점에 handleFormSubmit에서 confirm 방출)\r\n isConfirming.value = true\r\n if (dynamicFormRef.value) {\r\n dynamicFormRef.value.submit()\r\n }\r\n}\r\n\r\n// 취소 버튼 핸들러\r\nconst handleCancel = () => {\r\n emit('cancel')\r\n // 폼 리셋\r\n if (dynamicFormRef.value) {\r\n dynamicFormRef.value.reset()\r\n }\r\n}\r\n\r\n// 외부에서 접근 가능한 메서드\r\ndefineExpose({\r\n reset: () => dynamicFormRef.value?.reset(),\r\n submit: () => dynamicFormRef.value?.submit(),\r\n formState: computed(() => dynamicFormRef.value?.formState),\r\n})\r\n</script>\r\n"],"names":["props","__props","emit","__emit","dynamicFormRef","ref","internalFormValue","isConfirming","sizeClass","computed","watch","newValue","handleFormChange","value","handleFieldChange","data","handleFormSubmit","handleFormError","errors","onOpenChange","handleConfirm","handleCancel","__expose","_createBlock","_unref","Dialog","_createVNode","DialogContent","DialogHeader","DialogTitle","DialogBody","_createElementVNode","_hoisted_1","_createElementBlock","_hoisted_2","_toDisplayString","JDynamicForm","_renderSlot","_ctx","DialogFooter","_Fragment","JButton"],"mappings":"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"}
|