{"version":3,"file":"JModal.vue.cjs","sources":["../../../../src/components/organisms/JModal.vue"],"sourcesContent":["<template>\r\n  <Dialog\r\n    :open=\"open\"\r\n    :class=\"sizeClass\"\r\n    @update:open=\"onOpenChange\"\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>\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          <!-- JFormField가 있는 경우 -->\r\n          <div v-if=\"showFormField\">\r\n            <JFormField\r\n              :id=\"inputId\"\r\n              v-model=\"inputValue\"\r\n              :label=\"formFieldLabel\"\r\n              :error-msg=\"formFieldError\"\r\n              :required=\"formFieldRequired\"\r\n              :type=\"formFieldType\"\r\n              :input-type=\"formFieldInputType\"\r\n              :placeholder=\"formFieldInputPlaceholder\"\r\n              :disabled=\"disabled\"\r\n            />\r\n          </div>\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        <!-- 확인/취소 버튼 -->\n        <template v-if=\"buttonType === 'OkCancel'\">\n          <JButton\n            variant=\"outline\"\n            size=\"sm\"\n            @click=\"handleCancel\"\n          >\n            {{ cancelText }}\n          </JButton>\n          <JButton\n            :variant=\"confirmVariant\"\n            :disabled=\"confirmDisabled\"\n            size=\"sm\"\n            @click=\"handleConfirm\"\n          >\n            {{ confirmText }}\n          </JButton>\n        </template>\n        \n        <!-- 확인 버튼만 -->\n        <template v-else-if=\"buttonType === 'Ok'\">\n          <JButton\n            :variant=\"confirmVariant\"\n            :disabled=\"confirmDisabled\"\n            size=\"sm\"\n            class=\"w-full\"\n            @click=\"handleConfirm\"\n          >\n            {{ confirmText }}\n          </JButton>\n        </template>\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 { JFormField } from '@/components/molecules'\r\n\r\nexport interface JModalProps {\r\n  // 모달 표시 여부\r\n  open: boolean\r\n  // 헤더\r\n  title?: string\r\n  description?: string\r\n  // 모달 사이즈\r\n  size?: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full'\r\n  // 폼 필드 (JFormField)\r\n  showFormField?: boolean\r\n  formFieldLabel?: string\r\n  formFieldError?: string\r\n  formFieldRequired?: boolean\r\n  // 입력 필드 설정\r\n  formFieldInputType?: 'text' | 'email' | 'password' | 'number' | 'tel' | 'url'\r\n  formFieldInputPlaceholder?: string\r\n  formFieldValue?: string\r\n  formFieldType?: 'input' | 'textarea' | 'checkbox' | 'switch' | 'combo' | 'radio' | 'searchCombo' | 'datepicker'\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  disabled?: boolean\r\n}\r\n\r\nconst props = withDefaults(defineProps<JModalProps>(), {\r\n  open: false,\r\n  size: 'md',\r\n  showFormField: false,\r\n  formFieldInputType: 'text',\r\n  formFieldType: 'input',\r\n  buttonType: 'OkCancel',\r\n  confirmText: '확인',\r\n  cancelText: '취소',\r\n  confirmVariant: 'default',\r\n  confirmDisabled: false,\r\n  disabled: false,\r\n})\r\n\r\nconst emit = defineEmits<{\r\n  'update:open': [value: boolean]\r\n  'confirm': [value?: string]\r\n  'cancel': []\r\n}>()\r\n\r\n// 입력값 관리\r\nconst inputValue = ref(props.formFieldValue || '')\r\n\r\n// 입력 필드 ID 생성\r\nconst inputId = computed(() => `modal-input-${Math.random().toString(36).substr(2, 9)}`)\r\n\r\n// 사이즈 클래스 계산\r\nconst sizeClass = computed(() => {\r\n  // Dialog.vue에 기본 max-w-lg가 하드코딩되어 있어 !max-w-*로 오버라이드\r\n  const sizeMap: Record<NonNullable<JModalProps['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.formFieldValue 변경 감지\r\nwatch(() => props.formFieldValue, (newValue) => {\r\n  if (newValue !== undefined) {\r\n    inputValue.value = newValue\r\n  }\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  const value = props.showFormField ? inputValue.value : undefined\r\n  emit('confirm', value)\r\n}\r\n\r\n// 취소 버튼 핸들러\r\nconst handleCancel = () => {\r\n  emit('cancel')\r\n  // 입력값 초기화\r\n  inputValue.value = props.formFieldValue || ''\r\n}\r\n</script>\r\n"],"names":["props","__props","emit","__emit","inputValue","ref","inputId","computed","sizeClass","watch","newValue","onOpenChange","value","handleConfirm","handleCancel","_createBlock","_unref","Dialog","_createVNode","DialogContent","DialogHeader","DialogTitle","DialogBody","_createElementVNode","_hoisted_1","_createElementBlock","_hoisted_2","_toDisplayString","_hoisted_3","JFormField","$event","_renderSlot","_ctx","DialogFooter","_Fragment","JButton"],"mappings":"+jEAyHA,MAAMA,EAAQC,EAcRC,EAAOC,EAOPC,EAAaC,EAAAA,IAAIL,EAAM,gBAAkB,EAAE,EAG3CM,EAAUC,EAAAA,SAAS,IAAM,eAAe,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,OAAO,EAAG,CAAC,CAAC,EAAE,EAGjFC,EAAYD,EAAAA,SAAS,KAEyC,CAChE,GAAM,YACN,GAAM,YACN,GAAM,aACN,GAAM,aACN,MAAO,aACP,KAAQ,eAAA,GAEKP,EAAM,IAAI,CAC1B,EAGDS,EAAAA,MAAM,IAAMT,EAAM,eAAiBU,GAAa,CAC1CA,IAAa,SACfN,EAAW,MAAQM,EAEvB,CAAC,EAGD,MAAMC,EAAgBC,GAAmB,CACvCV,EAAK,cAAeU,CAAK,CAC3B,EAGMC,EAAgB,IAAM,CAC1B,MAAMD,EAAQZ,EAAM,cAAgBI,EAAW,MAAQ,OACvDF,EAAK,UAAWU,CAAK,CACvB,EAGME,EAAe,IAAM,CACzBZ,EAAK,QAAQ,EAEbE,EAAW,MAAQJ,EAAM,gBAAkB,EAC7C,8BAvLEe,EAAAA,YA4ESC,EAAAA,MAAAC,EAAAA,OAAA,EAAA,CA3EN,KAAMhB,EAAA,KACN,uBAAOO,EAAA,KAAS,EAChB,gBAAaG,CAAA,qBAEd,IAsEgB,CAtEhBO,EAAAA,YAsEgBF,EAAAA,MAAAG,SAAA,EAAA,KAAA,mBApEd,IAIe,CAJKlB,EAAA,qBAApBc,EAAAA,YAIeC,EAAAA,MAAAI,EAAAA,OAAA,EAAA,OAJY,MAAM,sBAAA,qBAC/B,IAEc,CAFdF,EAAAA,YAEcF,EAAAA,MAAAK,SAAA,EAAA,KAAA,mBADZ,IAAW,qCAARpB,EAAA,KAAK,EAAA,CAAA,CAAA,8CAKZiB,EAAAA,YAyBaF,EAAAA,MAAAM,SAAA,EAAA,KAAA,mBAxBX,IAuBM,CAvBNC,EAAAA,mBAuBM,MAvBNC,EAuBM,CArBKvB,EAAA,2BAATwB,EAAAA,mBAEI,IAFJC,EAEIC,EAAAA,gBADC1B,EAAA,WAAW,EAAA,CAAA,+BAILA,EAAA,6BAAXwB,EAAAA,mBAYM,MAAAG,EAAA,CAXJV,cAUEF,EAAAA,MAAAa,EAAAA,OAAA,EAAA,CATC,GAAIvB,EAAA,iBACIF,EAAA,2CAAAA,EAAU,MAAA0B,GAClB,MAAO7B,EAAA,eACP,YAAWA,EAAA,eACX,SAAUA,EAAA,kBACV,KAAMA,EAAA,cACN,aAAYA,EAAA,mBACZ,YAAaA,EAAA,0BACb,SAAUA,EAAA,QAAA,yIAKf8B,aAAoBC,EAAA,OAAA,MAAA,CAAA,WAKxBd,EAAAA,YAgCeF,EAAAA,MAAAiB,SAAA,EAAA,KAAA,mBA9Bb,IAgBW,CAhBKhC,EAAA,aAAU,0BAA1BwB,EAAAA,mBAgBWS,WAAA,CAAA,IAAA,GAAA,CAfThB,cAMUF,EAAAA,MAAAmB,EAAAA,OAAA,EAAA,CALR,QAAQ,UACR,KAAK,KACJ,QAAOrB,CAAA,qBAER,IAAgB,qCAAbb,EAAA,UAAU,EAAA,CAAA,CAAA,SAEfiB,cAOUF,EAAAA,MAAAmB,EAAAA,OAAA,EAAA,CANP,QAASlC,EAAA,eACT,SAAUA,EAAA,gBACX,KAAK,KACJ,QAAOY,CAAA,qBAER,IAAiB,qCAAdZ,EAAA,WAAW,EAAA,CAAA,CAAA,wCAKGA,EAAA,aAAU,oBAC7Bc,EAAAA,YAQUC,QAAAmB,EAAAA,OAAA,EAAA,OAPP,QAASlC,EAAA,eACT,SAAUA,EAAA,gBACX,KAAK,KACL,MAAM,SACL,QAAOY,CAAA,qBAER,IAAiB,qCAAdZ,EAAA,WAAW,EAAA,CAAA,CAAA"}