@j-solution/components 1.6.1 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -6
- package/assets/jwms-portal-frontend-BtHTA-UF.css +1 -0
- package/assets/styles/global-utilities.css +34 -0
- package/assets/styles/j-components.css +1 -1
- package/assets/styles/themes.css +128 -21
- package/components/atoms/JAvatar.vue.cjs +1 -1
- package/components/atoms/JAvatar.vue.cjs.map +1 -1
- package/components/atoms/JAvatar.vue.js +10 -7
- package/components/atoms/JAvatar.vue.js.map +1 -1
- package/components/atoms/JBadge.vue.cjs +1 -1
- package/components/atoms/JBadge.vue.cjs.map +1 -1
- package/components/atoms/JBadge.vue.js +7 -6
- package/components/atoms/JBadge.vue.js.map +1 -1
- package/components/atoms/JButton.vue.cjs +6 -1
- package/components/atoms/JButton.vue.cjs.map +1 -1
- package/components/atoms/JButton.vue.js +10 -85
- package/components/atoms/JButton.vue.js.map +1 -1
- package/components/atoms/JButton.vue2.cjs +1 -1
- package/components/atoms/JButton.vue2.cjs.map +1 -1
- package/components/atoms/JButton.vue2.js +85 -2
- package/components/atoms/JButton.vue2.js.map +1 -1
- package/components/atoms/JDatepicker.vue.cjs +1 -1
- package/components/atoms/JDatepicker.vue.cjs.map +1 -1
- package/components/atoms/JDatepicker.vue.js +10 -10
- package/components/atoms/JDatepicker.vue.js.map +1 -1
- package/components/atoms/JEditor.vue.cjs +1 -1
- package/components/atoms/JEditor.vue.js +1 -1
- package/components/atoms/JEditor.vue2.cjs +1 -1
- package/components/atoms/JEditor.vue2.cjs.map +1 -1
- package/components/atoms/JEditor.vue2.js +31 -17
- package/components/atoms/JEditor.vue2.js.map +1 -1
- package/components/atoms/JGrid.vue.cjs +1 -1
- package/components/atoms/JGrid.vue.js +2 -2
- package/components/atoms/JGrid.vue2.cjs +1 -1
- package/components/atoms/JGrid.vue2.cjs.map +1 -1
- package/components/atoms/JGrid.vue2.js +59 -43
- package/components/atoms/JGrid.vue2.js.map +1 -1
- package/components/atoms/JIcon.vue.cjs +1 -1
- package/components/atoms/JIcon.vue.cjs.map +1 -1
- package/components/atoms/JIcon.vue.js +14 -13
- package/components/atoms/JIcon.vue.js.map +1 -1
- package/components/atoms/JKbd.vue.cjs +1 -1
- package/components/atoms/JKbd.vue.cjs.map +1 -1
- package/components/atoms/JKbd.vue.js +13 -10
- package/components/atoms/JKbd.vue.js.map +1 -1
- package/components/atoms/JLabel.vue.cjs +1 -1
- package/components/atoms/JLabel.vue.cjs.map +1 -1
- package/components/atoms/JLabel.vue.js +26 -22
- package/components/atoms/JLabel.vue.js.map +1 -1
- package/components/atoms/JLink.vue.cjs +1 -1
- package/components/atoms/JLink.vue.cjs.map +1 -1
- package/components/atoms/JLink.vue.js +5 -5
- package/components/atoms/JLink.vue.js.map +1 -1
- package/components/atoms/JPreview.vue.cjs +1 -1
- package/components/atoms/JPreview.vue.js +2 -2
- package/components/atoms/JPreview.vue2.cjs +1 -1
- package/components/atoms/JPreview.vue2.cjs.map +1 -1
- package/components/atoms/JPreview.vue2.js +33 -20
- package/components/atoms/JPreview.vue2.js.map +1 -1
- package/components/atoms/JProgress.vue.cjs +1 -1
- package/components/atoms/JProgress.vue.cjs.map +1 -1
- package/components/atoms/JProgress.vue.js +15 -9
- package/components/atoms/JProgress.vue.js.map +1 -1
- package/components/atoms/JRadio.vue.cjs +1 -1
- package/components/atoms/JRadio.vue.cjs.map +1 -1
- package/components/atoms/JRadio.vue.js +1 -1
- package/components/atoms/JRadio.vue.js.map +1 -1
- package/components/atoms/JSearchCombo.vue.cjs +1 -1
- package/components/atoms/JSearchCombo.vue.cjs.map +1 -1
- package/components/atoms/JSearchCombo.vue.js +38 -37
- package/components/atoms/JSearchCombo.vue.js.map +1 -1
- package/components/atoms/JSectionTitle.vue.cjs +7 -0
- package/components/atoms/JSectionTitle.vue.cjs.map +1 -0
- package/components/atoms/JSectionTitle.vue.js +13 -0
- package/components/atoms/JSectionTitle.vue.js.map +1 -0
- package/components/atoms/JSectionTitle.vue2.cjs +2 -0
- package/components/atoms/JSectionTitle.vue2.cjs.map +1 -0
- package/components/atoms/JSectionTitle.vue2.js +67 -0
- package/components/atoms/JSectionTitle.vue2.js.map +1 -0
- package/components/atoms/JSpinner.vue.cjs +1 -1
- package/components/atoms/JSpinner.vue.cjs.map +1 -1
- package/components/atoms/JSpinner.vue.js +8 -7
- package/components/atoms/JSpinner.vue.js.map +1 -1
- package/components/atoms/JSplitter.vue.cjs +6 -1
- package/components/atoms/JSplitter.vue.cjs.map +1 -1
- package/components/atoms/JSplitter.vue.js +10 -54
- package/components/atoms/JSplitter.vue.js.map +1 -1
- package/components/atoms/JSplitter.vue2.cjs +1 -1
- package/components/atoms/JSplitter.vue2.cjs.map +1 -1
- package/components/atoms/JSplitter.vue2.js +59 -2
- package/components/atoms/JSplitter.vue2.js.map +1 -1
- package/components/atoms/JTooltip.vue.cjs +1 -1
- package/components/atoms/JTooltip.vue.cjs.map +1 -1
- package/components/atoms/JTooltip.vue.js +18 -15
- package/components/atoms/JTooltip.vue.js.map +1 -1
- package/components/examples/ExampleCrudPage.vue.cjs +1 -1
- package/components/examples/ExampleCrudPage.vue.cjs.map +1 -1
- package/components/examples/ExampleCrudPage.vue.js +265 -191
- package/components/examples/ExampleCrudPage.vue.js.map +1 -1
- package/components/examples/ExampleTabMappingPage.vue.cjs +1 -1
- package/components/examples/ExampleTabMappingPage.vue.cjs.map +1 -1
- package/components/examples/ExampleTabMappingPage.vue.js +349 -333
- package/components/examples/ExampleTabMappingPage.vue.js.map +1 -1
- package/components/molecules/JAlert.vue.cjs +1 -1
- package/components/molecules/JAlert.vue.cjs.map +1 -1
- package/components/molecules/JAlert.vue.js +18 -16
- package/components/molecules/JAlert.vue.js.map +1 -1
- package/components/molecules/JBreadcrumb.vue.cjs +1 -1
- package/components/molecules/JBreadcrumb.vue.cjs.map +1 -1
- package/components/molecules/JBreadcrumb.vue.js +3 -3
- package/components/molecules/JBreadcrumb.vue.js.map +1 -1
- package/components/molecules/JCard.vue.cjs +1 -1
- package/components/molecules/JCard.vue.cjs.map +1 -1
- package/components/molecules/JCard.vue.js +55 -39
- package/components/molecules/JCard.vue.js.map +1 -1
- package/components/molecules/JEmptyState.vue.cjs +7 -0
- package/components/molecules/JEmptyState.vue.cjs.map +1 -0
- package/components/molecules/JEmptyState.vue.js +13 -0
- package/components/molecules/JEmptyState.vue.js.map +1 -0
- package/components/molecules/JEmptyState.vue2.cjs +2 -0
- package/components/molecules/JEmptyState.vue2.cjs.map +1 -0
- package/components/molecules/JEmptyState.vue2.js +127 -0
- package/components/molecules/JEmptyState.vue2.js.map +1 -0
- package/components/molecules/JFormField.vue.cjs +6 -1
- package/components/molecules/JFormField.vue.cjs.map +1 -1
- package/components/molecules/JFormField.vue.js +10 -262
- package/components/molecules/JFormField.vue.js.map +1 -1
- package/components/molecules/JFormField.vue2.cjs +2 -0
- package/components/molecules/JFormField.vue2.cjs.map +1 -0
- package/components/molecules/JFormField.vue2.js +271 -0
- package/components/molecules/JFormField.vue2.js.map +1 -0
- package/components/molecules/JTabs.vue.cjs +1 -1
- package/components/molecules/JTabs.vue.js +1 -1
- package/components/molecules/JTabs.vue2.cjs +1 -1
- package/components/molecules/JTabs.vue2.cjs.map +1 -1
- package/components/molecules/JTabs.vue2.js +50 -56
- package/components/molecules/JTabs.vue2.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 +49 -47
- 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 +35 -32
- package/components/organisms/JDynamicForm.vue2.js.map +1 -1
- package/components/organisms/JDynamicTabs.vue.cjs +1 -1
- package/components/organisms/JDynamicTabs.vue.cjs.map +1 -1
- package/components/organisms/JDynamicTabs.vue.js +47 -52
- package/components/organisms/JDynamicTabs.vue.js.map +1 -1
- package/components/organisms/JFilterBar.vue.cjs +6 -1
- package/components/organisms/JFilterBar.vue.cjs.map +1 -1
- package/components/organisms/JFilterBar.vue.js +10 -137
- package/components/organisms/JFilterBar.vue.js.map +1 -1
- package/components/organisms/JFilterBar.vue2.cjs +1 -1
- package/components/organisms/JFilterBar.vue2.cjs.map +1 -1
- package/components/organisms/JFilterBar.vue2.js +141 -2
- package/components/organisms/JFilterBar.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 +54 -49
- package/components/organisms/JFormModal.vue.js.map +1 -1
- package/components/organisms/JHeader.vue.cjs +1 -1
- package/components/organisms/JHeader.vue.cjs.map +1 -1
- package/components/organisms/JHeader.vue.js +211 -208
- package/components/organisms/JHeader.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 +31 -26
- package/components/organisms/JModal.vue.js.map +1 -1
- package/components/organisms/JPageContainer.vue.cjs +1 -1
- package/components/organisms/JPageContainer.vue.cjs.map +1 -1
- package/components/organisms/JPageContainer.vue.js +22 -22
- package/components/organisms/JPageContainer.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 +34 -32
- package/components/organisms/JSearchPanel.vue2.js.map +1 -1
- package/components/organisms/JShuttle.vue.cjs +7 -0
- package/components/organisms/JShuttle.vue.cjs.map +1 -0
- package/components/organisms/JShuttle.vue.js +13 -0
- package/components/organisms/JShuttle.vue.js.map +1 -0
- package/components/organisms/JShuttle.vue2.cjs +2 -0
- package/components/organisms/JShuttle.vue2.cjs.map +1 -0
- package/components/organisms/JShuttle.vue2.js +216 -0
- package/components/organisms/JShuttle.vue2.js.map +1 -0
- package/components/organisms/JSidebarAdvanced.vue.cjs +1 -1
- package/components/organisms/JSidebarAdvanced.vue.js +7 -7
- package/components/organisms/JSidebarAdvanced.vue2.cjs +1 -1
- package/components/organisms/JSidebarAdvanced.vue2.cjs.map +1 -1
- package/components/organisms/JSidebarAdvanced.vue2.js +40 -40
- package/components/organisms/JSidebarAdvanced.vue2.js.map +1 -1
- package/components/organisms/JSidebarSimple/JDynamicMenuItem.vue.cjs +1 -1
- package/components/organisms/JSidebarSimple/JDynamicMenuItem.vue.cjs.map +1 -1
- package/components/organisms/JSidebarSimple/JDynamicMenuItem.vue.js +83 -63
- package/components/organisms/JSidebarSimple/JDynamicMenuItem.vue.js.map +1 -1
- package/components/organisms/JSidebarSimple.vue.cjs +1 -1
- package/components/organisms/JSidebarSimple.vue.js +2 -2
- package/components/organisms/JSidebarSimple.vue2.cjs +1 -1
- package/components/organisms/JSidebarSimple.vue2.cjs.map +1 -1
- package/components/organisms/JSidebarSimple.vue2.js +2 -2
- package/components/organisms/JSidebarSimple.vue2.js.map +1 -1
- package/components/shadcn/AccordionTrigger.vue.cjs +1 -1
- package/components/shadcn/AccordionTrigger.vue.cjs.map +1 -1
- package/components/shadcn/AccordionTrigger.vue.js +3 -3
- package/components/shadcn/AccordionTrigger.vue.js.map +1 -1
- package/components/shadcn/Card.vue.cjs +1 -1
- package/components/shadcn/Card.vue.cjs.map +1 -1
- package/components/shadcn/Card.vue.js +1 -1
- package/components/shadcn/Card.vue.js.map +1 -1
- package/components/shadcn/CardContent.vue.cjs +1 -1
- package/components/shadcn/CardContent.vue.cjs.map +1 -1
- package/components/shadcn/CardContent.vue.js +4 -4
- package/components/shadcn/CardContent.vue.js.map +1 -1
- package/components/shadcn/CardDescription.vue.cjs +1 -1
- package/components/shadcn/CardDescription.vue.cjs.map +1 -1
- package/components/shadcn/CardDescription.vue.js +1 -1
- package/components/shadcn/CardDescription.vue.js.map +1 -1
- package/components/shadcn/CardFooter.vue.cjs +1 -1
- package/components/shadcn/CardFooter.vue.cjs.map +1 -1
- package/components/shadcn/CardFooter.vue.js +7 -7
- package/components/shadcn/CardFooter.vue.js.map +1 -1
- package/components/shadcn/CardHeader.vue.cjs +1 -1
- package/components/shadcn/CardHeader.vue.cjs.map +1 -1
- package/components/shadcn/CardHeader.vue.js +8 -8
- package/components/shadcn/CardHeader.vue.js.map +1 -1
- package/components/shadcn/CardTitle.vue.cjs +1 -1
- package/components/shadcn/CardTitle.vue.cjs.map +1 -1
- package/components/shadcn/CardTitle.vue.js +5 -5
- package/components/shadcn/CardTitle.vue.js.map +1 -1
- package/components/shadcn/Input.vue.cjs +1 -1
- package/components/shadcn/Input.vue.cjs.map +1 -1
- package/components/shadcn/Input.vue.js +3 -3
- package/components/shadcn/Input.vue.js.map +1 -1
- package/components/shadcn/SelectTrigger.vue.cjs +1 -1
- package/components/shadcn/SelectTrigger.vue.cjs.map +1 -1
- package/components/shadcn/SelectTrigger.vue.js +2 -2
- package/components/shadcn/SelectTrigger.vue.js.map +1 -1
- package/components/shadcn/Switch.vue.cjs +1 -1
- package/components/shadcn/Switch.vue.cjs.map +1 -1
- package/components/shadcn/Switch.vue.js +2 -2
- package/components/shadcn/Switch.vue.js.map +1 -1
- package/components/shadcn/TabsContent.vue.cjs +1 -1
- package/components/shadcn/TabsContent.vue.cjs.map +1 -1
- package/components/shadcn/TabsContent.vue.js +1 -1
- package/components/shadcn/TabsContent.vue.js.map +1 -1
- package/components/shadcn/TabsList.vue.cjs +1 -1
- package/components/shadcn/TabsList.vue.cjs.map +1 -1
- package/components/shadcn/TabsList.vue.js +10 -10
- package/components/shadcn/TabsList.vue.js.map +1 -1
- package/components/shadcn/TabsTrigger.vue.cjs +1 -1
- package/components/shadcn/TabsTrigger.vue.cjs.map +1 -1
- package/components/shadcn/TabsTrigger.vue.js +4 -4
- package/components/shadcn/TabsTrigger.vue.js.map +1 -1
- package/components/shadcn/Textarea.vue.cjs +1 -1
- package/components/shadcn/Textarea.vue.cjs.map +1 -1
- package/components/shadcn/Textarea.vue.js +2 -2
- package/components/shadcn/Textarea.vue.js.map +1 -1
- package/components/shadcn/index.cjs +1 -1
- package/components/shadcn/index.cjs.map +1 -1
- package/components/shadcn/index.js +9 -8
- package/components/shadcn/index.js.map +1 -1
- package/components/templates/JLayout.vue.cjs.map +1 -1
- package/components/templates/JLayout.vue.js.map +1 -1
- package/index.cjs +1 -1
- package/index.js +73 -67
- package/package.json +1 -1
- package/types/index.d.ts +1025 -766
- package/assets/jwms-portal-frontend-DntSIcYt.css +0 -1
- package/components/molecules/JFormField.vue3.cjs +0 -2
- package/components/molecules/JFormField.vue3.cjs.map +0 -1
- package/components/molecules/JFormField.vue3.js +0 -6
- package/components/molecules/JFormField.vue3.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExampleTabMappingPage.vue.js","sources":["../../../../src/components/examples/ExampleTabMappingPage.vue"],"sourcesContent":["<template>\n <div class=\"flex flex-col h-full gap-4 bg-background text-foreground\">\n <!-- ==================== 타이틀바 ==================== -->\n <JTitlebar \n icon=\"users\" \n title=\"회원사 관리\" \n description=\"회원사 정보 및 고객사 매핑을 관리합니다\"\n :showHelp=\"true\" \n @help=\"onHelp\" \n />\n\n <!-- ==================== 탭 ==================== -->\n <JTabs v-model:activeTabId=\"activeTabId\" :tabs=\"tabs\" @tab-change=\"handleTabChange\">\n <!-- ==================== Tab 1: 마스터 (회원사 기본정보) ==================== -->\n <template #content-master>\n <div class=\"flex flex-col h-full gap-4 p-4\">\n <!-- 필터바 -->\n <JFilterBar\n v-model:collapsed=\"masterFilterCollapsed\"\n v-model:filterValues=\"masterFilterValues\"\n :filterDisplay=\"masterFilterDisplay\"\n :collapsible=\"true\"\n title=\"회원사 목록\"\n >\n <template #actions>\n <JButton size=\"sm\" variant=\"outline\" @click=\"onMasterReset\">초기화</JButton>\n <JButton size=\"sm\" styletype=\"primary\" @click=\"onMasterSearch\">조회</JButton>\n <JButton size=\"sm\" styletype=\"primary\" @click=\"onMasterNew\">신규</JButton>\n </template>\n\n <template #filters>\n <div class=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4\">\n <JFormField\n type=\"combo\"\n label=\"활성여부\"\n v-model=\"masterFilterValues.isActive\"\n :options=\"activeOptions\"\n />\n <JFormField type=\"input\" label=\"검색어\" v-model=\"masterFilterValues.keyword\" />\n </div>\n </template>\n </JFilterBar>\n\n <!-- 그리드 + 상세 영역 (Resizable) -->\n <JSplitter\n direction=\"horizontal\"\n :default-size=\"60\"\n :min-size=\"30\"\n :second-min-size=\"20\"\n :second-max-size=\"60\"\n class=\"flex-1\"\n >\n <!-- 좌측: 그리드 -->\n <template #left>\n <div class=\"h-full overflow-auto bg-background\">\n <JGrid\n ref=\"masterGridRef\"\n :columnDefs=\"masterColumnDefs\"\n :rowData=\"masterRowData\"\n :action-buttons=\"masterActionButtons\"\n @row-clicked=\"onMasterRowClicked\"\n />\n </div>\n </template>\n\n <!-- 우측: 상세 영역 -->\n <template #right>\n <div\n class=\"h-full flex flex-col gap-4 overflow-y-auto p-4 border-l rounded-lg bg-card\"\n >\n <h3 class=\"text-lg font-semibold mb-2\">\n {{ isMasterNew ? '신규 등록' : '상세 정보' }}\n </h3>\n\n <!-- 2열 그리드: 회원사코드, 회원사명 -->\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <JFormField\n type=\"input\"\n label=\"회원사코드\"\n v-model=\"masterDetail.memberId\"\n :readonly=\"!isMasterNew\"\n placeholder=\"회원사 코드\"\n />\n <JFormField\n type=\"input\"\n label=\"회원사명\"\n v-model=\"masterDetail.memberName\"\n placeholder=\"회원사 이름\"\n />\n </div>\n\n <!-- 활성여부 -->\n <JFormField\n type=\"checkbox\"\n label=\"활성여부\"\n v-model=\"masterDetail.isActive\"\n inlineLabel=\"활성\"\n />\n\n <div class=\"flex justify-end gap-2 mt-4\">\n <JButton styletype=\"primary\" size=\"sm\" @click=\"onMasterSave\">저장</JButton>\n <JButton variant=\"outline\" size=\"sm\" @click=\"onMasterDelete\" v-if=\"!isMasterNew\"\n >삭제</JButton\n >\n </div>\n </div>\n </template>\n </JSplitter>\n </div>\n </template>\n\n <!-- ==================== Tab 2: 매핑 (고객사 매핑) ==================== -->\n <template #content-mapping-customer>\n <div class=\"flex flex-col h-full gap-4 p-4\">\n <!-- 필터바 -->\n <JFilterBar\n v-model:collapsed=\"mappingFilterCollapsed\"\n v-model:filterValues=\"mappingFilterValues\"\n :filterDisplay=\"mappingFilterDisplay\"\n :collapsible=\"true\"\n title=\"회원사별 고객사 매핑\"\n >\n <template #actions>\n <JButton size=\"sm\" variant=\"outline\" @click=\"onMappingReset\">초기화</JButton>\n <JButton size=\"sm\" styletype=\"primary\" @click=\"onMappingSearch\">조회</JButton>\n </template>\n\n <template #filters>\n <div class=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4\">\n <JFormField type=\"input\" label=\"검색어\" v-model=\"mappingFilterValues.keyword\" />\n </div>\n </template>\n </JFilterBar>\n\n <!-- Vertical Splitter: 상단(마스터 그리드) / 하단(매핑 영역) -->\n <JSplitter\n direction=\"vertical\"\n :default-size=\"30\"\n :min-size=\"20\"\n :second-min-size=\"40\"\n class=\"flex-1\"\n >\n <!-- 상단: 마스터 그리드 -->\n <template #top>\n <div class=\"h-full overflow-auto bg-background\">\n <JGrid\n ref=\"mappingMasterGridRef\"\n :columnDefs=\"mappingMasterColumnDefs\"\n :rowData=\"masterRowData\"\n @row-clicked=\"onMappingMasterRowClicked\"\n />\n </div>\n </template>\n\n <!-- 하단: 매핑 영역 (미매핑 - 버튼 - 매핑) -->\n <template #bottom>\n <div class=\"h-full flex gap-2 overflow-hidden items-stretch p-2 bg-background\">\n <!-- 좌측: 미매핑 그리드 -->\n <div class=\"flex-1 flex flex-col overflow-hidden\">\n <h4 class=\"text-sm font-semibold mb-2 px-2\">미매핑 고객사</h4>\n <div class=\"flex-1 overflow-auto bg-background\">\n <JGrid\n ref=\"unmappedGridRef\"\n :columnDefs=\"customerColumnDefs\"\n :rowData=\"unmappedCustomers\"\n checkbox\n />\n </div>\n </div>\n\n <!-- 중앙: 매핑/해제 버튼 -->\n <div class=\"flex flex-col justify-center gap-2 px-2\">\n <JButton styletype=\"primary\" size=\"sm\" @click=\"onMap\">매핑 ▶</JButton>\n <JButton variant=\"outline\" size=\"sm\" @click=\"onUnmap\">◀ 해제</JButton>\n </div>\n\n <!-- 우측: 매핑 그리드 -->\n <div class=\"flex-1 flex flex-col overflow-hidden\">\n <h4 class=\"text-sm font-semibold mb-2 px-2\">매핑된 고객사</h4>\n <div class=\"flex-1 overflow-auto bg-background\">\n <JGrid\n ref=\"mappedGridRef\"\n :columnDefs=\"customerColumnDefs\"\n :rowData=\"mappedCustomers\"\n checkbox\n />\n </div>\n </div>\n </div>\n </template>\n </JSplitter>\n </div>\n </template>\n </JTabs>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed } from 'vue'\nimport { JTitlebar } from '@/components/molecules'\nimport { JFilterBar } from '@/components/organisms'\nimport { JGrid, JButton, JSplitter, type ActionButton } from '@/components/atoms'\nimport { JFormField } from '@/components/molecules'\nimport { JTabs } from '@/components/molecules'\n\n// ==================== 탭 상태 ====================\nconst activeTabId = ref('master')\n\nconst tabs = [\n { id: 'master', label: '회원사 기본정보' },\n { id: 'mapping-customer', label: '고객사 매핑' },\n]\n\nfunction handleTabChange(tabId: string) {\n console.log('탭 변경:', tabId)\n}\n\n// ==================== 공통 옵션 ====================\nconst activeOptions = [\n { value: 'Y', label: 'Y:활성' },\n { value: 'N', label: 'N:비활성' },\n]\n\n// ==================== Tab 1: 마스터 (회원사) ====================\n\nconst masterFilterCollapsed = ref(false)\nconst masterFilterValues = ref({\n isActive: '',\n keyword: '',\n})\n\nconst masterFilterDisplay = {\n isActive: {\n label: '활성여부',\n displayValue: (val: unknown) => {\n if (val === 'Y') return 'Y:활성'\n if (val === 'N') return 'N:비활성'\n return ''\n },\n },\n keyword: {\n label: '검색어',\n },\n}\n\n// Mock 데이터 - 회원사 목록\nconst masterRowData = ref([\n { memberId: 'M001', memberName: '제이솔루션', isActive: 'Y' },\n { memberId: 'M002', memberName: 'ABC물류', isActive: 'Y' },\n { memberId: 'M003', memberName: 'XYZ유통', isActive: 'N' },\n])\n\nconst masterColumnDefs = ref([\n { field: 'memberId', headerName: '회원사코드', width: 150 },\n { field: 'memberName', headerName: '회원사명', flex: 1 },\n {\n field: 'isActive',\n headerName: '활성',\n width: 100,\n cellRenderer: (params: any) => (params.value === 'Y' ? '✓' : ''),\n },\n])\n\n// 마스터 탭 행별 액션 버튼\nconst masterActionButtons: ActionButton[] = [\n {\n icon: 'pencil',\n label: '수정',\n tooltip: '편집',\n onClick: (rowData: any) => {\n isMasterNew.value = false\n masterDetail.value = {\n memberId: rowData.memberId,\n memberName: rowData.memberName,\n isActive: rowData.isActive,\n }\n },\n },\n {\n icon: 'trash2',\n label: '삭제',\n tooltip: '삭제',\n styletype: 'danger',\n onClick: (rowData: any) => {\n if (confirm(`${rowData.memberName}을(를) 삭제하시겠습니까?`)) {\n console.log('회원사 삭제:', rowData.memberId)\n alert(`삭제되었습니다: ${rowData.memberName}`)\n }\n },\n },\n]\n\nconst masterGridRef = ref()\nconst isMasterNew = ref(false)\nconst masterDetail = ref({\n memberId: '',\n memberName: '',\n isActive: 'Y',\n})\n\nfunction onMasterRowClicked(event: any) {\n isMasterNew.value = false\n masterDetail.value = {\n memberId: event.data.memberId,\n memberName: event.data.memberName,\n isActive: event.data.isActive,\n }\n}\n\nfunction onMasterNew() {\n isMasterNew.value = true\n masterDetail.value = {\n memberId: '',\n memberName: '',\n isActive: 'Y',\n }\n}\n\nfunction onMasterSave() {\n console.log('회원사 저장:', masterDetail.value)\n // TODO: 실제 구현 시 API 호출로 대체\n alert(`저장되었습니다: ${masterDetail.value.memberName}`)\n}\n\nfunction onMasterDelete() {\n if (confirm(`${masterDetail.value.memberName}을(를) 삭제하시겠습니까?`)) {\n console.log('회원사 삭제:', masterDetail.value.memberId)\n // TODO: 실제 구현 시 API 호출로 대체\n alert(`삭제되었습니다: ${masterDetail.value.memberName}`)\n }\n}\n\nfunction onMasterReset() {\n masterFilterValues.value = {\n isActive: '',\n keyword: '',\n }\n}\n\nfunction onMasterSearch() {\n console.log('회원사 조회:', masterFilterValues.value)\n // TODO: 실제 구현 시 API 호출로 대체\n}\n\nfunction onHelp() {\n alert('회원사 관리 페이지 도움말')\n}\n\n// ==================== Tab 2: 매핑 (고객사) ====================\n\nconst mappingFilterCollapsed = ref(false)\nconst mappingFilterValues = ref({\n keyword: '',\n})\n\nconst mappingFilterDisplay = {\n keyword: {\n label: '검색어',\n },\n}\n\nconst mappingMasterGridRef = ref()\nconst unmappedGridRef = ref()\nconst mappedGridRef = ref()\n\nconst mappingMasterColumnDefs = ref([\n { field: 'memberId', headerName: '회원사코드', width: 150 },\n { field: 'memberName', headerName: '회원사명', flex: 1 },\n])\n\n// Mock 데이터 - 전체 고객사 (매핑 여부 포함)\nconst selectedMemberId = ref<string>('')\n\n// Mock 데이터 - 회원사별 매핑 정보\nconst mappingData = ref<Record<string, string[]>>({\n M001: ['C001', 'C002'], // 제이솔루션에 매핑된 고객사\n M002: ['C003'], // ABC물류에 매핑된 고객사\n M003: [], // XYZ유통에 매핑된 고객사 없음\n})\n\nconst allCustomersData = [\n { code: 'C001', name: '고객A' },\n { code: 'C002', name: '고객B' },\n { code: 'C003', name: '고객C' },\n { code: 'C004', name: '고객D' },\n { code: 'C005', name: '고객E' },\n]\n\nconst customerColumnDefs = ref([\n { field: 'code', headerName: '코드', width: 120 },\n { field: 'name', headerName: '이름', flex: 1 },\n])\n\n// 매핑/미매핑 고객사 계산\nconst unmappedCustomers = computed(() => {\n if (!selectedMemberId.value) return []\n const mappedCodes = mappingData.value[selectedMemberId.value] || []\n return allCustomersData.filter((c) => !mappedCodes.includes(c.code))\n})\n\nconst mappedCustomers = computed(() => {\n if (!selectedMemberId.value) return []\n const mappedCodes = mappingData.value[selectedMemberId.value] || []\n return allCustomersData.filter((c) => mappedCodes.includes(c.code))\n})\n\nfunction onMappingMasterRowClicked(event: any) {\n selectedMemberId.value = event.data.memberId\n console.log('선택된 회원사:', event.data.memberName)\n // TODO: 실제 구현 시 API 호출로 매핑/미매핑 데이터 로드\n}\n\n/**\n * 매핑 버튼 클릭 (좌측 → 우측)\n */\nfunction onMap() {\n if (!selectedMemberId.value) {\n alert('회원사를 먼저 선택해주세요.')\n return\n }\n\n const selectedRows = unmappedGridRef.value?.getSelectedRows() || []\n if (selectedRows.length === 0) {\n alert('매핑할 고객사를 선택해주세요.')\n return\n }\n\n // 선택된 고객사 코드 추출\n const selectedCodes = selectedRows.map((row: any) => row.code)\n\n // 매핑 데이터 업데이트\n const key = selectedMemberId.value\n if (!mappingData.value[key]) {\n mappingData.value[key] = []\n }\n mappingData.value[key]!.push(...selectedCodes)\n\n console.log('매핑:', selectedCodes)\n // TODO: 실제 구현 시 API 호출로 매핑 처리\n // await api.mapCustomers(selectedMemberId.value, selectedCodes)\n}\n\n/**\n * 해제 버튼 클릭 (우측 → 좌측)\n */\nfunction onUnmap() {\n if (!selectedMemberId.value) {\n alert('회원사를 먼저 선택해주세요.')\n return\n }\n\n const selectedRows = mappedGridRef.value?.getSelectedRows() || []\n if (selectedRows.length === 0) {\n alert('해제할 고객사를 선택해주세요.')\n return\n }\n\n // 선택된 고객사 코드 추출\n const selectedCodes = selectedRows.map((row: any) => row.code)\n\n // 매핑 데이터에서 제거\n const unmapKey = selectedMemberId.value\n mappingData.value[unmapKey] = (mappingData.value[unmapKey] || []).filter(\n (code) => !selectedCodes.includes(code)\n )\n\n console.log('해제:', selectedCodes)\n // TODO: 실제 구현 시 API 호출로 매핑 해제 처리\n // await api.unmapCustomers(selectedMemberId.value, selectedCodes)\n}\n\nfunction onMappingReset() {\n mappingFilterValues.value = {\n keyword: '',\n }\n}\n\nfunction onMappingSearch() {\n console.log('매핑 조회:', mappingFilterValues.value)\n // TODO: 실제 구현 시 API 호출로 대체\n}\n\ndefineExpose({ masterGridRef, mappingMasterGridRef })\n</script>\n"],"names":["activeTabId","ref","tabs","handleTabChange","tabId","activeOptions","masterFilterCollapsed","masterFilterValues","masterFilterDisplay","val","masterRowData","masterColumnDefs","params","masterActionButtons","rowData","isMasterNew","masterDetail","masterGridRef","onMasterRowClicked","event","onMasterNew","onMasterSave","onMasterDelete","onMasterReset","onMasterSearch","onHelp","mappingFilterCollapsed","mappingFilterValues","mappingFilterDisplay","mappingMasterGridRef","unmappedGridRef","mappedGridRef","mappingMasterColumnDefs","selectedMemberId","mappingData","allCustomersData","customerColumnDefs","unmappedCustomers","computed","mappedCodes","c","mappedCustomers","onMappingMasterRowClicked","onMap","selectedRows","selectedCodes","row","key","onUnmap","unmapKey","code","onMappingReset","onMappingSearch","__expose","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_unref","JTitlebar","JTabs","$event","_createElementVNode","_hoisted_2","JFilterBar","JButton","_cache","_hoisted_3","JFormField","JSplitter","_hoisted_4","JGrid","_hoisted_5","_hoisted_6","_toDisplayString","_hoisted_7","_hoisted_8","_createBlock","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ExampleTabMappingPage.vue.js","sources":["../../../../src/components/examples/ExampleTabMappingPage.vue"],"sourcesContent":["<template>\n <JPageContainer title=\"회원사 관리\" icon=\"users\" description=\"회원사 정보 및 고객사 매핑을 관리합니다\" :showHelp=\"true\" @help=\"onHelp\" :content-scroll=\"false\">\n\n <!-- ==================== 탭 ==================== -->\n <JTabs v-model:activeTabId=\"activeTabId\" :tabs=\"tabs\" @tab-change=\"handleTabChange\">\n <!-- ==================== Tab 1: 마스터 (회원사 기본정보) ==================== -->\n <template #content-master>\n <div class=\"flex flex-col h-full gap-2 p-2\">\n <!-- 필터바 -->\n <JFilterBar\n v-model:collapsed=\"masterFilterCollapsed\"\n v-model:filterValues=\"masterFilterValues\"\n :filterDisplay=\"masterFilterDisplay\"\n :collapsible=\"true\"\n title=\"회원사 목록\"\n >\n <template #actions>\n <JButton size=\"xs\" variant=\"outline\" @click=\"onMasterReset\">초기화</JButton>\n <JButton size=\"xs\" styletype=\"primary\" @click=\"onMasterSearch\">조회</JButton>\n <JButton size=\"xs\" styletype=\"primary\" @click=\"onMasterNew\">신규</JButton>\n </template>\n\n <template #filters>\n <div class=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-2\">\n <JFormField\n type=\"combo\"\n label=\"활성여부\"\n v-model=\"masterFilterValues.isActive\"\n :options=\"activeOptions\"\n orientation=\"horizontal\"\n labelWidth=\"30%\"\n />\n <JFormField type=\"input\" label=\"검색어\" v-model=\"masterFilterValues.keyword\"\n orientation=\"horizontal\"\n labelWidth=\"30%\" \n />\n </div>\n </template>\n </JFilterBar>\n\n <!-- 그리드 + 상세 영역 (Resizable) -->\n <JSplitter\n direction=\"horizontal\"\n :default-size=\"60\"\n :min-size=\"30\"\n :second-min-size=\"20\"\n :second-max-size=\"60\"\n class=\"flex-1\"\n >\n <!-- 좌측: 그리드 -->\n <template #left>\n <div class=\"h-full overflow-auto bg-background\">\n <JGrid\n ref=\"masterGridRef\"\n :columnDefs=\"masterColumnDefs\"\n :rowData=\"masterRowData\"\n :action-buttons=\"masterActionButtons\"\n :enableGrouping=\"true\"\n :enablePivot=\"true\"\n :enableColumnsToolPanel=\"true\"\n rowGroupPanelShow=\"always\"\n pivotPanelShow=\"always\"\n :groupDefaultExpanded=\"1\"\n :compactFooter=\"true\"\n @row-clicked=\"onMasterRowClicked\"\n />\n </div>\n </template>\n\n <!-- 우측: 상세 영역 -->\n <template #right>\n <div class=\"h-full overflow-y-auto bg-muted/30\">\n <!-- 선택된 항목이 없을 때: EmptyState -->\n <JEmptyState\n v-if=\"!masterDetail.memberId && !isMasterNew\"\n variant=\"simple\"\n icon=\"mousePointerClick\"\n title=\"항목을 선택하거나 신규 버튼을 클릭하세요\"\n class=\"h-full\"\n />\n \n <!-- 선택된 항목이 있거나 신규일 때: 상세 폼 -->\n <JCard \n v-else\n class=\"h-full\" \n :title=\"isMasterNew ? '신규 등록' : '상세 정보'\"\n variant=\"elevated\"\n >\n <!-- actions 슬롯 (header 우측 버튼) -->\n <template #actions>\n <JButton size=\"xs\" styletype=\"primary\" @click=\"onMasterSave\">저장</JButton>\n <JButton size=\"xs\" variant=\"destructive\" v-if=\"!isMasterNew\" @click=\"onMasterDelete\">삭제</JButton>\n <JButton size=\"xs\" variant=\"outline\" @click=\"onMasterReset\">취소</JButton>\n </template>\n\n <!-- 2열 그리드: 회원사코드, 회원사명 -->\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-2 mt-2\">\n <JFormField\n type=\"input\"\n label=\"회원사코드\"\n v-model=\"masterDetail.memberId\"\n :readonly=\"!isMasterNew\"\n placeholder=\"회원사 코드\"\n />\n <JFormField\n type=\"input\"\n label=\"회원사명\"\n v-model=\"masterDetail.memberName\"\n placeholder=\"회원사 이름\"\n />\n </div>\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-2 mt-2\">\n <!-- 활성여부 -->\n <JFormField\n type=\"checkbox\"\n label=\"활성여부\"\n v-model=\"masterDetail.isActive\"\n inlineLabel=\"활성\"\n />\n </div>\n </JCard>\n </div>\n </template>\n </JSplitter>\n </div>\n </template>\n\n <!-- ==================== Tab 2: 매핑 (고객사 매핑) ==================== -->\n <template #content-mapping-customer>\n <div class=\"flex flex-col h-full gap-2 p-2\">\n <!-- 필터바 -->\n <JFilterBar\n v-model:collapsed=\"mappingFilterCollapsed\"\n v-model:filterValues=\"mappingFilterValues\"\n :filterDisplay=\"mappingFilterDisplay\"\n :collapsible=\"true\"\n title=\"회원사별 고객사 매핑\"\n >\n <template #actions>\n <JButton size=\"xs\" variant=\"outline\" @click=\"onMappingReset\">초기화</JButton>\n <JButton size=\"xs\" styletype=\"primary\" @click=\"onMappingSearch\">조회</JButton>\n </template>\n\n <template #filters>\n <div class=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-2\">\n <JFormField type=\"input\" label=\"검색어\" v-model=\"mappingFilterValues.keyword\" />\n </div>\n </template>\n </JFilterBar>\n\n <!-- Vertical Splitter: 상단(마스터 그리드) / 하단(매핑 영역) -->\n <JSplitter\n direction=\"vertical\"\n :default-size=\"30\"\n :min-size=\"20\"\n :second-min-size=\"40\"\n class=\"flex-1\"\n >\n <!-- 상단: 마스터 그리드 -->\n <template #top>\n <div class=\"h-full overflow-auto bg-background\">\n <JGrid\n ref=\"mappingMasterGridRef\"\n :columnDefs=\"mappingMasterColumnDefs\"\n :rowData=\"masterRowData\"\n @row-clicked=\"onMappingMasterRowClicked\"\n />\n </div>\n </template>\n\n <!-- 하단: 매핑 영역 (JShuttle 사용) -->\n <template #bottom>\n <div class=\"h-full\">\n <!-- 회원사 미선택 시: EmptyState -->\n <JEmptyState\n v-if=\"!selectedMemberId\"\n variant=\"simple\"\n icon=\"arrowLeftRight\"\n title=\"상단에서 회원사를 선택하세요\"\n class=\"h-full\"\n />\n \n <!-- 회원사 선택 후: Shuttle -->\n <JShuttle\n v-else\n left-title=\"미매핑 고객사\"\n right-title=\"매핑된 고객사\"\n :column-defs=\"customerColumnDefs\"\n v-model:left-data=\"shuttleUnmappedData\"\n v-model:right-data=\"shuttleMappedData\"\n :searchable=\"false\"\n @move=\"onShuttleMove\"\n />\n </div>\n </template>\n </JSplitter>\n </div>\n </template>\n </JTabs>\n </JPageContainer>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed } from 'vue'\nimport { JTitlebar, JCard, JEmptyState } from '@/components/molecules'\nimport { JFilterBar, JShuttle } from '@/components/organisms'\nimport { JGrid, JButton, JSplitter, type ActionButton } from '@/components/atoms'\nimport { JFormField } from '@/components/molecules'\nimport { JTabs } from '@/components/molecules'\n\n// ==================== 탭 상태 ====================\nconst activeTabId = ref('master')\n\nconst tabs = [\n { id: 'master', label: '회원사 기본정보' },\n { id: 'mapping-customer', label: '고객사 매핑' },\n]\n\nfunction handleTabChange(tabId: string) {\n console.log('탭 변경:', tabId)\n}\n\n// ==================== 공통 옵션 ====================\nconst activeOptions = [\n { value: 'Y', label: 'Y:활성' },\n { value: 'N', label: 'N:비활성' },\n]\n\n// ==================== Tab 1: 마스터 (회원사) ====================\n\nconst masterFilterCollapsed = ref(false)\nconst masterFilterValues = ref({\n isActive: '',\n keyword: '',\n})\n\nconst masterFilterDisplay = {\n isActive: {\n label: '활성여부',\n displayValue: (val: unknown) => {\n if (val === 'Y') return 'Y:활성'\n if (val === 'N') return 'N:비활성'\n return ''\n },\n },\n keyword: {\n label: '검색어',\n },\n}\n\n// Mock 데이터 - 회원사 목록\nconst masterRowData = ref([\n { memberId: 'M001', memberName: '제이솔루션', isActive: 'Y' },\n { memberId: 'M002', memberName: 'ABC물류', isActive: 'Y' },\n { memberId: 'M003', memberName: 'XYZ유통', isActive: 'N' },\n])\n\nconst masterColumnDefs = ref([\n { \n field: 'memberId', \n headerName: '회원사코드', \n width: 150,\n enableValue: true, // 집계 가능 (count)\n },\n { \n field: 'memberName', \n headerName: '회원사명', \n flex: 1,\n enableValue: true, // 집계 가능 (count)\n },\n {\n field: 'isActive',\n headerName: '활성',\n width: 100,\n cellRenderer: (params: any) => (params.value === 'Y' ? '✓' : ''),\n enableRowGroup: true, // Row Group으로 사용 가능\n enablePivot: true, // Pivot Column으로 사용 가능\n },\n])\n\n// 마스터 탭 행별 액션 버튼\nconst masterActionButtons: ActionButton[] = [\n {\n icon: 'pencil',\n label: '수정',\n tooltip: '편집',\n onClick: (rowData: any) => {\n isMasterNew.value = false\n masterDetail.value = {\n memberId: rowData.memberId,\n memberName: rowData.memberName,\n isActive: rowData.isActive,\n }\n },\n },\n {\n icon: 'trash2',\n label: '삭제',\n tooltip: '삭제',\n styletype: 'danger',\n onClick: (rowData: any) => {\n if (confirm(`${rowData.memberName}을(를) 삭제하시겠습니까?`)) {\n console.log('회원사 삭제:', rowData.memberId)\n alert(`삭제되었습니다: ${rowData.memberName}`)\n }\n },\n },\n]\n\nconst masterGridRef = ref()\nconst isMasterNew = ref(false)\nconst masterDetail = ref({\n memberId: '',\n memberName: '',\n isActive: 'Y',\n})\n\nfunction onMasterRowClicked(event: any) {\n isMasterNew.value = false\n masterDetail.value = {\n memberId: event.data.memberId,\n memberName: event.data.memberName,\n isActive: event.data.isActive,\n }\n}\n\nfunction onMasterNew() {\n isMasterNew.value = true\n masterDetail.value = {\n memberId: '',\n memberName: '',\n isActive: 'Y',\n }\n}\n\nfunction onMasterSave() {\n console.log('회원사 저장:', masterDetail.value)\n // TODO: 실제 구현 시 API 호출로 대체\n alert(`저장되었습니다: ${masterDetail.value.memberName}`)\n}\n\nfunction onMasterDelete() {\n if (confirm(`${masterDetail.value.memberName}을(를) 삭제하시겠습니까?`)) {\n console.log('회원사 삭제:', masterDetail.value.memberId)\n // TODO: 실제 구현 시 API 호출로 대체\n alert(`삭제되었습니다: ${masterDetail.value.memberName}`)\n }\n}\n\nfunction onMasterReset() {\n masterFilterValues.value = {\n isActive: '',\n keyword: '',\n }\n}\n\nfunction onMasterSearch() {\n console.log('회원사 조회:', masterFilterValues.value)\n // TODO: 실제 구현 시 API 호출로 대체\n}\n\nfunction onHelp() {\n alert('회원사 관리 페이지 도움말')\n}\n\n// ==================== Tab 2: 매핑 (고객사) ====================\n\nconst mappingFilterCollapsed = ref(false)\nconst mappingFilterValues = ref({\n keyword: '',\n})\n\nconst mappingFilterDisplay = {\n keyword: {\n label: '검색어',\n },\n}\n\nconst mappingMasterGridRef = ref()\n\nconst mappingMasterColumnDefs = ref([\n { field: 'memberId', headerName: '회원사코드', width: 150 },\n { field: 'memberName', headerName: '회원사명', flex: 1 },\n])\n\n// Mock 데이터 - 전체 고객사 (매핑 여부 포함)\nconst selectedMemberId = ref<string>('')\n\n// Mock 데이터 - 회원사별 매핑 정보\nconst mappingData = ref<Record<string, string[]>>({\n M001: ['C001', 'C002'], // 제이솔루션에 매핑된 고객사\n M002: ['C003'], // ABC물류에 매핑된 고객사\n M003: [], // XYZ유통에 매핑된 고객사 없음\n})\n\nconst allCustomersData = [\n { id: 'C001', code: 'C001', name: '고객A' },\n { id: 'C002', code: 'C002', name: '고객B' },\n { id: 'C003', code: 'C003', name: '고객C' },\n { id: 'C004', code: 'C004', name: '고객D' },\n { id: 'C005', code: 'C005', name: '고객E' },\n]\n\nconst customerColumnDefs = ref([\n { field: 'code', headerName: '코드', width: 120 },\n { field: 'name', headerName: '이름', flex: 1 },\n])\n\n// JShuttle용 데이터\nconst shuttleUnmappedData = ref<any[]>([])\nconst shuttleMappedData = ref<any[]>([])\n\nfunction onMappingMasterRowClicked(event: any) {\n selectedMemberId.value = event.data.memberId\n console.log('선택된 회원사:', event.data.memberName)\n \n // JShuttle 데이터 업데이트\n const mappedCodes = mappingData.value[event.data.memberId] || []\n shuttleUnmappedData.value = allCustomersData.filter((c) => !mappedCodes.includes(c.code))\n shuttleMappedData.value = allCustomersData.filter((c) => mappedCodes.includes(c.code))\n \n // TODO: 실제 구현 시 API 호출로 매핑/미매핑 데이터 로드\n}\n\n/**\n * JShuttle 이동 이벤트 핸들러\n */\nfunction onShuttleMove(event: any) {\n if (!selectedMemberId.value) {\n alert('회원사를 먼저 선택해주세요.')\n return\n }\n\n const { items, direction } = event\n const key = selectedMemberId.value\n\n if (direction === 'toRight') {\n // 매핑\n const codes = items.map((item: any) => item.code)\n if (!mappingData.value[key]) {\n mappingData.value[key] = []\n }\n mappingData.value[key]!.push(...codes)\n console.log('매핑:', codes)\n // TODO: 실제 구현 시 API 호출로 매핑 처리\n } else {\n // 해제\n const codes = items.map((item: any) => item.code)\n mappingData.value[key] = (mappingData.value[key] || []).filter(\n (code) => !codes.includes(code)\n )\n console.log('해제:', codes)\n // TODO: 실제 구현 시 API 호출로 매핑 해제 처리\n }\n}\n\nfunction onMappingReset() {\n mappingFilterValues.value = {\n keyword: '',\n }\n}\n\nfunction onMappingSearch() {\n console.log('매핑 조회:', mappingFilterValues.value)\n // TODO: 실제 구현 시 API 호출로 대체\n}\n\ndefineExpose({ masterGridRef, mappingMasterGridRef })\n\n// 초기 데이터 설정 (빈 상태)\nshuttleUnmappedData.value = []\nshuttleMappedData.value = []\n</script>\n"],"names":["activeTabId","ref","tabs","handleTabChange","tabId","activeOptions","masterFilterCollapsed","masterFilterValues","masterFilterDisplay","val","masterRowData","masterColumnDefs","params","masterActionButtons","rowData","isMasterNew","masterDetail","masterGridRef","onMasterRowClicked","event","onMasterNew","onMasterSave","onMasterDelete","onMasterReset","onMasterSearch","onHelp","mappingFilterCollapsed","mappingFilterValues","mappingFilterDisplay","mappingMasterGridRef","mappingMasterColumnDefs","selectedMemberId","mappingData","allCustomersData","customerColumnDefs","shuttleUnmappedData","shuttleMappedData","onMappingMasterRowClicked","mappedCodes","onShuttleMove","items","direction","key","codes","item","code","onMappingReset","onMappingSearch","__expose","_createBlock","_component_JPageContainer","_createVNode","_unref","JTabs","$event","_createElementVNode","_hoisted_1","JFilterBar","JButton","_cache","_hoisted_2","JFormField","JSplitter","_hoisted_3","JGrid","_hoisted_4","JEmptyState","JCard","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","JShuttle"],"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 a=require("../atoms/JButton.vue.cjs");require("lucide-vue-next");const l=require("../../lib/utils.cjs");require("@internationalized/date");require("md-editor-v3");;/* empty css */;/* empty css */require("../shadcn/badge-variants.cjs");require("@vueuse/core");require("reka-ui");;/* empty css */require("../shadcn/avatar-variants.cjs");require("dompurify");;/* empty css */require("ag-grid-vue3");require("ag-grid-community");require("ag-grid-enterprise");;/* empty css */;/* empty css */;/* empty css */;/* empty css */require("vue-sonner");const s=require("../shadcn/Alert.vue.cjs"),c=require("../shadcn/AlertTitle.vue.cjs"),d=require("../shadcn/AlertDescription.vue.cjs"),f={key:1,class:"mt-4 flex justify-end gap-2"},q=e.defineComponent({__name:"JAlert",props:{class:{},variant:{default:"default"},title:{},description:{},buttonText:{default:"확인"},onConfirm:{},showFooter:{type:Boolean,default:!0}},emits:["confirm"],setup(t,{emit:
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("vue");require("../shadcn/index.cjs");const a=require("../atoms/JButton.vue.cjs");require("lucide-vue-next");const l=require("../../lib/utils.cjs");require("@internationalized/date");require("md-editor-v3");;/* empty css */;/* empty css */require("../shadcn/badge-variants.cjs");require("@vueuse/core");require("reka-ui");;/* empty css */require("../shadcn/avatar-variants.cjs");require("dompurify");;/* empty css */require("ag-grid-vue3");require("ag-grid-community");require("ag-grid-enterprise");;/* empty css */;/* empty css */;/* empty css */;/* empty css */;/* empty css */;/* empty css */require("vue-sonner");const s=require("../shadcn/Alert.vue.cjs"),c=require("../shadcn/AlertTitle.vue.cjs"),d=require("../shadcn/AlertDescription.vue.cjs"),f={key:1,class:"mt-4 flex justify-end gap-2"},q=e.defineComponent({__name:"JAlert",props:{class:{},variant:{default:"default"},title:{},description:{},buttonText:{default:"확인"},onConfirm:{},showFooter:{type:Boolean,default:!0}},emits:["confirm"],setup(t,{emit:u}){const r=t,n=u,o=()=>{r.onConfirm?.(),n("confirm")};return(i,m)=>(e.openBlock(),e.createBlock(e.unref(s.default),{variant:r.variant,class:e.normalizeClass(e.unref(l.cn)(r.class))},{default:e.withCtx(()=>[t.title?(e.openBlock(),e.createBlock(e.unref(c.default),{key:0},{default:e.withCtx(()=>[e.renderSlot(i.$slots,"header",{},()=>[e.createTextVNode(e.toDisplayString(t.title),1)])]),_:3})):e.createCommentVNode("",!0),e.createVNode(e.unref(d.default),null,{default:e.withCtx(()=>[e.renderSlot(i.$slots,"default",{},()=>[e.createTextVNode(e.toDisplayString(t.description),1)])]),_:3}),t.showFooter?(e.openBlock(),e.createElementBlock("div",f,[e.renderSlot(i.$slots,"footer",{},()=>[e.createVNode(e.unref(a.default),{variant:t.variant==="destructive"?"secondary":"default",size:"sm",onClick:o},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(t.buttonText),1)]),_:1},8,["variant"])])])):e.createCommentVNode("",!0)]),_:3},8,["variant","class"]))}});exports.default=q;
|
|
2
2
|
//# sourceMappingURL=JAlert.vue.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JAlert.vue.cjs","sources":["../../../../src/components/molecules/JAlert.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport type { HTMLAttributes } from \"vue\"\r\nimport { Alert, AlertTitle, AlertDescription } from '@/components/shadcn'\r\nimport { JButton } from '@/components/atoms'\r\nimport { cn } from \"@/lib/utils\"\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Alert 자체의 클래스 */\r\n class?: HTMLAttributes[\"class\"]\r\n /** Alert variant 스타일 */\r\n variant?: \"default\" | \"destructive\"\r\n /** Alert 제목 (Header) */\r\n title?: string\r\n /** Alert 설명/내용 (Body) */\r\n description?: string\r\n /** Footer에 표시할 버튼 텍스트 */\r\n buttonText?: string\r\n /** Footer 버튼 클릭 핸들러 */\r\n onConfirm?: () => void\r\n /** Footer 표시 여부 */\r\n showFooter?: boolean\r\n }>(),\r\n {\r\n variant: \"default\",\r\n showFooter: true,\r\n buttonText: \"확인\"\r\n }\r\n)\r\n\r\nconst emit = defineEmits<{\r\n confirm: []\r\n}>()\r\n\r\nconst handleConfirm = () => {\r\n props.onConfirm?.()\r\n emit('confirm')\r\n}\r\n</script>\r\n\r\n<template>\r\n <Alert :variant=\"props.variant\" :class=\"cn(props.class)\">\r\n <!-- Header -->\r\n <AlertTitle v-if=\"title\">\r\n <slot name=\"header\">{{ title }}</slot>\r\n </AlertTitle>\r\n \r\n <!-- Body -->\r\n <AlertDescription>\r\n <slot>{{ description }}</slot>\r\n </AlertDescription>\r\n \r\n <!-- Footer -->\r\n <div v-if=\"showFooter\" class=\"mt-4 flex justify-end gap-2\">\r\n <slot name=\"footer\">\r\n <JButton \r\n :variant=\"variant === 'destructive' ? 'secondary' : 'default'\"\r\n size=\"sm\"\r\n @click=\"handleConfirm\"\r\n >\r\n {{ buttonText }}\r\n </JButton>\r\n </slot>\r\n </div>\r\n </Alert>\r\n</template>\r\n"],"names":["props","__props","emit","__emit","handleConfirm","_createBlock","_unref","Alert","_normalizeClass","cn","AlertTitle","_renderSlot","_ctx","_createVNode","AlertDescription","_openBlock","_createElementBlock","_hoisted_1","JButton"],"mappings":"
|
|
1
|
+
{"version":3,"file":"JAlert.vue.cjs","sources":["../../../../src/components/molecules/JAlert.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport type { HTMLAttributes } from \"vue\"\r\nimport { Alert, AlertTitle, AlertDescription } from '@/components/shadcn'\r\nimport { JButton } from '@/components/atoms'\r\nimport { cn } from \"@/lib/utils\"\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Alert 자체의 클래스 */\r\n class?: HTMLAttributes[\"class\"]\r\n /** Alert variant 스타일 */\r\n variant?: \"default\" | \"destructive\"\r\n /** Alert 제목 (Header) */\r\n title?: string\r\n /** Alert 설명/내용 (Body) */\r\n description?: string\r\n /** Footer에 표시할 버튼 텍스트 */\r\n buttonText?: string\r\n /** Footer 버튼 클릭 핸들러 */\r\n onConfirm?: () => void\r\n /** Footer 표시 여부 */\r\n showFooter?: boolean\r\n }>(),\r\n {\r\n variant: \"default\",\r\n showFooter: true,\r\n buttonText: \"확인\"\r\n }\r\n)\r\n\r\nconst emit = defineEmits<{\r\n confirm: []\r\n}>()\r\n\r\nconst handleConfirm = () => {\r\n props.onConfirm?.()\r\n emit('confirm')\r\n}\r\n</script>\r\n\r\n<template>\r\n <Alert :variant=\"props.variant\" :class=\"cn(props.class)\">\r\n <!-- Header -->\r\n <AlertTitle v-if=\"title\">\r\n <slot name=\"header\">{{ title }}</slot>\r\n </AlertTitle>\r\n \r\n <!-- Body -->\r\n <AlertDescription>\r\n <slot>{{ description }}</slot>\r\n </AlertDescription>\r\n \r\n <!-- Footer -->\r\n <div v-if=\"showFooter\" class=\"mt-4 flex justify-end gap-2\">\r\n <slot name=\"footer\">\r\n <JButton \r\n :variant=\"variant === 'destructive' ? 'secondary' : 'default'\"\r\n size=\"sm\"\r\n @click=\"handleConfirm\"\r\n >\r\n {{ buttonText }}\r\n </JButton>\r\n </slot>\r\n </div>\r\n </Alert>\r\n</template>\r\n"],"names":["props","__props","emit","__emit","handleConfirm","_createBlock","_unref","Alert","_normalizeClass","cn","AlertTitle","_renderSlot","_ctx","_createVNode","AlertDescription","_openBlock","_createElementBlock","_hoisted_1","JButton"],"mappings":"0qDAMA,MAAMA,EAAQC,EAwBRC,EAAOC,EAIPC,EAAgB,IAAM,CAC1BJ,EAAM,YAAA,EACNE,EAAK,SAAS,CAChB,8BAIEG,EAAAA,YAuBQC,EAAAA,MAAAC,EAAAA,OAAA,EAAA,CAvBA,QAASP,EAAM,QAAU,MAAKQ,EAAAA,eAAEF,EAAAA,MAAAG,EAAAA,EAAA,EAAGT,EAAM,KAAK,CAAA,CAAA,qBAEpD,IAEa,CAFKC,EAAA,qBAAlBI,EAAAA,YAEaC,QAAAI,EAAAA,OAAA,EAAA,CAAA,IAAA,GAAA,mBADX,IAAsC,CAAtCC,EAAAA,WAAsCC,qBAAtC,IAAsC,qCAAfX,EAAA,KAAK,EAAA,CAAA,CAAA,wCAI9BY,EAAAA,YAEmBP,EAAAA,MAAAQ,SAAA,EAAA,KAAA,mBADjB,IAA8B,CAA9BH,EAAAA,WAA8BC,sBAA9B,IAA8B,qCAArBX,EAAA,WAAW,EAAA,CAAA,CAAA,WAIXA,EAAA,YAAXc,EAAAA,UAAA,EAAAC,EAAAA,mBAUM,MAVNC,EAUM,CATJN,EAAAA,WAQOC,qBARP,IAQO,CAPLC,cAMUP,EAAAA,MAAAY,EAAAA,OAAA,EAAA,CALP,QAASjB,EAAA,UAAO,cAAA,YAAA,UACjB,KAAK,KACJ,QAAOG,CAAA,qBAER,IAAgB,qCAAbH,EAAA,UAAU,EAAA,CAAA,CAAA"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { defineComponent as v, createBlock as
|
|
1
|
+
import { defineComponent as v, createBlock as s, openBlock as m, unref as o, normalizeClass as C, withCtx as e, createCommentVNode as f, createVNode as c, createElementBlock as h, renderSlot as a, createTextVNode as n, toDisplayString as l } from "vue";
|
|
2
2
|
import "../shadcn/index.js";
|
|
3
|
-
import
|
|
3
|
+
import k from "../atoms/JButton.vue.js";
|
|
4
4
|
import "lucide-vue-next";
|
|
5
|
-
import { cn as
|
|
5
|
+
import { cn as y } from "../../lib/utils.js";
|
|
6
6
|
import "@internationalized/date";
|
|
7
7
|
import "md-editor-v3";
|
|
8
8
|
/* empty css */
|
|
@@ -21,14 +21,16 @@ import "ag-grid-enterprise";
|
|
|
21
21
|
/* empty css */
|
|
22
22
|
/* empty css */
|
|
23
23
|
/* empty css */
|
|
24
|
+
/* empty css */
|
|
25
|
+
/* empty css */
|
|
24
26
|
import "vue-sonner";
|
|
25
|
-
import
|
|
26
|
-
import
|
|
27
|
+
import $ from "../shadcn/Alert.vue.js";
|
|
28
|
+
import B from "../shadcn/AlertTitle.vue.js";
|
|
27
29
|
import x from "../shadcn/AlertDescription.vue.js";
|
|
28
|
-
const
|
|
30
|
+
const w = {
|
|
29
31
|
key: 1,
|
|
30
32
|
class: "mt-4 flex justify-end gap-2"
|
|
31
|
-
},
|
|
33
|
+
}, tt = /* @__PURE__ */ v({
|
|
32
34
|
__name: "JAlert",
|
|
33
35
|
props: {
|
|
34
36
|
class: {},
|
|
@@ -44,15 +46,15 @@ const B = {
|
|
|
44
46
|
const r = t, d = p, u = () => {
|
|
45
47
|
r.onConfirm?.(), d("confirm");
|
|
46
48
|
};
|
|
47
|
-
return (i,
|
|
49
|
+
return (i, N) => (m(), s(o($), {
|
|
48
50
|
variant: r.variant,
|
|
49
|
-
class: C(o(
|
|
51
|
+
class: C(o(y)(r.class))
|
|
50
52
|
}, {
|
|
51
53
|
default: e(() => [
|
|
52
|
-
t.title ? (m(),
|
|
54
|
+
t.title ? (m(), s(o(B), { key: 0 }, {
|
|
53
55
|
default: e(() => [
|
|
54
56
|
a(i.$slots, "header", {}, () => [
|
|
55
|
-
n(
|
|
57
|
+
n(l(t.title), 1)
|
|
56
58
|
])
|
|
57
59
|
]),
|
|
58
60
|
_: 3
|
|
@@ -60,20 +62,20 @@ const B = {
|
|
|
60
62
|
c(o(x), null, {
|
|
61
63
|
default: e(() => [
|
|
62
64
|
a(i.$slots, "default", {}, () => [
|
|
63
|
-
n(
|
|
65
|
+
n(l(t.description), 1)
|
|
64
66
|
])
|
|
65
67
|
]),
|
|
66
68
|
_: 3
|
|
67
69
|
}),
|
|
68
|
-
t.showFooter ? (m(), h("div",
|
|
70
|
+
t.showFooter ? (m(), h("div", w, [
|
|
69
71
|
a(i.$slots, "footer", {}, () => [
|
|
70
|
-
c(o(
|
|
72
|
+
c(o(k), {
|
|
71
73
|
variant: t.variant === "destructive" ? "secondary" : "default",
|
|
72
74
|
size: "sm",
|
|
73
75
|
onClick: u
|
|
74
76
|
}, {
|
|
75
77
|
default: e(() => [
|
|
76
|
-
n(
|
|
78
|
+
n(l(t.buttonText), 1)
|
|
77
79
|
]),
|
|
78
80
|
_: 1
|
|
79
81
|
}, 8, ["variant"])
|
|
@@ -85,6 +87,6 @@ const B = {
|
|
|
85
87
|
}
|
|
86
88
|
});
|
|
87
89
|
export {
|
|
88
|
-
|
|
90
|
+
tt as default
|
|
89
91
|
};
|
|
90
92
|
//# sourceMappingURL=JAlert.vue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JAlert.vue.js","sources":["../../../../src/components/molecules/JAlert.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport type { HTMLAttributes } from \"vue\"\r\nimport { Alert, AlertTitle, AlertDescription } from '@/components/shadcn'\r\nimport { JButton } from '@/components/atoms'\r\nimport { cn } from \"@/lib/utils\"\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Alert 자체의 클래스 */\r\n class?: HTMLAttributes[\"class\"]\r\n /** Alert variant 스타일 */\r\n variant?: \"default\" | \"destructive\"\r\n /** Alert 제목 (Header) */\r\n title?: string\r\n /** Alert 설명/내용 (Body) */\r\n description?: string\r\n /** Footer에 표시할 버튼 텍스트 */\r\n buttonText?: string\r\n /** Footer 버튼 클릭 핸들러 */\r\n onConfirm?: () => void\r\n /** Footer 표시 여부 */\r\n showFooter?: boolean\r\n }>(),\r\n {\r\n variant: \"default\",\r\n showFooter: true,\r\n buttonText: \"확인\"\r\n }\r\n)\r\n\r\nconst emit = defineEmits<{\r\n confirm: []\r\n}>()\r\n\r\nconst handleConfirm = () => {\r\n props.onConfirm?.()\r\n emit('confirm')\r\n}\r\n</script>\r\n\r\n<template>\r\n <Alert :variant=\"props.variant\" :class=\"cn(props.class)\">\r\n <!-- Header -->\r\n <AlertTitle v-if=\"title\">\r\n <slot name=\"header\">{{ title }}</slot>\r\n </AlertTitle>\r\n \r\n <!-- Body -->\r\n <AlertDescription>\r\n <slot>{{ description }}</slot>\r\n </AlertDescription>\r\n \r\n <!-- Footer -->\r\n <div v-if=\"showFooter\" class=\"mt-4 flex justify-end gap-2\">\r\n <slot name=\"footer\">\r\n <JButton \r\n :variant=\"variant === 'destructive' ? 'secondary' : 'default'\"\r\n size=\"sm\"\r\n @click=\"handleConfirm\"\r\n >\r\n {{ buttonText }}\r\n </JButton>\r\n </slot>\r\n </div>\r\n </Alert>\r\n</template>\r\n"],"names":["props","__props","emit","__emit","handleConfirm","_createBlock","_unref","Alert","_normalizeClass","cn","AlertTitle","_renderSlot","_ctx","_createVNode","AlertDescription","_openBlock","_createElementBlock","_hoisted_1","JButton"],"mappings":"
|
|
1
|
+
{"version":3,"file":"JAlert.vue.js","sources":["../../../../src/components/molecules/JAlert.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport type { HTMLAttributes } from \"vue\"\r\nimport { Alert, AlertTitle, AlertDescription } from '@/components/shadcn'\r\nimport { JButton } from '@/components/atoms'\r\nimport { cn } from \"@/lib/utils\"\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Alert 자체의 클래스 */\r\n class?: HTMLAttributes[\"class\"]\r\n /** Alert variant 스타일 */\r\n variant?: \"default\" | \"destructive\"\r\n /** Alert 제목 (Header) */\r\n title?: string\r\n /** Alert 설명/내용 (Body) */\r\n description?: string\r\n /** Footer에 표시할 버튼 텍스트 */\r\n buttonText?: string\r\n /** Footer 버튼 클릭 핸들러 */\r\n onConfirm?: () => void\r\n /** Footer 표시 여부 */\r\n showFooter?: boolean\r\n }>(),\r\n {\r\n variant: \"default\",\r\n showFooter: true,\r\n buttonText: \"확인\"\r\n }\r\n)\r\n\r\nconst emit = defineEmits<{\r\n confirm: []\r\n}>()\r\n\r\nconst handleConfirm = () => {\r\n props.onConfirm?.()\r\n emit('confirm')\r\n}\r\n</script>\r\n\r\n<template>\r\n <Alert :variant=\"props.variant\" :class=\"cn(props.class)\">\r\n <!-- Header -->\r\n <AlertTitle v-if=\"title\">\r\n <slot name=\"header\">{{ title }}</slot>\r\n </AlertTitle>\r\n \r\n <!-- Body -->\r\n <AlertDescription>\r\n <slot>{{ description }}</slot>\r\n </AlertDescription>\r\n \r\n <!-- Footer -->\r\n <div v-if=\"showFooter\" class=\"mt-4 flex justify-end gap-2\">\r\n <slot name=\"footer\">\r\n <JButton \r\n :variant=\"variant === 'destructive' ? 'secondary' : 'default'\"\r\n size=\"sm\"\r\n @click=\"handleConfirm\"\r\n >\r\n {{ buttonText }}\r\n </JButton>\r\n </slot>\r\n </div>\r\n </Alert>\r\n</template>\r\n"],"names":["props","__props","emit","__emit","handleConfirm","_createBlock","_unref","Alert","_normalizeClass","cn","AlertTitle","_renderSlot","_ctx","_createVNode","AlertDescription","_openBlock","_createElementBlock","_hoisted_1","JButton"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,UAAMA,IAAQC,GAwBRC,IAAOC,GAIPC,IAAgB,MAAM;AAC1B,MAAAJ,EAAM,YAAA,GACNE,EAAK,SAAS;AAAA,IAChB;2BAIEG,EAuBQC,EAAAC,CAAA,GAAA;AAAA,MAvBA,SAASP,EAAM;AAAA,MAAU,OAAKQ,EAAEF,EAAAG,CAAA,EAAGT,EAAM,KAAK,CAAA;AAAA,IAAA;iBAEpD,MAEa;AAAA,QAFKC,EAAA,cAAlBI,EAEaC,EAAAI,CAAA,GAAA,EAAA,KAAA,KAAA;AAAA,qBADX,MAAsC;AAAA,YAAtCC,EAAsCC,wBAAtC,MAAsC;AAAA,kBAAfX,EAAA,KAAK,GAAA,CAAA;AAAA,YAAA;;;;QAI9BY,EAEmBP,EAAAQ,CAAA,GAAA,MAAA;AAAA,qBADjB,MAA8B;AAAA,YAA9BH,EAA8BC,yBAA9B,MAA8B;AAAA,kBAArBX,EAAA,WAAW,GAAA,CAAA;AAAA,YAAA;;;;QAIXA,EAAA,cAAXc,EAAA,GAAAC,EAUM,OAVNC,GAUM;AAAA,UATJN,EAQOC,wBARP,MAQO;AAAA,YAPLC,EAMUP,EAAAY,CAAA,GAAA;AAAA,cALP,SAASjB,EAAA,YAAO,gBAAA,cAAA;AAAA,cACjB,MAAK;AAAA,cACJ,SAAOG;AAAA,YAAA;yBAER,MAAgB;AAAA,oBAAbH,EAAA,UAAU,GAAA,CAAA;AAAA,cAAA;;;;;;;;;;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("vue"),c=require("../atoms/JIcon.vue.cjs"),k=require("../atoms/JLink.vue.cjs"),u=require("../../lib/utils.cjs"),C={class:"flex items-center gap-2 list-none p-0 m-0"},g={key:1},
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("vue"),c=require("../atoms/JIcon.vue.cjs"),k=require("../atoms/JLink.vue.cjs"),u=require("../../lib/utils.cjs"),C={class:"flex items-center gap-2 list-none p-0 m-0"},g={key:1},x=e.defineComponent({__name:"JBreadcrumb",props:{items:{},separator:{default:"/"},styletype:{default:"default"},class:{}},emits:["itemClick"],setup(o,{emit:p}){const r=o,d=p,i={default:{containerClass:"flex items-center gap-2 px-4 py-1.5",itemClass:"text-xs text-muted-foreground hover:text-foreground transition-colors",separatorClass:"text-muted-foreground/50 text-xs",lastItemClass:"text-foreground font-medium"},minimal:{containerClass:"flex items-center gap-1.5 px-2 py-1",itemClass:"text-xs text-muted-foreground hover:text-foreground transition-colors",separatorClass:"text-muted-foreground/40 text-xs",lastItemClass:"text-foreground font-medium"}},s=e.computed(()=>i[r.styletype]??i.default),f=(l,m)=>{l.onClick?.(),d("itemClick",l,m)},n=l=>l===r.items.length-1;return(l,m)=>(e.openBlock(),e.createElementBlock("nav",{class:e.normalizeClass(e.unref(u.cn)(s.value.containerClass,r.class)),"aria-label":"브레드크럼 네비게이션"},[e.createElementVNode("ol",C,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(o.items,(t,a)=>(e.openBlock(),e.createElementBlock("li",{key:a,class:"flex items-center gap-2"},[n(a)||!t.href&&!t.onClick?(e.openBlock(),e.createElementBlock("span",{key:0,class:e.normalizeClass(e.unref(u.cn)(s.value.itemClass,s.value.lastItemClass,n(a)&&"cursor-default"))},[t.icon?(e.openBlock(),e.createBlock(c.default,{key:0,name:t.icon,size:"sm",class:"mr-1"},null,8,["name"])):e.createCommentVNode("",!0),e.createTextVNode(" "+e.toDisplayString(t.label),1)],2)):(e.openBlock(),e.createBlock(k.default,{key:1,href:t.href,class:e.normalizeClass(e.unref(u.cn)(s.value.itemClass)),onClick:_=>f(t,a)},{default:e.withCtx(()=>[t.icon?(e.openBlock(),e.createBlock(c.default,{key:0,name:t.icon,size:"sm",class:"mr-1"},null,8,["name"])):e.createCommentVNode("",!0),e.createTextVNode(" "+e.toDisplayString(t.label),1)]),_:2},1032,["href","class","onClick"])),n(a)?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("span",{key:2,class:e.normalizeClass(s.value.separatorClass),"aria-hidden":"true"},[o.separator==="chevron"?(e.openBlock(),e.createBlock(c.default,{key:0,name:"chevronRight",size:"sm"})):(e.openBlock(),e.createElementBlock("span",g,e.toDisplayString(o.separator),1))],2))]))),128))])],2))}});exports.default=x;
|
|
2
2
|
//# sourceMappingURL=JBreadcrumb.vue.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JBreadcrumb.vue.cjs","sources":["../../../../src/components/molecules/JBreadcrumb.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport JIcon from '@/components/atoms/JIcon.vue'\r\nimport JLink from '@/components/atoms/JLink.vue'\r\nimport { cn } from '@/lib/utils'\r\n\r\n/**\r\n * JBreadcrumb - 브레드크럼 네비게이션 컴포넌트 (molecules)\r\n * Breadcrumb Navigation Component\r\n * \r\n * @description\r\n * 페이지의 네비게이션 경로를 표시하는 브레드크럼 컴포넌트입니다.\r\n * \r\n * Features:\r\n * - 경로 아이템 표시\r\n * - 클릭 가능한 링크 지원\r\n * - 아이콘 지원\r\n * - 커스터마이징 가능한 구분자\r\n * \r\n * @example\r\n * ```vue\r\n * <JBreadcrumb \r\n * :items=\"[\r\n * { label: '홈', href: '/' },\r\n * { label: '제품', href: '/products' },\r\n * { label: '상세' }\r\n * ]\"\r\n * />\r\n * ```\r\n */\r\n\r\nexport type BreadcrumbItem = {\r\n /** 라벨 텍스트 */\r\n label: string\r\n /** 링크 URL (없으면 텍스트만 표시) */\r\n href?: string\r\n /** 아이콘 이름 */\r\n icon?: string\r\n /** 클릭 핸들러 */\r\n onClick?: () => void\r\n}\r\n\r\ntype StyleType =\r\n | 'default' // 기본 스타일\r\n | 'minimal' // 최소 스타일 (작은 크기, 얇은 구분자)\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** 브레드크럼 아이템 목록 */\r\n items: BreadcrumbItem[]\r\n /** 구분자 (기본값: /) */\r\n separator?: string\r\n /** 스타일 타입 */\r\n styletype?: StyleType\r\n /** 추가 CSS 클래스 */\r\n class?: string\r\n }>(),\r\n {\r\n separator: '/',\r\n styletype: 'default',\r\n }\r\n)\r\n\r\nconst emit = defineEmits<{\r\n /** 아이템 클릭 이벤트 */\r\n itemClick: [item: BreadcrumbItem, index: number]\r\n}>()\r\n\r\n/**\r\n * 스타일 프리셋\r\n */\r\nconst STYLE_PRESETS: Record<StyleType, {\r\n containerClass: string\r\n itemClass: string\r\n separatorClass: string\r\n lastItemClass: string\r\n}> = {\r\n default: {\
|
|
1
|
+
{"version":3,"file":"JBreadcrumb.vue.cjs","sources":["../../../../src/components/molecules/JBreadcrumb.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport JIcon from '@/components/atoms/JIcon.vue'\r\nimport JLink from '@/components/atoms/JLink.vue'\r\nimport { cn } from '@/lib/utils'\r\n\r\n/**\r\n * JBreadcrumb - 브레드크럼 네비게이션 컴포넌트 (molecules)\r\n * Breadcrumb Navigation Component\r\n * \r\n * @description\r\n * 페이지의 네비게이션 경로를 표시하는 브레드크럼 컴포넌트입니다.\r\n * \r\n * Features:\r\n * - 경로 아이템 표시\r\n * - 클릭 가능한 링크 지원\r\n * - 아이콘 지원\r\n * - 커스터마이징 가능한 구분자\r\n * \r\n * @example\r\n * ```vue\r\n * <JBreadcrumb \r\n * :items=\"[\r\n * { label: '홈', href: '/' },\r\n * { label: '제품', href: '/products' },\r\n * { label: '상세' }\r\n * ]\"\r\n * />\r\n * ```\r\n */\r\n\r\nexport type BreadcrumbItem = {\r\n /** 라벨 텍스트 */\r\n label: string\r\n /** 링크 URL (없으면 텍스트만 표시) */\r\n href?: string\r\n /** 아이콘 이름 */\r\n icon?: string\r\n /** 클릭 핸들러 */\r\n onClick?: () => void\r\n}\r\n\r\ntype StyleType =\r\n | 'default' // 기본 스타일\r\n | 'minimal' // 최소 스타일 (작은 크기, 얇은 구분자)\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** 브레드크럼 아이템 목록 */\r\n items: BreadcrumbItem[]\r\n /** 구분자 (기본값: /) */\r\n separator?: string\r\n /** 스타일 타입 */\r\n styletype?: StyleType\r\n /** 추가 CSS 클래스 */\r\n class?: string\r\n }>(),\r\n {\r\n separator: '/',\r\n styletype: 'default',\r\n }\r\n)\r\n\r\nconst emit = defineEmits<{\r\n /** 아이템 클릭 이벤트 */\r\n itemClick: [item: BreadcrumbItem, index: number]\r\n}>()\r\n\r\n/**\r\n * 스타일 프리셋\r\n */\r\nconst STYLE_PRESETS: Record<StyleType, {\r\n containerClass: string\r\n itemClass: string\r\n separatorClass: string\r\n lastItemClass: string\r\n}> = {\r\n default: {\n containerClass: 'flex items-center gap-2 px-4 py-1.5',\n itemClass: 'text-xs text-muted-foreground hover:text-foreground transition-colors',\n separatorClass: 'text-muted-foreground/50 text-xs',\n lastItemClass: 'text-foreground font-medium',\n },\n minimal: {\r\n containerClass: 'flex items-center gap-1.5 px-2 py-1',\r\n itemClass: 'text-xs text-muted-foreground hover:text-foreground transition-colors',\r\n separatorClass: 'text-muted-foreground/40 text-xs',\r\n lastItemClass: 'text-foreground font-medium',\r\n },\r\n}\r\n\r\nconst preset = computed(() => {\r\n return STYLE_PRESETS[props.styletype] ?? STYLE_PRESETS.default\r\n})\r\n\r\n/**\r\n * 아이템 클릭 핸들러\r\n */\r\nconst handleItemClick = (item: BreadcrumbItem, index: number) => {\r\n item.onClick?.()\r\n emit('itemClick', item, index)\r\n}\r\n\r\n/**\r\n * 마지막 아이템인지 확인\r\n */\r\nconst isLastItem = (index: number) => {\r\n return index === props.items.length - 1\r\n}\r\n</script>\r\n\r\n<template>\r\n <nav \r\n :class=\"cn(preset.containerClass, props.class)\"\r\n aria-label=\"브레드크럼 네비게이션\"\r\n >\r\n <ol class=\"flex items-center gap-2 list-none p-0 m-0\">\r\n <li\r\n v-for=\"(item, index) in items\"\r\n :key=\"index\"\r\n class=\"flex items-center gap-2\"\r\n >\r\n <!-- 아이템 -->\r\n <span\r\n v-if=\"isLastItem(index) || (!item.href && !item.onClick)\"\r\n :class=\"cn(preset.itemClass, preset.lastItemClass, isLastItem(index) && 'cursor-default')\"\r\n >\r\n <!-- 아이콘 -->\r\n <JIcon\r\n v-if=\"item.icon\"\r\n :name=\"item.icon\"\r\n size=\"sm\"\r\n class=\"mr-1\"\r\n />\r\n {{ item.label }}\r\n </span>\r\n \r\n <JLink\r\n v-else\r\n :href=\"item.href\"\r\n :class=\"cn(preset.itemClass)\"\r\n @click=\"handleItemClick(item, index)\"\r\n >\r\n <!-- 아이콘 -->\r\n <JIcon\r\n v-if=\"item.icon\"\r\n :name=\"item.icon\"\r\n size=\"sm\"\r\n class=\"mr-1\"\r\n />\r\n {{ item.label }}\r\n </JLink>\r\n\r\n <!-- 구분자 (마지막 아이템이 아니면 표시) -->\r\n <span\r\n v-if=\"!isLastItem(index)\"\r\n :class=\"preset.separatorClass\"\r\n aria-hidden=\"true\"\r\n >\r\n <JIcon\r\n v-if=\"separator === 'chevron'\"\r\n name=\"chevronRight\"\r\n size=\"sm\"\r\n />\r\n <span v-else>{{ separator }}</span>\r\n </span>\r\n </li>\r\n </ol>\r\n </nav>\r\n</template>\r\n"],"names":["props","__props","emit","__emit","STYLE_PRESETS","preset","computed","handleItemClick","item","index","isLastItem","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_hoisted_1","_openBlock","_Fragment","_renderList","cn","_createBlock","JIcon","_toDisplayString","JLink","$event"],"mappings":"4cA8CA,MAAMA,EAAQC,EAiBRC,EAAOC,EAQPC,EAKD,CACH,QAAS,CACP,eAAgB,sCAChB,UAAW,wEACX,eAAgB,mCAChB,cAAe,6BAAA,EAEjB,QAAS,CACP,eAAgB,sCAChB,UAAW,wEACX,eAAgB,mCAChB,cAAe,6BAAA,CACjB,EAGIC,EAASC,EAAAA,SAAS,IACfF,EAAcJ,EAAM,SAAS,GAAKI,EAAc,OACxD,EAKKG,EAAkB,CAACC,EAAsBC,IAAkB,CAC/DD,EAAK,UAAA,EACLN,EAAK,YAAaM,EAAMC,CAAK,CAC/B,EAKMC,EAAcD,GACXA,IAAUT,EAAM,MAAM,OAAS,8BAKtCW,EAAAA,mBAwDM,MAAA,CAvDH,MAAKC,EAAAA,eAAEC,EAAAA,YAAGR,EAAA,MAAO,eAAgBL,EAAM,KAAK,CAAA,EAC7C,aAAW,aAAA,GAEXc,EAAAA,mBAmDK,KAnDLC,EAmDK,EAlDHC,EAAAA,UAAA,EAAA,EAAAL,EAAAA,mBAiDKM,WAAA,KAAAC,EAAAA,WAhDqBjB,EAAA,MAAK,CAArBO,EAAMC,mBADhBE,EAAAA,mBAiDK,KAAA,CA/CF,IAAKF,EACN,MAAM,yBAAA,GAIEC,EAAWD,CAAK,GAAA,CAAOD,EAAK,MAAI,CAAKA,EAAK,uBADlDG,EAAAA,mBAYO,OAAA,OAVJ,MAAKC,EAAAA,eAAEC,EAAAA,MAAAM,EAAAA,EAAA,EAAGd,EAAA,MAAO,UAAWA,EAAA,MAAO,cAAeK,EAAWD,CAAK,GAAA,gBAAA,CAAA,CAAA,GAI3DD,EAAK,oBADbY,EAAAA,YAKEC,EAAAA,QAAA,OAHC,KAAMb,EAAK,KACZ,KAAK,KACL,MAAM,MAAA,kEACN,IACFc,EAAAA,gBAAGd,EAAK,KAAK,EAAA,CAAA,CAAA,qBAGfY,EAAAA,YAcQG,EAAAA,QAAA,OAZL,KAAMf,EAAK,KACX,MAAKI,EAAAA,eAAEC,QAAAM,EAAAA,EAAA,EAAGd,EAAA,MAAO,SAAS,CAAA,EAC1B,QAAKmB,GAAEjB,EAAgBC,EAAMC,CAAK,CAAA,qBAGnC,IAKE,CAJMD,EAAK,oBADbY,EAAAA,YAKEC,EAAAA,QAAA,OAHC,KAAMb,EAAK,KACZ,KAAK,KACL,MAAM,MAAA,kEACN,IACFc,EAAAA,gBAAGd,EAAK,KAAK,EAAA,CAAA,CAAA,0CAKNE,EAAWD,CAAK,6CADzBE,EAAAA,mBAWO,OAAA,OATJ,MAAKC,EAAAA,eAAEP,EAAA,MAAO,cAAc,EAC7B,cAAY,MAAA,GAGJJ,EAAA,YAAS,yBADjBmB,EAAAA,YAIEC,EAAAA,QAAA,OAFA,KAAK,eACL,KAAK,IAAA,KAEPL,EAAAA,YAAAL,EAAAA,mBAAmC,2BAAnBV,EAAA,SAAS,EAAA,CAAA,EAAA"}
|
|
@@ -14,9 +14,9 @@ const L = { class: "flex items-center gap-2 list-none p-0 m-0" }, N = { key: 1 }
|
|
|
14
14
|
setup(n, { emit: h }) {
|
|
15
15
|
const m = n, y = h, x = {
|
|
16
16
|
default: {
|
|
17
|
-
containerClass: "flex items-center gap-2 px-4 py-
|
|
18
|
-
itemClass: "text-
|
|
19
|
-
separatorClass: "text-muted-foreground/50 text-
|
|
17
|
+
containerClass: "flex items-center gap-2 px-4 py-1.5",
|
|
18
|
+
itemClass: "text-xs text-muted-foreground hover:text-foreground transition-colors",
|
|
19
|
+
separatorClass: "text-muted-foreground/50 text-xs",
|
|
20
20
|
lastItemClass: "text-foreground font-medium"
|
|
21
21
|
},
|
|
22
22
|
minimal: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JBreadcrumb.vue.js","sources":["../../../../src/components/molecules/JBreadcrumb.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport JIcon from '@/components/atoms/JIcon.vue'\r\nimport JLink from '@/components/atoms/JLink.vue'\r\nimport { cn } from '@/lib/utils'\r\n\r\n/**\r\n * JBreadcrumb - 브레드크럼 네비게이션 컴포넌트 (molecules)\r\n * Breadcrumb Navigation Component\r\n * \r\n * @description\r\n * 페이지의 네비게이션 경로를 표시하는 브레드크럼 컴포넌트입니다.\r\n * \r\n * Features:\r\n * - 경로 아이템 표시\r\n * - 클릭 가능한 링크 지원\r\n * - 아이콘 지원\r\n * - 커스터마이징 가능한 구분자\r\n * \r\n * @example\r\n * ```vue\r\n * <JBreadcrumb \r\n * :items=\"[\r\n * { label: '홈', href: '/' },\r\n * { label: '제품', href: '/products' },\r\n * { label: '상세' }\r\n * ]\"\r\n * />\r\n * ```\r\n */\r\n\r\nexport type BreadcrumbItem = {\r\n /** 라벨 텍스트 */\r\n label: string\r\n /** 링크 URL (없으면 텍스트만 표시) */\r\n href?: string\r\n /** 아이콘 이름 */\r\n icon?: string\r\n /** 클릭 핸들러 */\r\n onClick?: () => void\r\n}\r\n\r\ntype StyleType =\r\n | 'default' // 기본 스타일\r\n | 'minimal' // 최소 스타일 (작은 크기, 얇은 구분자)\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** 브레드크럼 아이템 목록 */\r\n items: BreadcrumbItem[]\r\n /** 구분자 (기본값: /) */\r\n separator?: string\r\n /** 스타일 타입 */\r\n styletype?: StyleType\r\n /** 추가 CSS 클래스 */\r\n class?: string\r\n }>(),\r\n {\r\n separator: '/',\r\n styletype: 'default',\r\n }\r\n)\r\n\r\nconst emit = defineEmits<{\r\n /** 아이템 클릭 이벤트 */\r\n itemClick: [item: BreadcrumbItem, index: number]\r\n}>()\r\n\r\n/**\r\n * 스타일 프리셋\r\n */\r\nconst STYLE_PRESETS: Record<StyleType, {\r\n containerClass: string\r\n itemClass: string\r\n separatorClass: string\r\n lastItemClass: string\r\n}> = {\r\n default: {\
|
|
1
|
+
{"version":3,"file":"JBreadcrumb.vue.js","sources":["../../../../src/components/molecules/JBreadcrumb.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport JIcon from '@/components/atoms/JIcon.vue'\r\nimport JLink from '@/components/atoms/JLink.vue'\r\nimport { cn } from '@/lib/utils'\r\n\r\n/**\r\n * JBreadcrumb - 브레드크럼 네비게이션 컴포넌트 (molecules)\r\n * Breadcrumb Navigation Component\r\n * \r\n * @description\r\n * 페이지의 네비게이션 경로를 표시하는 브레드크럼 컴포넌트입니다.\r\n * \r\n * Features:\r\n * - 경로 아이템 표시\r\n * - 클릭 가능한 링크 지원\r\n * - 아이콘 지원\r\n * - 커스터마이징 가능한 구분자\r\n * \r\n * @example\r\n * ```vue\r\n * <JBreadcrumb \r\n * :items=\"[\r\n * { label: '홈', href: '/' },\r\n * { label: '제품', href: '/products' },\r\n * { label: '상세' }\r\n * ]\"\r\n * />\r\n * ```\r\n */\r\n\r\nexport type BreadcrumbItem = {\r\n /** 라벨 텍스트 */\r\n label: string\r\n /** 링크 URL (없으면 텍스트만 표시) */\r\n href?: string\r\n /** 아이콘 이름 */\r\n icon?: string\r\n /** 클릭 핸들러 */\r\n onClick?: () => void\r\n}\r\n\r\ntype StyleType =\r\n | 'default' // 기본 스타일\r\n | 'minimal' // 최소 스타일 (작은 크기, 얇은 구분자)\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** 브레드크럼 아이템 목록 */\r\n items: BreadcrumbItem[]\r\n /** 구분자 (기본값: /) */\r\n separator?: string\r\n /** 스타일 타입 */\r\n styletype?: StyleType\r\n /** 추가 CSS 클래스 */\r\n class?: string\r\n }>(),\r\n {\r\n separator: '/',\r\n styletype: 'default',\r\n }\r\n)\r\n\r\nconst emit = defineEmits<{\r\n /** 아이템 클릭 이벤트 */\r\n itemClick: [item: BreadcrumbItem, index: number]\r\n}>()\r\n\r\n/**\r\n * 스타일 프리셋\r\n */\r\nconst STYLE_PRESETS: Record<StyleType, {\r\n containerClass: string\r\n itemClass: string\r\n separatorClass: string\r\n lastItemClass: string\r\n}> = {\r\n default: {\n containerClass: 'flex items-center gap-2 px-4 py-1.5',\n itemClass: 'text-xs text-muted-foreground hover:text-foreground transition-colors',\n separatorClass: 'text-muted-foreground/50 text-xs',\n lastItemClass: 'text-foreground font-medium',\n },\n minimal: {\r\n containerClass: 'flex items-center gap-1.5 px-2 py-1',\r\n itemClass: 'text-xs text-muted-foreground hover:text-foreground transition-colors',\r\n separatorClass: 'text-muted-foreground/40 text-xs',\r\n lastItemClass: 'text-foreground font-medium',\r\n },\r\n}\r\n\r\nconst preset = computed(() => {\r\n return STYLE_PRESETS[props.styletype] ?? STYLE_PRESETS.default\r\n})\r\n\r\n/**\r\n * 아이템 클릭 핸들러\r\n */\r\nconst handleItemClick = (item: BreadcrumbItem, index: number) => {\r\n item.onClick?.()\r\n emit('itemClick', item, index)\r\n}\r\n\r\n/**\r\n * 마지막 아이템인지 확인\r\n */\r\nconst isLastItem = (index: number) => {\r\n return index === props.items.length - 1\r\n}\r\n</script>\r\n\r\n<template>\r\n <nav \r\n :class=\"cn(preset.containerClass, props.class)\"\r\n aria-label=\"브레드크럼 네비게이션\"\r\n >\r\n <ol class=\"flex items-center gap-2 list-none p-0 m-0\">\r\n <li\r\n v-for=\"(item, index) in items\"\r\n :key=\"index\"\r\n class=\"flex items-center gap-2\"\r\n >\r\n <!-- 아이템 -->\r\n <span\r\n v-if=\"isLastItem(index) || (!item.href && !item.onClick)\"\r\n :class=\"cn(preset.itemClass, preset.lastItemClass, isLastItem(index) && 'cursor-default')\"\r\n >\r\n <!-- 아이콘 -->\r\n <JIcon\r\n v-if=\"item.icon\"\r\n :name=\"item.icon\"\r\n size=\"sm\"\r\n class=\"mr-1\"\r\n />\r\n {{ item.label }}\r\n </span>\r\n \r\n <JLink\r\n v-else\r\n :href=\"item.href\"\r\n :class=\"cn(preset.itemClass)\"\r\n @click=\"handleItemClick(item, index)\"\r\n >\r\n <!-- 아이콘 -->\r\n <JIcon\r\n v-if=\"item.icon\"\r\n :name=\"item.icon\"\r\n size=\"sm\"\r\n class=\"mr-1\"\r\n />\r\n {{ item.label }}\r\n </JLink>\r\n\r\n <!-- 구분자 (마지막 아이템이 아니면 표시) -->\r\n <span\r\n v-if=\"!isLastItem(index)\"\r\n :class=\"preset.separatorClass\"\r\n aria-hidden=\"true\"\r\n >\r\n <JIcon\r\n v-if=\"separator === 'chevron'\"\r\n name=\"chevronRight\"\r\n size=\"sm\"\r\n />\r\n <span v-else>{{ separator }}</span>\r\n </span>\r\n </li>\r\n </ol>\r\n </nav>\r\n</template>\r\n"],"names":["props","__props","emit","__emit","STYLE_PRESETS","preset","computed","handleItemClick","item","index","isLastItem","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_hoisted_1","_openBlock","_Fragment","_renderList","cn","_createBlock","JIcon","_toDisplayString","JLink","$event"],"mappings":";;;;;;;;;;;;;;AA8CA,UAAMA,IAAQC,GAiBRC,IAAOC,GAQPC,IAKD;AAAA,MACH,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,eAAe;AAAA,MAAA;AAAA,MAEjB,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,eAAe;AAAA,MAAA;AAAA,IACjB,GAGIC,IAASC,EAAS,MACfF,EAAcJ,EAAM,SAAS,KAAKI,EAAc,OACxD,GAKKG,IAAkB,CAACC,GAAsBC,MAAkB;AAC/D,MAAAD,EAAK,UAAA,GACLN,EAAK,aAAaM,GAAMC,CAAK;AAAA,IAC/B,GAKMC,IAAa,CAACD,MACXA,MAAUT,EAAM,MAAM,SAAS;2BAKtCW,EAwDM,OAAA;AAAA,MAvDH,OAAKC,EAAEC,KAAGR,EAAA,MAAO,gBAAgBL,EAAM,KAAK,CAAA;AAAA,MAC7C,cAAW;AAAA,IAAA;MAEXc,EAmDK,MAnDLC,GAmDK;AAAA,SAlDHC,EAAA,EAAA,GAAAL,EAiDKM,GAAA,MAAAC,EAhDqBjB,EAAA,OAAK,CAArBO,GAAMC,YADhBE,EAiDK,MAAA;AAAA,UA/CF,KAAKF;AAAA,UACN,OAAM;AAAA,QAAA;UAIEC,EAAWD,CAAK,KAAA,CAAOD,EAAK,QAAI,CAAKA,EAAK,gBADlDG,EAYO,QAAA;AAAA;YAVJ,OAAKC,EAAEC,EAAAM,CAAA,EAAGd,EAAA,MAAO,WAAWA,EAAA,MAAO,eAAeK,EAAWD,CAAK,KAAA,gBAAA,CAAA;AAAA,UAAA;YAI3DD,EAAK,aADbY,EAKEC,GAAA;AAAA;cAHC,MAAMb,EAAK;AAAA,cACZ,MAAK;AAAA,cACL,OAAM;AAAA,YAAA;cACN,MACFc,EAAGd,EAAK,KAAK,GAAA,CAAA;AAAA,UAAA,eAGfY,EAcQG,GAAA;AAAA;YAZL,MAAMf,EAAK;AAAA,YACX,OAAKI,EAAEC,EAAAM,CAAA,EAAGd,EAAA,MAAO,SAAS,CAAA;AAAA,YAC1B,SAAK,CAAAmB,MAAEjB,EAAgBC,GAAMC,CAAK;AAAA,UAAA;uBAGnC,MAKE;AAAA,cAJMD,EAAK,aADbY,EAKEC,GAAA;AAAA;gBAHC,MAAMb,EAAK;AAAA,gBACZ,MAAK;AAAA,gBACL,OAAM;AAAA,cAAA;gBACN,MACFc,EAAGd,EAAK,KAAK,GAAA,CAAA;AAAA,YAAA;;;UAKNE,EAAWD,CAAK,sBADzBE,EAWO,QAAA;AAAA;YATJ,OAAKC,EAAEP,EAAA,MAAO,cAAc;AAAA,YAC7B,eAAY;AAAA,UAAA;YAGJJ,EAAA,cAAS,kBADjBmB,EAIEC,GAAA;AAAA;cAFA,MAAK;AAAA,cACL,MAAK;AAAA,YAAA,OAEPL,KAAAL,EAAmC,aAAnBV,EAAA,SAAS,GAAA,CAAA;AAAA,UAAA;;;;;;"}
|
|
@@ -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
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("vue");require("../shadcn/index.cjs");const s=require("../../lib/utils.cjs"),l=require("../shadcn/Card.vue.cjs"),n=require("../shadcn/CardHeader.vue.cjs"),u=require("../shadcn/CardTitle.vue.cjs"),c=require("../shadcn/CardDescription.vue.cjs"),i=require("../shadcn/CardContent.vue.cjs"),d=require("../shadcn/CardFooter.vue.cjs"),_={class:"flex justify-between items-center gap-3"},f={class:"flex-1"},p={key:0,class:"flex gap-2 flex-shrink-0"},v=e.defineComponent({__name:"JCard",props:{class:{},title:{},description:{},footer:{},variant:{default:"default"}},setup(t){const o=t,a=e.computed(()=>({default:"shadow-sm",elevated:"shadow-md"})[o.variant]);return(r,m)=>(e.openBlock(),e.createBlock(e.unref(l.default),{class:e.normalizeClass(e.unref(s.cn)(a.value,o.class))},{default:e.withCtx(()=>[t.title||t.description||r.$slots.actions?(e.openBlock(),e.createBlock(e.unref(n.default),{key:0},{default:e.withCtx(()=>[e.createElementVNode("div",_,[e.createElementVNode("div",f,[t.title?(e.openBlock(),e.createBlock(e.unref(u.default),{key:0},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(t.title),1)]),_:1})):e.createCommentVNode("",!0),t.description?(e.openBlock(),e.createBlock(e.unref(c.default),{key:1},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(t.description),1)]),_:1})):e.createCommentVNode("",!0)]),r.$slots.actions?(e.openBlock(),e.createElementBlock("div",p,[e.renderSlot(r.$slots,"actions")])):e.createCommentVNode("",!0)])]),_:3})):e.createCommentVNode("",!0),e.createVNode(e.unref(i.default),null,{default:e.withCtx(()=>[e.renderSlot(r.$slots,"default")]),_:3}),r.$slots.footer||t.footer?(e.openBlock(),e.createBlock(e.unref(d.default),{key:1},{default:e.withCtx(()=>[e.renderSlot(r.$slots,"footer",{},()=>[e.createTextVNode(e.toDisplayString(t.footer),1)])]),_:3})):e.createCommentVNode("",!0)]),_:3},8,["class"]))}});exports.default=v;
|
|
2
2
|
//# sourceMappingURL=JCard.vue.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JCard.vue.cjs","sources":["../../../../src/components/molecules/JCard.vue"],"sourcesContent":["<script setup lang=\"ts\">\
|
|
1
|
+
{"version":3,"file":"JCard.vue.cjs","sources":["../../../../src/components/molecules/JCard.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { HTMLAttributes } from \"vue\"\nimport { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from '@/components/shadcn'\nimport { cn } from \"@/lib/utils\"\n\ntype CardVariant = 'default' | 'elevated'\n\nconst props = withDefaults(\n defineProps<{\n /** Card 자체의 클래스 */\n class?: HTMLAttributes[\"class\"]\n /** 카드 제목 */\n title?: string\n /** 카드 설명 */\n description?: string\n /** 카드 푸터 텍스트 */\n footer?: string\n /** 카드 variant (패턴 4) */\n variant?: CardVariant\n }>(),\n {\n variant: 'default',\n }\n)\n\n// 패턴 4: variant 클래스\nconst variantClasses = computed(() => {\n const variants = {\n default: 'shadow-sm',\n elevated: 'shadow-md',\n }\n return variants[props.variant]\n})\n</script>\n\n<template>\n <Card :class=\"cn(variantClasses, props.class)\">\n <!-- Header: title/description + actions 슬롯 (패턴 7) -->\n <CardHeader v-if=\"title || description || $slots.actions\">\n <div class=\"flex justify-between items-center gap-3\">\n <!-- 좌측: 제목/설명 -->\n <div class=\"flex-1\">\n <CardTitle v-if=\"title\">{{ title }}</CardTitle>\n <CardDescription v-if=\"description\">{{ description }}</CardDescription>\n </div>\n \n <!-- 우측: actions 슬롯 (패턴 7) -->\n <div v-if=\"$slots.actions\" class=\"flex gap-2 flex-shrink-0\">\n <slot name=\"actions\" />\n </div>\n </div>\n </CardHeader>\n\n <!-- Content -->\n <CardContent>\n <slot />\n </CardContent>\n\n <!-- Footer: 슬롯 우선, 없으면 텍스트 -->\n <CardFooter v-if=\"$slots.footer || footer\">\n <slot name=\"footer\">{{ footer }}</slot>\n </CardFooter>\n </Card>\n</template>\n"],"names":["props","__props","variantClasses","computed","_createBlock","_unref","Card","cn","$slots","CardHeader","_createElementVNode","_hoisted_1","_hoisted_2","CardTitle","CardDescription","_openBlock","_createElementBlock","_hoisted_3","_renderSlot","_ctx","_createVNode","CardContent","CardFooter"],"mappings":"krBAQA,MAAMA,EAAQC,EAmBRC,EAAiBC,EAAAA,SAAS,KACb,CACf,QAAS,YACT,SAAU,WAAA,GAEIH,EAAM,OAAO,CAC9B,8BAICI,EAAAA,YA0BOC,EAAAA,MAAAC,EAAAA,OAAA,EAAA,CA1BA,uBAAOD,EAAAA,MAAAE,EAAAA,EAAA,EAAGL,QAAgBF,EAAM,KAAK,CAAA,CAAA,qBAE1C,IAaa,CAbKC,EAAA,OAASA,EAAA,aAAeO,EAAAA,OAAO,uBAAjDJ,EAAAA,YAaaC,EAAAA,MAAAI,EAAAA,OAAA,EAAA,CAAA,IAAA,GAAA,mBAZX,IAWM,CAXNC,EAAAA,mBAWM,MAXNC,EAWM,CATJD,EAAAA,mBAGM,MAHNE,EAGM,CAFaX,EAAA,qBAAjBG,EAAAA,YAA+CC,QAAAQ,EAAAA,OAAA,EAAA,CAAA,IAAA,GAAA,mBAAvB,IAAW,qCAARZ,EAAA,KAAK,EAAA,CAAA,CAAA,sCACTA,EAAA,2BAAvBG,EAAAA,YAAuEC,QAAAS,EAAAA,OAAA,EAAA,CAAA,IAAA,GAAA,mBAAnC,IAAiB,qCAAdb,EAAA,WAAW,EAAA,CAAA,CAAA,wCAIzCO,EAAAA,OAAO,SAAlBO,EAAAA,YAAAC,EAAAA,mBAEM,MAFNC,EAEM,CADJC,aAAuBC,EAAA,OAAA,SAAA,CAAA,uEAM7BC,EAAAA,YAEcf,EAAAA,MAAAgB,SAAA,EAAA,KAAA,mBADZ,IAAQ,CAARH,aAAQC,EAAA,OAAA,SAAA,CAAA,SAIQX,EAAAA,OAAO,QAAUP,EAAA,sBAAnCG,EAAAA,YAEaC,EAAAA,MAAAiB,EAAAA,OAAA,EAAA,CAAA,IAAA,GAAA,mBADX,IAAuC,CAAvCJ,EAAAA,WAAuCC,qBAAvC,IAAuC,qCAAhBlB,EAAA,MAAM,EAAA,CAAA,CAAA"}
|
|
@@ -1,61 +1,77 @@
|
|
|
1
|
-
import { defineComponent as
|
|
1
|
+
import { defineComponent as u, computed as $, createBlock as r, openBlock as s, unref as o, normalizeClass as v, withCtx as a, createCommentVNode as i, createVNode as k, createElementVNode as m, createElementBlock as p, createTextVNode as l, toDisplayString as n, renderSlot as f } from "vue";
|
|
2
2
|
import "../shadcn/index.js";
|
|
3
|
-
import { cn as
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
const
|
|
3
|
+
import { cn as h } from "../../lib/utils.js";
|
|
4
|
+
import _ from "../shadcn/Card.vue.js";
|
|
5
|
+
import y from "../shadcn/CardHeader.vue.js";
|
|
6
|
+
import C from "../shadcn/CardTitle.vue.js";
|
|
7
|
+
import w from "../shadcn/CardDescription.vue.js";
|
|
8
|
+
import N from "../shadcn/CardContent.vue.js";
|
|
9
|
+
import V from "../shadcn/CardFooter.vue.js";
|
|
10
|
+
const g = { class: "flex justify-between items-center gap-3" }, B = { class: "flex-1" }, x = {
|
|
11
|
+
key: 0,
|
|
12
|
+
class: "flex gap-2 flex-shrink-0"
|
|
13
|
+
}, F = /* @__PURE__ */ u({
|
|
11
14
|
__name: "JCard",
|
|
12
15
|
props: {
|
|
13
16
|
class: {},
|
|
14
17
|
title: {},
|
|
15
18
|
description: {},
|
|
16
|
-
footer: {}
|
|
19
|
+
footer: {},
|
|
20
|
+
variant: { default: "default" }
|
|
17
21
|
},
|
|
18
|
-
setup(
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
+
setup(e) {
|
|
23
|
+
const c = e, d = $(() => ({
|
|
24
|
+
default: "shadow-sm",
|
|
25
|
+
elevated: "shadow-md"
|
|
26
|
+
})[c.variant]);
|
|
27
|
+
return (t, E) => (s(), r(o(_), {
|
|
28
|
+
class: v(o(h)(d.value, c.class))
|
|
22
29
|
}, {
|
|
23
|
-
default:
|
|
24
|
-
|
|
25
|
-
default:
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
30
|
+
default: a(() => [
|
|
31
|
+
e.title || e.description || t.$slots.actions ? (s(), r(o(y), { key: 0 }, {
|
|
32
|
+
default: a(() => [
|
|
33
|
+
m("div", g, [
|
|
34
|
+
m("div", B, [
|
|
35
|
+
e.title ? (s(), r(o(C), { key: 0 }, {
|
|
36
|
+
default: a(() => [
|
|
37
|
+
l(n(e.title), 1)
|
|
38
|
+
]),
|
|
39
|
+
_: 1
|
|
40
|
+
})) : i("", !0),
|
|
41
|
+
e.description ? (s(), r(o(w), { key: 1 }, {
|
|
42
|
+
default: a(() => [
|
|
43
|
+
l(n(e.description), 1)
|
|
44
|
+
]),
|
|
45
|
+
_: 1
|
|
46
|
+
})) : i("", !0)
|
|
29
47
|
]),
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
m(f(t.description), 1)
|
|
35
|
-
]),
|
|
36
|
-
_: 1
|
|
37
|
-
})) : a("", !0)
|
|
48
|
+
t.$slots.actions ? (s(), p("div", x, [
|
|
49
|
+
f(t.$slots, "actions")
|
|
50
|
+
])) : i("", !0)
|
|
51
|
+
])
|
|
38
52
|
]),
|
|
39
|
-
_:
|
|
40
|
-
})) :
|
|
41
|
-
|
|
42
|
-
default:
|
|
43
|
-
|
|
53
|
+
_: 3
|
|
54
|
+
})) : i("", !0),
|
|
55
|
+
k(o(N), null, {
|
|
56
|
+
default: a(() => [
|
|
57
|
+
f(t.$slots, "default")
|
|
44
58
|
]),
|
|
45
59
|
_: 3
|
|
46
60
|
}),
|
|
47
|
-
t.footer ? (
|
|
48
|
-
default:
|
|
49
|
-
|
|
61
|
+
t.$slots.footer || e.footer ? (s(), r(o(V), { key: 1 }, {
|
|
62
|
+
default: a(() => [
|
|
63
|
+
f(t.$slots, "footer", {}, () => [
|
|
64
|
+
l(n(e.footer), 1)
|
|
65
|
+
])
|
|
50
66
|
]),
|
|
51
|
-
_:
|
|
52
|
-
})) :
|
|
67
|
+
_: 3
|
|
68
|
+
})) : i("", !0)
|
|
53
69
|
]),
|
|
54
70
|
_: 3
|
|
55
71
|
}, 8, ["class"]));
|
|
56
72
|
}
|
|
57
73
|
});
|
|
58
74
|
export {
|
|
59
|
-
|
|
75
|
+
F as default
|
|
60
76
|
};
|
|
61
77
|
//# sourceMappingURL=JCard.vue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JCard.vue.js","sources":["../../../../src/components/molecules/JCard.vue"],"sourcesContent":["<script setup lang=\"ts\">\
|
|
1
|
+
{"version":3,"file":"JCard.vue.js","sources":["../../../../src/components/molecules/JCard.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { HTMLAttributes } from \"vue\"\nimport { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from '@/components/shadcn'\nimport { cn } from \"@/lib/utils\"\n\ntype CardVariant = 'default' | 'elevated'\n\nconst props = withDefaults(\n defineProps<{\n /** Card 자체의 클래스 */\n class?: HTMLAttributes[\"class\"]\n /** 카드 제목 */\n title?: string\n /** 카드 설명 */\n description?: string\n /** 카드 푸터 텍스트 */\n footer?: string\n /** 카드 variant (패턴 4) */\n variant?: CardVariant\n }>(),\n {\n variant: 'default',\n }\n)\n\n// 패턴 4: variant 클래스\nconst variantClasses = computed(() => {\n const variants = {\n default: 'shadow-sm',\n elevated: 'shadow-md',\n }\n return variants[props.variant]\n})\n</script>\n\n<template>\n <Card :class=\"cn(variantClasses, props.class)\">\n <!-- Header: title/description + actions 슬롯 (패턴 7) -->\n <CardHeader v-if=\"title || description || $slots.actions\">\n <div class=\"flex justify-between items-center gap-3\">\n <!-- 좌측: 제목/설명 -->\n <div class=\"flex-1\">\n <CardTitle v-if=\"title\">{{ title }}</CardTitle>\n <CardDescription v-if=\"description\">{{ description }}</CardDescription>\n </div>\n \n <!-- 우측: actions 슬롯 (패턴 7) -->\n <div v-if=\"$slots.actions\" class=\"flex gap-2 flex-shrink-0\">\n <slot name=\"actions\" />\n </div>\n </div>\n </CardHeader>\n\n <!-- Content -->\n <CardContent>\n <slot />\n </CardContent>\n\n <!-- Footer: 슬롯 우선, 없으면 텍스트 -->\n <CardFooter v-if=\"$slots.footer || footer\">\n <slot name=\"footer\">{{ footer }}</slot>\n </CardFooter>\n </Card>\n</template>\n"],"names":["props","__props","variantClasses","computed","_createBlock","_unref","Card","cn","$slots","CardHeader","_createElementVNode","_hoisted_1","_hoisted_2","CardTitle","CardDescription","_openBlock","_createElementBlock","_hoisted_3","_renderSlot","_ctx","_createVNode","CardContent","CardFooter"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAQA,UAAMA,IAAQC,GAmBRC,IAAiBC,EAAS,OACb;AAAA,MACf,SAAS;AAAA,MACT,UAAU;AAAA,IAAA,GAEIH,EAAM,OAAO,CAC9B;2BAICI,EA0BOC,EAAAC,CAAA,GAAA;AAAA,MA1BA,SAAOD,EAAAE,CAAA,EAAGL,SAAgBF,EAAM,KAAK,CAAA;AAAA,IAAA;iBAE1C,MAaa;AAAA,QAbKC,EAAA,SAASA,EAAA,eAAeO,EAAAA,OAAO,gBAAjDJ,EAaaC,EAAAI,CAAA,GAAA,EAAA,KAAA,KAAA;AAAA,qBAZX,MAWM;AAAA,YAXNC,EAWM,OAXNC,GAWM;AAAA,cATJD,EAGM,OAHNE,GAGM;AAAA,gBAFaX,EAAA,cAAjBG,EAA+CC,EAAAQ,CAAA,GAAA,EAAA,KAAA,KAAA;AAAA,6BAAvB,MAAW;AAAA,wBAARZ,EAAA,KAAK,GAAA,CAAA;AAAA,kBAAA;;;gBACTA,EAAA,oBAAvBG,EAAuEC,EAAAS,CAAA,GAAA,EAAA,KAAA,KAAA;AAAA,6BAAnC,MAAiB;AAAA,wBAAdb,EAAA,WAAW,GAAA,CAAA;AAAA,kBAAA;;;;cAIzCO,EAAAA,OAAO,WAAlBO,KAAAC,EAEM,OAFNC,GAEM;AAAA,gBADJC,EAAuBC,EAAA,QAAA,SAAA;AAAA,cAAA;;;;;QAM7BC,EAEcf,EAAAgB,CAAA,GAAA,MAAA;AAAA,qBADZ,MAAQ;AAAA,YAARH,EAAQC,EAAA,QAAA,SAAA;AAAA,UAAA;;;QAIQX,EAAAA,OAAO,UAAUP,EAAA,eAAnCG,EAEaC,EAAAiB,CAAA,GAAA,EAAA,KAAA,KAAA;AAAA,qBADX,MAAuC;AAAA,YAAvCJ,EAAuCC,wBAAvC,MAAuC;AAAA,kBAAhBlB,EAAA,MAAM,GAAA,CAAA;AAAA,YAAA;;;;;;;;;"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./JEmptyState.vue2.cjs");;/* empty css */const t = (t_comp, t_opts) => {
|
|
2
|
+
const t_merged = t_comp.__vccOpts || t_comp;
|
|
3
|
+
for (const [t_key, t_val] of t_opts)
|
|
4
|
+
t_merged[t_key] = t_val;
|
|
5
|
+
return t_merged;
|
|
6
|
+
};,u=t(e.default,[["__scopeId","data-v-b6b7e0cc"]]);exports.default=u;
|
|
7
|
+
//# sourceMappingURL=JEmptyState.vue.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JEmptyState.vue.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|