@j-solution/components 1.9.0 โ 1.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -5
- package/assets/{jwms-portal-frontend-Ct2Tc7yj.css โ jwms-portal-frontend-Di6lStzZ.css} +1 -1
- package/assets/styles/j-components.css +1 -1
- package/assets/styles/main.css +29 -29
- package/components/atoms/JAvatar.vue.cjs.map +1 -1
- package/components/atoms/JAvatar.vue.js.map +1 -1
- package/components/atoms/JBadge.vue.cjs.map +1 -1
- package/components/atoms/JBadge.vue.js.map +1 -1
- package/components/atoms/JCombo.vue.cjs.map +1 -1
- package/components/atoms/JCombo.vue.js.map +1 -1
- package/components/atoms/JDatepicker.vue.cjs.map +1 -1
- package/components/atoms/JDatepicker.vue.js.map +1 -1
- package/components/atoms/JDivider.vue.cjs.map +1 -1
- package/components/atoms/JDivider.vue.js.map +1 -1
- package/components/atoms/JEditor.vue.cjs +1 -1
- package/components/atoms/JEditor.vue.js +2 -2
- package/components/atoms/JEditor.vue2.cjs.map +1 -1
- 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 +72 -85
- package/components/atoms/JGrid.vue2.js.map +1 -1
- package/components/atoms/JIcon.vue.cjs.map +1 -1
- package/components/atoms/JIcon.vue.js.map +1 -1
- package/components/atoms/JImage.vue.cjs.map +1 -1
- package/components/atoms/JImage.vue.js.map +1 -1
- package/components/atoms/JKbd.vue.cjs.map +1 -1
- package/components/atoms/JKbd.vue.js.map +1 -1
- package/components/atoms/JPreview.vue.cjs +1 -1
- package/components/atoms/JPreview.vue.js +7 -7
- package/components/atoms/JPreview.vue2.cjs.map +1 -1
- package/components/atoms/JPreview.vue2.js.map +1 -1
- package/components/atoms/JProgress.vue.cjs.map +1 -1
- package/components/atoms/JProgress.vue.js.map +1 -1
- package/components/atoms/JRadio.vue.cjs.map +1 -1
- package/components/atoms/JRadio.vue.js.map +1 -1
- package/components/atoms/JSearchCombo.vue.cjs.map +1 -1
- package/components/atoms/JSearchCombo.vue.js.map +1 -1
- package/components/atoms/JSectionTitle.vue2.cjs +1 -1
- package/components/atoms/JSectionTitle.vue2.cjs.map +1 -1
- package/components/atoms/JSectionTitle.vue2.js +5 -8
- package/components/atoms/JSectionTitle.vue2.js.map +1 -1
- package/components/atoms/JSpinner.vue.cjs.map +1 -1
- package/components/atoms/JSpinner.vue.js.map +1 -1
- package/components/atoms/JToast.vue.cjs.map +1 -1
- package/components/atoms/JToast.vue.js.map +1 -1
- package/components/atoms/JTooltip.vue.cjs.map +1 -1
- package/components/atoms/JTooltip.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 +2 -5
- package/components/molecules/JAlert.vue.js.map +1 -1
- package/components/molecules/JBreadcrumb.vue.cjs.map +1 -1
- package/components/molecules/JBreadcrumb.vue.js.map +1 -1
- package/components/molecules/JEmptyState.vue2.cjs +1 -1
- package/components/molecules/JEmptyState.vue2.cjs.map +1 -1
- package/components/molecules/JEmptyState.vue2.js +15 -18
- package/components/molecules/JEmptyState.vue2.js.map +1 -1
- package/components/molecules/JFormField.vue2.cjs +1 -1
- package/components/molecules/JFormField.vue2.cjs.map +1 -1
- package/components/molecules/JFormField.vue2.js +2 -5
- package/components/molecules/JFormField.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 +16 -19
- 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 +2 -5
- package/components/organisms/JDynamicForm.vue2.js.map +1 -1
- package/components/organisms/JFilterBar.vue.cjs +1 -1
- package/components/organisms/JFilterBar.vue.js +2 -2
- package/components/organisms/JFilterBar.vue2.cjs.map +1 -1
- 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 +14 -17
- package/components/organisms/JFormModal.vue.js.map +1 -1
- package/components/organisms/JModal.vue.cjs +1 -1
- package/components/organisms/JModal.vue.cjs.map +1 -1
- package/components/organisms/JModal.vue.js +2 -5
- package/components/organisms/JModal.vue.js.map +1 -1
- package/components/organisms/JSearchPanel.vue2.cjs +1 -1
- package/components/organisms/JSearchPanel.vue2.cjs.map +1 -1
- package/components/organisms/JSearchPanel.vue2.js +20 -23
- package/components/organisms/JSearchPanel.vue2.js.map +1 -1
- package/components/organisms/JSidebar/JSidebar.vue.cjs.map +1 -1
- package/components/organisms/JSidebar/JSidebar.vue.js.map +1 -1
- package/components/organisms/JSidebar/JSidebarGroup.vue.cjs.map +1 -1
- package/components/organisms/JSidebar/JSidebarGroup.vue.js.map +1 -1
- package/components/organisms/JSidebar/JSidebarItem.vue.cjs.map +1 -1
- package/components/organisms/JSidebar/JSidebarItem.vue.js.map +1 -1
- package/components/organisms/JSidebarAdvanced.vue.cjs +1 -1
- package/components/organisms/JSidebarAdvanced.vue.js +7 -7
- package/components/organisms/JSidebarAdvanced.vue2.cjs.map +1 -1
- package/components/organisms/JSidebarAdvanced.vue2.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.map +1 -1
- package/components/organisms/JSidebarSimple.vue2.js.map +1 -1
- package/components/shadcn/AccordionTrigger.vue.cjs.map +1 -1
- package/components/shadcn/AccordionTrigger.vue.js.map +1 -1
- package/components/shadcn/CardDescription.vue.cjs.map +1 -1
- package/components/shadcn/CardDescription.vue.js.map +1 -1
- package/components/shadcn/CardFooter.vue.cjs.map +1 -1
- package/components/shadcn/CardFooter.vue.js.map +1 -1
- package/components/shadcn/CardTitle.vue.cjs.map +1 -1
- package/components/shadcn/CardTitle.vue.js.map +1 -1
- package/components/shadcn/Checkbox.vue.cjs.map +1 -1
- package/components/shadcn/Checkbox.vue.js.map +1 -1
- package/components/shadcn/Combobox.vue.cjs.map +1 -1
- package/components/shadcn/Combobox.vue.js.map +1 -1
- package/components/shadcn/ComboboxAnchor.vue.cjs.map +1 -1
- package/components/shadcn/ComboboxAnchor.vue.js.map +1 -1
- package/components/shadcn/ComboboxEmpty.vue.cjs.map +1 -1
- package/components/shadcn/ComboboxEmpty.vue.js.map +1 -1
- package/components/shadcn/ComboboxGroup.vue.cjs.map +1 -1
- package/components/shadcn/ComboboxGroup.vue.js.map +1 -1
- package/components/shadcn/ComboboxInput.vue.cjs.map +1 -1
- package/components/shadcn/ComboboxInput.vue.js.map +1 -1
- package/components/shadcn/ComboboxItem.vue.cjs.map +1 -1
- package/components/shadcn/ComboboxItem.vue.js.map +1 -1
- package/components/shadcn/ComboboxList.vue.cjs.map +1 -1
- package/components/shadcn/ComboboxList.vue.js.map +1 -1
- package/components/shadcn/ComboboxTrigger.vue.cjs.map +1 -1
- package/components/shadcn/ComboboxTrigger.vue.js.map +1 -1
- package/components/shadcn/ContextMenu.vue.cjs.map +1 -1
- package/components/shadcn/ContextMenu.vue.js.map +1 -1
- package/components/shadcn/ContextMenuContent.vue.cjs.map +1 -1
- package/components/shadcn/ContextMenuContent.vue.js.map +1 -1
- package/components/shadcn/ContextMenuGroup.vue.cjs.map +1 -1
- package/components/shadcn/ContextMenuGroup.vue.js.map +1 -1
- package/components/shadcn/ContextMenuItem.vue.cjs.map +1 -1
- package/components/shadcn/ContextMenuItem.vue.js.map +1 -1
- package/components/shadcn/ContextMenuLabel.vue.cjs.map +1 -1
- package/components/shadcn/ContextMenuLabel.vue.js.map +1 -1
- package/components/shadcn/ContextMenuSeparator.vue.cjs.map +1 -1
- package/components/shadcn/ContextMenuSeparator.vue.js.map +1 -1
- package/components/shadcn/ContextMenuSub.vue.cjs.map +1 -1
- package/components/shadcn/ContextMenuSub.vue.js.map +1 -1
- package/components/shadcn/ContextMenuSubContent.vue.cjs.map +1 -1
- package/components/shadcn/ContextMenuSubContent.vue.js.map +1 -1
- package/components/shadcn/ContextMenuSubTrigger.vue.cjs.map +1 -1
- package/components/shadcn/ContextMenuSubTrigger.vue.js.map +1 -1
- package/components/shadcn/ContextMenuTrigger.vue.cjs.map +1 -1
- package/components/shadcn/ContextMenuTrigger.vue.js.map +1 -1
- package/components/shadcn/Field.vue.cjs.map +1 -1
- package/components/shadcn/Field.vue.js.map +1 -1
- package/components/shadcn/FieldContent.vue.cjs.map +1 -1
- package/components/shadcn/FieldContent.vue.js.map +1 -1
- package/components/shadcn/FieldDescription.vue.cjs.map +1 -1
- package/components/shadcn/FieldDescription.vue.js.map +1 -1
- package/components/shadcn/FieldError.vue.cjs.map +1 -1
- package/components/shadcn/FieldError.vue.js.map +1 -1
- package/components/shadcn/FieldGroup.vue.cjs.map +1 -1
- package/components/shadcn/FieldGroup.vue.js.map +1 -1
- package/components/shadcn/FieldLabel.vue.cjs.map +1 -1
- package/components/shadcn/FieldLabel.vue.js.map +1 -1
- package/components/shadcn/Label.vue.cjs.map +1 -1
- package/components/shadcn/Label.vue.js.map +1 -1
- package/components/shadcn/RadioGroup.vue.cjs.map +1 -1
- package/components/shadcn/RadioGroup.vue.js.map +1 -1
- package/components/shadcn/RadioGroupItem.vue.cjs.map +1 -1
- package/components/shadcn/RadioGroupItem.vue.js.map +1 -1
- package/components/shadcn/Select.vue.cjs.map +1 -1
- package/components/shadcn/Select.vue.js.map +1 -1
- package/components/shadcn/SelectContent.vue.cjs.map +1 -1
- package/components/shadcn/SelectContent.vue.js.map +1 -1
- package/components/shadcn/SelectGroup.vue.cjs.map +1 -1
- package/components/shadcn/SelectGroup.vue.js.map +1 -1
- package/components/shadcn/SelectItem.vue.cjs.map +1 -1
- package/components/shadcn/SelectItem.vue.js.map +1 -1
- package/components/shadcn/SelectLabel.vue.cjs.map +1 -1
- package/components/shadcn/SelectLabel.vue.js.map +1 -1
- package/components/shadcn/SelectScrollDownButton.vue2.cjs.map +1 -1
- package/components/shadcn/SelectScrollDownButton.vue2.js.map +1 -1
- package/components/shadcn/SelectScrollUpButton.vue2.cjs.map +1 -1
- package/components/shadcn/SelectScrollUpButton.vue2.js.map +1 -1
- package/components/shadcn/SelectValue.vue.cjs.map +1 -1
- package/components/shadcn/SelectValue.vue.js.map +1 -1
- package/components/shadcn/Separator.vue.cjs.map +1 -1
- package/components/shadcn/Separator.vue.js.map +1 -1
- package/components/shadcn/Switch.vue.cjs.map +1 -1
- package/components/shadcn/Switch.vue.js.map +1 -1
- package/components/shadcn/Tabs.vue.cjs.map +1 -1
- package/components/shadcn/Tabs.vue.js.map +1 -1
- package/components/shadcn/TabsTrigger.vue.cjs.map +1 -1
- package/components/shadcn/TabsTrigger.vue.js.map +1 -1
- package/components/shadcn/Toaster.vue.cjs.map +1 -1
- package/components/shadcn/Toaster.vue.js.map +1 -1
- package/components/shadcn/resizable/ResizableHandle.vue.cjs.map +1 -1
- package/components/shadcn/resizable/ResizableHandle.vue.js.map +1 -1
- package/components/shadcn/resizable/ResizablePanelGroup.vue.cjs.map +1 -1
- package/components/shadcn/resizable/ResizablePanelGroup.vue.js.map +1 -1
- package/lib/styleTypePreset.cjs.map +1 -1
- package/lib/styleTypePreset.js.map +1 -1
- package/lib/theme-utils.cjs.map +1 -1
- package/lib/theme-utils.js.map +1 -1
- package/package.json +1 -1
- package/tailwind.config.js +81 -81
- package/types/index.d.ts +0 -46
- package/types/sidebar.types.cjs.map +1 -1
- package/types/sidebar.types.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JGrid.vue2.cjs","sources":["../../../../src/components/atoms/JGrid.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, watch, onMounted, onUnmounted } from 'vue'\nimport { AgGridVue } from 'ag-grid-vue3'\nimport { cn } from '@/lib/utils'\nimport type {\n ColDef,\n GridOptions,\n RowClickedEvent,\n CellClickedEvent,\n SelectionChangedEvent,\n CellValueChangedEvent,\n RowDoubleClickedEvent,\n GridReadyEvent,\n ICellRendererParams,\n} from 'ag-grid-community'\nimport { ModuleRegistry, AllCommunityModule } from 'ag-grid-community'\n// Enterprise ๋ชจ๋ import (Grouping, Pivot, Excel Export ๋ฑ)\nimport { AllEnterpriseModule } from 'ag-grid-enterprise'\n// ag-grid.css๋ ์ ๊ฑฐ - v34์์ Theming API์ ์ถฉ๋ ๋ฐฉ์ง\n// ํ
๋ง CSS ํ์ผ๋ง ์ฌ์ฉ (ํด๋์ค ๊ธฐ๋ฐ ํ
๋ง)\n// v34์์๋ dark ํ
๋ง๊ฐ ๊ฐ์ CSS ํ์ผ ์์ ํฌํจ๋์ด ์์\n// ์: ag-theme-quartz.css์ .ag-theme-quartz-dark ํด๋์ค ํฌํจ\nimport 'ag-grid-community/styles/ag-theme-quartz.css'\nimport 'ag-grid-community/styles/ag-theme-alpine.css'\nimport 'ag-grid-community/styles/ag-theme-balham.css'\n\n// AG Grid ๋ชจ๋ ๋ฑ๋ก (Community + Enterprise)\nModuleRegistry.registerModules([AllCommunityModule, AllEnterpriseModule])\n\n/**\n * Action Button ์ ์ ํ์
\n */\nexport type ActionButton = {\n /** ๋ฒํผ ์์ด์ฝ ์ด๋ฆ (lucide) - label์ด ์์ ๋ ๊ธฐ๋ณธ ํ
์คํธ ์์ฑ์ ์ฌ์ฉ */\n icon?: string\n /** ๋ฒํผ ๋ผ๋ฒจ */\n label?: string\n /** ํดํ ํ
์คํธ */\n tooltip?: string\n /** ๋ฒํผ ํด๋ฆญ ํธ๋ค๋ฌ (rowData ์ ๋ฌ) */\n onClick: (rowData: any) => void\n /** ๋ฒํผ ์คํ์ผ ํ์
*/\n styletype?: 'default' | 'primary' | 'secondary' | 'success' | 'warning' | 'danger'\n /** ์กฐ๊ฑด๋ถ ํ์ ํจ์ (rowData๋ฅผ ๋ฐ์ boolean ๋ฐํ) */\n show?: (rowData: any) => boolean\n}\n\nconst props = withDefaults(\n defineProps<{\n /** ์ถ๊ฐ ํด๋์ค (์ธ๋ถ ์ปค์คํฐ๋ง์ด์ง์ฉ) */\n class?: string\n /** ๊ทธ๋ฆฌ๋์ ํ์ํ ๋ฐ์ดํฐ ๋ฐฐ์ด */\n rowData: any[]\n /** ์ปฌ๋ผ ์ ์ ๋ฐฐ์ด */\n columnDefs: ColDef[]\n /** ag-Grid ํ
๋ง */\n theme?: string\n /** ํ์ด์ง๋ค์ด์
ํ์ฑํ ์ฌ๋ถ */\n pagination?: boolean\n /** ์ฒดํฌ๋ฐ์ค ์ ํ ํ์ฑํ ์ฌ๋ถ */\n checkbox?: boolean\n /** ํ ๋ฒํธ ํ์ ์ฌ๋ถ (Enterprise) */\n rowNumbers?: boolean\n /** ํ๋ณ ์ก์
๋ฒํผ ๋ชฉ๋ก */\n actionButtons?: ActionButton[]\n /** ๋คํฌ๋ชจ๋ ์๋ ๊ฐ์ง ์ฌ๋ถ */\n autoDetectDarkMode?: boolean\n /** ์์ฝ ์ปฌ๋ผ ํ์ ์ฌ๋ถ */\n summaryColumn?: boolean\n /** ์จ๊น ์ปฌ๋ผ ๊ด๋ฆฌ ํ์ฑํ ์ฌ๋ถ */\n hiddenColumn?: boolean\n /** ๊ทธ๋ฃนํ ๊ธฐ๋ฅ ํ์ฑํ ์ฌ๋ถ (Enterprise) */\n enableGrouping?: boolean\n /** ํผ๋ฒ ๊ธฐ๋ฅ ํ์ฑํ ์ฌ๋ถ (Enterprise) */\n enablePivot?: boolean\n /** Excel ๋ด๋ณด๋ด๊ธฐ ๊ธฐ๋ฅ ํ์ฑํ ์ฌ๋ถ (Enterprise) */\n enableExcelExport?: boolean\n /** Tree Data ๊ธฐ๋ฅ ํ์ฑํ ์ฌ๋ถ (Enterprise) */\n enableTreeData?: boolean\n /** Tree Data ๊ณ์ธต ๊ฒฝ๋ก๋ฅผ ๋ฐํํ๋ ํจ์ */\n getDataPath?: (data: any) => (string | number)[]\n /** Tree Data ๊ทธ๋ฃน ์ปฌ๋ผ ์ ์ */\n autoGroupColumnDef?: ColDef\n /** ์ ํ๋ ํ ๋ฐ์ดํฐ ๋ฐฐ์ด (v-model:selected-rows) */\n selectedRows?: any[]\n /** ์ปฌ๋ผ ํธ๋ฒ ํ์ด๋ผ์ดํธ ํ์ฑํ ์ฌ๋ถ */\n columnHover?: boolean\n /** Columns Tool Panel ํ์ฑํ ์ฌ๋ถ (Enterprise) */\n enableColumnsToolPanel?: boolean\n /** Status Bar ํ์ฑํ ์ฌ๋ถ (Enterprise) */\n statusBar?: boolean\n /** ๊ฐ์ํ๋ Footer ๋ชจ๋ (Status Bar ์ ๊ฑฐ, Pagination๋ง ํ์) */\n compactFooter?: boolean\n /** Row Group Panel ํ์ ์ฌ๋ถ ('always' | 'onlyWhenGrouping' | 'never') */\n rowGroupPanelShow?: 'always' | 'onlyWhenGrouping' | 'never'\n /** ๊ทธ๋ฃน ๊ธฐ๋ณธ ํ์ฅ ๋ ๋ฒจ (-1: ๋ชจ๋ ๋ซํ, 0: ์ฒซ ๋ ๋ฒจ๋ง, 1: 2๋ ๋ฒจ๊น์ง...) */\n groupDefaultExpanded?: number\n /** Pivot Mode Panel ํ์ ์ฌ๋ถ */\n pivotPanelShow?: 'always' | 'onlyWhenPivoting' | 'never'\n /** Pivot Mode ํ์ฑํ ์ฌ๋ถ */\n pivotMode?: boolean\n }>(),\n {\n theme: 'ag-theme-balham',\n pagination: true,\n checkbox: false,\n rowNumbers: true,\n actionButtons: undefined,\n autoDetectDarkMode: true,\n summaryColumn: false,\n hiddenColumn: false,\n enableGrouping: true,\n enablePivot: false,\n enableExcelExport: false,\n enableTreeData: false,\n getDataPath: undefined,\n autoGroupColumnDef: undefined,\n selectedRows: () => [],\n columnHover: true,\n enableColumnsToolPanel: true,\n statusBar: true,\n compactFooter: false,\n rowGroupPanelShow: 'never',\n groupDefaultExpanded: -1,\n pivotPanelShow: 'never',\n pivotMode: false,\n },\n)\n\nconst emit = defineEmits<{\n /** ํ ํด๋ฆญ ์ด๋ฒคํธ */\n rowClicked: [event: RowClickedEvent]\n /** ํ ๋๋ธํด๋ฆญ ์ด๋ฒคํธ */\n rowDoubleClicked: [event: RowDoubleClickedEvent]\n /** ์
ํด๋ฆญ ์ด๋ฒคํธ */\n cellClicked: [event: CellClickedEvent]\n /** ์ ํ ๋ณ๊ฒฝ ์ด๋ฒคํธ (์ฒดํฌ๋ฐ์ค ๋ฑ) */\n selectionChanged: [event: SelectionChangedEvent]\n /** ์
๊ฐ ๋ณ๊ฒฝ ์ด๋ฒคํธ */\n cellValueChanged: [event: CellValueChangedEvent]\n /** ๊ทธ๋ฆฌ๋ ์ค๋น ์๋ฃ ์ด๋ฒคํธ */\n gridReady: [event: GridReadyEvent]\n /** ์ ํ๋ ํ ๋ณ๊ฒฝ ์ด๋ฒคํธ (v-model:selected-rows) */\n 'update:selectedRows': [rows: any[]]\n}>()\n\n// ag-Grid ์ธ์คํด์ค ์ฐธ์กฐ\nconst gridApi = ref<any>(null)\nconst gridColumnApi = ref<any>(null)\n\n// ๋คํฌ๋ชจ๋ ์ํ\nconst isDarkMode = ref(false)\n\n// ๋คํฌ๋ชจ๋ ๊ฐ์ง ํจ์\nconst detectDarkMode = () => {\n isDarkMode.value = document.documentElement.classList.contains('dark')\n}\n\n// ํ์ฌ ํ
๋ง ๊ณ์ฐ (๋คํฌ๋ชจ๋ ์๋ ์ ํ)\nconst currentTheme = computed(() => {\n if (!props.autoDetectDarkMode) {\n return props.theme\n }\n \n const baseTheme = props.theme\n if (isDarkMode.value) {\n // ์ด๋ฏธ dark ํ
๋ง์ธ ๊ฒฝ์ฐ ๊ทธ๋๋ก ์ ์ง, ์๋๋ฉด -dark ์ถ๊ฐ\n return baseTheme.includes('-dark') ? baseTheme : `${baseTheme}-dark`\n } else {\n // dark ํ
๋ง ์ ๊ฑฐ\n return baseTheme.replace(/-dark$/, '')\n }\n})\n\n// Action Buttons Cell Renderer - ํจ์ํ์ผ๋ก DOM ์ง์ ์์ฑ\nconst ActionButtonsCellRenderer = (params: ICellRendererParams) => {\n const buttons = props.actionButtons || []\n const rowData = params.data\n \n // ํ์ํ ๋ฒํผ ํํฐ๋ง\n const visibleButtons = buttons.filter(btn => {\n if (btn.show) {\n return btn.show(rowData)\n }\n return true\n })\n \n if (visibleButtons.length === 0) {\n return ''\n }\n \n // ์ปจํ
์ด๋ div ์์ฑ\n const container = document.createElement('div')\n container.className = 'flex items-center gap-1'\n \n // ๊ฐ ๋ฒํผ ์์ฑ\n visibleButtons.forEach((btn) => {\n const button = document.createElement('button')\n button.className = 'px-2 py-1 text-xs border rounded transition-colors'\n \n // styletype์ ๋ฐ๋ฅธ ํด๋์ค ์ถ๊ฐ\n if (btn.styletype === 'danger') {\n button.className += ' bg-red-50 border-red-400 text-red-700 hover:bg-red-100 dark:bg-red-950 dark:border-red-700 dark:text-red-400 dark:hover:bg-red-900'\n } else {\n button.className += ' bg-gray-50 border-gray-400 text-gray-700 hover:bg-gray-100 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-700'\n }\n \n // tooltip\n if (btn.tooltip) {\n button.title = btn.tooltip\n }\n \n // ๋ผ๋ฒจ ์ถ๊ฐ (ํ
์คํธ ๋ฒํผ)\n if (btn.label) {\n button.textContent = btn.label\n } else if (btn.icon) {\n // ๋ผ๋ฒจ์ด ์์ผ๋ฉด ๊ธฐ๋ณธ ํ
์คํธ ์์ฑ\n if (btn.icon === 'pencil') {\n button.textContent = '์์ '\n } else if (btn.icon === 'trash2' || btn.icon === 'trash') {\n button.textContent = '์ญ์ '\n } else if (btn.icon === 'eye') {\n button.textContent = '๋ณด๊ธฐ'\n } else if (btn.icon === 'copy') {\n button.textContent = '๋ณต์ฌ'\n } else if (btn.icon === 'download') {\n button.textContent = '๋ค์ด๋ก๋'\n } else if (btn.icon === 'circleX') {\n button.textContent = '๋นํ์ฑํ'\n } else if (btn.icon === 'circleCheckBig') {\n button.textContent = 'ํ์ฑํ'\n } else {\n button.textContent = btn.icon\n }\n }\n \n // ํด๋ฆญ ์ด๋ฒคํธ\n button.addEventListener('click', (e) => {\n e.stopPropagation()\n btn.onClick(rowData)\n })\n \n container.appendChild(button)\n })\n \n return container\n}\n\n// Action Buttons ์ปฌ๋ผ ์ ์\nconst actionButtonsColumn = computed<ColDef | null>(() => {\n if (!props.actionButtons || props.actionButtons.length === 0) {\n return null\n }\n \n return {\n colId: 'actionButtons',\n headerName: '์์
',\n field: '_actions',\n width: 120,\n minWidth: 80,\n maxWidth: 200,\n lockPosition: 'left' as const,\n sortable: false,\n filter: false,\n resizable: true,\n suppressNavigable: true,\n suppressHeaderMenuButton: true,\n cellRenderer: ActionButtonsCellRenderer,\n cellStyle: { display: 'flex', justifyContent: 'center', alignItems: 'center' },\n }\n})\n\n// checkbox ํ์ฑํ ๋ฐ ์ถ๊ฐ ์ปฌ๋ผ ์ฒ๋ฆฌ\nconst processedColumnDefs = computed(() => {\n const columns: ColDef[] = []\n \n // 1. Checkbox ์ปฌ๋ผ (์ต์ฐ์ )\n if (props.checkbox) {\n columns.push({\n colId: 'rowSelection',\n headerName: '',\n // field์ valueGetter ์ ๊ฑฐ - AG Grid ๊ณต์ ๋ฐฉ์\n width: 50,\n minWidth: 50,\n maxWidth: 50,\n lockPosition: 'left' as const,\n checkboxSelection: true,\n headerCheckboxSelection: true,\n sortable: false,\n filter: false,\n resizable: false,\n suppressNavigable: true,\n suppressHeaderMenuButton: true,\n cellStyle: { display: 'flex', justifyContent: 'center', alignItems: 'center' },\n })\n }\n \n // 2. Action Buttons ์ปฌ๋ผ\n if (actionButtonsColumn.value) {\n columns.push(actionButtonsColumn.value)\n }\n \n // 3. ์ฌ์ฉ์ ์ ์ ์ปฌ๋ผ๋ค (Row Numbers๋ AG Grid๊ฐ ์๋์ผ๋ก ์ถ๊ฐ)\n columns.push(...props.columnDefs)\n \n return columns\n})\n\n// Grid ์ต์
์ค์ \nconst gridOptions = computed<GridOptions>(() => {\n const options: GridOptions = {\n // theme ์ต์
์ ๊ฑฐ - ํด๋์ค ๊ธฐ๋ฐ ํ
๋ง(:class=\"theme\") ์ฌ์ฉ\n // columnDefs์ rowData๋ prop์ผ๋ก ์ ๋ฌํ๋ฏ๋ก ์ฌ๊ธฐ์ ์ ๊ฑฐ\n pagination: props.pagination,\n rowSelection: props.checkbox ? 'multiple' : undefined,\n // ์ฒดํฌ๋ฐ์ค ๋ชจ๋์ผ ๋ row ํด๋ฆญ์ผ๋ก ์ ํ์ด ๋ณ๊ฒฝ๋์ง ์๋๋ก ์ค์ \n // ์ฒดํฌ๋ฐ์ค๋ง์ผ๋ก ์ ํ์ ์ ์ดํ๋๋ก ํจ\n suppressRowClickSelection: props.checkbox,\n\n // Row Numbers (Enterprise) - AG Grid ํ์ค ๋ฐฉ์\n rowNumbers: props.rowNumbers,\n\n // Column Hover Highlight\n columnHoverHighlight: props.columnHover,\n\n // Enterprise ๊ธฐ๋ฅ ์ต์
\n sideBar: props.enableColumnsToolPanel || props.enableGrouping || props.enablePivot ? {\n toolPanels: [\n {\n id: 'columns',\n labelDefault: 'Columns',\n labelKey: 'columns',\n iconKey: 'columns',\n toolPanel: 'agColumnsToolPanel',\n toolPanelParams: {\n suppressRowGroups: !props.enableGrouping,\n suppressValues: !props.enablePivot,\n suppressPivots: !props.enablePivot,\n suppressPivotMode: !props.enablePivot,\n },\n },\n ],\n defaultToolPanel: '', // ์ด๊ธฐ์๋ ์ ํ ์ํ\n } : undefined,\n\n // Status Bar (Enterprise)\n // compactFooter ๋ชจ๋์์๋ Status Bar ๋นํ์ฑํ\n statusBar: (props.statusBar && !props.compactFooter) ? {\n statusPanels: [\n { statusPanel: 'agTotalAndFilteredRowCountComponent', align: 'left' as const },\n { statusPanel: 'agSelectedRowCountComponent', align: 'left' as const },\n { statusPanel: 'agAggregationComponent', align: 'right' as const },\n ],\n } : undefined,\n\n // Row Group Panel ์ค์ (Enterprise) - ๊ทธ๋ฆฌ๋ ์๋จ์ ๋๋๊ทธ ์์ญ ํ์\n rowGroupPanelShow: props.rowGroupPanelShow !== 'never' ? props.rowGroupPanelShow : undefined,\n\n // Pivot Panel ์ค์ (Enterprise) - ํผ๋ฒ ๋ชจ๋์ฉ ๋๋๊ทธ ์์ญ\n pivotPanelShow: props.pivotPanelShow !== 'never' ? props.pivotPanelShow : undefined,\n \n // Pivot Mode ํ์ฑํ\n pivotMode: props.pivotMode,\n\n // ๊ทธ๋ฃนํ ๊ธฐ๋ณธ ์ค์ \n groupDefaultExpanded: props.groupDefaultExpanded,\n suppressAggFuncInHeader: false,\n\n // Tree Data ์ค์ (Enterprise)\n treeData: props.enableTreeData || undefined,\n getDataPath: props.enableTreeData\n ? (props.getDataPath || ((data: any) => data.path || []))\n : undefined,\n autoGroupColumnDef: props.enableTreeData && props.autoGroupColumnDef\n ? props.autoGroupColumnDef\n : undefined,\n }\n\n return options\n})\n\n// Excel ๋ด๋ณด๋ด๊ธฐ ํจ์ (์ธ๋ถ์์ ์ฌ์ฉ ๊ฐ๋ฅํ๋๋ก expose)\nconst exportToExcel = () => {\n if (gridApi.value && props.enableExcelExport) {\n gridApi.value.exportDataAsExcel({\n fileName: 'grid-export.xlsx',\n })\n }\n}\n\n// ๊ทธ๋ฆฌ๋ API๋ฅผ ์ธ๋ถ์ ๋
ธ์ถ\ndefineExpose({\n gridApi,\n gridColumnApi,\n exportToExcel,\n})\n\n// Grid ready ์ด๋ฒคํธ ํธ๋ค๋ฌ\nconst onGridReady = (params: GridReadyEvent) => {\n gridApi.value = params.api\n gridColumnApi.value = params.api // v34์์ columnApi๋ deprecated\n emit('gridReady', params)\n}\n\n// ํ ํด๋ฆญ ์ด๋ฒคํธ ํธ๋ค๋ฌ\nconst onRowClicked = (event: RowClickedEvent) => {\n emit('rowClicked', event)\n}\n\n// ํ ๋๋ธํด๋ฆญ ์ด๋ฒคํธ ํธ๋ค๋ฌ\nconst onRowDoubleClicked = (event: RowDoubleClickedEvent) => {\n emit('rowDoubleClicked', event)\n}\n\n// ์
ํด๋ฆญ ์ด๋ฒคํธ ํธ๋ค๋ฌ\nconst onCellClicked = (event: CellClickedEvent) => {\n emit('cellClicked', event)\n}\n\n// ์ ํ ๋ณ๊ฒฝ ์ด๋ฒคํธ ํธ๋ค๋ฌ\nconst onSelectionChanged = (event: SelectionChangedEvent) => {\n emit('selectionChanged', event)\n emit('update:selectedRows', event.api.getSelectedRows())\n}\n\n// ์
๊ฐ ๋ณ๊ฒฝ ์ด๋ฒคํธ ํธ๋ค๋ฌ\nconst onCellValueChanged = (event: CellValueChangedEvent) => {\n emit('cellValueChanged', event)\n}\n\n// MutationObserver๋ก ๋คํฌ๋ชจ๋ ๋ณ๊ฒฝ ๊ฐ์ง\nlet darkModeObserver: MutationObserver | null = null\n\nonMounted(() => {\n if (props.autoDetectDarkMode) {\n // ์ด๊ธฐ ๋คํฌ๋ชจ๋ ์ํ ๊ฐ์ง\n detectDarkMode()\n \n // MutationObserver๋ก class ๋ณ๊ฒฝ ๊ฐ์ง\n darkModeObserver = new MutationObserver(() => {\n detectDarkMode()\n })\n \n darkModeObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n })\n }\n})\n\nonUnmounted(() => {\n if (darkModeObserver) {\n darkModeObserver.disconnect()\n }\n})\n\n// columnDefs ๋ณ๊ฒฝ ๊ฐ์ง\nwatch(\n () => props.columnDefs,\n () => {\n if (gridApi.value) {\n gridApi.value.setGridOption('columnDefs', processedColumnDefs.value)\n }\n },\n { deep: true },\n)\n\n// rowData ๋ณ๊ฒฝ ๊ฐ์ง\nwatch(\n () => props.rowData,\n () => {\n if (gridApi.value) {\n gridApi.value.setGridOption('rowData', props.rowData)\n }\n },\n { deep: true },\n)\n</script>\n\n<template>\n <div :class=\"cn('ag-grid-container', props.class)\">\n <AgGridVue\n :column-defs=\"processedColumnDefs\"\n :row-data=\"rowData\"\n :grid-options=\"gridOptions\"\n :class=\"currentTheme\"\n style=\"height: 100%; width: 100%\"\n @grid-ready=\"onGridReady\"\n @row-clicked=\"onRowClicked\"\n @row-double-clicked=\"onRowDoubleClicked\"\n @cell-clicked=\"onCellClicked\"\n @selection-changed=\"onSelectionChanged\"\n @cell-value-changed=\"onCellValueChanged\"\n />\n </div>\n</template>\n\n<style scoped>\n.ag-grid-container {\n width: 100%;\n height: 100%;\n}\n\n/* ============================================\n COMPACT FOOTER: Status Bar + Pagination ํตํฉ\n ============================================ */\n\n/* Status Bar ๋์ด ์ค์ด๊ธฐ */\n:deep(.ag-status-bar) {\n min-height: 28px !important;\n height: 28px !important;\n padding: 0 12px !important;\n border-top: 1px solid var(--ag-border-color);\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 0.8125rem;\n}\n\n/* Status Bar ์ปดํฌ๋ํธ๋ค ๋์ด ์กฐ์ */\n:deep(.ag-status-bar-left),\n:deep(.ag-status-bar-center),\n:deep(.ag-status-bar-right) {\n height: 28px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n/* Status Bar ํจ๋๋ค ๊ฐ๊ฒฉ ์กฐ์ */\n:deep(.ag-status-panel) {\n padding: 0;\n height: 28px;\n display: flex;\n align-items: center;\n}\n\n/* Pagination Panel ๋์ด ์ค์ด๊ธฐ */\n:deep(.ag-paging-panel) {\n min-height: 28px !important;\n height: 28px !important;\n padding: 0 12px !important;\n border-top: 1px solid var(--ag-border-color);\n font-size: 0.8125rem;\n}\n\n/* Pagination ์ปดํฌ๋ํธ๋ค ๋์ด ์กฐ์ */\n:deep(.ag-paging-page-size),\n:deep(.ag-paging-row-summary-panel) {\n height: 28px;\n display: flex;\n align-items: center;\n}\n\n/* Page Size Selector ๋์ด ์กฐ์ */\n:deep(.ag-paging-page-size .ag-picker-field) {\n height: 24px;\n min-height: 24px;\n}\n\n:deep(.ag-paging-page-size .ag-picker-field-wrapper) {\n height: 24px;\n padding: 0 4px;\n}\n\n/* Pagination ๋ฒํผ๋ค ๋์ด ์กฐ์ */\n:deep(.ag-paging-button) {\n height: 24px;\n width: 24px;\n padding: 2px;\n}\n\n/* Pagination ๋ฒํผ ๋ํผ */\n:deep(.ag-paging-button-wrapper) {\n height: 28px;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n/* Row summary ํ
์คํธ */\n:deep(.ag-paging-row-summary-panel-number) {\n line-height: 28px;\n}\n\n/* ========================================\n ํจํด 9: AG-Grid ์คํ์ผ ํฅ์\n ======================================== */\n\n:deep(.ag-root-wrapper) {\n border: 1px solid hsl(var(--border));\n border-radius: 0.375rem;\n}\n\n:deep(.ag-header) {\n background-color: hsl(var(--muted));\n border-bottom: 1px solid hsl(var(--border));\n font-weight: 500;\n}\n\n:deep(.ag-header-cell) {\n color: hsl(var(--foreground));\n font-size: 0.75rem;\n padding: 0.5rem;\n}\n\n:deep(.ag-row) {\n transition: background-color 0.2s ease, border-left 0.2s ease;\n cursor: pointer;\n}\n\n:deep(.ag-row:hover) {\n background-color: hsl(var(--primary) / 0.05) !important;\n}\n\n:deep(.ag-row-selected) {\n background-color: hsl(var(--primary) / 0.1) !important;\n border-left: 2px solid hsl(var(--primary)) !important;\n}\n\n:deep(.ag-row-selected:hover) {\n background-color: hsl(var(--primary) / 0.15) !important;\n}\n\n:deep(.ag-cell) {\n line-height: 1.5;\n padding: 0.5rem;\n border-bottom: 1px solid hsl(var(--border) / 0.5);\n}\n\n:deep(.ag-paging-panel) {\n background-color: hsl(var(--muted) / 0.5);\n border-top: 1px solid hsl(var(--border));\n}\n</style>\n"],"names":["ModuleRegistry","AllCommunityModule","AllEnterpriseModule","props","__props","emit","__emit","gridApi","ref","gridColumnApi","isDarkMode","detectDarkMode","currentTheme","computed","baseTheme","ActionButtonsCellRenderer","params","buttons","rowData","visibleButtons","btn","container","button","e","actionButtonsColumn","processedColumnDefs","columns","gridOptions","data","__expose","onGridReady","onRowClicked","event","onRowDoubleClicked","onCellClicked","onSelectionChanged","onCellValueChanged","darkModeObserver","onMounted","onUnmounted","watch","_createElementBlock","_normalizeClass","_unref","cn","_createVNode","AgGridVue"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"JGrid.vue2.cjs","sources":["../../../../src/components/atoms/JGrid.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport { AgGridVue } from 'ag-grid-vue3'\nimport { cn } from '@/lib/utils'\nimport type {\n ColDef,\n GridOptions,\n RowClickedEvent,\n CellClickedEvent,\n SelectionChangedEvent,\n CellValueChangedEvent,\n RowDoubleClickedEvent,\n GridReadyEvent,\n ICellRendererParams,\n} from 'ag-grid-community'\nimport { ModuleRegistry, AllCommunityModule, themeQuartz } from 'ag-grid-community'\n// Enterprise ๋ชจ๋ import (Grouping, Pivot, Excel Export ๋ฑ)\nimport { AllEnterpriseModule } from 'ag-grid-enterprise'\n\n// AG Grid ๋ชจ๋ ๋ฑ๋ก (Community + Enterprise)\nModuleRegistry.registerModules([AllCommunityModule, AllEnterpriseModule])\n\n// Theme Builder API: JLIS ์ปค์คํ
ํ
๋ง (browserColorScheme: 'inherit' โ ๋คํฌ๋ชจ๋ ์๋ ๊ฐ์ง)\nconst jTheme = themeQuartz.withParams({\n browserColorScheme: 'inherit',\n cellHorizontalPaddingScale: 1,\n columnBorder: true,\n fontSize: 13,\n headerBackgroundColor: '#FFFFFF',\n headerFontWeight: 500,\n headerVerticalPaddingScale: 0.7,\n iconSize: 14,\n oddRowBackgroundColor: '#CBE6F175',\n rowVerticalPaddingScale: 0.5,\n})\n\n/**\n * Action Button ์ ์ ํ์
\n */\nexport type ActionButton = {\n /** ๋ฒํผ ์์ด์ฝ ์ด๋ฆ (lucide) - label์ด ์์ ๋ ๊ธฐ๋ณธ ํ
์คํธ ์์ฑ์ ์ฌ์ฉ */\n icon?: string\n /** ๋ฒํผ ๋ผ๋ฒจ */\n label?: string\n /** ํดํ ํ
์คํธ */\n tooltip?: string\n /** ๋ฒํผ ํด๋ฆญ ํธ๋ค๋ฌ (rowData ์ ๋ฌ) */\n onClick: (rowData: any) => void\n /** ๋ฒํผ ์คํ์ผ ํ์
*/\n styletype?: 'default' | 'primary' | 'secondary' | 'success' | 'warning' | 'danger'\n /** ์กฐ๊ฑด๋ถ ํ์ ํจ์ (rowData๋ฅผ ๋ฐ์ boolean ๋ฐํ) */\n show?: (rowData: any) => boolean\n}\n\nconst props = withDefaults(\n defineProps<{\n /** ์ถ๊ฐ ํด๋์ค (์ธ๋ถ ์ปค์คํฐ๋ง์ด์ง์ฉ) */\n class?: string\n /** ๊ทธ๋ฆฌ๋์ ํ์ํ ๋ฐ์ดํฐ ๋ฐฐ์ด */\n rowData: any[]\n /** ์ปฌ๋ผ ์ ์ ๋ฐฐ์ด */\n columnDefs: ColDef[]\n /** ํ์ด์ง๋ค์ด์
ํ์ฑํ ์ฌ๋ถ */\n pagination?: boolean\n /** ์ฒดํฌ๋ฐ์ค ์ ํ ํ์ฑํ ์ฌ๋ถ */\n checkbox?: boolean\n /** ํ ๋ฒํธ ํ์ ์ฌ๋ถ (Enterprise) */\n rowNumbers?: boolean\n /** ํ๋ณ ์ก์
๋ฒํผ ๋ชฉ๋ก */\n actionButtons?: ActionButton[]\n /** ์์ฝ ์ปฌ๋ผ ํ์ ์ฌ๋ถ */\n summaryColumn?: boolean\n /** ์จ๊น ์ปฌ๋ผ ๊ด๋ฆฌ ํ์ฑํ ์ฌ๋ถ */\n hiddenColumn?: boolean\n /** ๊ทธ๋ฃนํ ๊ธฐ๋ฅ ํ์ฑํ ์ฌ๋ถ (Enterprise) */\n enableGrouping?: boolean\n /** ํผ๋ฒ ๊ธฐ๋ฅ ํ์ฑํ ์ฌ๋ถ (Enterprise) */\n enablePivot?: boolean\n /** Excel ๋ด๋ณด๋ด๊ธฐ ๊ธฐ๋ฅ ํ์ฑํ ์ฌ๋ถ (Enterprise) */\n enableExcelExport?: boolean\n /** Tree Data ๊ธฐ๋ฅ ํ์ฑํ ์ฌ๋ถ (Enterprise) */\n enableTreeData?: boolean\n /** Tree Data ๊ณ์ธต ๊ฒฝ๋ก๋ฅผ ๋ฐํํ๋ ํจ์ */\n getDataPath?: (data: any) => (string | number)[]\n /** Tree Data ๊ทธ๋ฃน ์ปฌ๋ผ ์ ์ */\n autoGroupColumnDef?: ColDef\n /** ์ ํ๋ ํ ๋ฐ์ดํฐ ๋ฐฐ์ด (v-model:selected-rows) */\n selectedRows?: any[]\n /** ์ปฌ๋ผ ํธ๋ฒ ํ์ด๋ผ์ดํธ ํ์ฑํ ์ฌ๋ถ */\n columnHover?: boolean\n /** Columns Tool Panel ํ์ฑํ ์ฌ๋ถ (Enterprise) */\n enableColumnsToolPanel?: boolean\n /** Status Bar ํ์ฑํ ์ฌ๋ถ (Enterprise) */\n statusBar?: boolean\n /** ๊ฐ์ํ๋ Footer ๋ชจ๋ (Status Bar ์ ๊ฑฐ, Pagination๋ง ํ์) */\n compactFooter?: boolean\n /** Row Group Panel ํ์ ์ฌ๋ถ ('always' | 'onlyWhenGrouping' | 'never') */\n rowGroupPanelShow?: 'always' | 'onlyWhenGrouping' | 'never'\n /** ๊ทธ๋ฃน ๊ธฐ๋ณธ ํ์ฅ ๋ ๋ฒจ (-1: ๋ชจ๋ ๋ซํ, 0: ์ฒซ ๋ ๋ฒจ๋ง, 1: 2๋ ๋ฒจ๊น์ง...) */\n groupDefaultExpanded?: number\n /** Pivot Mode Panel ํ์ ์ฌ๋ถ */\n pivotPanelShow?: 'always' | 'onlyWhenPivoting' | 'never'\n /** Pivot Mode ํ์ฑํ ์ฌ๋ถ */\n pivotMode?: boolean\n }>(),\n {\n pagination: true,\n checkbox: false,\n rowNumbers: true,\n actionButtons: undefined,\n summaryColumn: false,\n hiddenColumn: false,\n enableGrouping: true,\n enablePivot: false,\n enableExcelExport: false,\n enableTreeData: false,\n getDataPath: undefined,\n autoGroupColumnDef: undefined,\n selectedRows: () => [],\n columnHover: true,\n enableColumnsToolPanel: true,\n statusBar: true,\n compactFooter: false,\n rowGroupPanelShow: 'never',\n groupDefaultExpanded: -1,\n pivotPanelShow: 'never',\n pivotMode: false,\n },\n)\n\nconst emit = defineEmits<{\n /** ํ ํด๋ฆญ ์ด๋ฒคํธ */\n rowClicked: [event: RowClickedEvent]\n /** ํ ๋๋ธํด๋ฆญ ์ด๋ฒคํธ */\n rowDoubleClicked: [event: RowDoubleClickedEvent]\n /** ์
ํด๋ฆญ ์ด๋ฒคํธ */\n cellClicked: [event: CellClickedEvent]\n /** ์ ํ ๋ณ๊ฒฝ ์ด๋ฒคํธ (์ฒดํฌ๋ฐ์ค ๋ฑ) */\n selectionChanged: [event: SelectionChangedEvent]\n /** ์
๊ฐ ๋ณ๊ฒฝ ์ด๋ฒคํธ */\n cellValueChanged: [event: CellValueChangedEvent]\n /** ๊ทธ๋ฆฌ๋ ์ค๋น ์๋ฃ ์ด๋ฒคํธ */\n gridReady: [event: GridReadyEvent]\n /** ์ ํ๋ ํ ๋ณ๊ฒฝ ์ด๋ฒคํธ (v-model:selected-rows) */\n 'update:selectedRows': [rows: any[]]\n}>()\n\n// ag-Grid ์ธ์คํด์ค ์ฐธ์กฐ\nconst gridApi = ref<any>(null)\nconst gridColumnApi = ref<any>(null)\n\n// Action Buttons Cell Renderer - ํจ์ํ์ผ๋ก DOM ์ง์ ์์ฑ\nconst ActionButtonsCellRenderer = (params: ICellRendererParams) => {\n const buttons = props.actionButtons || []\n const rowData = params.data\n \n // ํ์ํ ๋ฒํผ ํํฐ๋ง\n const visibleButtons = buttons.filter(btn => {\n if (btn.show) {\n return btn.show(rowData)\n }\n return true\n })\n \n if (visibleButtons.length === 0) {\n return ''\n }\n \n // ์ปจํ
์ด๋ div ์์ฑ\n const container = document.createElement('div')\n container.className = 'flex items-center gap-1'\n \n // ๊ฐ ๋ฒํผ ์์ฑ\n visibleButtons.forEach((btn) => {\n const button = document.createElement('button')\n button.className = 'px-2 py-1 text-xs border rounded transition-colors'\n \n // styletype์ ๋ฐ๋ฅธ ํด๋์ค ์ถ๊ฐ\n if (btn.styletype === 'danger') {\n button.className += ' bg-red-50 border-red-400 text-red-700 hover:bg-red-100 dark:bg-red-950 dark:border-red-700 dark:text-red-400 dark:hover:bg-red-900'\n } else {\n button.className += ' bg-gray-50 border-gray-400 text-gray-700 hover:bg-gray-100 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-700'\n }\n \n // tooltip\n if (btn.tooltip) {\n button.title = btn.tooltip\n }\n \n // ๋ผ๋ฒจ ์ถ๊ฐ (ํ
์คํธ ๋ฒํผ)\n if (btn.label) {\n button.textContent = btn.label\n } else if (btn.icon) {\n // ๋ผ๋ฒจ์ด ์์ผ๋ฉด ๊ธฐ๋ณธ ํ
์คํธ ์์ฑ\n if (btn.icon === 'pencil') {\n button.textContent = '์์ '\n } else if (btn.icon === 'trash2' || btn.icon === 'trash') {\n button.textContent = '์ญ์ '\n } else if (btn.icon === 'eye') {\n button.textContent = '๋ณด๊ธฐ'\n } else if (btn.icon === 'copy') {\n button.textContent = '๋ณต์ฌ'\n } else if (btn.icon === 'download') {\n button.textContent = '๋ค์ด๋ก๋'\n } else if (btn.icon === 'circleX') {\n button.textContent = '๋นํ์ฑํ'\n } else if (btn.icon === 'circleCheckBig') {\n button.textContent = 'ํ์ฑํ'\n } else {\n button.textContent = btn.icon\n }\n }\n \n // ํด๋ฆญ ์ด๋ฒคํธ\n button.addEventListener('click', (e) => {\n e.stopPropagation()\n btn.onClick(rowData)\n })\n \n container.appendChild(button)\n })\n \n return container\n}\n\n// Action Buttons ์ปฌ๋ผ ์ ์\nconst actionButtonsColumn = computed<ColDef | null>(() => {\n if (!props.actionButtons || props.actionButtons.length === 0) {\n return null\n }\n \n return {\n colId: 'actionButtons',\n headerName: '์์
',\n field: '_actions',\n width: 120,\n minWidth: 80,\n maxWidth: 200,\n lockPosition: 'left' as const,\n sortable: false,\n filter: false,\n resizable: true,\n suppressNavigable: true,\n suppressHeaderMenuButton: true,\n cellRenderer: ActionButtonsCellRenderer,\n cellStyle: { display: 'flex', justifyContent: 'center', alignItems: 'center' },\n }\n})\n\n// checkbox ํ์ฑํ ๋ฐ ์ถ๊ฐ ์ปฌ๋ผ ์ฒ๋ฆฌ\nconst processedColumnDefs = computed(() => {\n const columns: ColDef[] = []\n \n // 1. Checkbox ์ปฌ๋ผ (์ต์ฐ์ )\n if (props.checkbox) {\n columns.push({\n colId: 'rowSelection',\n headerName: '',\n // field์ valueGetter ์ ๊ฑฐ - AG Grid ๊ณต์ ๋ฐฉ์\n width: 50,\n minWidth: 50,\n maxWidth: 50,\n lockPosition: 'left' as const,\n checkboxSelection: true,\n headerCheckboxSelection: true,\n sortable: false,\n filter: false,\n resizable: false,\n suppressNavigable: true,\n suppressHeaderMenuButton: true,\n cellStyle: { display: 'flex', justifyContent: 'center', alignItems: 'center' },\n })\n }\n \n // 2. Action Buttons ์ปฌ๋ผ\n if (actionButtonsColumn.value) {\n columns.push(actionButtonsColumn.value)\n }\n \n // 3. ์ฌ์ฉ์ ์ ์ ์ปฌ๋ผ๋ค (Row Numbers๋ AG Grid๊ฐ ์๋์ผ๋ก ์ถ๊ฐ)\n columns.push(...props.columnDefs)\n \n return columns\n})\n\n// Grid ์ต์
์ค์ \nconst gridOptions = computed<GridOptions>(() => {\n const options: GridOptions = {\n theme: jTheme,\n pagination: props.pagination,\n rowSelection: props.checkbox ? 'multiple' : undefined,\n // ์ฒดํฌ๋ฐ์ค ๋ชจ๋์ผ ๋ row ํด๋ฆญ์ผ๋ก ์ ํ์ด ๋ณ๊ฒฝ๋์ง ์๋๋ก ์ค์ \n // ์ฒดํฌ๋ฐ์ค๋ง์ผ๋ก ์ ํ์ ์ ์ดํ๋๋ก ํจ\n suppressRowClickSelection: props.checkbox,\n\n // Row Numbers (Enterprise) - AG Grid ํ์ค ๋ฐฉ์\n rowNumbers: props.rowNumbers,\n\n // Column Hover Highlight\n columnHoverHighlight: props.columnHover,\n\n // Enterprise ๊ธฐ๋ฅ ์ต์
\n sideBar: props.enableColumnsToolPanel || props.enableGrouping || props.enablePivot ? {\n toolPanels: [\n {\n id: 'columns',\n labelDefault: 'Columns',\n labelKey: 'columns',\n iconKey: 'columns',\n toolPanel: 'agColumnsToolPanel',\n toolPanelParams: {\n suppressRowGroups: !props.enableGrouping,\n suppressValues: !props.enablePivot,\n suppressPivots: !props.enablePivot,\n suppressPivotMode: !props.enablePivot,\n },\n },\n ],\n defaultToolPanel: '', // ์ด๊ธฐ์๋ ์ ํ ์ํ\n } : undefined,\n\n // Status Bar (Enterprise)\n // compactFooter ๋ชจ๋์์๋ Status Bar ๋นํ์ฑํ\n statusBar: (props.statusBar && !props.compactFooter) ? {\n statusPanels: [\n { statusPanel: 'agTotalAndFilteredRowCountComponent', align: 'left' as const },\n { statusPanel: 'agSelectedRowCountComponent', align: 'left' as const },\n { statusPanel: 'agAggregationComponent', align: 'right' as const },\n ],\n } : undefined,\n\n // Row Group Panel ์ค์ (Enterprise) - ๊ทธ๋ฆฌ๋ ์๋จ์ ๋๋๊ทธ ์์ญ ํ์\n rowGroupPanelShow: props.rowGroupPanelShow !== 'never' ? props.rowGroupPanelShow : undefined,\n\n // Pivot Panel ์ค์ (Enterprise) - ํผ๋ฒ ๋ชจ๋์ฉ ๋๋๊ทธ ์์ญ\n pivotPanelShow: props.pivotPanelShow !== 'never' ? props.pivotPanelShow : undefined,\n \n // Pivot Mode ํ์ฑํ\n pivotMode: props.pivotMode,\n\n // ๊ทธ๋ฃนํ ๊ธฐ๋ณธ ์ค์ \n groupDefaultExpanded: props.groupDefaultExpanded,\n suppressAggFuncInHeader: false,\n\n // Tree Data ์ค์ (Enterprise)\n treeData: props.enableTreeData || undefined,\n getDataPath: props.enableTreeData\n ? (props.getDataPath || ((data: any) => data.path || []))\n : undefined,\n autoGroupColumnDef: props.enableTreeData && props.autoGroupColumnDef\n ? props.autoGroupColumnDef\n : undefined,\n }\n\n return options\n})\n\n// Excel ๋ด๋ณด๋ด๊ธฐ ํจ์ (์ธ๋ถ์์ ์ฌ์ฉ ๊ฐ๋ฅํ๋๋ก expose)\nconst exportToExcel = () => {\n if (gridApi.value && props.enableExcelExport) {\n gridApi.value.exportDataAsExcel({\n fileName: 'grid-export.xlsx',\n })\n }\n}\n\n// ๊ทธ๋ฆฌ๋ API๋ฅผ ์ธ๋ถ์ ๋
ธ์ถ\ndefineExpose({\n gridApi,\n gridColumnApi,\n exportToExcel,\n})\n\n// Grid ready ์ด๋ฒคํธ ํธ๋ค๋ฌ\nconst onGridReady = (params: GridReadyEvent) => {\n gridApi.value = params.api\n gridColumnApi.value = params.api // v34์์ columnApi๋ deprecated\n emit('gridReady', params)\n}\n\n// ํ ํด๋ฆญ ์ด๋ฒคํธ ํธ๋ค๋ฌ\nconst onRowClicked = (event: RowClickedEvent) => {\n emit('rowClicked', event)\n}\n\n// ํ ๋๋ธํด๋ฆญ ์ด๋ฒคํธ ํธ๋ค๋ฌ\nconst onRowDoubleClicked = (event: RowDoubleClickedEvent) => {\n emit('rowDoubleClicked', event)\n}\n\n// ์
ํด๋ฆญ ์ด๋ฒคํธ ํธ๋ค๋ฌ\nconst onCellClicked = (event: CellClickedEvent) => {\n emit('cellClicked', event)\n}\n\n// ์ ํ ๋ณ๊ฒฝ ์ด๋ฒคํธ ํธ๋ค๋ฌ\nconst onSelectionChanged = (event: SelectionChangedEvent) => {\n emit('selectionChanged', event)\n emit('update:selectedRows', event.api.getSelectedRows())\n}\n\n// ์
๊ฐ ๋ณ๊ฒฝ ์ด๋ฒคํธ ํธ๋ค๋ฌ\nconst onCellValueChanged = (event: CellValueChangedEvent) => {\n emit('cellValueChanged', event)\n}\n\n// columnDefs ๋ณ๊ฒฝ ๊ฐ์ง\nwatch(\n () => props.columnDefs,\n () => {\n if (gridApi.value) {\n gridApi.value.setGridOption('columnDefs', processedColumnDefs.value)\n }\n },\n { deep: true },\n)\n\n// rowData ๋ณ๊ฒฝ ๊ฐ์ง\nwatch(\n () => props.rowData,\n () => {\n if (gridApi.value) {\n gridApi.value.setGridOption('rowData', props.rowData)\n }\n },\n { deep: true },\n)\n</script>\n\n<template>\n <div :class=\"cn('ag-grid-container', props.class)\">\n <AgGridVue\n :column-defs=\"processedColumnDefs\"\n :row-data=\"rowData\"\n :grid-options=\"gridOptions\"\n style=\"height: 100%; width: 100%\"\n @grid-ready=\"onGridReady\"\n @row-clicked=\"onRowClicked\"\n @row-double-clicked=\"onRowDoubleClicked\"\n @cell-clicked=\"onCellClicked\"\n @selection-changed=\"onSelectionChanged\"\n @cell-value-changed=\"onCellValueChanged\"\n />\n </div>\n</template>\n\n<style scoped>\n.ag-grid-container {\n width: 100%;\n height: 100%;\n}\n\n/* ============================================\n COMPACT FOOTER: Status Bar + Pagination ํตํฉ\n ============================================ */\n\n/* Status Bar ๋์ด ์ค์ด๊ธฐ */\n:deep(.ag-status-bar) {\n min-height: 28px !important;\n height: 28px !important;\n padding: 0 12px !important;\n border-top: 1px solid var(--ag-border-color);\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 0.8125rem;\n}\n\n/* Status Bar ์ปดํฌ๋ํธ๋ค ๋์ด ์กฐ์ */\n:deep(.ag-status-bar-left),\n:deep(.ag-status-bar-center),\n:deep(.ag-status-bar-right) {\n height: 28px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n/* Status Bar ํจ๋๋ค ๊ฐ๊ฒฉ ์กฐ์ */\n:deep(.ag-status-panel) {\n padding: 0;\n height: 28px;\n display: flex;\n align-items: center;\n}\n\n/* Pagination Panel ๋์ด ์ค์ด๊ธฐ */\n:deep(.ag-paging-panel) {\n min-height: 28px !important;\n height: 28px !important;\n padding: 0 12px !important;\n border-top: 1px solid var(--ag-border-color);\n font-size: 0.8125rem;\n}\n\n/* Pagination ์ปดํฌ๋ํธ๋ค ๋์ด ์กฐ์ */\n:deep(.ag-paging-page-size),\n:deep(.ag-paging-row-summary-panel) {\n height: 28px;\n display: flex;\n align-items: center;\n}\n\n/* Page Size Selector ๋์ด ์กฐ์ */\n:deep(.ag-paging-page-size .ag-picker-field) {\n height: 24px;\n min-height: 24px;\n}\n\n:deep(.ag-paging-page-size .ag-picker-field-wrapper) {\n height: 24px;\n padding: 0 4px;\n}\n\n/* Pagination ๋ฒํผ๋ค ๋์ด ์กฐ์ */\n:deep(.ag-paging-button) {\n height: 24px;\n width: 24px;\n padding: 2px;\n}\n\n/* Pagination ๋ฒํผ ๋ํผ */\n:deep(.ag-paging-button-wrapper) {\n height: 28px;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n/* Row summary ํ
์คํธ */\n:deep(.ag-paging-row-summary-panel-number) {\n line-height: 28px;\n}\n\n/* ========================================\n ํจํด 9: AG-Grid ์คํ์ผ ํฅ์\n ======================================== */\n\n:deep(.ag-root-wrapper) {\n border: 1px solid hsl(var(--border));\n border-radius: 0.375rem;\n}\n\n:deep(.ag-header) {\n background-color: hsl(var(--muted));\n border-bottom: 1px solid hsl(var(--border));\n font-weight: 500;\n}\n\n:deep(.ag-header-cell) {\n color: hsl(var(--foreground));\n font-size: 0.75rem;\n padding: 0.5rem;\n}\n\n:deep(.ag-row) {\n transition: background-color 0.2s ease, border-left 0.2s ease;\n cursor: pointer;\n}\n\n:deep(.ag-row:hover) {\n background-color: hsl(var(--primary) / 0.05) !important;\n}\n\n:deep(.ag-row-selected) {\n background-color: hsl(var(--primary) / 0.1) !important;\n border-left: 2px solid hsl(var(--primary)) !important;\n}\n\n:deep(.ag-row-selected:hover) {\n background-color: hsl(var(--primary) / 0.15) !important;\n}\n\n:deep(.ag-cell) {\n line-height: 1.5;\n padding: 0.5rem;\n border-bottom: 1px solid hsl(var(--border) / 0.5);\n}\n\n:deep(.ag-paging-panel) {\n background-color: hsl(var(--muted) / 0.5);\n border-top: 1px solid hsl(var(--border));\n}\n</style>\n"],"names":["ModuleRegistry","AllCommunityModule","AllEnterpriseModule","jTheme","themeQuartz","props","__props","emit","__emit","gridApi","ref","gridColumnApi","ActionButtonsCellRenderer","params","buttons","rowData","visibleButtons","btn","container","button","e","actionButtonsColumn","computed","processedColumnDefs","columns","gridOptions","data","__expose","onGridReady","onRowClicked","event","onRowDoubleClicked","onCellClicked","onSelectionChanged","onCellValueChanged","watch","_createElementBlock","_normalizeClass","_unref","cn","_createVNode","AgGridVue"],"mappings":"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"}
|
|
@@ -1,23 +1,18 @@
|
|
|
1
|
-
import { defineComponent as
|
|
2
|
-
import { AgGridVue as
|
|
3
|
-
import { cn as
|
|
4
|
-
import { ModuleRegistry as
|
|
5
|
-
import { AllEnterpriseModule as
|
|
6
|
-
/*
|
|
7
|
-
/* empty css */
|
|
8
|
-
/* empty css */
|
|
9
|
-
const ee = /* @__PURE__ */ A({
|
|
1
|
+
import { defineComponent as R, ref as g, computed as s, watch as h, createElementBlock as F, openBlock as N, normalizeClass as T, unref as C, createVNode as A } from "vue";
|
|
2
|
+
import { AgGridVue as M } from "ag-grid-vue3";
|
|
3
|
+
import { cn as H } from "../../lib/utils.js";
|
|
4
|
+
import { ModuleRegistry as V, AllCommunityModule as z, themeQuartz as I } from "ag-grid-community";
|
|
5
|
+
import { AllEnterpriseModule as W } from "ag-grid-enterprise";
|
|
6
|
+
const Q = /* @__PURE__ */ R({
|
|
10
7
|
__name: "JGrid",
|
|
11
8
|
props: {
|
|
12
9
|
class: {},
|
|
13
10
|
rowData: {},
|
|
14
11
|
columnDefs: {},
|
|
15
|
-
theme: { default: "ag-theme-balham" },
|
|
16
12
|
pagination: { type: Boolean, default: !0 },
|
|
17
13
|
checkbox: { type: Boolean, default: !1 },
|
|
18
14
|
rowNumbers: { type: Boolean, default: !0 },
|
|
19
15
|
actionButtons: { default: void 0 },
|
|
20
|
-
autoDetectDarkMode: { type: Boolean, default: !0 },
|
|
21
16
|
summaryColumn: { type: Boolean, default: !1 },
|
|
22
17
|
hiddenColumn: { type: Boolean, default: !1 },
|
|
23
18
|
enableGrouping: { type: Boolean, default: !0 },
|
|
@@ -37,27 +32,31 @@ const ee = /* @__PURE__ */ A({
|
|
|
37
32
|
pivotMode: { type: Boolean, default: !1 }
|
|
38
33
|
},
|
|
39
34
|
emits: ["rowClicked", "rowDoubleClicked", "cellClicked", "selectionChanged", "cellValueChanged", "gridReady", "update:selectedRows"],
|
|
40
|
-
setup(
|
|
41
|
-
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
35
|
+
setup(u, { expose: v, emit: w }) {
|
|
36
|
+
V.registerModules([z, W]);
|
|
37
|
+
const x = I.withParams({
|
|
38
|
+
browserColorScheme: "inherit",
|
|
39
|
+
cellHorizontalPaddingScale: 1,
|
|
40
|
+
columnBorder: !0,
|
|
41
|
+
fontSize: 13,
|
|
42
|
+
headerBackgroundColor: "#FFFFFF",
|
|
43
|
+
headerFontWeight: 500,
|
|
44
|
+
headerVerticalPaddingScale: 0.7,
|
|
45
|
+
iconSize: 14,
|
|
46
|
+
oddRowBackgroundColor: "#CBE6F175",
|
|
47
|
+
rowVerticalPaddingScale: 0.5
|
|
48
|
+
}), e = u, n = w, a = g(null), d = g(null), y = (o) => {
|
|
49
|
+
const r = e.actionButtons || [], f = o.data, m = r.filter((t) => t.show ? t.show(f) : !0);
|
|
50
|
+
if (m.length === 0)
|
|
52
51
|
return "";
|
|
53
|
-
const
|
|
54
|
-
return
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
}),
|
|
59
|
-
}),
|
|
60
|
-
},
|
|
52
|
+
const i = document.createElement("div");
|
|
53
|
+
return i.className = "flex items-center gap-1", m.forEach((t) => {
|
|
54
|
+
const l = document.createElement("button");
|
|
55
|
+
l.className = "px-2 py-1 text-xs border rounded transition-colors", t.styletype === "danger" ? l.className += " bg-red-50 border-red-400 text-red-700 hover:bg-red-100 dark:bg-red-950 dark:border-red-700 dark:text-red-400 dark:hover:bg-red-900" : l.className += " bg-gray-50 border-gray-400 text-gray-700 hover:bg-gray-100 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-700", t.tooltip && (l.title = t.tooltip), t.label ? l.textContent = t.label : t.icon && (t.icon === "pencil" ? l.textContent = "์์ " : t.icon === "trash2" || t.icon === "trash" ? l.textContent = "์ญ์ " : t.icon === "eye" ? l.textContent = "๋ณด๊ธฐ" : t.icon === "copy" ? l.textContent = "๋ณต์ฌ" : t.icon === "download" ? l.textContent = "๋ค์ด๋ก๋" : t.icon === "circleX" ? l.textContent = "๋นํ์ฑํ" : t.icon === "circleCheckBig" ? l.textContent = "ํ์ฑํ" : l.textContent = t.icon), l.addEventListener("click", (G) => {
|
|
56
|
+
G.stopPropagation(), t.onClick(f);
|
|
57
|
+
}), i.appendChild(l);
|
|
58
|
+
}), i;
|
|
59
|
+
}, c = s(() => !e.actionButtons || e.actionButtons.length === 0 ? null : {
|
|
61
60
|
colId: "actionButtons",
|
|
62
61
|
headerName: "์์
",
|
|
63
62
|
field: "_actions",
|
|
@@ -70,11 +69,11 @@ const ee = /* @__PURE__ */ A({
|
|
|
70
69
|
resizable: !0,
|
|
71
70
|
suppressNavigable: !0,
|
|
72
71
|
suppressHeaderMenuButton: !0,
|
|
73
|
-
cellRenderer:
|
|
72
|
+
cellRenderer: y,
|
|
74
73
|
cellStyle: { display: "flex", justifyContent: "center", alignItems: "center" }
|
|
75
|
-
}),
|
|
76
|
-
const
|
|
77
|
-
return e.checkbox &&
|
|
74
|
+
}), p = s(() => {
|
|
75
|
+
const o = [];
|
|
76
|
+
return e.checkbox && o.push({
|
|
78
77
|
colId: "rowSelection",
|
|
79
78
|
headerName: "",
|
|
80
79
|
// field์ valueGetter ์ ๊ฑฐ - AG Grid ๊ณต์ ๋ฐฉ์
|
|
@@ -90,10 +89,9 @@ const ee = /* @__PURE__ */ A({
|
|
|
90
89
|
suppressNavigable: !0,
|
|
91
90
|
suppressHeaderMenuButton: !0,
|
|
92
91
|
cellStyle: { display: "flex", justifyContent: "center", alignItems: "center" }
|
|
93
|
-
}),
|
|
94
|
-
}),
|
|
95
|
-
|
|
96
|
-
// columnDefs์ rowData๋ prop์ผ๋ก ์ ๋ฌํ๋ฏ๋ก ์ฌ๊ธฐ์ ์ ๊ฑฐ
|
|
92
|
+
}), c.value && o.push(c.value), o.push(...e.columnDefs), o;
|
|
93
|
+
}), b = s(() => ({
|
|
94
|
+
theme: x,
|
|
97
95
|
pagination: e.pagination,
|
|
98
96
|
rowSelection: e.checkbox ? "multiple" : void 0,
|
|
99
97
|
// ์ฒดํฌ๋ฐ์ค ๋ชจ๋์ผ ๋ row ํด๋ฆญ์ผ๋ก ์ ํ์ด ๋ณ๊ฒฝ๋์ง ์๋๋ก ์ค์
|
|
@@ -143,73 +141,62 @@ const ee = /* @__PURE__ */ A({
|
|
|
143
141
|
suppressAggFuncInHeader: !1,
|
|
144
142
|
// Tree Data ์ค์ (Enterprise)
|
|
145
143
|
treeData: e.enableTreeData || void 0,
|
|
146
|
-
getDataPath: e.enableTreeData ? e.getDataPath || ((
|
|
144
|
+
getDataPath: e.enableTreeData ? e.getDataPath || ((r) => r.path || []) : void 0,
|
|
147
145
|
autoGroupColumnDef: e.enableTreeData && e.autoGroupColumnDef ? e.autoGroupColumnDef : void 0
|
|
148
146
|
}));
|
|
149
|
-
|
|
150
|
-
gridApi:
|
|
151
|
-
gridColumnApi:
|
|
147
|
+
v({
|
|
148
|
+
gridApi: a,
|
|
149
|
+
gridColumnApi: d,
|
|
152
150
|
exportToExcel: () => {
|
|
153
|
-
|
|
151
|
+
a.value && e.enableExcelExport && a.value.exportDataAsExcel({
|
|
154
152
|
fileName: "grid-export.xlsx"
|
|
155
153
|
});
|
|
156
154
|
}
|
|
157
155
|
});
|
|
158
|
-
const
|
|
159
|
-
|
|
160
|
-
},
|
|
161
|
-
n("rowClicked",
|
|
162
|
-
},
|
|
163
|
-
n("rowDoubleClicked",
|
|
164
|
-
},
|
|
165
|
-
n("cellClicked",
|
|
166
|
-
},
|
|
167
|
-
n("selectionChanged",
|
|
168
|
-
},
|
|
169
|
-
n("cellValueChanged",
|
|
156
|
+
const P = (o) => {
|
|
157
|
+
a.value = o.api, d.value = o.api, n("gridReady", o);
|
|
158
|
+
}, B = (o) => {
|
|
159
|
+
n("rowClicked", o);
|
|
160
|
+
}, k = (o) => {
|
|
161
|
+
n("rowDoubleClicked", o);
|
|
162
|
+
}, D = (o) => {
|
|
163
|
+
n("cellClicked", o);
|
|
164
|
+
}, S = (o) => {
|
|
165
|
+
n("selectionChanged", o), n("update:selectedRows", o.api.getSelectedRows());
|
|
166
|
+
}, E = (o) => {
|
|
167
|
+
n("cellValueChanged", o);
|
|
170
168
|
};
|
|
171
|
-
|
|
172
|
-
return H(() => {
|
|
173
|
-
e.autoDetectDarkMode && (m(), r = new MutationObserver(() => {
|
|
174
|
-
m();
|
|
175
|
-
}), r.observe(document.documentElement, {
|
|
176
|
-
attributes: !0,
|
|
177
|
-
attributeFilter: ["class"]
|
|
178
|
-
}));
|
|
179
|
-
}), F(() => {
|
|
180
|
-
r && r.disconnect();
|
|
181
|
-
}), w(
|
|
169
|
+
return h(
|
|
182
170
|
() => e.columnDefs,
|
|
183
171
|
() => {
|
|
184
|
-
|
|
172
|
+
a.value && a.value.setGridOption("columnDefs", p.value);
|
|
185
173
|
},
|
|
186
174
|
{ deep: !0 }
|
|
187
|
-
),
|
|
175
|
+
), h(
|
|
188
176
|
() => e.rowData,
|
|
189
177
|
() => {
|
|
190
|
-
|
|
178
|
+
a.value && a.value.setGridOption("rowData", e.rowData);
|
|
191
179
|
},
|
|
192
180
|
{ deep: !0 }
|
|
193
|
-
), (
|
|
194
|
-
class:
|
|
181
|
+
), (o, r) => (N(), F("div", {
|
|
182
|
+
class: T(C(H)("ag-grid-container", e.class))
|
|
195
183
|
}, [
|
|
196
|
-
|
|
197
|
-
"column-defs":
|
|
198
|
-
"row-data":
|
|
199
|
-
"grid-options":
|
|
200
|
-
class: b(D.value),
|
|
184
|
+
A(C(M), {
|
|
185
|
+
"column-defs": p.value,
|
|
186
|
+
"row-data": u.rowData,
|
|
187
|
+
"grid-options": b.value,
|
|
201
188
|
style: { height: "100%", width: "100%" },
|
|
202
|
-
onGridReady:
|
|
203
|
-
onRowClicked:
|
|
204
|
-
onRowDoubleClicked:
|
|
205
|
-
onCellClicked:
|
|
206
|
-
onSelectionChanged:
|
|
207
|
-
onCellValueChanged:
|
|
208
|
-
}, null, 8, ["column-defs", "row-data", "grid-options"
|
|
189
|
+
onGridReady: P,
|
|
190
|
+
onRowClicked: B,
|
|
191
|
+
onRowDoubleClicked: k,
|
|
192
|
+
onCellClicked: D,
|
|
193
|
+
onSelectionChanged: S,
|
|
194
|
+
onCellValueChanged: E
|
|
195
|
+
}, null, 8, ["column-defs", "row-data", "grid-options"])
|
|
209
196
|
], 2));
|
|
210
197
|
}
|
|
211
198
|
});
|
|
212
199
|
export {
|
|
213
|
-
|
|
200
|
+
Q as default
|
|
214
201
|
};
|
|
215
202
|
//# sourceMappingURL=JGrid.vue2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JGrid.vue2.js","sources":["../../../../src/components/atoms/JGrid.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, watch, onMounted, onUnmounted } from 'vue'\nimport { AgGridVue } from 'ag-grid-vue3'\nimport { cn } from '@/lib/utils'\nimport type {\n ColDef,\n GridOptions,\n RowClickedEvent,\n CellClickedEvent,\n SelectionChangedEvent,\n CellValueChangedEvent,\n RowDoubleClickedEvent,\n GridReadyEvent,\n ICellRendererParams,\n} from 'ag-grid-community'\nimport { ModuleRegistry, AllCommunityModule } from 'ag-grid-community'\n// Enterprise ๋ชจ๋ import (Grouping, Pivot, Excel Export ๋ฑ)\nimport { AllEnterpriseModule } from 'ag-grid-enterprise'\n// ag-grid.css๋ ์ ๊ฑฐ - v34์์ Theming API์ ์ถฉ๋ ๋ฐฉ์ง\n// ํ
๋ง CSS ํ์ผ๋ง ์ฌ์ฉ (ํด๋์ค ๊ธฐ๋ฐ ํ
๋ง)\n// v34์์๋ dark ํ
๋ง๊ฐ ๊ฐ์ CSS ํ์ผ ์์ ํฌํจ๋์ด ์์\n// ์: ag-theme-quartz.css์ .ag-theme-quartz-dark ํด๋์ค ํฌํจ\nimport 'ag-grid-community/styles/ag-theme-quartz.css'\nimport 'ag-grid-community/styles/ag-theme-alpine.css'\nimport 'ag-grid-community/styles/ag-theme-balham.css'\n\n// AG Grid ๋ชจ๋ ๋ฑ๋ก (Community + Enterprise)\nModuleRegistry.registerModules([AllCommunityModule, AllEnterpriseModule])\n\n/**\n * Action Button ์ ์ ํ์
\n */\nexport type ActionButton = {\n /** ๋ฒํผ ์์ด์ฝ ์ด๋ฆ (lucide) - label์ด ์์ ๋ ๊ธฐ๋ณธ ํ
์คํธ ์์ฑ์ ์ฌ์ฉ */\n icon?: string\n /** ๋ฒํผ ๋ผ๋ฒจ */\n label?: string\n /** ํดํ ํ
์คํธ */\n tooltip?: string\n /** ๋ฒํผ ํด๋ฆญ ํธ๋ค๋ฌ (rowData ์ ๋ฌ) */\n onClick: (rowData: any) => void\n /** ๋ฒํผ ์คํ์ผ ํ์
*/\n styletype?: 'default' | 'primary' | 'secondary' | 'success' | 'warning' | 'danger'\n /** ์กฐ๊ฑด๋ถ ํ์ ํจ์ (rowData๋ฅผ ๋ฐ์ boolean ๋ฐํ) */\n show?: (rowData: any) => boolean\n}\n\nconst props = withDefaults(\n defineProps<{\n /** ์ถ๊ฐ ํด๋์ค (์ธ๋ถ ์ปค์คํฐ๋ง์ด์ง์ฉ) */\n class?: string\n /** ๊ทธ๋ฆฌ๋์ ํ์ํ ๋ฐ์ดํฐ ๋ฐฐ์ด */\n rowData: any[]\n /** ์ปฌ๋ผ ์ ์ ๋ฐฐ์ด */\n columnDefs: ColDef[]\n /** ag-Grid ํ
๋ง */\n theme?: string\n /** ํ์ด์ง๋ค์ด์
ํ์ฑํ ์ฌ๋ถ */\n pagination?: boolean\n /** ์ฒดํฌ๋ฐ์ค ์ ํ ํ์ฑํ ์ฌ๋ถ */\n checkbox?: boolean\n /** ํ ๋ฒํธ ํ์ ์ฌ๋ถ (Enterprise) */\n rowNumbers?: boolean\n /** ํ๋ณ ์ก์
๋ฒํผ ๋ชฉ๋ก */\n actionButtons?: ActionButton[]\n /** ๋คํฌ๋ชจ๋ ์๋ ๊ฐ์ง ์ฌ๋ถ */\n autoDetectDarkMode?: boolean\n /** ์์ฝ ์ปฌ๋ผ ํ์ ์ฌ๋ถ */\n summaryColumn?: boolean\n /** ์จ๊น ์ปฌ๋ผ ๊ด๋ฆฌ ํ์ฑํ ์ฌ๋ถ */\n hiddenColumn?: boolean\n /** ๊ทธ๋ฃนํ ๊ธฐ๋ฅ ํ์ฑํ ์ฌ๋ถ (Enterprise) */\n enableGrouping?: boolean\n /** ํผ๋ฒ ๊ธฐ๋ฅ ํ์ฑํ ์ฌ๋ถ (Enterprise) */\n enablePivot?: boolean\n /** Excel ๋ด๋ณด๋ด๊ธฐ ๊ธฐ๋ฅ ํ์ฑํ ์ฌ๋ถ (Enterprise) */\n enableExcelExport?: boolean\n /** Tree Data ๊ธฐ๋ฅ ํ์ฑํ ์ฌ๋ถ (Enterprise) */\n enableTreeData?: boolean\n /** Tree Data ๊ณ์ธต ๊ฒฝ๋ก๋ฅผ ๋ฐํํ๋ ํจ์ */\n getDataPath?: (data: any) => (string | number)[]\n /** Tree Data ๊ทธ๋ฃน ์ปฌ๋ผ ์ ์ */\n autoGroupColumnDef?: ColDef\n /** ์ ํ๋ ํ ๋ฐ์ดํฐ ๋ฐฐ์ด (v-model:selected-rows) */\n selectedRows?: any[]\n /** ์ปฌ๋ผ ํธ๋ฒ ํ์ด๋ผ์ดํธ ํ์ฑํ ์ฌ๋ถ */\n columnHover?: boolean\n /** Columns Tool Panel ํ์ฑํ ์ฌ๋ถ (Enterprise) */\n enableColumnsToolPanel?: boolean\n /** Status Bar ํ์ฑํ ์ฌ๋ถ (Enterprise) */\n statusBar?: boolean\n /** ๊ฐ์ํ๋ Footer ๋ชจ๋ (Status Bar ์ ๊ฑฐ, Pagination๋ง ํ์) */\n compactFooter?: boolean\n /** Row Group Panel ํ์ ์ฌ๋ถ ('always' | 'onlyWhenGrouping' | 'never') */\n rowGroupPanelShow?: 'always' | 'onlyWhenGrouping' | 'never'\n /** ๊ทธ๋ฃน ๊ธฐ๋ณธ ํ์ฅ ๋ ๋ฒจ (-1: ๋ชจ๋ ๋ซํ, 0: ์ฒซ ๋ ๋ฒจ๋ง, 1: 2๋ ๋ฒจ๊น์ง...) */\n groupDefaultExpanded?: number\n /** Pivot Mode Panel ํ์ ์ฌ๋ถ */\n pivotPanelShow?: 'always' | 'onlyWhenPivoting' | 'never'\n /** Pivot Mode ํ์ฑํ ์ฌ๋ถ */\n pivotMode?: boolean\n }>(),\n {\n theme: 'ag-theme-balham',\n pagination: true,\n checkbox: false,\n rowNumbers: true,\n actionButtons: undefined,\n autoDetectDarkMode: true,\n summaryColumn: false,\n hiddenColumn: false,\n enableGrouping: true,\n enablePivot: false,\n enableExcelExport: false,\n enableTreeData: false,\n getDataPath: undefined,\n autoGroupColumnDef: undefined,\n selectedRows: () => [],\n columnHover: true,\n enableColumnsToolPanel: true,\n statusBar: true,\n compactFooter: false,\n rowGroupPanelShow: 'never',\n groupDefaultExpanded: -1,\n pivotPanelShow: 'never',\n pivotMode: false,\n },\n)\n\nconst emit = defineEmits<{\n /** ํ ํด๋ฆญ ์ด๋ฒคํธ */\n rowClicked: [event: RowClickedEvent]\n /** ํ ๋๋ธํด๋ฆญ ์ด๋ฒคํธ */\n rowDoubleClicked: [event: RowDoubleClickedEvent]\n /** ์
ํด๋ฆญ ์ด๋ฒคํธ */\n cellClicked: [event: CellClickedEvent]\n /** ์ ํ ๋ณ๊ฒฝ ์ด๋ฒคํธ (์ฒดํฌ๋ฐ์ค ๋ฑ) */\n selectionChanged: [event: SelectionChangedEvent]\n /** ์
๊ฐ ๋ณ๊ฒฝ ์ด๋ฒคํธ */\n cellValueChanged: [event: CellValueChangedEvent]\n /** ๊ทธ๋ฆฌ๋ ์ค๋น ์๋ฃ ์ด๋ฒคํธ */\n gridReady: [event: GridReadyEvent]\n /** ์ ํ๋ ํ ๋ณ๊ฒฝ ์ด๋ฒคํธ (v-model:selected-rows) */\n 'update:selectedRows': [rows: any[]]\n}>()\n\n// ag-Grid ์ธ์คํด์ค ์ฐธ์กฐ\nconst gridApi = ref<any>(null)\nconst gridColumnApi = ref<any>(null)\n\n// ๋คํฌ๋ชจ๋ ์ํ\nconst isDarkMode = ref(false)\n\n// ๋คํฌ๋ชจ๋ ๊ฐ์ง ํจ์\nconst detectDarkMode = () => {\n isDarkMode.value = document.documentElement.classList.contains('dark')\n}\n\n// ํ์ฌ ํ
๋ง ๊ณ์ฐ (๋คํฌ๋ชจ๋ ์๋ ์ ํ)\nconst currentTheme = computed(() => {\n if (!props.autoDetectDarkMode) {\n return props.theme\n }\n \n const baseTheme = props.theme\n if (isDarkMode.value) {\n // ์ด๋ฏธ dark ํ
๋ง์ธ ๊ฒฝ์ฐ ๊ทธ๋๋ก ์ ์ง, ์๋๋ฉด -dark ์ถ๊ฐ\n return baseTheme.includes('-dark') ? baseTheme : `${baseTheme}-dark`\n } else {\n // dark ํ
๋ง ์ ๊ฑฐ\n return baseTheme.replace(/-dark$/, '')\n }\n})\n\n// Action Buttons Cell Renderer - ํจ์ํ์ผ๋ก DOM ์ง์ ์์ฑ\nconst ActionButtonsCellRenderer = (params: ICellRendererParams) => {\n const buttons = props.actionButtons || []\n const rowData = params.data\n \n // ํ์ํ ๋ฒํผ ํํฐ๋ง\n const visibleButtons = buttons.filter(btn => {\n if (btn.show) {\n return btn.show(rowData)\n }\n return true\n })\n \n if (visibleButtons.length === 0) {\n return ''\n }\n \n // ์ปจํ
์ด๋ div ์์ฑ\n const container = document.createElement('div')\n container.className = 'flex items-center gap-1'\n \n // ๊ฐ ๋ฒํผ ์์ฑ\n visibleButtons.forEach((btn) => {\n const button = document.createElement('button')\n button.className = 'px-2 py-1 text-xs border rounded transition-colors'\n \n // styletype์ ๋ฐ๋ฅธ ํด๋์ค ์ถ๊ฐ\n if (btn.styletype === 'danger') {\n button.className += ' bg-red-50 border-red-400 text-red-700 hover:bg-red-100 dark:bg-red-950 dark:border-red-700 dark:text-red-400 dark:hover:bg-red-900'\n } else {\n button.className += ' bg-gray-50 border-gray-400 text-gray-700 hover:bg-gray-100 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-700'\n }\n \n // tooltip\n if (btn.tooltip) {\n button.title = btn.tooltip\n }\n \n // ๋ผ๋ฒจ ์ถ๊ฐ (ํ
์คํธ ๋ฒํผ)\n if (btn.label) {\n button.textContent = btn.label\n } else if (btn.icon) {\n // ๋ผ๋ฒจ์ด ์์ผ๋ฉด ๊ธฐ๋ณธ ํ
์คํธ ์์ฑ\n if (btn.icon === 'pencil') {\n button.textContent = '์์ '\n } else if (btn.icon === 'trash2' || btn.icon === 'trash') {\n button.textContent = '์ญ์ '\n } else if (btn.icon === 'eye') {\n button.textContent = '๋ณด๊ธฐ'\n } else if (btn.icon === 'copy') {\n button.textContent = '๋ณต์ฌ'\n } else if (btn.icon === 'download') {\n button.textContent = '๋ค์ด๋ก๋'\n } else if (btn.icon === 'circleX') {\n button.textContent = '๋นํ์ฑํ'\n } else if (btn.icon === 'circleCheckBig') {\n button.textContent = 'ํ์ฑํ'\n } else {\n button.textContent = btn.icon\n }\n }\n \n // ํด๋ฆญ ์ด๋ฒคํธ\n button.addEventListener('click', (e) => {\n e.stopPropagation()\n btn.onClick(rowData)\n })\n \n container.appendChild(button)\n })\n \n return container\n}\n\n// Action Buttons ์ปฌ๋ผ ์ ์\nconst actionButtonsColumn = computed<ColDef | null>(() => {\n if (!props.actionButtons || props.actionButtons.length === 0) {\n return null\n }\n \n return {\n colId: 'actionButtons',\n headerName: '์์
',\n field: '_actions',\n width: 120,\n minWidth: 80,\n maxWidth: 200,\n lockPosition: 'left' as const,\n sortable: false,\n filter: false,\n resizable: true,\n suppressNavigable: true,\n suppressHeaderMenuButton: true,\n cellRenderer: ActionButtonsCellRenderer,\n cellStyle: { display: 'flex', justifyContent: 'center', alignItems: 'center' },\n }\n})\n\n// checkbox ํ์ฑํ ๋ฐ ์ถ๊ฐ ์ปฌ๋ผ ์ฒ๋ฆฌ\nconst processedColumnDefs = computed(() => {\n const columns: ColDef[] = []\n \n // 1. Checkbox ์ปฌ๋ผ (์ต์ฐ์ )\n if (props.checkbox) {\n columns.push({\n colId: 'rowSelection',\n headerName: '',\n // field์ valueGetter ์ ๊ฑฐ - AG Grid ๊ณต์ ๋ฐฉ์\n width: 50,\n minWidth: 50,\n maxWidth: 50,\n lockPosition: 'left' as const,\n checkboxSelection: true,\n headerCheckboxSelection: true,\n sortable: false,\n filter: false,\n resizable: false,\n suppressNavigable: true,\n suppressHeaderMenuButton: true,\n cellStyle: { display: 'flex', justifyContent: 'center', alignItems: 'center' },\n })\n }\n \n // 2. Action Buttons ์ปฌ๋ผ\n if (actionButtonsColumn.value) {\n columns.push(actionButtonsColumn.value)\n }\n \n // 3. ์ฌ์ฉ์ ์ ์ ์ปฌ๋ผ๋ค (Row Numbers๋ AG Grid๊ฐ ์๋์ผ๋ก ์ถ๊ฐ)\n columns.push(...props.columnDefs)\n \n return columns\n})\n\n// Grid ์ต์
์ค์ \nconst gridOptions = computed<GridOptions>(() => {\n const options: GridOptions = {\n // theme ์ต์
์ ๊ฑฐ - ํด๋์ค ๊ธฐ๋ฐ ํ
๋ง(:class=\"theme\") ์ฌ์ฉ\n // columnDefs์ rowData๋ prop์ผ๋ก ์ ๋ฌํ๋ฏ๋ก ์ฌ๊ธฐ์ ์ ๊ฑฐ\n pagination: props.pagination,\n rowSelection: props.checkbox ? 'multiple' : undefined,\n // ์ฒดํฌ๋ฐ์ค ๋ชจ๋์ผ ๋ row ํด๋ฆญ์ผ๋ก ์ ํ์ด ๋ณ๊ฒฝ๋์ง ์๋๋ก ์ค์ \n // ์ฒดํฌ๋ฐ์ค๋ง์ผ๋ก ์ ํ์ ์ ์ดํ๋๋ก ํจ\n suppressRowClickSelection: props.checkbox,\n\n // Row Numbers (Enterprise) - AG Grid ํ์ค ๋ฐฉ์\n rowNumbers: props.rowNumbers,\n\n // Column Hover Highlight\n columnHoverHighlight: props.columnHover,\n\n // Enterprise ๊ธฐ๋ฅ ์ต์
\n sideBar: props.enableColumnsToolPanel || props.enableGrouping || props.enablePivot ? {\n toolPanels: [\n {\n id: 'columns',\n labelDefault: 'Columns',\n labelKey: 'columns',\n iconKey: 'columns',\n toolPanel: 'agColumnsToolPanel',\n toolPanelParams: {\n suppressRowGroups: !props.enableGrouping,\n suppressValues: !props.enablePivot,\n suppressPivots: !props.enablePivot,\n suppressPivotMode: !props.enablePivot,\n },\n },\n ],\n defaultToolPanel: '', // ์ด๊ธฐ์๋ ์ ํ ์ํ\n } : undefined,\n\n // Status Bar (Enterprise)\n // compactFooter ๋ชจ๋์์๋ Status Bar ๋นํ์ฑํ\n statusBar: (props.statusBar && !props.compactFooter) ? {\n statusPanels: [\n { statusPanel: 'agTotalAndFilteredRowCountComponent', align: 'left' as const },\n { statusPanel: 'agSelectedRowCountComponent', align: 'left' as const },\n { statusPanel: 'agAggregationComponent', align: 'right' as const },\n ],\n } : undefined,\n\n // Row Group Panel ์ค์ (Enterprise) - ๊ทธ๋ฆฌ๋ ์๋จ์ ๋๋๊ทธ ์์ญ ํ์\n rowGroupPanelShow: props.rowGroupPanelShow !== 'never' ? props.rowGroupPanelShow : undefined,\n\n // Pivot Panel ์ค์ (Enterprise) - ํผ๋ฒ ๋ชจ๋์ฉ ๋๋๊ทธ ์์ญ\n pivotPanelShow: props.pivotPanelShow !== 'never' ? props.pivotPanelShow : undefined,\n \n // Pivot Mode ํ์ฑํ\n pivotMode: props.pivotMode,\n\n // ๊ทธ๋ฃนํ ๊ธฐ๋ณธ ์ค์ \n groupDefaultExpanded: props.groupDefaultExpanded,\n suppressAggFuncInHeader: false,\n\n // Tree Data ์ค์ (Enterprise)\n treeData: props.enableTreeData || undefined,\n getDataPath: props.enableTreeData\n ? (props.getDataPath || ((data: any) => data.path || []))\n : undefined,\n autoGroupColumnDef: props.enableTreeData && props.autoGroupColumnDef\n ? props.autoGroupColumnDef\n : undefined,\n }\n\n return options\n})\n\n// Excel ๋ด๋ณด๋ด๊ธฐ ํจ์ (์ธ๋ถ์์ ์ฌ์ฉ ๊ฐ๋ฅํ๋๋ก expose)\nconst exportToExcel = () => {\n if (gridApi.value && props.enableExcelExport) {\n gridApi.value.exportDataAsExcel({\n fileName: 'grid-export.xlsx',\n })\n }\n}\n\n// ๊ทธ๋ฆฌ๋ API๋ฅผ ์ธ๋ถ์ ๋
ธ์ถ\ndefineExpose({\n gridApi,\n gridColumnApi,\n exportToExcel,\n})\n\n// Grid ready ์ด๋ฒคํธ ํธ๋ค๋ฌ\nconst onGridReady = (params: GridReadyEvent) => {\n gridApi.value = params.api\n gridColumnApi.value = params.api // v34์์ columnApi๋ deprecated\n emit('gridReady', params)\n}\n\n// ํ ํด๋ฆญ ์ด๋ฒคํธ ํธ๋ค๋ฌ\nconst onRowClicked = (event: RowClickedEvent) => {\n emit('rowClicked', event)\n}\n\n// ํ ๋๋ธํด๋ฆญ ์ด๋ฒคํธ ํธ๋ค๋ฌ\nconst onRowDoubleClicked = (event: RowDoubleClickedEvent) => {\n emit('rowDoubleClicked', event)\n}\n\n// ์
ํด๋ฆญ ์ด๋ฒคํธ ํธ๋ค๋ฌ\nconst onCellClicked = (event: CellClickedEvent) => {\n emit('cellClicked', event)\n}\n\n// ์ ํ ๋ณ๊ฒฝ ์ด๋ฒคํธ ํธ๋ค๋ฌ\nconst onSelectionChanged = (event: SelectionChangedEvent) => {\n emit('selectionChanged', event)\n emit('update:selectedRows', event.api.getSelectedRows())\n}\n\n// ์
๊ฐ ๋ณ๊ฒฝ ์ด๋ฒคํธ ํธ๋ค๋ฌ\nconst onCellValueChanged = (event: CellValueChangedEvent) => {\n emit('cellValueChanged', event)\n}\n\n// MutationObserver๋ก ๋คํฌ๋ชจ๋ ๋ณ๊ฒฝ ๊ฐ์ง\nlet darkModeObserver: MutationObserver | null = null\n\nonMounted(() => {\n if (props.autoDetectDarkMode) {\n // ์ด๊ธฐ ๋คํฌ๋ชจ๋ ์ํ ๊ฐ์ง\n detectDarkMode()\n \n // MutationObserver๋ก class ๋ณ๊ฒฝ ๊ฐ์ง\n darkModeObserver = new MutationObserver(() => {\n detectDarkMode()\n })\n \n darkModeObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n })\n }\n})\n\nonUnmounted(() => {\n if (darkModeObserver) {\n darkModeObserver.disconnect()\n }\n})\n\n// columnDefs ๋ณ๊ฒฝ ๊ฐ์ง\nwatch(\n () => props.columnDefs,\n () => {\n if (gridApi.value) {\n gridApi.value.setGridOption('columnDefs', processedColumnDefs.value)\n }\n },\n { deep: true },\n)\n\n// rowData ๋ณ๊ฒฝ ๊ฐ์ง\nwatch(\n () => props.rowData,\n () => {\n if (gridApi.value) {\n gridApi.value.setGridOption('rowData', props.rowData)\n }\n },\n { deep: true },\n)\n</script>\n\n<template>\n <div :class=\"cn('ag-grid-container', props.class)\">\n <AgGridVue\n :column-defs=\"processedColumnDefs\"\n :row-data=\"rowData\"\n :grid-options=\"gridOptions\"\n :class=\"currentTheme\"\n style=\"height: 100%; width: 100%\"\n @grid-ready=\"onGridReady\"\n @row-clicked=\"onRowClicked\"\n @row-double-clicked=\"onRowDoubleClicked\"\n @cell-clicked=\"onCellClicked\"\n @selection-changed=\"onSelectionChanged\"\n @cell-value-changed=\"onCellValueChanged\"\n />\n </div>\n</template>\n\n<style scoped>\n.ag-grid-container {\n width: 100%;\n height: 100%;\n}\n\n/* ============================================\n COMPACT FOOTER: Status Bar + Pagination ํตํฉ\n ============================================ */\n\n/* Status Bar ๋์ด ์ค์ด๊ธฐ */\n:deep(.ag-status-bar) {\n min-height: 28px !important;\n height: 28px !important;\n padding: 0 12px !important;\n border-top: 1px solid var(--ag-border-color);\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 0.8125rem;\n}\n\n/* Status Bar ์ปดํฌ๋ํธ๋ค ๋์ด ์กฐ์ */\n:deep(.ag-status-bar-left),\n:deep(.ag-status-bar-center),\n:deep(.ag-status-bar-right) {\n height: 28px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n/* Status Bar ํจ๋๋ค ๊ฐ๊ฒฉ ์กฐ์ */\n:deep(.ag-status-panel) {\n padding: 0;\n height: 28px;\n display: flex;\n align-items: center;\n}\n\n/* Pagination Panel ๋์ด ์ค์ด๊ธฐ */\n:deep(.ag-paging-panel) {\n min-height: 28px !important;\n height: 28px !important;\n padding: 0 12px !important;\n border-top: 1px solid var(--ag-border-color);\n font-size: 0.8125rem;\n}\n\n/* Pagination ์ปดํฌ๋ํธ๋ค ๋์ด ์กฐ์ */\n:deep(.ag-paging-page-size),\n:deep(.ag-paging-row-summary-panel) {\n height: 28px;\n display: flex;\n align-items: center;\n}\n\n/* Page Size Selector ๋์ด ์กฐ์ */\n:deep(.ag-paging-page-size .ag-picker-field) {\n height: 24px;\n min-height: 24px;\n}\n\n:deep(.ag-paging-page-size .ag-picker-field-wrapper) {\n height: 24px;\n padding: 0 4px;\n}\n\n/* Pagination ๋ฒํผ๋ค ๋์ด ์กฐ์ */\n:deep(.ag-paging-button) {\n height: 24px;\n width: 24px;\n padding: 2px;\n}\n\n/* Pagination ๋ฒํผ ๋ํผ */\n:deep(.ag-paging-button-wrapper) {\n height: 28px;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n/* Row summary ํ
์คํธ */\n:deep(.ag-paging-row-summary-panel-number) {\n line-height: 28px;\n}\n\n/* ========================================\n ํจํด 9: AG-Grid ์คํ์ผ ํฅ์\n ======================================== */\n\n:deep(.ag-root-wrapper) {\n border: 1px solid hsl(var(--border));\n border-radius: 0.375rem;\n}\n\n:deep(.ag-header) {\n background-color: hsl(var(--muted));\n border-bottom: 1px solid hsl(var(--border));\n font-weight: 500;\n}\n\n:deep(.ag-header-cell) {\n color: hsl(var(--foreground));\n font-size: 0.75rem;\n padding: 0.5rem;\n}\n\n:deep(.ag-row) {\n transition: background-color 0.2s ease, border-left 0.2s ease;\n cursor: pointer;\n}\n\n:deep(.ag-row:hover) {\n background-color: hsl(var(--primary) / 0.05) !important;\n}\n\n:deep(.ag-row-selected) {\n background-color: hsl(var(--primary) / 0.1) !important;\n border-left: 2px solid hsl(var(--primary)) !important;\n}\n\n:deep(.ag-row-selected:hover) {\n background-color: hsl(var(--primary) / 0.15) !important;\n}\n\n:deep(.ag-cell) {\n line-height: 1.5;\n padding: 0.5rem;\n border-bottom: 1px solid hsl(var(--border) / 0.5);\n}\n\n:deep(.ag-paging-panel) {\n background-color: hsl(var(--muted) / 0.5);\n border-top: 1px solid hsl(var(--border));\n}\n</style>\n"],"names":["ModuleRegistry","AllCommunityModule","AllEnterpriseModule","props","__props","emit","__emit","gridApi","ref","gridColumnApi","isDarkMode","detectDarkMode","currentTheme","computed","baseTheme","ActionButtonsCellRenderer","params","buttons","rowData","visibleButtons","btn","container","button","e","actionButtonsColumn","processedColumnDefs","columns","gridOptions","data","__expose","onGridReady","onRowClicked","event","onRowDoubleClicked","onCellClicked","onSelectionChanged","onCellValueChanged","darkModeObserver","onMounted","onUnmounted","watch","_createElementBlock","_normalizeClass","_unref","cn","_createVNode","AgGridVue"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"JGrid.vue2.js","sources":["../../../../src/components/atoms/JGrid.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport { AgGridVue } from 'ag-grid-vue3'\nimport { cn } from '@/lib/utils'\nimport type {\n ColDef,\n GridOptions,\n RowClickedEvent,\n CellClickedEvent,\n SelectionChangedEvent,\n CellValueChangedEvent,\n RowDoubleClickedEvent,\n GridReadyEvent,\n ICellRendererParams,\n} from 'ag-grid-community'\nimport { ModuleRegistry, AllCommunityModule, themeQuartz } from 'ag-grid-community'\n// Enterprise ๋ชจ๋ import (Grouping, Pivot, Excel Export ๋ฑ)\nimport { AllEnterpriseModule } from 'ag-grid-enterprise'\n\n// AG Grid ๋ชจ๋ ๋ฑ๋ก (Community + Enterprise)\nModuleRegistry.registerModules([AllCommunityModule, AllEnterpriseModule])\n\n// Theme Builder API: JLIS ์ปค์คํ
ํ
๋ง (browserColorScheme: 'inherit' โ ๋คํฌ๋ชจ๋ ์๋ ๊ฐ์ง)\nconst jTheme = themeQuartz.withParams({\n browserColorScheme: 'inherit',\n cellHorizontalPaddingScale: 1,\n columnBorder: true,\n fontSize: 13,\n headerBackgroundColor: '#FFFFFF',\n headerFontWeight: 500,\n headerVerticalPaddingScale: 0.7,\n iconSize: 14,\n oddRowBackgroundColor: '#CBE6F175',\n rowVerticalPaddingScale: 0.5,\n})\n\n/**\n * Action Button ์ ์ ํ์
\n */\nexport type ActionButton = {\n /** ๋ฒํผ ์์ด์ฝ ์ด๋ฆ (lucide) - label์ด ์์ ๋ ๊ธฐ๋ณธ ํ
์คํธ ์์ฑ์ ์ฌ์ฉ */\n icon?: string\n /** ๋ฒํผ ๋ผ๋ฒจ */\n label?: string\n /** ํดํ ํ
์คํธ */\n tooltip?: string\n /** ๋ฒํผ ํด๋ฆญ ํธ๋ค๋ฌ (rowData ์ ๋ฌ) */\n onClick: (rowData: any) => void\n /** ๋ฒํผ ์คํ์ผ ํ์
*/\n styletype?: 'default' | 'primary' | 'secondary' | 'success' | 'warning' | 'danger'\n /** ์กฐ๊ฑด๋ถ ํ์ ํจ์ (rowData๋ฅผ ๋ฐ์ boolean ๋ฐํ) */\n show?: (rowData: any) => boolean\n}\n\nconst props = withDefaults(\n defineProps<{\n /** ์ถ๊ฐ ํด๋์ค (์ธ๋ถ ์ปค์คํฐ๋ง์ด์ง์ฉ) */\n class?: string\n /** ๊ทธ๋ฆฌ๋์ ํ์ํ ๋ฐ์ดํฐ ๋ฐฐ์ด */\n rowData: any[]\n /** ์ปฌ๋ผ ์ ์ ๋ฐฐ์ด */\n columnDefs: ColDef[]\n /** ํ์ด์ง๋ค์ด์
ํ์ฑํ ์ฌ๋ถ */\n pagination?: boolean\n /** ์ฒดํฌ๋ฐ์ค ์ ํ ํ์ฑํ ์ฌ๋ถ */\n checkbox?: boolean\n /** ํ ๋ฒํธ ํ์ ์ฌ๋ถ (Enterprise) */\n rowNumbers?: boolean\n /** ํ๋ณ ์ก์
๋ฒํผ ๋ชฉ๋ก */\n actionButtons?: ActionButton[]\n /** ์์ฝ ์ปฌ๋ผ ํ์ ์ฌ๋ถ */\n summaryColumn?: boolean\n /** ์จ๊น ์ปฌ๋ผ ๊ด๋ฆฌ ํ์ฑํ ์ฌ๋ถ */\n hiddenColumn?: boolean\n /** ๊ทธ๋ฃนํ ๊ธฐ๋ฅ ํ์ฑํ ์ฌ๋ถ (Enterprise) */\n enableGrouping?: boolean\n /** ํผ๋ฒ ๊ธฐ๋ฅ ํ์ฑํ ์ฌ๋ถ (Enterprise) */\n enablePivot?: boolean\n /** Excel ๋ด๋ณด๋ด๊ธฐ ๊ธฐ๋ฅ ํ์ฑํ ์ฌ๋ถ (Enterprise) */\n enableExcelExport?: boolean\n /** Tree Data ๊ธฐ๋ฅ ํ์ฑํ ์ฌ๋ถ (Enterprise) */\n enableTreeData?: boolean\n /** Tree Data ๊ณ์ธต ๊ฒฝ๋ก๋ฅผ ๋ฐํํ๋ ํจ์ */\n getDataPath?: (data: any) => (string | number)[]\n /** Tree Data ๊ทธ๋ฃน ์ปฌ๋ผ ์ ์ */\n autoGroupColumnDef?: ColDef\n /** ์ ํ๋ ํ ๋ฐ์ดํฐ ๋ฐฐ์ด (v-model:selected-rows) */\n selectedRows?: any[]\n /** ์ปฌ๋ผ ํธ๋ฒ ํ์ด๋ผ์ดํธ ํ์ฑํ ์ฌ๋ถ */\n columnHover?: boolean\n /** Columns Tool Panel ํ์ฑํ ์ฌ๋ถ (Enterprise) */\n enableColumnsToolPanel?: boolean\n /** Status Bar ํ์ฑํ ์ฌ๋ถ (Enterprise) */\n statusBar?: boolean\n /** ๊ฐ์ํ๋ Footer ๋ชจ๋ (Status Bar ์ ๊ฑฐ, Pagination๋ง ํ์) */\n compactFooter?: boolean\n /** Row Group Panel ํ์ ์ฌ๋ถ ('always' | 'onlyWhenGrouping' | 'never') */\n rowGroupPanelShow?: 'always' | 'onlyWhenGrouping' | 'never'\n /** ๊ทธ๋ฃน ๊ธฐ๋ณธ ํ์ฅ ๋ ๋ฒจ (-1: ๋ชจ๋ ๋ซํ, 0: ์ฒซ ๋ ๋ฒจ๋ง, 1: 2๋ ๋ฒจ๊น์ง...) */\n groupDefaultExpanded?: number\n /** Pivot Mode Panel ํ์ ์ฌ๋ถ */\n pivotPanelShow?: 'always' | 'onlyWhenPivoting' | 'never'\n /** Pivot Mode ํ์ฑํ ์ฌ๋ถ */\n pivotMode?: boolean\n }>(),\n {\n pagination: true,\n checkbox: false,\n rowNumbers: true,\n actionButtons: undefined,\n summaryColumn: false,\n hiddenColumn: false,\n enableGrouping: true,\n enablePivot: false,\n enableExcelExport: false,\n enableTreeData: false,\n getDataPath: undefined,\n autoGroupColumnDef: undefined,\n selectedRows: () => [],\n columnHover: true,\n enableColumnsToolPanel: true,\n statusBar: true,\n compactFooter: false,\n rowGroupPanelShow: 'never',\n groupDefaultExpanded: -1,\n pivotPanelShow: 'never',\n pivotMode: false,\n },\n)\n\nconst emit = defineEmits<{\n /** ํ ํด๋ฆญ ์ด๋ฒคํธ */\n rowClicked: [event: RowClickedEvent]\n /** ํ ๋๋ธํด๋ฆญ ์ด๋ฒคํธ */\n rowDoubleClicked: [event: RowDoubleClickedEvent]\n /** ์
ํด๋ฆญ ์ด๋ฒคํธ */\n cellClicked: [event: CellClickedEvent]\n /** ์ ํ ๋ณ๊ฒฝ ์ด๋ฒคํธ (์ฒดํฌ๋ฐ์ค ๋ฑ) */\n selectionChanged: [event: SelectionChangedEvent]\n /** ์
๊ฐ ๋ณ๊ฒฝ ์ด๋ฒคํธ */\n cellValueChanged: [event: CellValueChangedEvent]\n /** ๊ทธ๋ฆฌ๋ ์ค๋น ์๋ฃ ์ด๋ฒคํธ */\n gridReady: [event: GridReadyEvent]\n /** ์ ํ๋ ํ ๋ณ๊ฒฝ ์ด๋ฒคํธ (v-model:selected-rows) */\n 'update:selectedRows': [rows: any[]]\n}>()\n\n// ag-Grid ์ธ์คํด์ค ์ฐธ์กฐ\nconst gridApi = ref<any>(null)\nconst gridColumnApi = ref<any>(null)\n\n// Action Buttons Cell Renderer - ํจ์ํ์ผ๋ก DOM ์ง์ ์์ฑ\nconst ActionButtonsCellRenderer = (params: ICellRendererParams) => {\n const buttons = props.actionButtons || []\n const rowData = params.data\n \n // ํ์ํ ๋ฒํผ ํํฐ๋ง\n const visibleButtons = buttons.filter(btn => {\n if (btn.show) {\n return btn.show(rowData)\n }\n return true\n })\n \n if (visibleButtons.length === 0) {\n return ''\n }\n \n // ์ปจํ
์ด๋ div ์์ฑ\n const container = document.createElement('div')\n container.className = 'flex items-center gap-1'\n \n // ๊ฐ ๋ฒํผ ์์ฑ\n visibleButtons.forEach((btn) => {\n const button = document.createElement('button')\n button.className = 'px-2 py-1 text-xs border rounded transition-colors'\n \n // styletype์ ๋ฐ๋ฅธ ํด๋์ค ์ถ๊ฐ\n if (btn.styletype === 'danger') {\n button.className += ' bg-red-50 border-red-400 text-red-700 hover:bg-red-100 dark:bg-red-950 dark:border-red-700 dark:text-red-400 dark:hover:bg-red-900'\n } else {\n button.className += ' bg-gray-50 border-gray-400 text-gray-700 hover:bg-gray-100 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-700'\n }\n \n // tooltip\n if (btn.tooltip) {\n button.title = btn.tooltip\n }\n \n // ๋ผ๋ฒจ ์ถ๊ฐ (ํ
์คํธ ๋ฒํผ)\n if (btn.label) {\n button.textContent = btn.label\n } else if (btn.icon) {\n // ๋ผ๋ฒจ์ด ์์ผ๋ฉด ๊ธฐ๋ณธ ํ
์คํธ ์์ฑ\n if (btn.icon === 'pencil') {\n button.textContent = '์์ '\n } else if (btn.icon === 'trash2' || btn.icon === 'trash') {\n button.textContent = '์ญ์ '\n } else if (btn.icon === 'eye') {\n button.textContent = '๋ณด๊ธฐ'\n } else if (btn.icon === 'copy') {\n button.textContent = '๋ณต์ฌ'\n } else if (btn.icon === 'download') {\n button.textContent = '๋ค์ด๋ก๋'\n } else if (btn.icon === 'circleX') {\n button.textContent = '๋นํ์ฑํ'\n } else if (btn.icon === 'circleCheckBig') {\n button.textContent = 'ํ์ฑํ'\n } else {\n button.textContent = btn.icon\n }\n }\n \n // ํด๋ฆญ ์ด๋ฒคํธ\n button.addEventListener('click', (e) => {\n e.stopPropagation()\n btn.onClick(rowData)\n })\n \n container.appendChild(button)\n })\n \n return container\n}\n\n// Action Buttons ์ปฌ๋ผ ์ ์\nconst actionButtonsColumn = computed<ColDef | null>(() => {\n if (!props.actionButtons || props.actionButtons.length === 0) {\n return null\n }\n \n return {\n colId: 'actionButtons',\n headerName: '์์
',\n field: '_actions',\n width: 120,\n minWidth: 80,\n maxWidth: 200,\n lockPosition: 'left' as const,\n sortable: false,\n filter: false,\n resizable: true,\n suppressNavigable: true,\n suppressHeaderMenuButton: true,\n cellRenderer: ActionButtonsCellRenderer,\n cellStyle: { display: 'flex', justifyContent: 'center', alignItems: 'center' },\n }\n})\n\n// checkbox ํ์ฑํ ๋ฐ ์ถ๊ฐ ์ปฌ๋ผ ์ฒ๋ฆฌ\nconst processedColumnDefs = computed(() => {\n const columns: ColDef[] = []\n \n // 1. Checkbox ์ปฌ๋ผ (์ต์ฐ์ )\n if (props.checkbox) {\n columns.push({\n colId: 'rowSelection',\n headerName: '',\n // field์ valueGetter ์ ๊ฑฐ - AG Grid ๊ณต์ ๋ฐฉ์\n width: 50,\n minWidth: 50,\n maxWidth: 50,\n lockPosition: 'left' as const,\n checkboxSelection: true,\n headerCheckboxSelection: true,\n sortable: false,\n filter: false,\n resizable: false,\n suppressNavigable: true,\n suppressHeaderMenuButton: true,\n cellStyle: { display: 'flex', justifyContent: 'center', alignItems: 'center' },\n })\n }\n \n // 2. Action Buttons ์ปฌ๋ผ\n if (actionButtonsColumn.value) {\n columns.push(actionButtonsColumn.value)\n }\n \n // 3. ์ฌ์ฉ์ ์ ์ ์ปฌ๋ผ๋ค (Row Numbers๋ AG Grid๊ฐ ์๋์ผ๋ก ์ถ๊ฐ)\n columns.push(...props.columnDefs)\n \n return columns\n})\n\n// Grid ์ต์
์ค์ \nconst gridOptions = computed<GridOptions>(() => {\n const options: GridOptions = {\n theme: jTheme,\n pagination: props.pagination,\n rowSelection: props.checkbox ? 'multiple' : undefined,\n // ์ฒดํฌ๋ฐ์ค ๋ชจ๋์ผ ๋ row ํด๋ฆญ์ผ๋ก ์ ํ์ด ๋ณ๊ฒฝ๋์ง ์๋๋ก ์ค์ \n // ์ฒดํฌ๋ฐ์ค๋ง์ผ๋ก ์ ํ์ ์ ์ดํ๋๋ก ํจ\n suppressRowClickSelection: props.checkbox,\n\n // Row Numbers (Enterprise) - AG Grid ํ์ค ๋ฐฉ์\n rowNumbers: props.rowNumbers,\n\n // Column Hover Highlight\n columnHoverHighlight: props.columnHover,\n\n // Enterprise ๊ธฐ๋ฅ ์ต์
\n sideBar: props.enableColumnsToolPanel || props.enableGrouping || props.enablePivot ? {\n toolPanels: [\n {\n id: 'columns',\n labelDefault: 'Columns',\n labelKey: 'columns',\n iconKey: 'columns',\n toolPanel: 'agColumnsToolPanel',\n toolPanelParams: {\n suppressRowGroups: !props.enableGrouping,\n suppressValues: !props.enablePivot,\n suppressPivots: !props.enablePivot,\n suppressPivotMode: !props.enablePivot,\n },\n },\n ],\n defaultToolPanel: '', // ์ด๊ธฐ์๋ ์ ํ ์ํ\n } : undefined,\n\n // Status Bar (Enterprise)\n // compactFooter ๋ชจ๋์์๋ Status Bar ๋นํ์ฑํ\n statusBar: (props.statusBar && !props.compactFooter) ? {\n statusPanels: [\n { statusPanel: 'agTotalAndFilteredRowCountComponent', align: 'left' as const },\n { statusPanel: 'agSelectedRowCountComponent', align: 'left' as const },\n { statusPanel: 'agAggregationComponent', align: 'right' as const },\n ],\n } : undefined,\n\n // Row Group Panel ์ค์ (Enterprise) - ๊ทธ๋ฆฌ๋ ์๋จ์ ๋๋๊ทธ ์์ญ ํ์\n rowGroupPanelShow: props.rowGroupPanelShow !== 'never' ? props.rowGroupPanelShow : undefined,\n\n // Pivot Panel ์ค์ (Enterprise) - ํผ๋ฒ ๋ชจ๋์ฉ ๋๋๊ทธ ์์ญ\n pivotPanelShow: props.pivotPanelShow !== 'never' ? props.pivotPanelShow : undefined,\n \n // Pivot Mode ํ์ฑํ\n pivotMode: props.pivotMode,\n\n // ๊ทธ๋ฃนํ ๊ธฐ๋ณธ ์ค์ \n groupDefaultExpanded: props.groupDefaultExpanded,\n suppressAggFuncInHeader: false,\n\n // Tree Data ์ค์ (Enterprise)\n treeData: props.enableTreeData || undefined,\n getDataPath: props.enableTreeData\n ? (props.getDataPath || ((data: any) => data.path || []))\n : undefined,\n autoGroupColumnDef: props.enableTreeData && props.autoGroupColumnDef\n ? props.autoGroupColumnDef\n : undefined,\n }\n\n return options\n})\n\n// Excel ๋ด๋ณด๋ด๊ธฐ ํจ์ (์ธ๋ถ์์ ์ฌ์ฉ ๊ฐ๋ฅํ๋๋ก expose)\nconst exportToExcel = () => {\n if (gridApi.value && props.enableExcelExport) {\n gridApi.value.exportDataAsExcel({\n fileName: 'grid-export.xlsx',\n })\n }\n}\n\n// ๊ทธ๋ฆฌ๋ API๋ฅผ ์ธ๋ถ์ ๋
ธ์ถ\ndefineExpose({\n gridApi,\n gridColumnApi,\n exportToExcel,\n})\n\n// Grid ready ์ด๋ฒคํธ ํธ๋ค๋ฌ\nconst onGridReady = (params: GridReadyEvent) => {\n gridApi.value = params.api\n gridColumnApi.value = params.api // v34์์ columnApi๋ deprecated\n emit('gridReady', params)\n}\n\n// ํ ํด๋ฆญ ์ด๋ฒคํธ ํธ๋ค๋ฌ\nconst onRowClicked = (event: RowClickedEvent) => {\n emit('rowClicked', event)\n}\n\n// ํ ๋๋ธํด๋ฆญ ์ด๋ฒคํธ ํธ๋ค๋ฌ\nconst onRowDoubleClicked = (event: RowDoubleClickedEvent) => {\n emit('rowDoubleClicked', event)\n}\n\n// ์
ํด๋ฆญ ์ด๋ฒคํธ ํธ๋ค๋ฌ\nconst onCellClicked = (event: CellClickedEvent) => {\n emit('cellClicked', event)\n}\n\n// ์ ํ ๋ณ๊ฒฝ ์ด๋ฒคํธ ํธ๋ค๋ฌ\nconst onSelectionChanged = (event: SelectionChangedEvent) => {\n emit('selectionChanged', event)\n emit('update:selectedRows', event.api.getSelectedRows())\n}\n\n// ์
๊ฐ ๋ณ๊ฒฝ ์ด๋ฒคํธ ํธ๋ค๋ฌ\nconst onCellValueChanged = (event: CellValueChangedEvent) => {\n emit('cellValueChanged', event)\n}\n\n// columnDefs ๋ณ๊ฒฝ ๊ฐ์ง\nwatch(\n () => props.columnDefs,\n () => {\n if (gridApi.value) {\n gridApi.value.setGridOption('columnDefs', processedColumnDefs.value)\n }\n },\n { deep: true },\n)\n\n// rowData ๋ณ๊ฒฝ ๊ฐ์ง\nwatch(\n () => props.rowData,\n () => {\n if (gridApi.value) {\n gridApi.value.setGridOption('rowData', props.rowData)\n }\n },\n { deep: true },\n)\n</script>\n\n<template>\n <div :class=\"cn('ag-grid-container', props.class)\">\n <AgGridVue\n :column-defs=\"processedColumnDefs\"\n :row-data=\"rowData\"\n :grid-options=\"gridOptions\"\n style=\"height: 100%; width: 100%\"\n @grid-ready=\"onGridReady\"\n @row-clicked=\"onRowClicked\"\n @row-double-clicked=\"onRowDoubleClicked\"\n @cell-clicked=\"onCellClicked\"\n @selection-changed=\"onSelectionChanged\"\n @cell-value-changed=\"onCellValueChanged\"\n />\n </div>\n</template>\n\n<style scoped>\n.ag-grid-container {\n width: 100%;\n height: 100%;\n}\n\n/* ============================================\n COMPACT FOOTER: Status Bar + Pagination ํตํฉ\n ============================================ */\n\n/* Status Bar ๋์ด ์ค์ด๊ธฐ */\n:deep(.ag-status-bar) {\n min-height: 28px !important;\n height: 28px !important;\n padding: 0 12px !important;\n border-top: 1px solid var(--ag-border-color);\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 0.8125rem;\n}\n\n/* Status Bar ์ปดํฌ๋ํธ๋ค ๋์ด ์กฐ์ */\n:deep(.ag-status-bar-left),\n:deep(.ag-status-bar-center),\n:deep(.ag-status-bar-right) {\n height: 28px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n/* Status Bar ํจ๋๋ค ๊ฐ๊ฒฉ ์กฐ์ */\n:deep(.ag-status-panel) {\n padding: 0;\n height: 28px;\n display: flex;\n align-items: center;\n}\n\n/* Pagination Panel ๋์ด ์ค์ด๊ธฐ */\n:deep(.ag-paging-panel) {\n min-height: 28px !important;\n height: 28px !important;\n padding: 0 12px !important;\n border-top: 1px solid var(--ag-border-color);\n font-size: 0.8125rem;\n}\n\n/* Pagination ์ปดํฌ๋ํธ๋ค ๋์ด ์กฐ์ */\n:deep(.ag-paging-page-size),\n:deep(.ag-paging-row-summary-panel) {\n height: 28px;\n display: flex;\n align-items: center;\n}\n\n/* Page Size Selector ๋์ด ์กฐ์ */\n:deep(.ag-paging-page-size .ag-picker-field) {\n height: 24px;\n min-height: 24px;\n}\n\n:deep(.ag-paging-page-size .ag-picker-field-wrapper) {\n height: 24px;\n padding: 0 4px;\n}\n\n/* Pagination ๋ฒํผ๋ค ๋์ด ์กฐ์ */\n:deep(.ag-paging-button) {\n height: 24px;\n width: 24px;\n padding: 2px;\n}\n\n/* Pagination ๋ฒํผ ๋ํผ */\n:deep(.ag-paging-button-wrapper) {\n height: 28px;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n/* Row summary ํ
์คํธ */\n:deep(.ag-paging-row-summary-panel-number) {\n line-height: 28px;\n}\n\n/* ========================================\n ํจํด 9: AG-Grid ์คํ์ผ ํฅ์\n ======================================== */\n\n:deep(.ag-root-wrapper) {\n border: 1px solid hsl(var(--border));\n border-radius: 0.375rem;\n}\n\n:deep(.ag-header) {\n background-color: hsl(var(--muted));\n border-bottom: 1px solid hsl(var(--border));\n font-weight: 500;\n}\n\n:deep(.ag-header-cell) {\n color: hsl(var(--foreground));\n font-size: 0.75rem;\n padding: 0.5rem;\n}\n\n:deep(.ag-row) {\n transition: background-color 0.2s ease, border-left 0.2s ease;\n cursor: pointer;\n}\n\n:deep(.ag-row:hover) {\n background-color: hsl(var(--primary) / 0.05) !important;\n}\n\n:deep(.ag-row-selected) {\n background-color: hsl(var(--primary) / 0.1) !important;\n border-left: 2px solid hsl(var(--primary)) !important;\n}\n\n:deep(.ag-row-selected:hover) {\n background-color: hsl(var(--primary) / 0.15) !important;\n}\n\n:deep(.ag-cell) {\n line-height: 1.5;\n padding: 0.5rem;\n border-bottom: 1px solid hsl(var(--border) / 0.5);\n}\n\n:deep(.ag-paging-panel) {\n background-color: hsl(var(--muted) / 0.5);\n border-top: 1px solid hsl(var(--border));\n}\n</style>\n"],"names":["ModuleRegistry","AllCommunityModule","AllEnterpriseModule","jTheme","themeQuartz","props","__props","emit","__emit","gridApi","ref","gridColumnApi","ActionButtonsCellRenderer","params","buttons","rowData","visibleButtons","btn","container","button","e","actionButtonsColumn","computed","processedColumnDefs","columns","gridOptions","data","__expose","onGridReady","onRowClicked","event","onRowDoubleClicked","onCellClicked","onSelectionChanged","onCellValueChanged","watch","_createElementBlock","_normalizeClass","_unref","cn","_createVNode","AgGridVue"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JIcon.vue.cjs","sources":["../../../../src/components/atoms/JIcon.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport { \r\n House, \r\n User, \r\n Settings, \r\n Search, \r\n Plus, \r\n Minus, \r\n SquarePen, \r\n Trash2, \r\n Save, \r\n Download,\r\n Upload,\r\n Eye,\r\n EyeOff,\r\n Heart,\r\n Star,\r\n Check,\r\n X,\r\n CircleAlert,\r\n Info,\r\n ChevronDown,\r\n ChevronUp,\r\n ChevronLeft,\r\n ChevronRight,\r\n Menu,\r\n Ellipsis,\r\n EllipsisVertical,\r\n Palette,\r\n // WMS ํต์ฌ ์์ด์ฝ๋ค\r\n Package,\r\n PackageCheck,\r\n PackageX,\r\n Truck,\r\n Warehouse,\r\n Boxes,\r\n Archive,\r\n ClipboardList,\r\n ClipboardCheck,\r\n FileText,\r\n ChartBar,\r\n TrendingUp,\r\n TrendingDown,\r\n Calendar,\r\n Clock,\r\n MapPin,\r\n Table,\r\n List,\r\n ListFilter,\r\n ArrowUpWideNarrow,\r\n ArrowDownWideNarrow,\r\n Scale,\r\n // ์ถ๊ฐ ์์ด์ฝ๋ค\r\n Server,\r\n Database,\r\n Link,\r\n ArrowLeftRight,\r\n CircleQuestionMark,\r\n Monitor,\r\n Users,\r\n Code,\r\n FileKey,\r\n Cpu,\r\n Rocket,\r\n FileSpreadsheet,\r\n Activity,\r\n MessageCircle,\r\n Book,\r\n LogIn,\r\n LogOut,\r\n // ํธ์ง ๊ด๋ จ\r\n Copy,\r\n Clipboard,\r\n Undo2,\r\n Redo2,\r\n Pencil,\r\n // ํ์ผ/ํด๋ ๊ด๋ จ\r\n Folder,\r\n FolderPlus,\r\n FolderOpen,\r\n FilePlus,\r\n FileSearch,\r\n FilePen,\r\n FileMinus,\r\n // ํต์ /์๋ฆผ ๊ด๋ จ\r\n Mail,\r\n Send,\r\n Phone,\r\n Bell,\r\n BellOff,\r\n MessageSquare,\r\n // ํ์ดํ/๋ฐฉํฅ ๊ด๋ จ\r\n ArrowUp,\r\n ArrowDown,\r\n ArrowLeft,\r\n ArrowRight,\r\n RotateCw,\r\n RotateCcw,\r\n RefreshCw,\r\n Move,\r\n // ์ํ/ํผ๋๋ฐฑ ๊ด๋ จ\r\n CircleCheckBig,\r\n CircleX,\r\n Circle,\r\n // ๋ณด์ ๊ด๋ จ\r\n Lock,\r\n LockOpen,\r\n Shield,\r\n ShieldCheck,\r\n ShieldAlert,\r\n // ์ฌ์ฉ์ ๊ด๋ฆฌ ๊ด๋ จ\r\n UserPlus,\r\n UserMinus,\r\n UserCheck,\r\n UserX,\r\n CircleUser,\r\n // ์ก์
๊ด๋ จ\r\n Power,\r\n Zap,\r\n Target,\r\n Flag,\r\n Funnel,\r\n // ์กฐ์ง/ํ ๊ด๋ จ\r\n Building,\r\n Briefcase,\r\n Globe,\r\n // ๊ธฐํ ์ ์ฉํ ์์ด์ฝ\r\n Printer,\r\n Share2,\r\n ExternalLink,\r\n Maximize2,\r\n Minimize2,\r\n MoveVertical,\r\n MoveHorizontal,\r\n Sun,\r\n Moon,\r\n type LucideIcon\r\n} from 'lucide-vue-next'\r\n\r\n// ํ์ฅ ๊ฐ๋ฅํ ์์ด์ฝ ํ์
\r\ntype BaseIconName = \r\n | 'house' | 'user' | 'settings' | 'search' | 'plus' | 'minus'\r\n | 'squarePen' | 'trash2' | 'save' | 'download' | 'upload'\r\n | 'eye' | 'eyeOff' | 'heart' | 'star' | 'check' | 'x'\r\n | 'circleAlert' | 'info' | 'chevronDown' | 'chevronUp'\r\n | 'chevronLeft' | 'chevronRight' | 'menu' | 'ellipsis' | 'ellipsisVertical'\r\n | 'palette'\r\n // WMS ํต์ฌ ์์ด์ฝ๋ค\r\n | 'package' | 'packageCheck' | 'packageX'\r\n | 'truck' | 'warehouse' | 'boxes'\r\n | 'archive' | 'clipboardList' | 'clipboardCheck'\r\n | 'fileText' | 'chartBar'\r\n | 'trendingUp' | 'trendingDown' | 'calendar' | 'clock'\r\n | 'mapPin' | 'table' | 'list' | 'listFilter'\r\n | 'arrowUpWideNarrow' | 'arrowDownWideNarrow' | 'scale'\r\n // ์ถ๊ฐ ์์ด์ฝ๋ค\r\n | 'server' | 'database' | 'link' | 'arrowLeftRight' | 'circleQuestionMark'\r\n | 'monitor' | 'users' | 'code' | 'fileKey' | 'cpu'\r\n | 'rocket' | 'fileSpreadsheet' | 'activity' | 'messageCircle' | 'book'\r\n // ์ธ์ฆ ๊ด๋ จ ์์ด์ฝ๋ค\r\n | 'logIn' | 'logOut'\r\n // ํธ์ง ๊ด๋ จ ์์ด์ฝ๋ค\r\n | 'copy' | 'clipboard' | 'undo2' | 'redo2' | 'pencil'\r\n // ํ์ผ/ํด๋ ๊ด๋ จ ์์ด์ฝ๋ค\r\n | 'folder' | 'folderPlus' | 'folderOpen' | 'filePlus' | 'fileSearch' | 'filePen' | 'fileMinus'\r\n // ํต์ /์๋ฆผ ๊ด๋ จ ์์ด์ฝ๋ค\r\n | 'mail' | 'send' | 'phone' | 'bell' | 'bellOff' | 'messageSquare'\r\n // ํ์ดํ/๋ฐฉํฅ ๊ด๋ จ ์์ด์ฝ๋ค\r\n | 'arrowUp' | 'arrowDown' | 'arrowLeft' | 'arrowRight' | 'rotateCw' | 'rotateCcw' | 'refreshCw' | 'move'\r\n // ์ํ/ํผ๋๋ฐฑ ๊ด๋ จ ์์ด์ฝ๋ค\r\n | 'circleCheckBig' | 'circleX' | 'circle'\r\n // ๋ณด์ ๊ด๋ จ ์์ด์ฝ๋ค\r\n | 'lock' | 'lockOpen' | 'shield' | 'shieldCheck' | 'shieldAlert'\r\n // ์ฌ์ฉ์ ๊ด๋ฆฌ ๊ด๋ จ ์์ด์ฝ๋ค\r\n | 'userPlus' | 'userMinus' | 'userCheck' | 'userX' | 'circleUser'\r\n // ์ก์
๊ด๋ จ ์์ด์ฝ๋ค\r\n | 'power' | 'zap' | 'target' | 'flag' | 'funnel'\r\n // ์กฐ์ง/ํ ๊ด๋ จ ์์ด์ฝ๋ค\r\n | 'building' | 'briefcase' | 'globe'\r\n // ๊ธฐํ ์ ์ฉํ ์์ด์ฝ๋ค\r\n | 'printer' | 'share2' | 'externalLink' | 'maximize2' | 'minimize2' | 'moveVertical' | 'moveHorizontal'\r\n | 'sun' | 'moon'\r\n\r\n// ์ปค์คํ
์์ด์ฝ ํ์ฅ์ ์ํ ํ์
\r\ntype CustomIconName = string // ๋์ค์ ํ์ฅ ๊ฐ๋ฅ\r\n\r\ntype IconName = BaseIconName | CustomIconName\r\n\r\ntype StyleType =\r\n | 'default' // ๊ธฐ๋ณธ ์คํ์ผ\r\n | 'primary' // ๊ฐ์กฐ ์คํ์ผ (ํ๋)\r\n | 'success' // ์ฑ๊ณต ์คํ์ผ (์ด๋ก)\r\n | 'warning' // ๊ฒฝ๊ณ ์คํ์ผ (์ฃผํฉ)\r\n | 'danger' // ์ํ ์คํ์ผ (๋นจ๊ฐ)\r\n\r\ntype SizeType = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n name: IconName\r\n size?: SizeType\r\n color?: string\r\n class?: string\r\n /** ์คํ์ผ ํ๋ฆฌ์
*/\r\n styletype?: StyleType\r\n /** ์ ๊ทผ์ฑ ๋ผ๋ฒจ */\r\n ariaLabel?: string\r\n /** ์ ๊ทผ์ฑ ์ญํ */\r\n role?: string\r\n }>(),\r\n {\n size: 'sm',\n styletype: 'default',\n role: 'img',\n },\n)\r\n\r\n/**\r\n * ๊ธฐ๋ณธ ์์ด์ฝ ๋งคํ (ํ์
์์ )\r\n */\r\nconst baseIconMap: Record<BaseIconName, LucideIcon> = {\r\n house: House,\r\n user: User,\r\n settings: Settings,\r\n search: Search,\r\n plus: Plus,\r\n minus: Minus,\r\n squarePen: SquarePen,\r\n trash2: Trash2,\r\n save: Save,\r\n download: Download,\r\n upload: Upload,\r\n eye: Eye,\r\n eyeOff: EyeOff,\r\n heart: Heart,\r\n star: Star,\r\n check: Check,\r\n x: X,\r\n circleAlert: CircleAlert,\r\n info: Info,\r\n chevronDown: ChevronDown,\r\n chevronUp: ChevronUp,\r\n chevronLeft: ChevronLeft,\r\n chevronRight: ChevronRight,\r\n menu: Menu,\r\n ellipsis: Ellipsis,\r\n ellipsisVertical: EllipsisVertical,\r\n palette: Palette,\r\n // WMS ํต์ฌ ์์ด์ฝ๋ค\r\n package: Package,\r\n packageCheck: PackageCheck,\r\n packageX: PackageX,\r\n truck: Truck,\r\n warehouse: Warehouse,\r\n boxes: Boxes,\r\n archive: Archive,\r\n clipboardList: ClipboardList,\r\n clipboardCheck: ClipboardCheck,\r\n fileText: FileText,\r\n chartBar: ChartBar,\r\n trendingUp: TrendingUp,\r\n trendingDown: TrendingDown,\r\n calendar: Calendar,\r\n clock: Clock,\r\n mapPin: MapPin,\r\n table: Table,\r\n list: List,\r\n listFilter: ListFilter,\r\n arrowUpWideNarrow: ArrowUpWideNarrow,\r\n arrowDownWideNarrow: ArrowDownWideNarrow,\r\n scale: Scale,\r\n // ์ถ๊ฐ ์์ด์ฝ๋ค\r\n server: Server,\r\n database: Database,\r\n link: Link,\r\n arrowLeftRight: ArrowLeftRight,\r\n circleQuestionMark: CircleQuestionMark,\r\n monitor: Monitor,\r\n users: Users,\r\n code: Code,\r\n fileKey: FileKey,\r\n cpu: Cpu,\r\n rocket: Rocket,\r\n fileSpreadsheet: FileSpreadsheet,\r\n activity: Activity,\r\n messageCircle: MessageCircle,\r\n book: Book,\r\n // ์ธ์ฆ ๊ด๋ จ ์์ด์ฝ๋ค\r\n logIn: LogIn,\r\n logOut: LogOut,\r\n // ํธ์ง ๊ด๋ จ ์์ด์ฝ๋ค\r\n copy: Copy,\r\n clipboard: Clipboard,\r\n undo2: Undo2,\r\n redo2: Redo2,\r\n pencil: Pencil,\r\n // ํ์ผ/ํด๋ ๊ด๋ จ ์์ด์ฝ๋ค\r\n folder: Folder,\r\n folderPlus: FolderPlus,\r\n folderOpen: FolderOpen,\r\n filePlus: FilePlus,\r\n fileSearch: FileSearch,\r\n filePen: FilePen,\r\n fileMinus: FileMinus,\r\n // ํต์ /์๋ฆผ ๊ด๋ จ ์์ด์ฝ๋ค\r\n mail: Mail,\r\n send: Send,\r\n phone: Phone,\r\n bell: Bell,\r\n bellOff: BellOff,\r\n messageSquare: MessageSquare,\r\n // ํ์ดํ/๋ฐฉํฅ ๊ด๋ จ ์์ด์ฝ๋ค\r\n arrowUp: ArrowUp,\r\n arrowDown: ArrowDown,\r\n arrowLeft: ArrowLeft,\r\n arrowRight: ArrowRight,\r\n rotateCw: RotateCw,\r\n rotateCcw: RotateCcw,\r\n refreshCw: RefreshCw,\r\n move: Move,\r\n // ์ํ/ํผ๋๋ฐฑ ๊ด๋ จ ์์ด์ฝ๋ค\r\n circleCheckBig: CircleCheckBig,\r\n circleX: CircleX,\r\n circle: Circle,\r\n // ๋ณด์ ๊ด๋ จ ์์ด์ฝ๋ค\r\n lock: Lock,\r\n lockOpen: LockOpen,\r\n shield: Shield,\r\n shieldCheck: ShieldCheck,\r\n shieldAlert: ShieldAlert,\r\n // ์ฌ์ฉ์ ๊ด๋ฆฌ ๊ด๋ จ ์์ด์ฝ๋ค\r\n userPlus: UserPlus,\r\n userMinus: UserMinus,\r\n userCheck: UserCheck,\r\n userX: UserX,\r\n circleUser: CircleUser,\r\n // ์ก์
๊ด๋ จ ์์ด์ฝ๋ค\r\n power: Power,\r\n zap: Zap,\r\n target: Target,\r\n flag: Flag,\r\n funnel: Funnel,\r\n // ์กฐ์ง/ํ ๊ด๋ จ ์์ด์ฝ๋ค\r\n building: Building,\r\n briefcase: Briefcase,\r\n globe: Globe,\r\n // ๊ธฐํ ์ ์ฉํ ์์ด์ฝ๋ค\r\n printer: Printer,\r\n share2: Share2,\r\n externalLink: ExternalLink,\r\n maximize2: Maximize2,\r\n minimize2: Minimize2,\r\n moveVertical: MoveVertical,\r\n moveHorizontal: MoveHorizontal,\r\n sun: Sun,\r\n moon: Moon,\r\n}\r\n\r\n/**\r\n * ๋์ ์์ด์ฝ ๋ก๋ฉ์ ์ํ ํจ์ (๋์ค์ ํ์ฅ ๊ฐ๋ฅ)\r\n * ํ์ฌ๋ ์ฌ์ฉํ์ง ์์ง๋ง ํฅํ ์ปค์คํ
์์ด์ฝ ์ง์์ ์ํด ์ค๋น\r\n */\r\n// const loadCustomIcon = async (iconName: string): Promise<LucideIcon | null> => {\r\n// try {\r\n// // ๋์ค์ ๋ค๋ฅธ ์์ด์ฝ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ปค์คํ
์์ด์ฝ์ ๋์ ์ผ๋ก ๋ก๋ํ ์ ์์\r\n// // ์: const { [iconName]: IconComponent } = await import('@/assets/icons')\r\n// return null\r\n// } catch {\r\n// return null\r\n// }\r\n// }\r\n\r\n/**\r\n * size -> ์ค์ ํฌ๊ธฐ ๋งคํ\r\n */\r\nconst SIZE_PRESETS: Record<SizeType, number> = {\n xs: 12,\n sm: 16,\n md: 20,\n lg: 24,\n xl: 32,\n}\n\r\n/**\r\n * styletype -> color, class ๋งคํ\r\n */\r\nconst STYLE_PRESETS: Record<StyleType, { color?: string; class: string }> = {\r\n default: { class: '' },\r\n primary: { \r\n color: '#3b82f6',\r\n class: '',\r\n },\r\n success: { \r\n color: '#10b981',\r\n class: '',\r\n },\r\n warning: { \r\n color: '#f59e0b',\r\n class: '',\r\n },\r\n danger: { \r\n color: '#ef4444',\r\n class: '',\r\n },\r\n}\r\n\r\n/** ์ต์ข
๋ฐ์ธ๋ฉ: ์ง์ ๋๊ธด props๊ฐ ์์ผ๋ฉด styletype ๊ธฐ๋ณธ๊ฐ๊ณผ ๋ณํฉ */\r\nconst mapped = computed(() => {\r\n const stylePreset = STYLE_PRESETS[props.styletype!]\r\n const sizePreset = SIZE_PRESETS[props.size!]\r\n const finalClass = [stylePreset.class, props.class].filter(Boolean).join(' ')\r\n const ariaLabel = props.ariaLabel || props.name\r\n \r\n return {\r\n size: sizePreset,\r\n color: props.color || stylePreset.color, // props.color๊ฐ ์์ผ๋ฉด ์ฐ์ ์ฌ์ฉ, ์์ผ๋ฉด stylePreset.color ์ฌ์ฉ\r\n class: finalClass,\r\n 'aria-label': ariaLabel,\r\n 'aria-hidden': !ariaLabel,\r\n role: props.role,\r\n }\r\n})\r\n\r\n/** ํ์ฌ ์์ด์ฝ ์ปดํฌ๋ํธ */\r\nconst IconComponent = computed(() => {\r\n // ๊ธฐ๋ณธ ์์ด์ฝ ๋จผ์ ํ์ธ\r\n if (props.name in baseIconMap) {\r\n return baseIconMap[props.name as BaseIconName]\r\n }\r\n \r\n // ์ปค์คํ
์์ด์ฝ์ ๋์ค์ ํ์ฅ\r\n // return loadCustomIcon(props.name)\r\n \r\n // ๊ธฐ๋ณธ๊ฐ์ผ๋ก house ์์ด์ฝ ๋ฐํ\r\n return House\r\n})\r\n</script>\r\n\r\n<template>\r\n <component \r\n :is=\"IconComponent\" \r\n v-bind=\"mapped\"\r\n />\r\n</template>"],"names":["props","__props","baseIconMap","House","User","Settings","Search","Plus","Minus","SquarePen","Trash2","Save","Download","Upload","Eye","EyeOff","Heart","Star","Check","X","CircleAlert","Info","ChevronDown","ChevronUp","ChevronLeft","ChevronRight","Menu","Ellipsis","EllipsisVertical","Palette","Package","PackageCheck","PackageX","Truck","Warehouse","Boxes","Archive","ClipboardList","ClipboardCheck","FileText","ChartBar","TrendingUp","TrendingDown","Calendar","Clock","MapPin","Table","List","ListFilter","ArrowUpWideNarrow","ArrowDownWideNarrow","Scale","Server","Database","Link","ArrowLeftRight","CircleQuestionMark","Monitor","Users","Code","FileKey","Cpu","Rocket","FileSpreadsheet","Activity","MessageCircle","Book","LogIn","LogOut","Copy","Clipboard","Undo2","Redo2","Pencil","Folder","FolderPlus","FolderOpen","FilePlus","FileSearch","FilePen","FileMinus","Mail","Send","Phone","Bell","BellOff","MessageSquare","ArrowUp","ArrowDown","ArrowLeft","ArrowRight","RotateCw","RotateCcw","RefreshCw","Move","CircleCheckBig","CircleX","Circle","Lock","LockOpen","Shield","ShieldCheck","ShieldAlert","UserPlus","UserMinus","UserCheck","UserX","CircleUser","Power","Zap","Target","Flag","Funnel","Building","Briefcase","Globe","Printer","Share2","ExternalLink","Maximize2","Minimize2","MoveVertical","MoveHorizontal","Sun","Moon","SIZE_PRESETS","STYLE_PRESETS","mapped","computed","stylePreset","sizePreset","finalClass","ariaLabel","IconComponent","_createBlock","_resolveDynamicComponent","_normalizeProps","_guardReactiveProps"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"JIcon.vue.cjs","sources":["../../../../src/components/atoms/JIcon.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { \n House, \n User, \n Settings, \n Search, \n Plus, \n Minus, \n SquarePen, \n Trash2, \n Save, \n Download,\n Upload,\n Eye,\n EyeOff,\n Heart,\n Star,\n Check,\n X,\n CircleAlert,\n Info,\n ChevronDown,\n ChevronUp,\n ChevronLeft,\n ChevronRight,\n Menu,\n Ellipsis,\n EllipsisVertical,\n Palette,\n // WMS ํต์ฌ ์์ด์ฝ๋ค\n Package,\n PackageCheck,\n PackageX,\n Truck,\n Warehouse,\n Boxes,\n Archive,\n ClipboardList,\n ClipboardCheck,\n FileText,\n ChartBar,\n TrendingUp,\n TrendingDown,\n Calendar,\n Clock,\n MapPin,\n Table,\n List,\n ListFilter,\n ArrowUpWideNarrow,\n ArrowDownWideNarrow,\n Scale,\n // ์ถ๊ฐ ์์ด์ฝ๋ค\n Server,\n Database,\n Link,\n ArrowLeftRight,\n CircleQuestionMark,\n Monitor,\n Users,\n Code,\n FileKey,\n Cpu,\n Rocket,\n FileSpreadsheet,\n Activity,\n MessageCircle,\n Book,\n LogIn,\n LogOut,\n // ํธ์ง ๊ด๋ จ\n Copy,\n Clipboard,\n Undo2,\n Redo2,\n Pencil,\n // ํ์ผ/ํด๋ ๊ด๋ จ\n Folder,\n FolderPlus,\n FolderOpen,\n FilePlus,\n FileSearch,\n FilePen,\n FileMinus,\n // ํต์ /์๋ฆผ ๊ด๋ จ\n Mail,\n Send,\n Phone,\n Bell,\n BellOff,\n MessageSquare,\n // ํ์ดํ/๋ฐฉํฅ ๊ด๋ จ\n ArrowUp,\n ArrowDown,\n ArrowLeft,\n ArrowRight,\n RotateCw,\n RotateCcw,\n RefreshCw,\n Move,\n // ์ํ/ํผ๋๋ฐฑ ๊ด๋ จ\n CircleCheckBig,\n CircleX,\n Circle,\n // ๋ณด์ ๊ด๋ จ\n Lock,\n LockOpen,\n Shield,\n ShieldCheck,\n ShieldAlert,\n // ์ฌ์ฉ์ ๊ด๋ฆฌ ๊ด๋ จ\n UserPlus,\n UserMinus,\n UserCheck,\n UserX,\n CircleUser,\n // ์ก์
๊ด๋ จ\n Power,\n Zap,\n Target,\n Flag,\n Funnel,\n // ์กฐ์ง/ํ ๊ด๋ จ\n Building,\n Briefcase,\n Globe,\n // ๊ธฐํ ์ ์ฉํ ์์ด์ฝ\n Printer,\n Share2,\n ExternalLink,\n Maximize2,\n Minimize2,\n MoveVertical,\n MoveHorizontal,\n Sun,\n Moon,\n type LucideIcon\n} from 'lucide-vue-next'\n\n// ํ์ฅ ๊ฐ๋ฅํ ์์ด์ฝ ํ์
\ntype BaseIconName = \n | 'house' | 'user' | 'settings' | 'search' | 'plus' | 'minus'\n | 'squarePen' | 'trash2' | 'save' | 'download' | 'upload'\n | 'eye' | 'eyeOff' | 'heart' | 'star' | 'check' | 'x'\n | 'circleAlert' | 'info' | 'chevronDown' | 'chevronUp'\n | 'chevronLeft' | 'chevronRight' | 'menu' | 'ellipsis' | 'ellipsisVertical'\n | 'palette'\n // WMS ํต์ฌ ์์ด์ฝ๋ค\n | 'package' | 'packageCheck' | 'packageX'\n | 'truck' | 'warehouse' | 'boxes'\n | 'archive' | 'clipboardList' | 'clipboardCheck'\n | 'fileText' | 'chartBar'\n | 'trendingUp' | 'trendingDown' | 'calendar' | 'clock'\n | 'mapPin' | 'table' | 'list' | 'listFilter'\n | 'arrowUpWideNarrow' | 'arrowDownWideNarrow' | 'scale'\n // ์ถ๊ฐ ์์ด์ฝ๋ค\n | 'server' | 'database' | 'link' | 'arrowLeftRight' | 'circleQuestionMark'\n | 'monitor' | 'users' | 'code' | 'fileKey' | 'cpu'\n | 'rocket' | 'fileSpreadsheet' | 'activity' | 'messageCircle' | 'book'\n // ์ธ์ฆ ๊ด๋ จ ์์ด์ฝ๋ค\n | 'logIn' | 'logOut'\n // ํธ์ง ๊ด๋ จ ์์ด์ฝ๋ค\n | 'copy' | 'clipboard' | 'undo2' | 'redo2' | 'pencil'\n // ํ์ผ/ํด๋ ๊ด๋ จ ์์ด์ฝ๋ค\n | 'folder' | 'folderPlus' | 'folderOpen' | 'filePlus' | 'fileSearch' | 'filePen' | 'fileMinus'\n // ํต์ /์๋ฆผ ๊ด๋ จ ์์ด์ฝ๋ค\n | 'mail' | 'send' | 'phone' | 'bell' | 'bellOff' | 'messageSquare'\n // ํ์ดํ/๋ฐฉํฅ ๊ด๋ จ ์์ด์ฝ๋ค\n | 'arrowUp' | 'arrowDown' | 'arrowLeft' | 'arrowRight' | 'rotateCw' | 'rotateCcw' | 'refreshCw' | 'move'\n // ์ํ/ํผ๋๋ฐฑ ๊ด๋ จ ์์ด์ฝ๋ค\n | 'circleCheckBig' | 'circleX' | 'circle'\n // ๋ณด์ ๊ด๋ จ ์์ด์ฝ๋ค\n | 'lock' | 'lockOpen' | 'shield' | 'shieldCheck' | 'shieldAlert'\n // ์ฌ์ฉ์ ๊ด๋ฆฌ ๊ด๋ จ ์์ด์ฝ๋ค\n | 'userPlus' | 'userMinus' | 'userCheck' | 'userX' | 'circleUser'\n // ์ก์
๊ด๋ จ ์์ด์ฝ๋ค\n | 'power' | 'zap' | 'target' | 'flag' | 'funnel'\n // ์กฐ์ง/ํ ๊ด๋ จ ์์ด์ฝ๋ค\n | 'building' | 'briefcase' | 'globe'\n // ๊ธฐํ ์ ์ฉํ ์์ด์ฝ๋ค\n | 'printer' | 'share2' | 'externalLink' | 'maximize2' | 'minimize2' | 'moveVertical' | 'moveHorizontal'\n | 'sun' | 'moon'\n\n// ์ปค์คํ
์์ด์ฝ ํ์ฅ์ ์ํ ํ์
\ntype CustomIconName = string // ๋์ค์ ํ์ฅ ๊ฐ๋ฅ\n\ntype IconName = BaseIconName | CustomIconName\n\ntype StyleType =\n | 'default' // ๊ธฐ๋ณธ ์คํ์ผ\n | 'primary' // ๊ฐ์กฐ ์คํ์ผ (ํ๋)\n | 'success' // ์ฑ๊ณต ์คํ์ผ (์ด๋ก)\n | 'warning' // ๊ฒฝ๊ณ ์คํ์ผ (์ฃผํฉ)\n | 'danger' // ์ํ ์คํ์ผ (๋นจ๊ฐ)\n\ntype SizeType = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n\nconst props = withDefaults(\n defineProps<{\n name: IconName\n size?: SizeType\n color?: string\n class?: string\n /** ์คํ์ผ ํ๋ฆฌ์
*/\n styletype?: StyleType\n /** ์ ๊ทผ์ฑ ๋ผ๋ฒจ */\n ariaLabel?: string\n /** ์ ๊ทผ์ฑ ์ญํ */\n role?: string\n }>(),\n {\n size: 'sm',\n styletype: 'default',\n role: 'img',\n },\n)\n\n/**\n * ๊ธฐ๋ณธ ์์ด์ฝ ๋งคํ (ํ์
์์ )\n */\nconst baseIconMap: Record<BaseIconName, LucideIcon> = {\n house: House,\n user: User,\n settings: Settings,\n search: Search,\n plus: Plus,\n minus: Minus,\n squarePen: SquarePen,\n trash2: Trash2,\n save: Save,\n download: Download,\n upload: Upload,\n eye: Eye,\n eyeOff: EyeOff,\n heart: Heart,\n star: Star,\n check: Check,\n x: X,\n circleAlert: CircleAlert,\n info: Info,\n chevronDown: ChevronDown,\n chevronUp: ChevronUp,\n chevronLeft: ChevronLeft,\n chevronRight: ChevronRight,\n menu: Menu,\n ellipsis: Ellipsis,\n ellipsisVertical: EllipsisVertical,\n palette: Palette,\n // WMS ํต์ฌ ์์ด์ฝ๋ค\n package: Package,\n packageCheck: PackageCheck,\n packageX: PackageX,\n truck: Truck,\n warehouse: Warehouse,\n boxes: Boxes,\n archive: Archive,\n clipboardList: ClipboardList,\n clipboardCheck: ClipboardCheck,\n fileText: FileText,\n chartBar: ChartBar,\n trendingUp: TrendingUp,\n trendingDown: TrendingDown,\n calendar: Calendar,\n clock: Clock,\n mapPin: MapPin,\n table: Table,\n list: List,\n listFilter: ListFilter,\n arrowUpWideNarrow: ArrowUpWideNarrow,\n arrowDownWideNarrow: ArrowDownWideNarrow,\n scale: Scale,\n // ์ถ๊ฐ ์์ด์ฝ๋ค\n server: Server,\n database: Database,\n link: Link,\n arrowLeftRight: ArrowLeftRight,\n circleQuestionMark: CircleQuestionMark,\n monitor: Monitor,\n users: Users,\n code: Code,\n fileKey: FileKey,\n cpu: Cpu,\n rocket: Rocket,\n fileSpreadsheet: FileSpreadsheet,\n activity: Activity,\n messageCircle: MessageCircle,\n book: Book,\n // ์ธ์ฆ ๊ด๋ จ ์์ด์ฝ๋ค\n logIn: LogIn,\n logOut: LogOut,\n // ํธ์ง ๊ด๋ จ ์์ด์ฝ๋ค\n copy: Copy,\n clipboard: Clipboard,\n undo2: Undo2,\n redo2: Redo2,\n pencil: Pencil,\n // ํ์ผ/ํด๋ ๊ด๋ จ ์์ด์ฝ๋ค\n folder: Folder,\n folderPlus: FolderPlus,\n folderOpen: FolderOpen,\n filePlus: FilePlus,\n fileSearch: FileSearch,\n filePen: FilePen,\n fileMinus: FileMinus,\n // ํต์ /์๋ฆผ ๊ด๋ จ ์์ด์ฝ๋ค\n mail: Mail,\n send: Send,\n phone: Phone,\n bell: Bell,\n bellOff: BellOff,\n messageSquare: MessageSquare,\n // ํ์ดํ/๋ฐฉํฅ ๊ด๋ จ ์์ด์ฝ๋ค\n arrowUp: ArrowUp,\n arrowDown: ArrowDown,\n arrowLeft: ArrowLeft,\n arrowRight: ArrowRight,\n rotateCw: RotateCw,\n rotateCcw: RotateCcw,\n refreshCw: RefreshCw,\n move: Move,\n // ์ํ/ํผ๋๋ฐฑ ๊ด๋ จ ์์ด์ฝ๋ค\n circleCheckBig: CircleCheckBig,\n circleX: CircleX,\n circle: Circle,\n // ๋ณด์ ๊ด๋ จ ์์ด์ฝ๋ค\n lock: Lock,\n lockOpen: LockOpen,\n shield: Shield,\n shieldCheck: ShieldCheck,\n shieldAlert: ShieldAlert,\n // ์ฌ์ฉ์ ๊ด๋ฆฌ ๊ด๋ จ ์์ด์ฝ๋ค\n userPlus: UserPlus,\n userMinus: UserMinus,\n userCheck: UserCheck,\n userX: UserX,\n circleUser: CircleUser,\n // ์ก์
๊ด๋ จ ์์ด์ฝ๋ค\n power: Power,\n zap: Zap,\n target: Target,\n flag: Flag,\n funnel: Funnel,\n // ์กฐ์ง/ํ ๊ด๋ จ ์์ด์ฝ๋ค\n building: Building,\n briefcase: Briefcase,\n globe: Globe,\n // ๊ธฐํ ์ ์ฉํ ์์ด์ฝ๋ค\n printer: Printer,\n share2: Share2,\n externalLink: ExternalLink,\n maximize2: Maximize2,\n minimize2: Minimize2,\n moveVertical: MoveVertical,\n moveHorizontal: MoveHorizontal,\n sun: Sun,\n moon: Moon,\n}\n\n/**\n * ๋์ ์์ด์ฝ ๋ก๋ฉ์ ์ํ ํจ์ (๋์ค์ ํ์ฅ ๊ฐ๋ฅ)\n * ํ์ฌ๋ ์ฌ์ฉํ์ง ์์ง๋ง ํฅํ ์ปค์คํ
์์ด์ฝ ์ง์์ ์ํด ์ค๋น\n */\n// const loadCustomIcon = async (iconName: string): Promise<LucideIcon | null> => {\n// try {\n// // ๋์ค์ ๋ค๋ฅธ ์์ด์ฝ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ปค์คํ
์์ด์ฝ์ ๋์ ์ผ๋ก ๋ก๋ํ ์ ์์\n// // ์: const { [iconName]: IconComponent } = await import('@/assets/icons')\n// return null\n// } catch {\n// return null\n// }\n// }\n\n/**\n * size -> ์ค์ ํฌ๊ธฐ ๋งคํ\n */\nconst SIZE_PRESETS: Record<SizeType, number> = {\n xs: 12,\n sm: 16,\n md: 20,\n lg: 24,\n xl: 32,\n}\n\n/**\n * styletype -> color, class ๋งคํ\n */\nconst STYLE_PRESETS: Record<StyleType, { color?: string; class: string }> = {\n default: { class: '' },\n primary: { \n color: '#3b82f6',\n class: '',\n },\n success: { \n color: '#10b981',\n class: '',\n },\n warning: { \n color: '#f59e0b',\n class: '',\n },\n danger: { \n color: '#ef4444',\n class: '',\n },\n}\n\n/** ์ต์ข
๋ฐ์ธ๋ฉ: ์ง์ ๋๊ธด props๊ฐ ์์ผ๋ฉด styletype ๊ธฐ๋ณธ๊ฐ๊ณผ ๋ณํฉ */\nconst mapped = computed(() => {\n const stylePreset = STYLE_PRESETS[props.styletype!]\n const sizePreset = SIZE_PRESETS[props.size!]\n const finalClass = [stylePreset.class, props.class].filter(Boolean).join(' ')\n const ariaLabel = props.ariaLabel || props.name\n \n return {\n size: sizePreset,\n color: props.color || stylePreset.color, // props.color๊ฐ ์์ผ๋ฉด ์ฐ์ ์ฌ์ฉ, ์์ผ๋ฉด stylePreset.color ์ฌ์ฉ\n class: finalClass,\n 'aria-label': ariaLabel,\n 'aria-hidden': !ariaLabel,\n role: props.role,\n }\n})\n\n/** ํ์ฌ ์์ด์ฝ ์ปดํฌ๋ํธ */\nconst IconComponent = computed(() => {\n // ๊ธฐ๋ณธ ์์ด์ฝ ๋จผ์ ํ์ธ\n if (props.name in baseIconMap) {\n return baseIconMap[props.name as BaseIconName]\n }\n \n // ์ปค์คํ
์์ด์ฝ์ ๋์ค์ ํ์ฅ\n // return loadCustomIcon(props.name)\n \n // ๊ธฐ๋ณธ๊ฐ์ผ๋ก house ์์ด์ฝ ๋ฐํ\n return House\n})\n</script>\n\n<template>\n <component \n :is=\"IconComponent\" \n v-bind=\"mapped\"\n />\n</template>"],"names":["props","__props","baseIconMap","House","User","Settings","Search","Plus","Minus","SquarePen","Trash2","Save","Download","Upload","Eye","EyeOff","Heart","Star","Check","X","CircleAlert","Info","ChevronDown","ChevronUp","ChevronLeft","ChevronRight","Menu","Ellipsis","EllipsisVertical","Palette","Package","PackageCheck","PackageX","Truck","Warehouse","Boxes","Archive","ClipboardList","ClipboardCheck","FileText","ChartBar","TrendingUp","TrendingDown","Calendar","Clock","MapPin","Table","List","ListFilter","ArrowUpWideNarrow","ArrowDownWideNarrow","Scale","Server","Database","Link","ArrowLeftRight","CircleQuestionMark","Monitor","Users","Code","FileKey","Cpu","Rocket","FileSpreadsheet","Activity","MessageCircle","Book","LogIn","LogOut","Copy","Clipboard","Undo2","Redo2","Pencil","Folder","FolderPlus","FolderOpen","FilePlus","FileSearch","FilePen","FileMinus","Mail","Send","Phone","Bell","BellOff","MessageSquare","ArrowUp","ArrowDown","ArrowLeft","ArrowRight","RotateCw","RotateCcw","RefreshCw","Move","CircleCheckBig","CircleX","Circle","Lock","LockOpen","Shield","ShieldCheck","ShieldAlert","UserPlus","UserMinus","UserCheck","UserX","CircleUser","Power","Zap","Target","Flag","Funnel","Building","Briefcase","Globe","Printer","Share2","ExternalLink","Maximize2","Minimize2","MoveVertical","MoveHorizontal","Sun","Moon","SIZE_PRESETS","STYLE_PRESETS","mapped","computed","stylePreset","sizePreset","finalClass","ariaLabel","IconComponent","_createBlock","_resolveDynamicComponent","_normalizeProps","_guardReactiveProps"],"mappings":"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"}
|