@j-solution/components 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +6 -6
  2. package/assets/jwms-portal-frontend-DntSIcYt.css +1 -0
  3. package/assets/styles/j-components.css +1 -1
  4. package/components/atoms/JGrid.vue.cjs +1 -1
  5. package/components/atoms/JGrid.vue.js +2 -2
  6. package/components/atoms/JGrid.vue2.cjs +1 -1
  7. package/components/atoms/JGrid.vue2.cjs.map +1 -1
  8. package/components/atoms/JGrid.vue2.js +124 -56
  9. package/components/atoms/JGrid.vue2.js.map +1 -1
  10. package/components/atoms/JSplitter.vue.cjs +2 -0
  11. package/components/atoms/JSplitter.vue.cjs.map +1 -0
  12. package/components/atoms/JSplitter.vue.js +57 -0
  13. package/components/atoms/JSplitter.vue.js.map +1 -0
  14. package/components/atoms/JSplitter.vue2.cjs +2 -0
  15. package/components/atoms/JSplitter.vue2.cjs.map +1 -0
  16. package/components/atoms/JSplitter.vue2.js +5 -0
  17. package/components/atoms/JSplitter.vue2.js.map +1 -0
  18. package/components/molecules/JTitlebar.vue.cjs +1 -1
  19. package/components/molecules/JTitlebar.vue.cjs.map +1 -1
  20. package/components/molecules/JTitlebar.vue.js +48 -40
  21. package/components/molecules/JTitlebar.vue.js.map +1 -1
  22. package/components/organisms/JFilterBar.vue.cjs +1 -1
  23. package/components/organisms/JFilterBar.vue.cjs.map +1 -1
  24. package/components/organisms/JFilterBar.vue.js +60 -53
  25. package/components/organisms/JFilterBar.vue.js.map +1 -1
  26. package/components/shadcn/resizable/ResizableHandle.vue.cjs +2 -0
  27. package/components/shadcn/resizable/ResizableHandle.vue.cjs.map +1 -0
  28. package/components/shadcn/resizable/ResizableHandle.vue.js +40 -0
  29. package/components/shadcn/resizable/ResizableHandle.vue.js.map +1 -0
  30. package/components/shadcn/resizable/ResizableHandle.vue2.cjs +2 -0
  31. package/components/shadcn/resizable/ResizableHandle.vue2.cjs.map +1 -0
  32. package/components/shadcn/resizable/ResizableHandle.vue2.js +5 -0
  33. package/components/shadcn/resizable/ResizableHandle.vue2.js.map +1 -0
  34. package/components/shadcn/resizable/ResizablePanelGroup.vue.cjs +2 -0
  35. package/components/shadcn/resizable/ResizablePanelGroup.vue.cjs.map +1 -0
  36. package/components/shadcn/resizable/ResizablePanelGroup.vue.js +33 -0
  37. package/components/shadcn/resizable/ResizablePanelGroup.vue.js.map +1 -0
  38. package/components/shadcn/resizable/ResizablePanelGroup.vue2.cjs +2 -0
  39. package/components/shadcn/resizable/ResizablePanelGroup.vue2.cjs.map +1 -0
  40. package/components/shadcn/resizable/ResizablePanelGroup.vue2.js +5 -0
  41. package/components/shadcn/resizable/ResizablePanelGroup.vue2.js.map +1 -0
  42. package/index.cjs +1 -1
  43. package/index.js +56 -54
  44. package/package.json +2 -2
  45. package/types/index.d.ts +232 -136
  46. package/assets/jwms-portal-frontend-uK756XTb.css +0 -1
@@ -3,5 +3,5 @@
3
3
  for (const [t_key, t_val] of t_opts)
4
4
  t_merged[t_key] = t_val;
5
5
  return t_merged;
6
- };,u=t(e.default,[["__scopeId","data-v-4b111a60"]]);exports.default=u;
6
+ };,u=t(e.default,[["__scopeId","data-v-8d4485e3"]]);exports.default=u;
7
7
  //# sourceMappingURL=JGrid.vue.cjs.map
@@ -6,8 +6,8 @@ const r = (r_comp, r_opts) => {
6
6
  r_merged[r_key] = r_val;
7
7
  return r_merged;
8
8
  };
9
- const p = /* @__PURE__ */ r(o, [["__scopeId", "data-v-4b111a60"]]);
9
+ const _ = /* @__PURE__ */ r(o, [["__scopeId", "data-v-8d4485e3"]]);
10
10
  export {
11
- p as default
11
+ _ as default
12
12
  };
13
13
  //# sourceMappingURL=JGrid.vue.js.map
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const l=require("vue"),b=require("ag-grid-vue3"),r=require("ag-grid-community"),v=require("ag-grid-enterprise");;/* empty css */;/* empty css */;/* empty css */const w={class:"ag-grid-container"},x=l.defineComponent({__name:"JGrid",props:{rowData:{},columnDefs:{},theme:{default:"ag-theme-balham"},pagination:{type:Boolean,default:!1},checkbox:{type:Boolean,default:!1},summaryColumn:{type:Boolean,default:!1},hiddenColumn:{type:Boolean,default:!1},enableGrouping:{type:Boolean,default:!1},enablePivot:{type:Boolean,default:!1},enableExcelExport:{type:Boolean,default:!1},enableTreeData:{type:Boolean,default:!1},getDataPath:{type:Function,default:void 0},autoGroupColumnDef:{default:void 0},selectedRows:{default:()=>[]}},emits:["rowClicked","rowDoubleClicked","cellClicked","selectionChanged","cellValueChanged","gridReady","update:selectedRows"],setup(n,{expose:c,emit:d}){r.ModuleRegistry.registerModules([r.AllCommunityModule,v.AllEnterpriseModule]);const e=n,t=d,a=l.ref(null),s=l.ref(null),u=l.computed(()=>{if(!e.checkbox)return e.columnDefs;const o=[...e.columnDefs];return o.length>0&&(o[0]={...o[0],checkboxSelection:!0,headerCheckboxSelection:!0}),o}),p=l.computed(()=>({columnDefs:u.value,rowData:e.rowData,pagination:e.pagination,rowSelection:e.checkbox?"multiple":void 0,suppressRowClickSelection:e.checkbox,sideBar:e.enableGrouping||e.enablePivot?{toolPanels:[{id:"columns",labelDefault:"Columns",labelKey:"columns",iconKey:"columns",toolPanel:"agColumnsToolPanel",toolPanelParams:{suppressRowGroups:!e.enableGrouping,suppressValues:!e.enablePivot,suppressPivots:!e.enablePivot,suppressPivotMode:!e.enablePivot}}],defaultToolPanel:"columns",hiddenByDefault:!1}:void 0,groupDefaultExpanded:e.enableGrouping||e.enableTreeData?1:void 0,suppressAggFuncInHeader:!1,treeData:e.enableTreeData||void 0,getDataPath:e.enableTreeData?e.getDataPath||(i=>i.path||[]):void 0,autoGroupColumnDef:e.enableTreeData&&e.autoGroupColumnDef?e.autoGroupColumnDef:void 0}));c({gridApi:a,gridColumnApi:s,exportToExcel:()=>{a.value&&e.enableExcelExport&&a.value.exportDataAsExcel({fileName:"grid-export.xlsx"})}});const f=o=>{a.value=o.api,s.value=o.api,t("gridReady",o)},m=o=>{t("rowClicked",o)},g=o=>{t("rowDoubleClicked",o)},D=o=>{t("cellClicked",o)},C=o=>{t("selectionChanged",o),t("update:selectedRows",o.api.getSelectedRows())},h=o=>{t("cellValueChanged",o)};return l.watch(()=>e.columnDefs,()=>{a.value&&a.value.setGridOption("columnDefs",u.value)},{deep:!0}),l.watch(()=>e.rowData,()=>{a.value&&a.value.setGridOption("rowData",e.rowData)},{deep:!0}),(o,i)=>(l.openBlock(),l.createElementBlock("div",w,[l.createVNode(l.unref(b.AgGridVue),{"column-defs":u.value,"row-data":n.rowData,"grid-options":p.value,class:l.normalizeClass(n.theme),style:{height:"100%",width:"100%"},onGridReady:f,onRowClicked:m,onRowDoubleClicked:g,onCellClicked:D,onSelectionChanged:C,onCellValueChanged:h},null,8,["column-defs","row-data","grid-options","class"])]))}});exports.default=x;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const a=require("vue"),T=require("ag-grid-vue3"),v=require("ag-grid-community"),N=require("ag-grid-enterprise");;/* empty css */;/* empty css */;/* empty css */const S={class:"ag-grid-container"},A=a.defineComponent({__name:"JGrid",props:{rowData:{},columnDefs:{},theme:{default:"ag-theme-balham"},pagination:{type:Boolean,default:!0},checkbox:{type:Boolean,default:!1},rowNumbers:{type:Boolean,default:!0},actionButtons:{default:void 0},autoDetectDarkMode:{type:Boolean,default:!0},summaryColumn:{type:Boolean,default:!1},hiddenColumn:{type:Boolean,default:!1},enableGrouping:{type:Boolean,default:!0},enablePivot:{type:Boolean,default:!1},enableExcelExport:{type:Boolean,default:!1},enableTreeData:{type:Boolean,default:!1},getDataPath:{type:Function,default:void 0},autoGroupColumnDef:{default:void 0},selectedRows:{default:()=>[]},columnHover:{type:Boolean,default:!0},enableColumnsToolPanel:{type:Boolean,default:!0},statusBar:{type:Boolean,default:!0}},emits:["rowClicked","rowDoubleClicked","cellClicked","selectionChanged","cellValueChanged","gridReady","update:selectedRows"],setup(c,{expose:b,emit:y}){v.ModuleRegistry.registerModules([v.AllCommunityModule,N.AllEnterpriseModule]);const e=c,r=y,n=a.ref(null),d=a.ref(null),p=a.ref(!1),f=()=>{p.value=document.documentElement.classList.contains("dark")},x=a.computed(()=>{if(!e.autoDetectDarkMode)return e.theme;const t=e.theme;return p.value?t.includes("-dark")?t:`${t}-dark`:t.replace(/-dark$/,"")}),k=t=>{const u=e.actionButtons||[],h=t.data,C=u.filter(o=>o.show?o.show(h):!0);if(C.length===0)return"";const i=document.createElement("div");return i.className="flex items-center gap-1",C.forEach(o=>{const l=document.createElement("button");l.className="px-2 py-1 text-xs border rounded transition-colors",o.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",o.tooltip&&(l.title=o.tooltip),o.label?l.textContent=o.label:o.icon&&(o.icon==="pencil"?l.textContent="수정":o.icon==="trash2"||o.icon==="trash"?l.textContent="삭제":o.icon==="eye"?l.textContent="보기":o.icon==="copy"?l.textContent="복사":o.icon==="download"?l.textContent="다운로드":o.icon==="circleX"?l.textContent="비활성화":o.icon==="circleCheckBig"?l.textContent="활성화":l.textContent=o.icon),l.addEventListener("click",R=>{R.stopPropagation(),o.onClick(h)}),i.appendChild(l)}),i},m=a.computed(()=>!e.actionButtons||e.actionButtons.length===0?null:{colId:"actionButtons",headerName:"작업",field:"_actions",width:120,minWidth:80,maxWidth:200,lockPosition:"left",sortable:!1,filter:!1,resizable:!0,suppressNavigable:!0,suppressHeaderMenuButton:!0,cellRenderer:k,cellStyle:{display:"flex",justifyContent:"center",alignItems:"center"}}),g=a.computed(()=>{const t=[];return e.checkbox&&t.push({colId:"rowSelection",headerName:"",width:50,minWidth:50,maxWidth:50,lockPosition:"left",checkboxSelection:!0,headerCheckboxSelection:!0,sortable:!1,filter:!1,resizable:!1,suppressNavigable:!0,suppressHeaderMenuButton:!0,cellStyle:{display:"flex",justifyContent:"center",alignItems:"center"}}),m.value&&t.push(m.value),t.push(...e.columnDefs),t}),D=a.computed(()=>({pagination:e.pagination,rowSelection:e.checkbox?"multiple":void 0,suppressRowClickSelection:e.checkbox,rowNumbers:e.rowNumbers,columnHoverHighlight:e.columnHover,sideBar:e.enableColumnsToolPanel||e.enableGrouping||e.enablePivot?{toolPanels:[{id:"columns",labelDefault:"Columns",labelKey:"columns",iconKey:"columns",toolPanel:"agColumnsToolPanel",toolPanelParams:{suppressRowGroups:!e.enableGrouping,suppressValues:!e.enablePivot,suppressPivots:!e.enablePivot,suppressPivotMode:!e.enablePivot}}],defaultToolPanel:""}:void 0,statusBar:e.statusBar?{statusPanels:[{statusPanel:"agTotalAndFilteredRowCountComponent",align:"left"},{statusPanel:"agSelectedRowCountComponent",align:"left"},{statusPanel:"agAggregationComponent",align:"right"}]}:void 0,groupDefaultExpanded:e.enableGrouping||e.enableTreeData?1:void 0,suppressAggFuncInHeader:!1,treeData:e.enableTreeData||void 0,getDataPath:e.enableTreeData?e.getDataPath||(u=>u.path||[]):void 0,autoGroupColumnDef:e.enableTreeData&&e.autoGroupColumnDef?e.autoGroupColumnDef:void 0}));b({gridApi:n,gridColumnApi:d,exportToExcel:()=>{n.value&&e.enableExcelExport&&n.value.exportDataAsExcel({fileName:"grid-export.xlsx"})}});const w=t=>{n.value=t.api,d.value=t.api,r("gridReady",t)},B=t=>{r("rowClicked",t)},P=t=>{r("rowDoubleClicked",t)},E=t=>{r("cellClicked",t)},G=t=>{r("selectionChanged",t),r("update:selectedRows",t.api.getSelectedRows())},M=t=>{r("cellValueChanged",t)};let s=null;return a.onMounted(()=>{e.autoDetectDarkMode&&(f(),s=new MutationObserver(()=>{f()}),s.observe(document.documentElement,{attributes:!0,attributeFilter:["class"]}))}),a.onUnmounted(()=>{s&&s.disconnect()}),a.watch(()=>e.columnDefs,()=>{n.value&&n.value.setGridOption("columnDefs",g.value)},{deep:!0}),a.watch(()=>e.rowData,()=>{n.value&&n.value.setGridOption("rowData",e.rowData)},{deep:!0}),(t,u)=>(a.openBlock(),a.createElementBlock("div",S,[a.createVNode(a.unref(T.AgGridVue),{"column-defs":g.value,"row-data":c.rowData,"grid-options":D.value,class:a.normalizeClass(x.value),style:{height:"100%",width:"100%"},onGridReady:w,onRowClicked:B,onRowDoubleClicked:P,onCellClicked:E,onSelectionChanged:G,onCellValueChanged:M},null,8,["column-defs","row-data","grid-options","class"])]))}});exports.default=A;
2
2
  //# sourceMappingURL=JGrid.vue2.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"JGrid.vue2.cjs","sources":["../../../../src/components/atoms/JGrid.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed, ref, watch } from 'vue'\r\nimport { AgGridVue } from 'ag-grid-vue3'\r\nimport type {\r\n ColDef,\r\n GridOptions,\r\n RowClickedEvent,\r\n CellClickedEvent,\r\n SelectionChangedEvent,\r\n CellValueChangedEvent,\r\n RowDoubleClickedEvent,\r\n GridReadyEvent,\r\n} from 'ag-grid-community'\r\nimport { ModuleRegistry, AllCommunityModule } from 'ag-grid-community'\r\n// Enterprise 모듈 import (Grouping, Pivot, Excel Export 등)\r\nimport { AllEnterpriseModule } from 'ag-grid-enterprise'\r\n// ag-grid.css는 제거 - v34에서 Theming API와 충돌 방지\r\n// 테마 CSS 파일만 사용 (클래스 기반 테마)\r\n// v34에서는 dark 테마가 같은 CSS 파일 안에 포함되어 있음\r\n// 예: ag-theme-quartz.css에 .ag-theme-quartz-dark 클래스 포함\r\nimport 'ag-grid-community/styles/ag-theme-quartz.css'\r\nimport 'ag-grid-community/styles/ag-theme-alpine.css'\r\nimport 'ag-grid-community/styles/ag-theme-balham.css'\r\n\r\n// AG Grid 모듈 등록 (Community + Enterprise)\r\nModuleRegistry.registerModules([AllCommunityModule, AllEnterpriseModule])\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** 그리드에 표시할 데이터 배열 */\r\n rowData: any[]\r\n /** 컬럼 정의 배열 */\r\n columnDefs: ColDef[]\r\n /** ag-Grid 테마 */\r\n theme?: string\r\n /** 페이지네이션 활성화 여부 */\r\n pagination?: boolean\r\n /** 체크박스 선택 활성화 여부 */\r\n checkbox?: boolean\r\n /** 요약 컬럼 표시 여부 */\r\n summaryColumn?: boolean\r\n /** 숨김 컬럼 관리 활성화 여부 */\r\n hiddenColumn?: boolean\r\n /** 그룹핑 기능 활성화 여부 (Enterprise) */\r\n enableGrouping?: boolean\r\n /** 피벗 기능 활성화 여부 (Enterprise) */\r\n enablePivot?: boolean\r\n /** Excel 내보내기 기능 활성화 여부 (Enterprise) */\r\n enableExcelExport?: boolean\r\n /** Tree Data 기능 활성화 여부 (Enterprise) */\r\n enableTreeData?: boolean\r\n /** Tree Data 계층 경로를 반환하는 함수 */\r\n getDataPath?: (data: any) => (string | number)[]\r\n /** Tree Data 그룹 컬럼 정의 */\r\n autoGroupColumnDef?: ColDef\r\n /** 선택된 행 데이터 배열 (v-model:selected-rows) */\r\n selectedRows?: any[]\r\n }>(),\r\n {\r\n theme: 'ag-theme-balham',\r\n pagination: false,\r\n checkbox: false,\r\n summaryColumn: false,\r\n hiddenColumn: false,\r\n enableGrouping: false,\r\n enablePivot: false,\r\n enableExcelExport: false,\r\n enableTreeData: false,\r\n getDataPath: undefined,\r\n autoGroupColumnDef: undefined,\r\n selectedRows: () => [],\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n /** 행 클릭 이벤트 */\r\n rowClicked: [event: RowClickedEvent]\r\n /** 행 더블클릭 이벤트 */\r\n rowDoubleClicked: [event: RowDoubleClickedEvent]\r\n /** 셀 클릭 이벤트 */\r\n cellClicked: [event: CellClickedEvent]\r\n /** 선택 변경 이벤트 (체크박스 등) */\r\n selectionChanged: [event: SelectionChangedEvent]\r\n /** 셀 값 변경 이벤트 */\r\n cellValueChanged: [event: CellValueChangedEvent]\r\n /** 그리드 준비 완료 이벤트 */\r\n gridReady: [event: GridReadyEvent]\r\n /** 선택된 행 변경 이벤트 (v-model:selected-rows) */\r\n 'update:selectedRows': [rows: any[]]\r\n}>()\r\n\r\n// ag-Grid 인스턴스 참조\r\nconst gridApi = ref<any>(null)\r\nconst gridColumnApi = ref<any>(null)\r\n\r\n// checkbox 활성화 시 첫 번째 컬럼에 checkboxSelection 추가\r\nconst processedColumnDefs = computed(() => {\r\n if (!props.checkbox) {\r\n return props.columnDefs\r\n }\r\n\r\n const columnDefs = [...props.columnDefs]\r\n if (columnDefs.length > 0) {\r\n // 첫 번째 컬럼에 checkboxSelection 추가\r\n columnDefs[0] = {\r\n ...columnDefs[0],\r\n checkboxSelection: true,\r\n headerCheckboxSelection: true,\r\n }\r\n }\r\n return columnDefs\r\n})\r\n\r\n// Grid 옵션 설정\r\nconst gridOptions = computed<GridOptions>(() => {\r\n const options: GridOptions = {\r\n // theme 옵션 제거 - 클래스 기반 테마(:class=\"theme\") 사용\r\n columnDefs: processedColumnDefs.value,\r\n rowData: props.rowData,\r\n pagination: props.pagination,\r\n rowSelection: props.checkbox ? 'multiple' : undefined,\r\n // 체크박스 모드일 때 row 클릭으로 선택이 변경되지 않도록 설정\r\n // 체크박스만으로 선택을 제어하도록 함\r\n suppressRowClickSelection: props.checkbox,\r\n // suppressColumnsToolPanel은 ag-grid v34에서 더 이상 지원되지 않음\r\n // summaryColumn은 pinnedBottomRowData 또는 다른 옵션으로 구현 가능\r\n \r\n // Enterprise 기능 옵션\r\n sideBar: props.enableGrouping || props.enablePivot ? {\r\n toolPanels: [\r\n {\r\n id: 'columns',\r\n labelDefault: 'Columns',\r\n labelKey: 'columns',\r\n iconKey: 'columns',\r\n toolPanel: 'agColumnsToolPanel',\r\n toolPanelParams: {\r\n suppressRowGroups: !props.enableGrouping,\r\n suppressValues: !props.enablePivot,\r\n suppressPivots: !props.enablePivot,\r\n suppressPivotMode: !props.enablePivot,\r\n },\r\n },\r\n ],\r\n defaultToolPanel: 'columns',\r\n hiddenByDefault: false,\r\n } : undefined,\r\n \r\n // 그룹핑 기본 설정\r\n groupDefaultExpanded: props.enableGrouping || props.enableTreeData ? 1 : undefined,\r\n suppressAggFuncInHeader: false,\r\n\r\n // Tree Data 설정 (Enterprise)\r\n treeData: props.enableTreeData || undefined,\r\n getDataPath: props.enableTreeData\r\n ? (props.getDataPath || ((data: any) => data.path || []))\r\n : undefined,\r\n autoGroupColumnDef: props.enableTreeData && props.autoGroupColumnDef\r\n ? props.autoGroupColumnDef\r\n : undefined,\r\n }\r\n\r\n return options\r\n})\r\n\r\n// Excel 내보내기 함수 (외부에서 사용 가능하도록 expose)\r\nconst exportToExcel = () => {\r\n if (gridApi.value && props.enableExcelExport) {\r\n gridApi.value.exportDataAsExcel({\r\n fileName: 'grid-export.xlsx',\r\n })\r\n }\r\n}\r\n\r\n// 그리드 API를 외부에 노출\r\ndefineExpose({\r\n gridApi,\r\n gridColumnApi,\r\n exportToExcel,\r\n})\r\n\r\n// Grid ready 이벤트 핸들러\r\nconst onGridReady = (params: GridReadyEvent) => {\r\n gridApi.value = params.api\r\n gridColumnApi.value = params.api // v34에서 columnApi는 deprecated\r\n emit('gridReady', params)\r\n}\r\n\r\n// 행 클릭 이벤트 핸들러\r\nconst onRowClicked = (event: RowClickedEvent) => {\r\n emit('rowClicked', event)\r\n}\r\n\r\n// 행 더블클릭 이벤트 핸들러\r\nconst onRowDoubleClicked = (event: RowDoubleClickedEvent) => {\r\n emit('rowDoubleClicked', event)\r\n}\r\n\r\n// 셀 클릭 이벤트 핸들러\r\nconst onCellClicked = (event: CellClickedEvent) => {\r\n emit('cellClicked', event)\r\n}\r\n\r\n// 선택 변경 이벤트 핸들러\r\nconst onSelectionChanged = (event: SelectionChangedEvent) => {\r\n emit('selectionChanged', event)\r\n emit('update:selectedRows', event.api.getSelectedRows())\r\n}\r\n\r\n// 셀 값 변경 이벤트 핸들러\r\nconst onCellValueChanged = (event: CellValueChangedEvent) => {\r\n emit('cellValueChanged', event)\r\n}\r\n\r\n// columnDefs 변경 감지\r\nwatch(\r\n () => props.columnDefs,\r\n () => {\r\n if (gridApi.value) {\r\n gridApi.value.setGridOption('columnDefs', processedColumnDefs.value)\r\n }\r\n },\r\n { deep: true },\r\n)\r\n\r\n// rowData 변경 감지\r\nwatch(\r\n () => props.rowData,\r\n () => {\r\n if (gridApi.value) {\r\n gridApi.value.setGridOption('rowData', props.rowData)\r\n }\r\n },\r\n { deep: true },\r\n)\r\n</script>\r\n\r\n<template>\r\n <div class=\"ag-grid-container\">\r\n <AgGridVue\r\n :column-defs=\"processedColumnDefs\"\r\n :row-data=\"rowData\"\r\n :grid-options=\"gridOptions\"\r\n :class=\"theme\"\r\n style=\"height: 100%; width: 100%\"\r\n @grid-ready=\"onGridReady\"\r\n @row-clicked=\"onRowClicked\"\r\n @row-double-clicked=\"onRowDoubleClicked\"\r\n @cell-clicked=\"onCellClicked\"\r\n @selection-changed=\"onSelectionChanged\"\r\n @cell-value-changed=\"onCellValueChanged\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.ag-grid-container {\r\n width: 100%;\r\n height: 100%;\r\n}\r\n</style>\r\n"],"names":["ModuleRegistry","AllCommunityModule","AllEnterpriseModule","props","__props","emit","__emit","gridApi","ref","gridColumnApi","processedColumnDefs","computed","columnDefs","gridOptions","data","__expose","onGridReady","params","onRowClicked","event","onRowDoubleClicked","onCellClicked","onSelectionChanged","onCellValueChanged","watch","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_unref","AgGridVue"],"mappings":"yxCAyBAA,EAAAA,eAAe,gBAAgB,CAACC,EAAAA,mBAAoBC,EAAAA,mBAAmB,CAAC,EAExE,MAAMC,EAAQC,EA+CRC,EAAOC,EAkBPC,EAAUC,EAAAA,IAAS,IAAI,EACvBC,EAAgBD,EAAAA,IAAS,IAAI,EAG7BE,EAAsBC,EAAAA,SAAS,IAAM,CACzC,GAAI,CAACR,EAAM,SACT,OAAOA,EAAM,WAGf,MAAMS,EAAa,CAAC,GAAGT,EAAM,UAAU,EACvC,OAAIS,EAAW,OAAS,IAEtBA,EAAW,CAAC,EAAI,CACd,GAAGA,EAAW,CAAC,EACf,kBAAmB,GACnB,wBAAyB,EAAA,GAGtBA,CACT,CAAC,EAGKC,EAAcF,EAAAA,SAAsB,KACX,CAE3B,WAAYD,EAAoB,MAChC,QAASP,EAAM,QACf,WAAYA,EAAM,WAClB,aAAcA,EAAM,SAAW,WAAa,OAG5C,0BAA2BA,EAAM,SAKjC,QAASA,EAAM,gBAAkBA,EAAM,YAAc,CACnD,WAAY,CACV,CACE,GAAI,UACJ,aAAc,UACd,SAAU,UACV,QAAS,UACT,UAAW,qBACX,gBAAiB,CACf,kBAAmB,CAACA,EAAM,eAC1B,eAAgB,CAACA,EAAM,YACvB,eAAgB,CAACA,EAAM,YACvB,kBAAmB,CAACA,EAAM,WAAA,CAC5B,CACF,EAEF,iBAAkB,UAClB,gBAAiB,EAAA,EACf,OAGJ,qBAAsBA,EAAM,gBAAkBA,EAAM,eAAiB,EAAI,OACzE,wBAAyB,GAGzB,SAAUA,EAAM,gBAAkB,OAClC,YAAaA,EAAM,eACdA,EAAM,cAAiBW,GAAcA,EAAK,MAAQ,CAAA,GACnD,OACJ,mBAAoBX,EAAM,gBAAkBA,EAAM,mBAC9CA,EAAM,mBACN,MAAA,EAIP,EAYDY,EAAa,CACX,QAAAR,EACA,cAAAE,EACA,cAZoB,IAAM,CACtBF,EAAQ,OAASJ,EAAM,mBACzBI,EAAQ,MAAM,kBAAkB,CAC9B,SAAU,kBAAA,CACX,CAEL,CAME,CACD,EAGD,MAAMS,EAAeC,GAA2B,CAC9CV,EAAQ,MAAQU,EAAO,IACvBR,EAAc,MAAQQ,EAAO,IAC7BZ,EAAK,YAAaY,CAAM,CAC1B,EAGMC,EAAgBC,GAA2B,CAC/Cd,EAAK,aAAcc,CAAK,CAC1B,EAGMC,EAAsBD,GAAiC,CAC3Dd,EAAK,mBAAoBc,CAAK,CAChC,EAGME,EAAiBF,GAA4B,CACjDd,EAAK,cAAec,CAAK,CAC3B,EAGMG,EAAsBH,GAAiC,CAC3Dd,EAAK,mBAAoBc,CAAK,EAC9Bd,EAAK,sBAAuBc,EAAM,IAAI,gBAAA,CAAiB,CACzD,EAGMI,EAAsBJ,GAAiC,CAC3Dd,EAAK,mBAAoBc,CAAK,CAChC,EAGAK,OAAAA,EAAAA,MACE,IAAMrB,EAAM,WACZ,IAAM,CACAI,EAAQ,OACVA,EAAQ,MAAM,cAAc,aAAcG,EAAoB,KAAK,CAEvE,EACA,CAAE,KAAM,EAAA,CAAK,EAIfc,EAAAA,MACE,IAAMrB,EAAM,QACZ,IAAM,CACAI,EAAQ,OACVA,EAAQ,MAAM,cAAc,UAAWJ,EAAM,OAAO,CAExD,EACA,CAAE,KAAM,EAAA,CAAK,UAKbsB,YAAA,EAAAC,qBAcM,MAdNC,EAcM,CAbJC,cAYEC,EAAAA,MAAAC,EAAAA,SAAA,EAAA,CAXC,cAAapB,EAAA,MACb,WAAUN,EAAA,QACV,eAAcS,EAAA,MACd,uBAAOT,EAAA,KAAK,EACb,MAAA,CAAA,OAAA,OAAA,MAAA,MAAA,EACC,YAAAY,EACA,aAAAE,EACA,mBAAAE,EACA,cAAAC,EACA,mBAAAC,EACA,mBAAAC,CAAA"}
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 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 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 }>(),\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 },\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 statusBar: props.statusBar ? {\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 // 그룹핑 기본 설정\n groupDefaultExpanded: props.enableGrouping || props.enableTreeData ? 1 : undefined,\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=\"ag-grid-container\">\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</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","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_unref","AgGridVue"],"mappings":"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"}
@@ -1,53 +1,103 @@
1
- import { defineComponent as v, ref as i, computed as r, watch as c, createElementBlock as w, openBlock as x, createVNode as y, unref as k, normalizeClass as P } from "vue";
2
- import { AgGridVue as G } from "ag-grid-vue3";
3
- import { ModuleRegistry as B, AllCommunityModule as R } from "ag-grid-community";
4
- import { AllEnterpriseModule as E } from "ag-grid-enterprise";
1
+ import { defineComponent as N, ref as c, computed as i, onMounted as A, onUnmounted as S, watch as v, createElementBlock as H, openBlock as _, createVNode as V, unref as I, normalizeClass as O } from "vue";
2
+ import { AgGridVue as F } from "ag-grid-vue3";
3
+ import { ModuleRegistry as W, AllCommunityModule as z } from "ag-grid-community";
4
+ import { AllEnterpriseModule as j } from "ag-grid-enterprise";
5
5
  /* empty css */
6
6
  /* empty css */
7
7
  /* empty css */
8
- const T = { class: "ag-grid-container" }, N = /* @__PURE__ */ v({
8
+ const K = { class: "ag-grid-container" }, Z = /* @__PURE__ */ N({
9
9
  __name: "JGrid",
10
10
  props: {
11
11
  rowData: {},
12
12
  columnDefs: {},
13
13
  theme: { default: "ag-theme-balham" },
14
- pagination: { type: Boolean, default: !1 },
14
+ pagination: { type: Boolean, default: !0 },
15
15
  checkbox: { type: Boolean, default: !1 },
16
+ rowNumbers: { type: Boolean, default: !0 },
17
+ actionButtons: { default: void 0 },
18
+ autoDetectDarkMode: { type: Boolean, default: !0 },
16
19
  summaryColumn: { type: Boolean, default: !1 },
17
20
  hiddenColumn: { type: Boolean, default: !1 },
18
- enableGrouping: { type: Boolean, default: !1 },
21
+ enableGrouping: { type: Boolean, default: !0 },
19
22
  enablePivot: { type: Boolean, default: !1 },
20
23
  enableExcelExport: { type: Boolean, default: !1 },
21
24
  enableTreeData: { type: Boolean, default: !1 },
22
25
  getDataPath: { type: Function, default: void 0 },
23
26
  autoGroupColumnDef: { default: void 0 },
24
- selectedRows: { default: () => [] }
27
+ selectedRows: { default: () => [] },
28
+ columnHover: { type: Boolean, default: !0 },
29
+ enableColumnsToolPanel: { type: Boolean, default: !0 },
30
+ statusBar: { type: Boolean, default: !0 }
25
31
  },
26
32
  emits: ["rowClicked", "rowDoubleClicked", "cellClicked", "selectionChanged", "cellValueChanged", "gridReady", "update:selectedRows"],
27
- setup(t, { expose: d, emit: p }) {
28
- B.registerModules([R, E]);
29
- const e = t, a = p, l = i(null), u = i(null), n = r(() => {
30
- if (!e.checkbox)
31
- return e.columnDefs;
32
- const o = [...e.columnDefs];
33
- return o.length > 0 && (o[0] = {
34
- ...o[0],
33
+ setup(d, { expose: x, emit: y }) {
34
+ W.registerModules([z, j]);
35
+ const e = d, n = y, l = c(null), p = c(null), f = c(!1), m = () => {
36
+ f.value = document.documentElement.classList.contains("dark");
37
+ }, k = i(() => {
38
+ if (!e.autoDetectDarkMode)
39
+ return e.theme;
40
+ const t = e.theme;
41
+ return f.value ? t.includes("-dark") ? t : `${t}-dark` : t.replace(/-dark$/, "");
42
+ }), D = (t) => {
43
+ const s = e.actionButtons || [], C = t.data, b = s.filter((o) => o.show ? o.show(C) : !0);
44
+ if (b.length === 0)
45
+ return "";
46
+ const u = document.createElement("div");
47
+ return u.className = "flex items-center gap-1", b.forEach((o) => {
48
+ const a = document.createElement("button");
49
+ a.className = "px-2 py-1 text-xs border rounded transition-colors", o.styletype === "danger" ? a.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" : a.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", o.tooltip && (a.title = o.tooltip), o.label ? a.textContent = o.label : o.icon && (o.icon === "pencil" ? a.textContent = "수정" : o.icon === "trash2" || o.icon === "trash" ? a.textContent = "삭제" : o.icon === "eye" ? a.textContent = "보기" : o.icon === "copy" ? a.textContent = "복사" : o.icon === "download" ? a.textContent = "다운로드" : o.icon === "circleX" ? a.textContent = "비활성화" : o.icon === "circleCheckBig" ? a.textContent = "활성화" : a.textContent = o.icon), a.addEventListener("click", (T) => {
50
+ T.stopPropagation(), o.onClick(C);
51
+ }), u.appendChild(a);
52
+ }), u;
53
+ }, g = i(() => !e.actionButtons || e.actionButtons.length === 0 ? null : {
54
+ colId: "actionButtons",
55
+ headerName: "작업",
56
+ field: "_actions",
57
+ width: 120,
58
+ minWidth: 80,
59
+ maxWidth: 200,
60
+ lockPosition: "left",
61
+ sortable: !1,
62
+ filter: !1,
63
+ resizable: !0,
64
+ suppressNavigable: !0,
65
+ suppressHeaderMenuButton: !0,
66
+ cellRenderer: D,
67
+ cellStyle: { display: "flex", justifyContent: "center", alignItems: "center" }
68
+ }), h = i(() => {
69
+ const t = [];
70
+ return e.checkbox && t.push({
71
+ colId: "rowSelection",
72
+ headerName: "",
73
+ // field와 valueGetter 제거 - AG Grid 공식 방식
74
+ width: 50,
75
+ minWidth: 50,
76
+ maxWidth: 50,
77
+ lockPosition: "left",
35
78
  checkboxSelection: !0,
36
- headerCheckboxSelection: !0
37
- }), o;
38
- }), f = r(() => ({
79
+ headerCheckboxSelection: !0,
80
+ sortable: !1,
81
+ filter: !1,
82
+ resizable: !1,
83
+ suppressNavigable: !0,
84
+ suppressHeaderMenuButton: !0,
85
+ cellStyle: { display: "flex", justifyContent: "center", alignItems: "center" }
86
+ }), g.value && t.push(g.value), t.push(...e.columnDefs), t;
87
+ }), w = i(() => ({
39
88
  // theme 옵션 제거 - 클래스 기반 테마(:class="theme") 사용
40
- columnDefs: n.value,
41
- rowData: e.rowData,
89
+ // columnDefs rowData는 prop으로 전달하므로 여기서 제거
42
90
  pagination: e.pagination,
43
91
  rowSelection: e.checkbox ? "multiple" : void 0,
44
92
  // 체크박스 모드일 때 row 클릭으로 선택이 변경되지 않도록 설정
45
93
  // 체크박스만으로 선택을 제어하도록 함
46
94
  suppressRowClickSelection: e.checkbox,
47
- // suppressColumnsToolPanel은 ag-grid v34에서 이상 지원되지 않음
48
- // summaryColumn은 pinnedBottomRowData 또는 다른 옵션으로 구현 가능
95
+ // Row Numbers (Enterprise) - AG Grid 표준 방식
96
+ rowNumbers: e.rowNumbers,
97
+ // Column Hover Highlight
98
+ columnHoverHighlight: e.columnHover,
49
99
  // Enterprise 기능 옵션
50
- sideBar: e.enableGrouping || e.enablePivot ? {
100
+ sideBar: e.enableColumnsToolPanel || e.enableGrouping || e.enablePivot ? {
51
101
  toolPanels: [
52
102
  {
53
103
  id: "columns",
@@ -63,8 +113,16 @@ const T = { class: "ag-grid-container" }, N = /* @__PURE__ */ v({
63
113
  }
64
114
  }
65
115
  ],
66
- defaultToolPanel: "columns",
67
- hiddenByDefault: !1
116
+ defaultToolPanel: ""
117
+ // 초기에는 접힌 상태
118
+ } : void 0,
119
+ // Status Bar (Enterprise)
120
+ statusBar: e.statusBar ? {
121
+ statusPanels: [
122
+ { statusPanel: "agTotalAndFilteredRowCountComponent", align: "left" },
123
+ { statusPanel: "agSelectedRowCountComponent", align: "left" },
124
+ { statusPanel: "agAggregationComponent", align: "right" }
125
+ ]
68
126
  } : void 0,
69
127
  // 그룹핑 기본 설정
70
128
  groupDefaultExpanded: e.enableGrouping || e.enableTreeData ? 1 : void 0,
@@ -74,58 +132,68 @@ const T = { class: "ag-grid-container" }, N = /* @__PURE__ */ v({
74
132
  getDataPath: e.enableTreeData ? e.getDataPath || ((s) => s.path || []) : void 0,
75
133
  autoGroupColumnDef: e.enableTreeData && e.autoGroupColumnDef ? e.autoGroupColumnDef : void 0
76
134
  }));
77
- d({
135
+ x({
78
136
  gridApi: l,
79
- gridColumnApi: u,
137
+ gridColumnApi: p,
80
138
  exportToExcel: () => {
81
139
  l.value && e.enableExcelExport && l.value.exportDataAsExcel({
82
140
  fileName: "grid-export.xlsx"
83
141
  });
84
142
  }
85
143
  });
86
- const m = (o) => {
87
- l.value = o.api, u.value = o.api, a("gridReady", o);
88
- }, g = (o) => {
89
- a("rowClicked", o);
90
- }, D = (o) => {
91
- a("rowDoubleClicked", o);
92
- }, C = (o) => {
93
- a("cellClicked", o);
94
- }, h = (o) => {
95
- a("selectionChanged", o), a("update:selectedRows", o.api.getSelectedRows());
96
- }, b = (o) => {
97
- a("cellValueChanged", o);
144
+ const B = (t) => {
145
+ l.value = t.api, p.value = t.api, n("gridReady", t);
146
+ }, P = (t) => {
147
+ n("rowClicked", t);
148
+ }, E = (t) => {
149
+ n("rowDoubleClicked", t);
150
+ }, R = (t) => {
151
+ n("cellClicked", t);
152
+ }, M = (t) => {
153
+ n("selectionChanged", t), n("update:selectedRows", t.api.getSelectedRows());
154
+ }, G = (t) => {
155
+ n("cellValueChanged", t);
98
156
  };
99
- return c(
157
+ let r = null;
158
+ return A(() => {
159
+ e.autoDetectDarkMode && (m(), r = new MutationObserver(() => {
160
+ m();
161
+ }), r.observe(document.documentElement, {
162
+ attributes: !0,
163
+ attributeFilter: ["class"]
164
+ }));
165
+ }), S(() => {
166
+ r && r.disconnect();
167
+ }), v(
100
168
  () => e.columnDefs,
101
169
  () => {
102
- l.value && l.value.setGridOption("columnDefs", n.value);
170
+ l.value && l.value.setGridOption("columnDefs", h.value);
103
171
  },
104
172
  { deep: !0 }
105
- ), c(
173
+ ), v(
106
174
  () => e.rowData,
107
175
  () => {
108
176
  l.value && l.value.setGridOption("rowData", e.rowData);
109
177
  },
110
178
  { deep: !0 }
111
- ), (o, s) => (x(), w("div", T, [
112
- y(k(G), {
113
- "column-defs": n.value,
114
- "row-data": t.rowData,
115
- "grid-options": f.value,
116
- class: P(t.theme),
179
+ ), (t, s) => (_(), H("div", K, [
180
+ V(I(F), {
181
+ "column-defs": h.value,
182
+ "row-data": d.rowData,
183
+ "grid-options": w.value,
184
+ class: O(k.value),
117
185
  style: { height: "100%", width: "100%" },
118
- onGridReady: m,
119
- onRowClicked: g,
120
- onRowDoubleClicked: D,
121
- onCellClicked: C,
122
- onSelectionChanged: h,
123
- onCellValueChanged: b
186
+ onGridReady: B,
187
+ onRowClicked: P,
188
+ onRowDoubleClicked: E,
189
+ onCellClicked: R,
190
+ onSelectionChanged: M,
191
+ onCellValueChanged: G
124
192
  }, null, 8, ["column-defs", "row-data", "grid-options", "class"])
125
193
  ]));
126
194
  }
127
195
  });
128
196
  export {
129
- N as default
197
+ Z as default
130
198
  };
131
199
  //# 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\">\r\nimport { computed, ref, watch } from 'vue'\r\nimport { AgGridVue } from 'ag-grid-vue3'\r\nimport type {\r\n ColDef,\r\n GridOptions,\r\n RowClickedEvent,\r\n CellClickedEvent,\r\n SelectionChangedEvent,\r\n CellValueChangedEvent,\r\n RowDoubleClickedEvent,\r\n GridReadyEvent,\r\n} from 'ag-grid-community'\r\nimport { ModuleRegistry, AllCommunityModule } from 'ag-grid-community'\r\n// Enterprise 모듈 import (Grouping, Pivot, Excel Export 등)\r\nimport { AllEnterpriseModule } from 'ag-grid-enterprise'\r\n// ag-grid.css는 제거 - v34에서 Theming API와 충돌 방지\r\n// 테마 CSS 파일만 사용 (클래스 기반 테마)\r\n// v34에서는 dark 테마가 같은 CSS 파일 안에 포함되어 있음\r\n// 예: ag-theme-quartz.css에 .ag-theme-quartz-dark 클래스 포함\r\nimport 'ag-grid-community/styles/ag-theme-quartz.css'\r\nimport 'ag-grid-community/styles/ag-theme-alpine.css'\r\nimport 'ag-grid-community/styles/ag-theme-balham.css'\r\n\r\n// AG Grid 모듈 등록 (Community + Enterprise)\r\nModuleRegistry.registerModules([AllCommunityModule, AllEnterpriseModule])\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** 그리드에 표시할 데이터 배열 */\r\n rowData: any[]\r\n /** 컬럼 정의 배열 */\r\n columnDefs: ColDef[]\r\n /** ag-Grid 테마 */\r\n theme?: string\r\n /** 페이지네이션 활성화 여부 */\r\n pagination?: boolean\r\n /** 체크박스 선택 활성화 여부 */\r\n checkbox?: boolean\r\n /** 요약 컬럼 표시 여부 */\r\n summaryColumn?: boolean\r\n /** 숨김 컬럼 관리 활성화 여부 */\r\n hiddenColumn?: boolean\r\n /** 그룹핑 기능 활성화 여부 (Enterprise) */\r\n enableGrouping?: boolean\r\n /** 피벗 기능 활성화 여부 (Enterprise) */\r\n enablePivot?: boolean\r\n /** Excel 내보내기 기능 활성화 여부 (Enterprise) */\r\n enableExcelExport?: boolean\r\n /** Tree Data 기능 활성화 여부 (Enterprise) */\r\n enableTreeData?: boolean\r\n /** Tree Data 계층 경로를 반환하는 함수 */\r\n getDataPath?: (data: any) => (string | number)[]\r\n /** Tree Data 그룹 컬럼 정의 */\r\n autoGroupColumnDef?: ColDef\r\n /** 선택된 행 데이터 배열 (v-model:selected-rows) */\r\n selectedRows?: any[]\r\n }>(),\r\n {\r\n theme: 'ag-theme-balham',\r\n pagination: false,\r\n checkbox: false,\r\n summaryColumn: false,\r\n hiddenColumn: false,\r\n enableGrouping: false,\r\n enablePivot: false,\r\n enableExcelExport: false,\r\n enableTreeData: false,\r\n getDataPath: undefined,\r\n autoGroupColumnDef: undefined,\r\n selectedRows: () => [],\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n /** 행 클릭 이벤트 */\r\n rowClicked: [event: RowClickedEvent]\r\n /** 행 더블클릭 이벤트 */\r\n rowDoubleClicked: [event: RowDoubleClickedEvent]\r\n /** 셀 클릭 이벤트 */\r\n cellClicked: [event: CellClickedEvent]\r\n /** 선택 변경 이벤트 (체크박스 등) */\r\n selectionChanged: [event: SelectionChangedEvent]\r\n /** 셀 값 변경 이벤트 */\r\n cellValueChanged: [event: CellValueChangedEvent]\r\n /** 그리드 준비 완료 이벤트 */\r\n gridReady: [event: GridReadyEvent]\r\n /** 선택된 행 변경 이벤트 (v-model:selected-rows) */\r\n 'update:selectedRows': [rows: any[]]\r\n}>()\r\n\r\n// ag-Grid 인스턴스 참조\r\nconst gridApi = ref<any>(null)\r\nconst gridColumnApi = ref<any>(null)\r\n\r\n// checkbox 활성화 시 첫 번째 컬럼에 checkboxSelection 추가\r\nconst processedColumnDefs = computed(() => {\r\n if (!props.checkbox) {\r\n return props.columnDefs\r\n }\r\n\r\n const columnDefs = [...props.columnDefs]\r\n if (columnDefs.length > 0) {\r\n // 첫 번째 컬럼에 checkboxSelection 추가\r\n columnDefs[0] = {\r\n ...columnDefs[0],\r\n checkboxSelection: true,\r\n headerCheckboxSelection: true,\r\n }\r\n }\r\n return columnDefs\r\n})\r\n\r\n// Grid 옵션 설정\r\nconst gridOptions = computed<GridOptions>(() => {\r\n const options: GridOptions = {\r\n // theme 옵션 제거 - 클래스 기반 테마(:class=\"theme\") 사용\r\n columnDefs: processedColumnDefs.value,\r\n rowData: props.rowData,\r\n pagination: props.pagination,\r\n rowSelection: props.checkbox ? 'multiple' : undefined,\r\n // 체크박스 모드일 때 row 클릭으로 선택이 변경되지 않도록 설정\r\n // 체크박스만으로 선택을 제어하도록 함\r\n suppressRowClickSelection: props.checkbox,\r\n // suppressColumnsToolPanel은 ag-grid v34에서 더 이상 지원되지 않음\r\n // summaryColumn은 pinnedBottomRowData 또는 다른 옵션으로 구현 가능\r\n \r\n // Enterprise 기능 옵션\r\n sideBar: props.enableGrouping || props.enablePivot ? {\r\n toolPanels: [\r\n {\r\n id: 'columns',\r\n labelDefault: 'Columns',\r\n labelKey: 'columns',\r\n iconKey: 'columns',\r\n toolPanel: 'agColumnsToolPanel',\r\n toolPanelParams: {\r\n suppressRowGroups: !props.enableGrouping,\r\n suppressValues: !props.enablePivot,\r\n suppressPivots: !props.enablePivot,\r\n suppressPivotMode: !props.enablePivot,\r\n },\r\n },\r\n ],\r\n defaultToolPanel: 'columns',\r\n hiddenByDefault: false,\r\n } : undefined,\r\n \r\n // 그룹핑 기본 설정\r\n groupDefaultExpanded: props.enableGrouping || props.enableTreeData ? 1 : undefined,\r\n suppressAggFuncInHeader: false,\r\n\r\n // Tree Data 설정 (Enterprise)\r\n treeData: props.enableTreeData || undefined,\r\n getDataPath: props.enableTreeData\r\n ? (props.getDataPath || ((data: any) => data.path || []))\r\n : undefined,\r\n autoGroupColumnDef: props.enableTreeData && props.autoGroupColumnDef\r\n ? props.autoGroupColumnDef\r\n : undefined,\r\n }\r\n\r\n return options\r\n})\r\n\r\n// Excel 내보내기 함수 (외부에서 사용 가능하도록 expose)\r\nconst exportToExcel = () => {\r\n if (gridApi.value && props.enableExcelExport) {\r\n gridApi.value.exportDataAsExcel({\r\n fileName: 'grid-export.xlsx',\r\n })\r\n }\r\n}\r\n\r\n// 그리드 API를 외부에 노출\r\ndefineExpose({\r\n gridApi,\r\n gridColumnApi,\r\n exportToExcel,\r\n})\r\n\r\n// Grid ready 이벤트 핸들러\r\nconst onGridReady = (params: GridReadyEvent) => {\r\n gridApi.value = params.api\r\n gridColumnApi.value = params.api // v34에서 columnApi는 deprecated\r\n emit('gridReady', params)\r\n}\r\n\r\n// 행 클릭 이벤트 핸들러\r\nconst onRowClicked = (event: RowClickedEvent) => {\r\n emit('rowClicked', event)\r\n}\r\n\r\n// 행 더블클릭 이벤트 핸들러\r\nconst onRowDoubleClicked = (event: RowDoubleClickedEvent) => {\r\n emit('rowDoubleClicked', event)\r\n}\r\n\r\n// 셀 클릭 이벤트 핸들러\r\nconst onCellClicked = (event: CellClickedEvent) => {\r\n emit('cellClicked', event)\r\n}\r\n\r\n// 선택 변경 이벤트 핸들러\r\nconst onSelectionChanged = (event: SelectionChangedEvent) => {\r\n emit('selectionChanged', event)\r\n emit('update:selectedRows', event.api.getSelectedRows())\r\n}\r\n\r\n// 셀 값 변경 이벤트 핸들러\r\nconst onCellValueChanged = (event: CellValueChangedEvent) => {\r\n emit('cellValueChanged', event)\r\n}\r\n\r\n// columnDefs 변경 감지\r\nwatch(\r\n () => props.columnDefs,\r\n () => {\r\n if (gridApi.value) {\r\n gridApi.value.setGridOption('columnDefs', processedColumnDefs.value)\r\n }\r\n },\r\n { deep: true },\r\n)\r\n\r\n// rowData 변경 감지\r\nwatch(\r\n () => props.rowData,\r\n () => {\r\n if (gridApi.value) {\r\n gridApi.value.setGridOption('rowData', props.rowData)\r\n }\r\n },\r\n { deep: true },\r\n)\r\n</script>\r\n\r\n<template>\r\n <div class=\"ag-grid-container\">\r\n <AgGridVue\r\n :column-defs=\"processedColumnDefs\"\r\n :row-data=\"rowData\"\r\n :grid-options=\"gridOptions\"\r\n :class=\"theme\"\r\n style=\"height: 100%; width: 100%\"\r\n @grid-ready=\"onGridReady\"\r\n @row-clicked=\"onRowClicked\"\r\n @row-double-clicked=\"onRowDoubleClicked\"\r\n @cell-clicked=\"onCellClicked\"\r\n @selection-changed=\"onSelectionChanged\"\r\n @cell-value-changed=\"onCellValueChanged\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.ag-grid-container {\r\n width: 100%;\r\n height: 100%;\r\n}\r\n</style>\r\n"],"names":["ModuleRegistry","AllCommunityModule","AllEnterpriseModule","props","__props","emit","__emit","gridApi","ref","gridColumnApi","processedColumnDefs","computed","columnDefs","gridOptions","data","__expose","onGridReady","params","onRowClicked","event","onRowDoubleClicked","onCellClicked","onSelectionChanged","onCellValueChanged","watch","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_unref","AgGridVue"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,IAAAA,EAAe,gBAAgB,CAACC,GAAoBC,CAAmB,CAAC;AAExE,UAAMC,IAAQC,GA+CRC,IAAOC,GAkBPC,IAAUC,EAAS,IAAI,GACvBC,IAAgBD,EAAS,IAAI,GAG7BE,IAAsBC,EAAS,MAAM;AACzC,UAAI,CAACR,EAAM;AACT,eAAOA,EAAM;AAGf,YAAMS,IAAa,CAAC,GAAGT,EAAM,UAAU;AACvC,aAAIS,EAAW,SAAS,MAEtBA,EAAW,CAAC,IAAI;AAAA,QACd,GAAGA,EAAW,CAAC;AAAA,QACf,mBAAmB;AAAA,QACnB,yBAAyB;AAAA,MAAA,IAGtBA;AAAA,IACT,CAAC,GAGKC,IAAcF,EAAsB,OACX;AAAA;AAAA,MAE3B,YAAYD,EAAoB;AAAA,MAChC,SAASP,EAAM;AAAA,MACf,YAAYA,EAAM;AAAA,MAClB,cAAcA,EAAM,WAAW,aAAa;AAAA;AAAA;AAAA,MAG5C,2BAA2BA,EAAM;AAAA;AAAA;AAAA;AAAA,MAKjC,SAASA,EAAM,kBAAkBA,EAAM,cAAc;AAAA,QACnD,YAAY;AAAA,UACV;AAAA,YACE,IAAI;AAAA,YACJ,cAAc;AAAA,YACd,UAAU;AAAA,YACV,SAAS;AAAA,YACT,WAAW;AAAA,YACX,iBAAiB;AAAA,cACf,mBAAmB,CAACA,EAAM;AAAA,cAC1B,gBAAgB,CAACA,EAAM;AAAA,cACvB,gBAAgB,CAACA,EAAM;AAAA,cACvB,mBAAmB,CAACA,EAAM;AAAA,YAAA;AAAA,UAC5B;AAAA,QACF;AAAA,QAEF,kBAAkB;AAAA,QAClB,iBAAiB;AAAA,MAAA,IACf;AAAA;AAAA,MAGJ,sBAAsBA,EAAM,kBAAkBA,EAAM,iBAAiB,IAAI;AAAA,MACzE,yBAAyB;AAAA;AAAA,MAGzB,UAAUA,EAAM,kBAAkB;AAAA,MAClC,aAAaA,EAAM,iBACdA,EAAM,gBAAgB,CAACW,MAAcA,EAAK,QAAQ,CAAA,KACnD;AAAA,MACJ,oBAAoBX,EAAM,kBAAkBA,EAAM,qBAC9CA,EAAM,qBACN;AAAA,IAAA,EAIP;AAYD,IAAAY,EAAa;AAAA,MACX,SAAAR;AAAA,MACA,eAAAE;AAAA,MACA,eAZoB,MAAM;AAC1B,QAAIF,EAAQ,SAASJ,EAAM,qBACzBI,EAAQ,MAAM,kBAAkB;AAAA,UAC9B,UAAU;AAAA,QAAA,CACX;AAAA,MAEL;AAAA,IAME,CACD;AAGD,UAAMS,IAAc,CAACC,MAA2B;AAC9C,MAAAV,EAAQ,QAAQU,EAAO,KACvBR,EAAc,QAAQQ,EAAO,KAC7BZ,EAAK,aAAaY,CAAM;AAAA,IAC1B,GAGMC,IAAe,CAACC,MAA2B;AAC/C,MAAAd,EAAK,cAAcc,CAAK;AAAA,IAC1B,GAGMC,IAAqB,CAACD,MAAiC;AAC3D,MAAAd,EAAK,oBAAoBc,CAAK;AAAA,IAChC,GAGME,IAAgB,CAACF,MAA4B;AACjD,MAAAd,EAAK,eAAec,CAAK;AAAA,IAC3B,GAGMG,IAAqB,CAACH,MAAiC;AAC3D,MAAAd,EAAK,oBAAoBc,CAAK,GAC9Bd,EAAK,uBAAuBc,EAAM,IAAI,gBAAA,CAAiB;AAAA,IACzD,GAGMI,IAAqB,CAACJ,MAAiC;AAC3D,MAAAd,EAAK,oBAAoBc,CAAK;AAAA,IAChC;AAGA,WAAAK;AAAA,MACE,MAAMrB,EAAM;AAAA,MACZ,MAAM;AACJ,QAAII,EAAQ,SACVA,EAAQ,MAAM,cAAc,cAAcG,EAAoB,KAAK;AAAA,MAEvE;AAAA,MACA,EAAE,MAAM,GAAA;AAAA,IAAK,GAIfc;AAAA,MACE,MAAMrB,EAAM;AAAA,MACZ,MAAM;AACJ,QAAII,EAAQ,SACVA,EAAQ,MAAM,cAAc,WAAWJ,EAAM,OAAO;AAAA,MAExD;AAAA,MACA,EAAE,MAAM,GAAA;AAAA,IAAK,cAKbsB,EAAA,GAAAC,EAcM,OAdNC,GAcM;AAAA,MAbJC,EAYEC,EAAAC,CAAA,GAAA;AAAA,QAXC,eAAapB,EAAA;AAAA,QACb,YAAUN,EAAA;AAAA,QACV,gBAAcS,EAAA;AAAA,QACd,SAAOT,EAAA,KAAK;AAAA,QACb,OAAA,EAAA,QAAA,QAAA,OAAA,OAAA;AAAA,QACC,aAAAY;AAAA,QACA,cAAAE;AAAA,QACA,oBAAAE;AAAA,QACA,eAAAC;AAAA,QACA,oBAAAC;AAAA,QACA,oBAAAC;AAAA,MAAA;;;;"}
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 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 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 }>(),\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 },\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 statusBar: props.statusBar ? {\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 // 그룹핑 기본 설정\n groupDefaultExpanded: props.enableGrouping || props.enableTreeData ? 1 : undefined,\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=\"ag-grid-container\">\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</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","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_unref","AgGridVue"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("vue"),s=require("../shadcn/resizable/ResizableHandle.vue.cjs"),r=require("../shadcn/resizable/ResizablePanelGroup.vue.cjs"),l=require("reka-ui"),u=e.defineComponent({__name:"JSplitter",props:{direction:{default:"horizontal"},defaultSize:{default:50},minSize:{default:20},maxSize:{},secondMinSize:{},secondMaxSize:{},withHandle:{type:Boolean,default:!0},class:{}},setup(t){const n=t,a=e.computed(()=>100-n.defaultSize);return(i,d)=>(e.openBlock(),e.createBlock(e.unref(r.default),{direction:t.direction,class:e.normalizeClass(t.class)},{default:e.withCtx(()=>[e.createVNode(e.unref(l.SplitterPanel),{"default-size":t.defaultSize,"min-size":t.minSize,"max-size":t.maxSize},{default:e.withCtx(()=>[e.renderSlot(i.$slots,"first"),e.renderSlot(i.$slots,"left"),e.renderSlot(i.$slots,"top")]),_:3},8,["default-size","min-size","max-size"]),e.createVNode(e.unref(s.default),{"with-handle":t.withHandle},null,8,["with-handle"]),e.createVNode(e.unref(l.SplitterPanel),{"default-size":a.value,"min-size":t.secondMinSize,"max-size":t.secondMaxSize},{default:e.withCtx(()=>[e.renderSlot(i.$slots,"second"),e.renderSlot(i.$slots,"right"),e.renderSlot(i.$slots,"bottom")]),_:3},8,["default-size","min-size","max-size"])]),_:3},8,["direction","class"]))}});exports.default=u;
2
+ //# sourceMappingURL=JSplitter.vue.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JSplitter.vue.cjs","sources":["../../../../src/components/atoms/JSplitter.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport {\n ResizablePanelGroup,\n ResizablePanel,\n ResizableHandle,\n} from '@/components/shadcn/resizable'\n\ntype Orientation = 'horizontal' | 'vertical'\n\nconst props = withDefaults(\n defineProps<{\n /** 분할 방향 (horizontal: 좌우, vertical: 상하) */\n direction?: Orientation\n /** 첫 번째 패널의 기본 크기 (%) */\n defaultSize?: number\n /** 첫 번째 패널의 최소 크기 (%) */\n minSize?: number\n /** 첫 번째 패널의 최대 크기 (%) */\n maxSize?: number\n /** 두 번째 패널의 최소 크기 (%) */\n secondMinSize?: number\n /** 두 번째 패널의 최대 크기 (%) */\n secondMaxSize?: number\n /** ResizableHandle에 grip 아이콘 표시 여부 */\n withHandle?: boolean\n /** 추가 CSS 클래스 */\n class?: string\n }>(),\n {\n direction: 'horizontal',\n defaultSize: 50,\n minSize: 20,\n withHandle: true,\n },\n)\n\n// 두 번째 패널의 기본 크기 계산\nconst secondDefaultSize = computed(() => 100 - props.defaultSize)\n</script>\n\n<template>\n <ResizablePanelGroup :direction=\"direction\" :class=\"class\">\n <!-- 첫 번째 패널 (좌측/상단) -->\n <ResizablePanel :default-size=\"defaultSize\" :min-size=\"minSize\" :max-size=\"maxSize\">\n <slot name=\"first\" />\n <!-- direction=\"horizontal\"일 때 left, vertical일 때 top으로도 사용 가능 -->\n <slot name=\"left\" />\n <slot name=\"top\" />\n </ResizablePanel>\n\n <!-- 크기 조정 핸들 -->\n <ResizableHandle :with-handle=\"withHandle\" />\n\n <!-- 두 번째 패널 (우측/하단) -->\n <ResizablePanel\n :default-size=\"secondDefaultSize\"\n :min-size=\"secondMinSize\"\n :max-size=\"secondMaxSize\"\n >\n <slot name=\"second\" />\n <!-- direction=\"horizontal\"일 때 right, vertical일 때 bottom으로도 사용 가능 -->\n <slot name=\"right\" />\n <slot name=\"bottom\" />\n </ResizablePanel>\n </ResizablePanelGroup>\n</template>\n"],"names":["props","__props","secondDefaultSize","computed","_createBlock","_unref","ResizablePanelGroup","_createVNode","ResizablePanel","_renderSlot","_ctx","ResizableHandle"],"mappings":"ifAUA,MAAMA,EAAQC,EA4BRC,EAAoBC,EAAAA,SAAS,IAAM,IAAMH,EAAM,WAAW,8BAI9DI,EAAAA,YAuBsBC,EAAAA,MAAAC,EAAAA,OAAA,EAAA,CAvBA,UAAWL,EAAA,UAAY,uBAAOA,EAAA,KAAK,CAAA,qBAEvD,IAKiB,CALjBM,cAKiBF,EAAAA,MAAAG,EAAAA,aAAA,EAAA,CALA,eAAcP,EAAA,YAAc,WAAUA,EAAA,QAAU,WAAUA,EAAA,OAAA,qBACzE,IAAqB,CAArBQ,aAAqBC,EAAA,OAAA,OAAA,EAErBD,aAAoBC,EAAA,OAAA,MAAA,EACpBD,aAAmBC,EAAA,OAAA,KAAA,CAAA,kDAIrBH,EAAAA,YAA6CF,EAAAA,MAAAM,SAAA,EAAA,CAA3B,cAAaV,EAAA,UAAA,EAAU,KAAA,EAAA,CAAA,aAAA,CAAA,EAGzCM,cASiBF,EAAAA,MAAAG,EAAAA,aAAA,EAAA,CARd,eAAcN,EAAA,MACd,WAAUD,EAAA,cACV,WAAUA,EAAA,aAAA,qBAEX,IAAsB,CAAtBQ,aAAsBC,EAAA,OAAA,QAAA,EAEtBD,aAAqBC,EAAA,OAAA,OAAA,EACrBD,aAAsBC,EAAA,OAAA,QAAA,CAAA"}
@@ -0,0 +1,57 @@
1
+ import { defineComponent as m, computed as f, createBlock as z, openBlock as u, unref as a, normalizeClass as r, withCtx as l, createVNode as s, renderSlot as t } from "vue";
2
+ import c from "../shadcn/resizable/ResizableHandle.vue.js";
3
+ import S from "../shadcn/resizable/ResizablePanelGroup.vue.js";
4
+ import { SplitterPanel as n } from "reka-ui";
5
+ const B = /* @__PURE__ */ m({
6
+ __name: "JSplitter",
7
+ props: {
8
+ direction: { default: "horizontal" },
9
+ defaultSize: { default: 50 },
10
+ minSize: { default: 20 },
11
+ maxSize: {},
12
+ secondMinSize: {},
13
+ secondMaxSize: {},
14
+ withHandle: { type: Boolean, default: !0 },
15
+ class: {}
16
+ },
17
+ setup(e) {
18
+ const o = e, d = f(() => 100 - o.defaultSize);
19
+ return (i, h) => (u(), z(a(S), {
20
+ direction: e.direction,
21
+ class: r(e.class)
22
+ }, {
23
+ default: l(() => [
24
+ s(a(n), {
25
+ "default-size": e.defaultSize,
26
+ "min-size": e.minSize,
27
+ "max-size": e.maxSize
28
+ }, {
29
+ default: l(() => [
30
+ t(i.$slots, "first"),
31
+ t(i.$slots, "left"),
32
+ t(i.$slots, "top")
33
+ ]),
34
+ _: 3
35
+ }, 8, ["default-size", "min-size", "max-size"]),
36
+ s(a(c), { "with-handle": e.withHandle }, null, 8, ["with-handle"]),
37
+ s(a(n), {
38
+ "default-size": d.value,
39
+ "min-size": e.secondMinSize,
40
+ "max-size": e.secondMaxSize
41
+ }, {
42
+ default: l(() => [
43
+ t(i.$slots, "second"),
44
+ t(i.$slots, "right"),
45
+ t(i.$slots, "bottom")
46
+ ]),
47
+ _: 3
48
+ }, 8, ["default-size", "min-size", "max-size"])
49
+ ]),
50
+ _: 3
51
+ }, 8, ["direction", "class"]));
52
+ }
53
+ });
54
+ export {
55
+ B as default
56
+ };
57
+ //# sourceMappingURL=JSplitter.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JSplitter.vue.js","sources":["../../../../src/components/atoms/JSplitter.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport {\n ResizablePanelGroup,\n ResizablePanel,\n ResizableHandle,\n} from '@/components/shadcn/resizable'\n\ntype Orientation = 'horizontal' | 'vertical'\n\nconst props = withDefaults(\n defineProps<{\n /** 분할 방향 (horizontal: 좌우, vertical: 상하) */\n direction?: Orientation\n /** 첫 번째 패널의 기본 크기 (%) */\n defaultSize?: number\n /** 첫 번째 패널의 최소 크기 (%) */\n minSize?: number\n /** 첫 번째 패널의 최대 크기 (%) */\n maxSize?: number\n /** 두 번째 패널의 최소 크기 (%) */\n secondMinSize?: number\n /** 두 번째 패널의 최대 크기 (%) */\n secondMaxSize?: number\n /** ResizableHandle에 grip 아이콘 표시 여부 */\n withHandle?: boolean\n /** 추가 CSS 클래스 */\n class?: string\n }>(),\n {\n direction: 'horizontal',\n defaultSize: 50,\n minSize: 20,\n withHandle: true,\n },\n)\n\n// 두 번째 패널의 기본 크기 계산\nconst secondDefaultSize = computed(() => 100 - props.defaultSize)\n</script>\n\n<template>\n <ResizablePanelGroup :direction=\"direction\" :class=\"class\">\n <!-- 첫 번째 패널 (좌측/상단) -->\n <ResizablePanel :default-size=\"defaultSize\" :min-size=\"minSize\" :max-size=\"maxSize\">\n <slot name=\"first\" />\n <!-- direction=\"horizontal\"일 때 left, vertical일 때 top으로도 사용 가능 -->\n <slot name=\"left\" />\n <slot name=\"top\" />\n </ResizablePanel>\n\n <!-- 크기 조정 핸들 -->\n <ResizableHandle :with-handle=\"withHandle\" />\n\n <!-- 두 번째 패널 (우측/하단) -->\n <ResizablePanel\n :default-size=\"secondDefaultSize\"\n :min-size=\"secondMinSize\"\n :max-size=\"secondMaxSize\"\n >\n <slot name=\"second\" />\n <!-- direction=\"horizontal\"일 때 right, vertical일 때 bottom으로도 사용 가능 -->\n <slot name=\"right\" />\n <slot name=\"bottom\" />\n </ResizablePanel>\n </ResizablePanelGroup>\n</template>\n"],"names":["props","__props","secondDefaultSize","computed","_createBlock","_unref","ResizablePanelGroup","_createVNode","ResizablePanel","_renderSlot","_ctx","ResizableHandle"],"mappings":";;;;;;;;;;;;;;;;;AAUA,UAAMA,IAAQC,GA4BRC,IAAoBC,EAAS,MAAM,MAAMH,EAAM,WAAW;2BAI9DI,EAuBsBC,EAAAC,CAAA,GAAA;AAAA,MAvBA,WAAWL,EAAA;AAAA,MAAY,SAAOA,EAAA,KAAK;AAAA,IAAA;iBAEvD,MAKiB;AAAA,QALjBM,EAKiBF,EAAAG,CAAA,GAAA;AAAA,UALA,gBAAcP,EAAA;AAAA,UAAc,YAAUA,EAAA;AAAA,UAAU,YAAUA,EAAA;AAAA,QAAA;qBACzE,MAAqB;AAAA,YAArBQ,EAAqBC,EAAA,QAAA,OAAA;AAAA,YAErBD,EAAoBC,EAAA,QAAA,MAAA;AAAA,YACpBD,EAAmBC,EAAA,QAAA,KAAA;AAAA,UAAA;;;QAIrBH,EAA6CF,EAAAM,CAAA,GAAA,EAA3B,eAAaV,EAAA,WAAA,GAAU,MAAA,GAAA,CAAA,aAAA,CAAA;AAAA,QAGzCM,EASiBF,EAAAG,CAAA,GAAA;AAAA,UARd,gBAAcN,EAAA;AAAA,UACd,YAAUD,EAAA;AAAA,UACV,YAAUA,EAAA;AAAA,QAAA;qBAEX,MAAsB;AAAA,YAAtBQ,EAAsBC,EAAA,QAAA,QAAA;AAAA,YAEtBD,EAAqBC,EAAA,QAAA,OAAA;AAAA,YACrBD,EAAsBC,EAAA,QAAA,QAAA;AAAA,UAAA;;;;;;;;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./JSplitter.vue.cjs");exports.default=e.default;
2
+ //# sourceMappingURL=JSplitter.vue2.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JSplitter.vue2.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import f from "./JSplitter.vue.js";
2
+ export {
3
+ f as default
4
+ };
5
+ //# sourceMappingURL=JSplitter.vue2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JSplitter.vue2.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("vue"),f=require("../atoms/JButton.vue.cjs");require("../shadcn/index.cjs");require("lucide-vue-next");const n=require("../../lib/utils.cjs");require("@internationalized/date");require("md-editor-v3");;/* empty css */;/* empty css */require("../shadcn/badge-variants.cjs");require("@vueuse/core");require("reka-ui");;/* empty css */require("../shadcn/avatar-variants.cjs");const o=require("../atoms/JIcon.vue.cjs"),b=require("../atoms/JLabel.vue.cjs"),x=require("../atoms/JPopover.vue.cjs");require("dompurify");;/* empty css */require("ag-grid-vue3");require("ag-grid-community");require("ag-grid-enterprise");;/* empty css */;/* empty css */;/* empty css */;/* empty css */require("vue-sonner");const p={class:"flex items-center gap-3 flex-1"},g={class:"flex items-center gap-2"},y={class:"p-2"},C={class:"text-sm text-muted-foreground whitespace-normal break-words"},_={key:0,class:"flex items-center gap-2"},h={key:1},k=e.defineComponent({__name:"JTitlebar",props:{styletype:{default:"default"},icon:{},title:{},description:{},buttons:{default:()=>[]}},emits:["buttonClick"],setup(r,{emit:a}){const c=r,i={default:{class:"flex items-center justify-between w-full h-14 px-4 border-b border-border bg-background",iconClass:"text-primary",titleClass:"text-foreground",infoIconClass:"text-muted-foreground hover:text-primary"},primary:{class:"flex items-center justify-between w-full h-14 px-4 border-b border-blue-400/30 bg-blue-500",iconClass:"text-white",titleClass:"text-white font-semibold",infoIconClass:"text-white/80 hover:text-white"},accent:{class:"flex items-center justify-between w-full h-14 px-4 border-b border-blue-200 bg-blue-50",iconClass:"text-blue-600",titleClass:"text-blue-700 font-semibold",infoIconClass:"text-blue-600/70 hover:text-blue-700"},neutral:{class:"flex items-center justify-between w-full h-14 px-4 border-b border-gray-300 bg-gray-100",iconClass:"text-gray-600",titleClass:"text-gray-700",infoIconClass:"text-gray-500 hover:text-gray-700"},elevated:{class:"flex items-center justify-between w-full h-14 px-4 border-b border-border bg-background shadow-md",iconClass:"text-primary",titleClass:"text-foreground font-semibold",infoIconClass:"text-muted-foreground hover:text-primary"}},l=e.computed(()=>i[c.styletype]??i.default),u=a,d=s=>{s.onClick?.(),u("buttonClick",s)};return(s,v)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(e.unref(n.cn)(l.value.class))},[e.createElementVNode("div",p,[r.icon?(e.openBlock(),e.createBlock(e.unref(o.default),{key:0,name:r.icon,size:"md",class:e.normalizeClass(l.value.iconClass)},null,8,["name","class"])):e.createCommentVNode("",!0),e.createElementVNode("div",g,[e.createVNode(e.unref(b.default),{text:r.title||"",class:e.normalizeClass(e.unref(n.cn)("text-lg font-semibold",l.value.titleClass))},null,8,["text","class"]),r.description?(e.openBlock(),e.createBlock(e.unref(x.default),{key:0,position:"bottom",align:"center","side-offset":8},{trigger:e.withCtx(()=>[e.createVNode(e.unref(o.default),{name:"info",size:"sm",class:e.normalizeClass(e.unref(n.cn)("cursor-help transition-colors inline-flex",l.value.infoIconClass))},null,8,["class"])]),default:e.withCtx(()=>[e.createElementVNode("div",y,[e.createElementVNode("p",C,e.toDisplayString(r.description),1)])]),_:1})):e.createCommentVNode("",!0)])]),r.buttons&&r.buttons.length>0?(e.openBlock(),e.createElementBlock("div",_,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.buttons,(t,m)=>(e.openBlock(),e.createBlock(e.unref(f.default),{key:m,variant:t.variant,styletype:t.styletype,disabled:t.disabled,loading:t.loading,class:e.normalizeClass(t.size==="sm"?"h-8":t.size==="lg"?"h-11":"h-9"),onClick:q=>d(t)},{default:e.withCtx(()=>[t.icon?(e.openBlock(),e.createBlock(e.unref(o.default),{key:0,name:t.icon,size:"sm",class:"mr-1.5"},null,8,["name"])):e.createCommentVNode("",!0),t.text?(e.openBlock(),e.createElementBlock("span",h,e.toDisplayString(t.text),1)):e.createCommentVNode("",!0)]),_:2},1032,["variant","styletype","disabled","loading","class","onClick"]))),128))])):e.createCommentVNode("",!0),e.renderSlot(s.$slots,"buttons")],2))}});exports.default=k;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("vue"),p=require("../atoms/JButton.vue.cjs");require("../shadcn/index.cjs");require("lucide-vue-next");const n=require("../../lib/utils.cjs");require("@internationalized/date");require("md-editor-v3");;/* empty css */;/* empty css */require("../shadcn/badge-variants.cjs");require("@vueuse/core");require("reka-ui");;/* empty css */require("../shadcn/avatar-variants.cjs");const o=require("../atoms/JIcon.vue.cjs"),b=require("../atoms/JLabel.vue.cjs"),x=require("../atoms/JPopover.vue.cjs");require("dompurify");;/* empty css */require("ag-grid-vue3");require("ag-grid-community");require("ag-grid-enterprise");;/* empty css */;/* empty css */;/* empty css */;/* empty css */require("vue-sonner");const C={class:"flex items-center gap-3 flex-1"},y={class:"flex items-center gap-2"},g={class:"p-2"},k={class:"text-sm text-muted-foreground whitespace-normal break-words"},h={key:0,class:"flex items-center gap-2"},v={key:1},_=e.defineComponent({__name:"JTitlebar",props:{styletype:{default:"default"},icon:{},title:{},description:{},showHelp:{type:Boolean},buttons:{default:()=>[]}},emits:["buttonClick","help"],setup(r,{emit:u}){const d=r,i={default:{class:"flex items-center justify-between w-full h-14 px-4 border-b border-border bg-background",iconClass:"text-primary",titleClass:"text-foreground",infoIconClass:"text-muted-foreground hover:text-primary"},primary:{class:"flex items-center justify-between w-full h-14 px-4 border-b border-blue-400/30 bg-blue-500",iconClass:"text-white",titleClass:"text-white font-semibold",infoIconClass:"text-white/80 hover:text-white"},accent:{class:"flex items-center justify-between w-full h-14 px-4 border-b border-blue-200 bg-blue-50",iconClass:"text-blue-600",titleClass:"text-blue-700 font-semibold",infoIconClass:"text-blue-600/70 hover:text-blue-700"},neutral:{class:"flex items-center justify-between w-full h-14 px-4 border-b border-gray-300 bg-gray-100",iconClass:"text-gray-600",titleClass:"text-gray-700",infoIconClass:"text-gray-500 hover:text-gray-700"},elevated:{class:"flex items-center justify-between w-full h-14 px-4 border-b border-border bg-background shadow-md",iconClass:"text-primary",titleClass:"text-foreground font-semibold",infoIconClass:"text-muted-foreground hover:text-primary"}},l=e.computed(()=>i[d.styletype]??i.default),a=u,m=s=>{s.onClick?.(),a("buttonClick",s)};return(s,c)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(e.unref(n.cn)(l.value.class))},[e.createElementVNode("div",C,[r.icon?(e.openBlock(),e.createBlock(e.unref(o.default),{key:0,name:r.icon,size:"md",class:e.normalizeClass(l.value.iconClass)},null,8,["name","class"])):e.createCommentVNode("",!0),e.createElementVNode("div",y,[e.createVNode(e.unref(b.default),{text:r.title||"",class:e.normalizeClass(e.unref(n.cn)("text-lg font-semibold",l.value.titleClass))},null,8,["text","class"]),r.description?(e.openBlock(),e.createBlock(e.unref(x.default),{key:0,position:"bottom",align:"center","side-offset":8},{trigger:e.withCtx(()=>[e.createVNode(e.unref(o.default),{name:"info",size:"sm",class:e.normalizeClass(e.unref(n.cn)("cursor-help transition-colors inline-flex",l.value.infoIconClass))},null,8,["class"])]),default:e.withCtx(()=>[e.createElementVNode("div",g,[e.createElementVNode("p",k,e.toDisplayString(r.description),1)])]),_:1})):e.createCommentVNode("",!0),r.showHelp?(e.openBlock(),e.createBlock(e.unref(o.default),{key:1,name:"circleQuestionMark",size:"sm",class:e.normalizeClass(e.unref(n.cn)("cursor-pointer transition-colors inline-flex",l.value.infoIconClass)),onClick:c[0]||(c[0]=t=>a("help"))},null,8,["class"])):e.createCommentVNode("",!0)])]),r.buttons&&r.buttons.length>0?(e.openBlock(),e.createElementBlock("div",h,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.buttons,(t,f)=>(e.openBlock(),e.createBlock(e.unref(p.default),{key:f,variant:t.variant,styletype:t.styletype,disabled:t.disabled,loading:t.loading,class:e.normalizeClass(t.size==="sm"?"h-8":t.size==="lg"?"h-11":"h-9"),onClick:q=>m(t)},{default:e.withCtx(()=>[t.icon?(e.openBlock(),e.createBlock(e.unref(o.default),{key:0,name:t.icon,size:"sm",class:"mr-1.5"},null,8,["name"])):e.createCommentVNode("",!0),t.text?(e.openBlock(),e.createElementBlock("span",v,e.toDisplayString(t.text),1)):e.createCommentVNode("",!0)]),_:2},1032,["variant","styletype","disabled","loading","class","onClick"]))),128))])):e.createCommentVNode("",!0),e.renderSlot(s.$slots,"buttons")],2))}});exports.default=_;
2
2
  //# sourceMappingURL=JTitlebar.vue.cjs.map