open-grid 0.4.0 → 1.0.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 (48) hide show
  1. package/dist/OpenGrid-C6SK6VeK.cjs +90 -0
  2. package/dist/OpenGrid-C6SK6VeK.cjs.map +1 -0
  3. package/dist/OpenGrid-D7EJOVi1.js +4864 -0
  4. package/dist/OpenGrid-D7EJOVi1.js.map +1 -0
  5. package/dist/open-grid-react.cjs +1 -1
  6. package/dist/open-grid-react.js +1 -1
  7. package/dist/open-grid-vue.cjs +1 -1
  8. package/dist/open-grid-vue.js +1 -1
  9. package/dist/open-grid.cjs +1 -1
  10. package/dist/open-grid.js +2 -2
  11. package/dist/types/core/CellEditManager.d.ts +2 -3
  12. package/dist/types/core/CellEventHandler.d.ts +4 -5
  13. package/dist/types/core/CellTypeRegistry.d.ts +1 -2
  14. package/dist/types/core/ColumnLayout.d.ts +1 -2
  15. package/dist/types/core/ContextMenu.d.ts +1 -2
  16. package/dist/types/core/CrossGridRegistry.d.ts +1 -2
  17. package/dist/types/core/DataLayer.d.ts +4 -2
  18. package/dist/types/core/ExportManager.d.ts +4 -3
  19. package/dist/types/core/FilterPanel.d.ts +1 -2
  20. package/dist/types/core/FilterSelect.d.ts +1 -2
  21. package/dist/types/core/FindBarManager.d.ts +4 -5
  22. package/dist/types/core/FooterManager.d.ts +2 -1
  23. package/dist/types/core/FormulaEngine.d.ts +1 -2
  24. package/dist/types/core/GridRenderer.d.ts +3 -2
  25. package/dist/types/core/GridShuttle.d.ts +1 -2
  26. package/dist/types/core/GroupEngine.d.ts +7 -4
  27. package/dist/types/core/GroupTreeManager.d.ts +6 -3
  28. package/dist/types/core/KeyboardManager.d.ts +4 -5
  29. package/dist/types/core/OpenGrid.d.ts +27 -4
  30. package/dist/types/core/OverrideKernel.d.ts +70 -0
  31. package/dist/types/core/PivotEngine.d.ts +1 -2
  32. package/dist/types/core/RowManager.d.ts +0 -1
  33. package/dist/types/core/SortFilterManager.d.ts +5 -6
  34. package/dist/types/core/TriggerManager.d.ts +1 -2
  35. package/dist/types/core/WorksheetManager.d.ts +1 -2
  36. package/dist/types/core/editors/CellEditor.d.ts +2 -3
  37. package/dist/types/core/editors/DateEditor.d.ts +2 -3
  38. package/dist/types/core/editors/SelectEditor.d.ts +2 -3
  39. package/dist/types/core/renderers/CellRenderer.d.ts +4 -4
  40. package/dist/types/core/types.d.ts +58 -0
  41. package/dist/types/index.d.ts +1 -1
  42. package/dist/types/react/OpenGrid.d.ts +3 -3
  43. package/dist/types/vue/types.d.ts +1 -2
  44. package/package.json +99 -99
  45. package/dist/OpenGrid-ClmeIJYR.cjs +0 -88
  46. package/dist/OpenGrid-ClmeIJYR.cjs.map +0 -1
  47. package/dist/OpenGrid-doS5aFVl.js +0 -4669
  48. package/dist/OpenGrid-doS5aFVl.js.map +0 -1
@@ -1,88 +0,0 @@
1
- "use strict";class tt{constructor(){this.listeners=new Map}on(e,t){const s=this.listeners.get(e)??[];return s.push({handler:t,once:!1}),this.listeners.set(e,s),this}once(e,t){const s=this.listeners.get(e)??[];return s.push({handler:t,once:!0}),this.listeners.set(e,s),this}off(e,t){if(!t)return this.listeners.delete(e),this;const s=this.listeners.get(e);if(s){const i=s.filter(n=>n.handler!==t);i.length===0?this.listeners.delete(e):this.listeners.set(e,i)}return this}emit(e,...t){const s=this.listeners.get(e);if(!s||s.length===0)return!1;const i=[];for(const n of s)n.handler(...t),n.once||i.push(n);return i.length!==s.length&&(i.length===0?this.listeners.delete(e):this.listeners.set(e,i)),!0}removeAllListeners(e){return e?this.listeners.delete(e):this.listeners.clear(),this}listenerCount(e){var t;return((t=this.listeners.get(e))==null?void 0:t.length)??0}}let st=0;function Le(){return`og-r-${++st}`}class it{constructor(e="_ogRowId"){this._data=[],this._original=[],this._meta=new Map,this._displayIndexes=[],this._idMap=new Map,this._findQuery="",this._findFields=[],this._idField=e}setData(e){this._data=e.map(t=>{const s=Le(),i={...t,[this._idField]:s};return this._meta.set(s,{state:"none",rowId:s}),i}),this._original=this._data.map(t=>({...t})),this._rebuildIdMap(),this._displayIndexes=this._data.map((t,s)=>s)}getData(){return this._displayIndexes.map(e=>this._data[e])}getOriginalData(){return[...this._original]}getAllData(){return[...this._data]}clearData(){this._data=[],this._original=[],this._meta.clear(),this._idMap.clear(),this._displayIndexes=[]}get rowCount(){return this._displayIndexes.length}get totalRowCount(){return this._data.length}addRow(e,t="last"){const s=Le(),i={...e,[this._idField]:s};if(this._meta.set(s,{state:"added",rowId:s}),t==="last"){const n=this._data.push(i)-1;this._idMap.set(s,n),this._displayIndexes.push(n)}else if(t==="first")this._data.unshift(i),this._rebuildIdMap(),this._displayIndexes.unshift(0);else{const n=Math.min(t,this._displayIndexes.length),o=n<this._displayIndexes.length?this._displayIndexes[n]:this._data.length;this._data.splice(o,0,i),this._rebuildIdMap(),this._displayIndexes=this._data.map((l,r)=>r)}}removeRow(e){const t=this._displayIndexes[e];if(t===void 0)return;const s=this._data[t],i=s[this._idField],n=this._meta.get(i);return(n==null?void 0:n.state)==="added"?(this._data.splice(t,1),this._meta.delete(i)):this._meta.set(i,{...n,state:"removed"}),this._rebuildIdMap(),this._displayIndexes=this._data.map((o,l)=>({r:o,i:l})).filter(({r:o})=>{var l;return((l=this._meta.get(o[this._idField]))==null?void 0:l.state)!=="removed"}).map(({i:o})=>o),s}moveRow(e,t){const s=this._displayIndexes[e],i=this._displayIndexes[t];if(s===void 0||i===void 0)return;const[n]=this._data.splice(s,1),o=s<i?i-1:i;this._data.splice(o,0,n),this._rebuildIdMap(),this._displayIndexes=this._data.map((l,r)=>({r:l,i:r})).filter(({r:l})=>{var r;return((r=this._meta.get(l[this._idField]))==null?void 0:r.state)!=="removed"}).map(({i:l})=>l)}updateCell(e,t,s){const i=this._displayIndexes[e];if(i===void 0)return!1;const o=this._data[i][this._idField],l=this._meta.get(o);return(l==null?void 0:l.state)==="none"&&this._meta.set(o,{...l,state:"edited",original:{...this._original[i]}}),this._data[i][t]=s,!0}getRowByIndex(e){const t=this._displayIndexes[e];return t!==void 0?this._data[t]:void 0}getCellValue(e,t){var s;return(s=this.getRowByIndex(e))==null?void 0:s[t]}getEditedRows(){return this._data.filter(e=>{var t;return((t=this._meta.get(e[this._idField]))==null?void 0:t.state)==="edited"})}getChangedRows(){return this.getEditedRows()}getAddedRows(){return this._data.filter(e=>{var t;return((t=this._meta.get(e[this._idField]))==null?void 0:t.state)==="added"})}getRemovedRows(){return this._data.filter(e=>{var t;return((t=this._meta.get(e[this._idField]))==null?void 0:t.state)==="removed"})}getChanges(){const e=[],t=[],s=[];for(const i of this._data){const n=i[this._idField],o=this._meta.get(n),l=(o==null?void 0:o.state)??"none";if(l==="added")e.push({...i});else if(l==="removed")s.push({...i});else if(l==="edited"){const r=o.original??{},a=Object.keys(i).filter(c=>c!==this._idField&&i[c]!==r[c]);t.push({...i,_changedFields:a})}}return{added:e,edited:t,removed:s}}getChangedColumns(){return this._data.filter(e=>{var t;return((t=this._meta.get(e[this._idField]))==null?void 0:t.state)==="edited"}).map(e=>{var i;const t=((i=this._meta.get(e[this._idField]))==null?void 0:i.original)??{},s=[];for(const n of Object.keys(e))n!==this._idField&&e[n]!==t[n]&&s.push({field:n,oldValue:t[n],newValue:e[n]});return{row:{...e},fields:s.map(n=>n.field),diff:s}})}getOriginalRow(e){const t=this._displayIndexes[e];if(t===void 0)return;const s=this._data[t],i=this._meta.get(s[this._idField]);if(!(!i||i.state==="added"))return i.state==="edited"&&i.original?{...i.original}:{...this._original[t]}}getRowsWithState(e){return this._data.map(t=>{var i;const s=((i=this._meta.get(t[this._idField]))==null?void 0:i.state)??"none";return{...t,[e]:s}})}getRowState(e){var s;const t=this.getRowByIndex(e);return t?((s=this._meta.get(t[this._idField]))==null?void 0:s.state)??"none":"none"}applySort(e){const t=i=>{var n,o;return((o=this._meta.get((n=this._data[i])==null?void 0:n[this._idField]))==null?void 0:o.state)!=="removed"};if(e.length===0){this._displayIndexes=this._data.map((i,n)=>n).filter(t);return}const s=this._displayIndexes.filter(t).map(i=>{const n=this._data[i];return{idx:i,keys:e.map(o=>n[o.field])}});s.sort((i,n)=>{for(let o=0;o<e.length;o++){const l=e[o].dir,r=i.keys[o],a=n.keys[o];let c=0;if(r==null&&a==null)c=0;else if(r==null)c=-1;else if(a==null)c=1;else if(typeof r=="number"&&typeof a=="number")c=r-a;else{const h=String(r),u=String(a);c=h<u?-1:h>u?1:0}if(c!==0)return l==="asc"?c:-c}return 0}),this._displayIndexes=s.map(i=>i.idx)}applyFilter(e){const t=Object.keys(e);this._displayIndexes=this._data.map((s,i)=>({r:s,i})).filter(({r:s})=>{var i;if(((i=this._meta.get(s[this._idField]))==null?void 0:i.state)==="removed"||t.length>0&&!t.every(n=>{const o=s[n];return e[n].every(l=>nt(o,l))}))return!1;if(this._findQuery&&this._findFields.length>0){const n=this._findQuery;if(!this._findFields.some(l=>{const r=s[l];return r!=null&&String(r).toLowerCase().includes(n)}))return!1}return!0}).map(({i:s})=>s)}setFindFilter(e,t){this._findQuery=e.toLowerCase(),this._findFields=t}_rebuildIdMap(){this._idMap.clear(),this._data.forEach((e,t)=>{this._idMap.set(e[this._idField],t)})}}function nt(d,e){const t=d,s=e.value;switch(e.operator){case"=":return t==s;case"!=":return t!=s;case">":return t>s;case">=":return t>=s;case"<":return t<s;case"<=":return t<=s;case"contains":return String(t).includes(String(s));case"startsWith":return String(t).startsWith(String(s));case"endsWith":return String(t).endsWith(String(s));default:return!0}}class ot{constructor(e,t){this._totalRows=0,this._scrollTop=0,this._viewportHeight=0,this._rafId=null,this._onScroll=()=>{this._scrollTop=this.container.scrollTop,this._scheduleRender()},this.container=e,this.rowHeight=t.rowHeight,this.overscan=t.overscan??5,this.onRender=t.onRender,this.container.addEventListener("scroll",this._onScroll,{passive:!0})}_scheduleRender(){this._rafId===null&&(this._rafId=requestAnimationFrame(()=>{this._rafId=null;const e=this.getVisibleRange();this.onRender(e.startIndex,e.endIndex)}))}getVisibleRange(){const e=Math.ceil(this._viewportHeight/this.rowHeight),t=Math.max(0,Math.floor(this._scrollTop/this.rowHeight)-this.overscan),s=Math.min(this._totalRows-1,t+e+this.overscan*2),i=t*this.rowHeight;return{startIndex:t,endIndex:s,offsetY:i}}setTotalRows(e){this._totalRows=e,this._updateSpacerHeight(),this._scheduleRender()}setViewportHeight(e){this._viewportHeight=e,this._scheduleRender()}setRowHeight(e){this.rowHeight=e,this._updateSpacerHeight(),this._scheduleRender()}scrollToRow(e){const t=e*this.rowHeight,s=t+this.rowHeight,i=this._scrollTop+this._viewportHeight;if(t<this._scrollTop)this._scrollTop=t,this.container.scrollTop=t;else if(s>i){const n=s-this._viewportHeight;this._scrollTop=n,this.container.scrollTop=n}}getTotalHeight(){return this._totalRows*this.rowHeight}_updateSpacerHeight(){const e=this.container.querySelector(".og-spacer");e&&(e.style.height=`${this.getTotalHeight()}px`)}destroy(){this.container.removeEventListener("scroll",this._onScroll),this._rafId!==null&&cancelAnimationFrame(this._rafId)}}class ce{constructor(e,t=0){this._flatLeaves=[],this._maxDepth=1,this._frozenCount=0,this._columns=e,this._frozenCount=t,this._process()}_process(){const e=[];let t=0;const s=(i,n)=>{for(const o of i)o.children&&o.children.length>0?(s(o.children,n+1),this._maxDepth=Math.max(this._maxDepth,n+1)):e.push({...o,_colIndex:t++,_depth:n,_leaf:!0})};this._maxDepth=1,s(this._columns,1),this._flatLeaves=e}get leaves(){return this._flatLeaves}get visibleLeaves(){return this._flatLeaves.filter(e=>!e.hidden)}get headerDepth(){return this._maxDepth}get frozenCount(){return this._frozenCount}setFrozen(e){this._frozenCount=e}setColumns(e){this._columns=e,this._process()}hideColumn(e){const t=Array.isArray(e)?e:[e];this._flatLeaves.forEach(s=>{t.includes(s.field)&&(s.hidden=!0)})}showColumn(e){const t=Array.isArray(e)?e:[e];this._flatLeaves.forEach(s=>{t.includes(s.field)&&(s.hidden=!1)})}addColumn(e,t="last"){t==="last"?this._columns.push(e):t==="first"?this._columns.unshift(e):this._columns.splice(t,0,e),this._process()}removeColumn(e){const t=s=>s.filter(i=>i.field===e?!1:(i.children&&(i.children=t(i.children)),!0));this._columns=t(this._columns),this._process()}getColumnByField(e){return this._flatLeaves.find(t=>t.field===e)}getColumnByIndex(e){return this._flatLeaves[e]}getColumnIndex(e){return this._flatLeaves.findIndex(t=>t.field===e)}buildHeaderCells(){const e=Array.from({length:this._maxDepth},()=>[]);let t=0;const s=(i,n)=>{let o=0;for(const l of i)if(!l.hidden)if(l.children&&l.children.length>0){const r=s(l.children,n+1);r>0&&(e[n-1].push({column:l,colIndex:t,depth:n,colSpan:r,rowSpan:1}),o+=r)}else e[n-1].push({column:l,colIndex:t++,depth:n,colSpan:1,rowSpan:this._maxDepth-n+1}),o++;return o};return s(this._columns,1),e}computeWidths(e,t=100){const s=this.visibleLeaves,i=s.filter(r=>r.flex),n=s.filter(r=>!r.flex&&r.width).reduce((r,a)=>r+a.width,0),o=i.reduce((r,a)=>r+(a.flex??1),0),l=Math.max(0,e-n);return s.map(r=>r.flex?Math.round(r.flex/o*l):r.width??t)}}class rt{constructor(e,t,s){this._field="",this._outsideHandler=null,this._onApply=t,this._onClear=s,this._el=document.createElement("div"),this._el.className="og-filter-panel",this._el.style.cssText=`
2
- position:absolute;z-index:1000;min-width:200px;max-width:280px;
3
- background:var(--og-row-bg,#fff);border:1px solid var(--og-border-color,#e0e0e0);
4
- border-radius:4px;box-shadow:0 4px 16px rgba(0,0,0,0.15);
5
- padding:10px;box-sizing:border-box;display:none;font-size:13px;
6
- `,e.appendChild(this._el)}open(e,t,s){var M;this._field=e,this._el.innerHTML="";const i=document.createElement("div");i.textContent="필터",i.style.cssText="font-weight:600;margin-bottom:8px;color:var(--og-text-color,#333);",this._el.appendChild(i);const n=document.createElement("div");n.style.cssText="display:flex;gap:4px;margin-bottom:6px;";const o=document.createElement("select");o.style.cssText="flex:1;padding:3px 4px;border:1px solid var(--og-border-color,#e0e0e0);border-radius:3px;font-size:12px;";const l=[{label:"포함",value:"contains"},{label:"같음",value:"="},{label:"같지 않음",value:"!="},{label:"시작",value:"startsWith"},{label:"끝남",value:"endsWith"},{label:"보다 큼",value:">"},{label:"보다 작음",value:"<"},{label:"이상",value:">="},{label:"이하",value:"<="}];for(const f of l){const E=document.createElement("option");E.value=f.value,E.textContent=f.label,o.appendChild(E)}s[0]&&(o.value=s[0].operator),n.appendChild(o),this._el.appendChild(n);const r=document.createElement("input");r.type="text",r.placeholder="필터 값 입력...",r.value=((M=s[0])==null?void 0:M.value)??"",r.style.cssText=`
7
- width:100%;padding:4px 6px;border:1px solid var(--og-border-color,#e0e0e0);
8
- border-radius:3px;font-size:12px;box-sizing:border-box;margin-bottom:8px;
9
- outline:none;
10
- `,r.addEventListener("keydown",f=>{f.key==="Enter"?h.click():f.key==="Escape"&&this.close()}),this._el.appendChild(r);const a=document.createElement("div");a.style.cssText="display:flex;gap:6px;justify-content:flex-end;";const c=document.createElement("button");c.textContent="초기화",c.style.cssText=`
11
- padding:3px 10px;border:1px solid var(--og-border-color,#e0e0e0);
12
- border-radius:3px;background:#fff;cursor:pointer;font-size:12px;color:#666;
13
- `,c.addEventListener("click",()=>{this._onClear(this._field),this.close()});const h=document.createElement("button");h.textContent="적용",h.style.cssText=`
14
- padding:3px 10px;border:1px solid var(--og-primary,#1976d2);
15
- border-radius:3px;background:var(--og-primary,#1976d2);
16
- color:#fff;cursor:pointer;font-size:12px;
17
- `,h.addEventListener("click",()=>{const f=r.value.trim();f?this._onApply(this._field,[{operator:o.value,value:f}]):this._onClear(this._field),this.close()}),a.appendChild(c),a.appendChild(h),this._el.appendChild(a);const u=t.getBoundingClientRect(),p=this._el.parentElement.getBoundingClientRect();this._el.style.top=`${u.bottom-p.top+2}px`,this._el.style.left=`${Math.min(u.left-p.left,p.width-220)}px`,this._el.style.display="block",requestAnimationFrame(()=>r.focus()),this._outsideHandler&&document.removeEventListener("mousedown",this._outsideHandler),this._outsideHandler=f=>{!this._el.contains(f.target)&&f.target!==t&&this.close()},setTimeout(()=>document.addEventListener("mousedown",this._outsideHandler),0)}close(){this._el.style.display="none",this._outsideHandler&&(document.removeEventListener("mousedown",this._outsideHandler),this._outsideHandler=null)}get isOpen(){return this._el.style.display!=="none"}destroy(){this.close(),this._el.remove()}}const lt=10;function at(d,e=lt){const t=Math.pow(10,e);return Math.round(d*t)/t}class R{constructor(e,t){this._c=e,this._s=t<0?0:t}static from(e){if(e instanceof R)return e;if(typeof e=="bigint")return new R(e,0);const t=String(e).trim();if(!t||t==="null"||t==="undefined"||t==="NaN")return new R(0n,0);const s=t.startsWith("-"),i=s?t.slice(1):t,n=i.indexOf(".");let o,l;if(n===-1)o=BigInt(i),l=0;else{const r=i.slice(n+1);o=BigInt(i.slice(0,n)+r),l=r.length}return new R(s?-o:o,l)}static zero(){return new R(0n,0)}static one(){return new R(1n,0)}static _align(e,t){return e._s===t._s?[e._c,t._c,e._s]:e._s>t._s?[e._c,t._c*10n**BigInt(e._s-t._s),e._s]:[e._c*10n**BigInt(t._s-e._s),t._c,t._s]}add(e){const[t,s,i]=R._align(this,R.from(e));return new R(t+s,i)}sub(e){const[t,s,i]=R._align(this,R.from(e));return new R(t-s,i)}mul(e){const t=R.from(e);return new R(this._c*t._c,this._s+t._s)}div(e,t=20){const s=R.from(e);if(s._c===0n)throw new Error("OGDecimal: division by zero");const n=this._c*10n**BigInt(t+s._s)/s._c;return new R(n,t+this._s)}mod(e){const t=R.from(e),[s,i,n]=R._align(this,t);return new R(s%i,n)}neg(){return new R(-this._c,this._s)}abs(){return new R(this._c<0n?-this._c:this._c,this._s)}eq(e){const[t,s]=R._align(this,R.from(e));return t===s}gt(e){const[t,s]=R._align(this,R.from(e));return t>s}lt(e){const[t,s]=R._align(this,R.from(e));return t<s}gte(e){return!this.lt(e)}lte(e){return!this.gt(e)}isZero(){return this._c===0n}isNeg(){return this._c<0n}isPos(){return this._c>0n}toFixed(e){let t=this._c,s=this._s;if(s<e)t=t*10n**BigInt(e-s);else if(s>e){const c=10n**BigInt(s-e),h=c/2n,u=t<0n,p=u?-t:t,M=p%c;let f=p/c;M>=h&&(f+=1n),t=u?-f:f}s=e;const i=t<0n,o=(i?-t:t).toString().padStart(e+1,"0"),l=o.slice(0,o.length-e)||"0",r=e>0?"."+o.slice(o.length-e):"";return(i?"-":"")+l+r}toString(){if(this._s===0)return this._c.toString();let e=this._c,t=this._s;for(;t>0&&e!==0n&&e%10n===0n;)e/=10n,t--;return new R(e,t).toFixed(t)}toNumber(){return parseFloat(this.toFixed(20))}static sum(e){return e.reduce((t,s)=>t.add(s),R.zero())}static avg(e,t=20){return e.length?R.sum(e).div(e.length,t):R.zero()}static min(e){if(!e.length)throw new Error("OGDecimal.min: empty array");return e.map(R.from).reduce((t,s)=>t.lt(s)?t:s)}static max(e){if(!e.length)throw new Error("OGDecimal.max: empty array");return e.map(R.from).reduce((t,s)=>t.gt(s)?t:s)}}function Ve(d,e,t=30){return new dt(d,e,t).parse()}class dt{constructor(e,t,s){this._ctx=t,this._prec=s,this._pos=0,this._src=e.trim()}parse(){const e=this._additive();if(this._skip(),this._pos<this._src.length)throw new SyntaxError(`FormulaEngine: 예상치 못한 토큰 '${this._src[this._pos]}' (위치 ${this._pos})`);return e}_additive(){let e=this._multiplicative();for(this._skip();this._pos<this._src.length;){const t=this._src[this._pos];if(t!=="+"&&t!=="-")break;this._pos++,this._skip();const s=this._multiplicative();e=t==="+"?e.add(s):e.sub(s),this._skip()}return e}_multiplicative(){let e=this._unary();for(this._skip();this._pos<this._src.length;){const t=this._src[this._pos];if(t!=="*"&&t!=="/"&&t!=="%")break;this._pos++,this._skip();const s=this._unary();t==="*"?e=e.mul(s):t==="/"?e=e.div(s,this._prec):e=e.mod(s),this._skip()}return e}_unary(){return this._skip(),this._src[this._pos]==="-"?(this._pos++,this._unary().neg()):this._primary()}_primary(){this._skip();const e=this._src[this._pos];if(e==="("){this._pos++;const t=this._additive();if(this._skip(),this._src[this._pos]!==")")throw new SyntaxError("FormulaEngine: 닫는 괄호 ) 누락");return this._pos++,t}return e==="["?this._fieldRef():this._literal()}_fieldRef(){this._pos++;const e=this._pos;for(;this._pos<this._src.length&&this._src[this._pos]!=="]";)this._pos++;if(this._pos>=this._src.length)throw new SyntaxError("FormulaEngine: 닫는 ] 누락");const t=this._src.slice(e,this._pos);this._pos++;const s=this._ctx[t];if(s==null)throw new ReferenceError(`FormulaEngine: 필드 '[${t}]'가 행 데이터에 없습니다`);return R.from(s)}_literal(){const e=this._pos;for(;this._pos<this._src.length&&/[0-9.]/.test(this._src[this._pos]);)this._pos++;const t=this._src.slice(e,this._pos);if(!t)throw new SyntaxError(`FormulaEngine: 숫자 또는 [필드]를 기대했지만 '${this._src[this._pos]??"EOF"}' 발견 (위치 ${e})`);return R.from(t)}_skip(){for(;this._pos<this._src.length&&/\s/.test(this._src[this._pos]);)this._pos++}}function Me(d,e){if(d==null||d==="")return d??"";const t=typeof e=="string"?{type:e}:e,s=t.char??"*";switch(t.type){case"ssn":return ct(d,s);case"phone":case"mobile":return ht(d,s);case"email":return ut(d,s);case"credit":return pt(d,s);case"account":return gt(d,s,t.visiblePrefix??3,t.visibleSuffix??4);case"password":return s.repeat(Math.max(d.length,6));case"name":return _t(d,s);case"ip":return ft(d,s);case"partial":return se(d,s,t.visiblePrefix??0,t.visibleSuffix??4);default:return d}}function ct(d,e){const t=d.replace(/[^0-9]/g,"");if(t.length<7){const o=d.includes("-")?"-":"",l=d.indexOf("-")>=0?d.indexOf("-"):6;return d.slice(0,l)+o+e.repeat(Math.max(1,d.length-l-o.length))}const s=t.slice(0,6),i=t[6],n=t.length-7;return`${s}-${i}${e.repeat(n)}`}function ht(d,e){const t=d.replace(/[^0-9]/g,"");return t.length===11?`${t.slice(0,3)}-${e.repeat(4)}-${t.slice(7)}`:t.length===10?t.startsWith("02")?`${t.slice(0,2)}-${e.repeat(4)}-${t.slice(6)}`:`${t.slice(0,3)}-${e.repeat(3)}-${t.slice(6)}`:t.length===9?`${t.slice(0,2)}-${e.repeat(3)}-${t.slice(5)}`:se(d,e,3,4)}function ut(d,e){const t=d.indexOf("@");if(t<0)return se(d,e,2,0);const s=d.slice(0,t),i=d.slice(t),n=Math.min(2,s.length),o=s.slice(0,n),l=Math.max(s.length-n,3);return`${o}${e.repeat(l)}${i}`}function pt(d,e){const t=d.replace(/[^0-9]/g,"");if(t.length<8)return d;const s=t.slice(0,4),i=t.slice(-4),n=t.length-8,o=e.repeat(Math.max(n,8)),l=[s];for(let r=0;r<o.length;r+=4){const a=o.slice(r,r+4);a&&l.push(a)}return l.push(i),l.join("-")}function gt(d,e,t,s){const i=d.replace(/[^0-9]/g,"");if(i.length<=t+s)return se(i,e,t,s);const n=i.slice(0,t),o=i.slice(-s),l=i.length-t-s;return`${n}-${e.repeat(l)}-${o}`}function _t(d,e){const t=d.trim();return t.length===0?d:t.length===1?e:t.length===2?`${t[0]}${e}`:`${t[0]}${e.repeat(t.length-2)}${t[t.length-1]}`}function ft(d,e){const t=d.split(".");if(t.length!==4)return se(d,e,3,0);const s=i=>e.repeat(Math.max(i.length,3));return`${t[0]}.${t[1]}.${s(t[2])}.${s(t[3])}`}function se(d,e,t,s){if(d.length<=t+s)return d;const i=d.slice(0,t),n=s>0?d.slice(-s):"",o=d.length-t-s;return`${i}${e.repeat(o)}${n}`}function je(d){const e=d.column;if(!e.formula)return null;const t=e.formulaPrecision??30;try{let s;return typeof e.formula=="function"?s=e.formula(d.row,R):s=Ve(e.formula,d.row,t),s instanceof R?e.precision!=null?s.toFixed(e.precision):s.toString():typeof s=="string"?s:e.precision!=null?R.from(s).toFixed(e.precision):String(s)}catch(s){return console.warn("[OpenGrid] Formula error:",s),"#ERR"}}function mt(d,e,t,s){if(d==null||d==="")return"";let i=Number(d);if(isNaN(i))return String(d);if(t!=null&&(i=at(i,t)),s)try{return new Intl.NumberFormat(void 0,{style:"currency",currency:s,...t!=null?{minimumFractionDigits:t,maximumFractionDigits:t}:{}}).format(i)}catch{}if(!e)return t!=null?i.toFixed(t):String(i);const n=e.indexOf(";"),o=n>=0?e.slice(n+1):null,l=i<0&&o!=null?o:n>=0?e.slice(0,n):e,r=i<0&&o!=null?Math.abs(i):i,a=l.match(/[#0][#0,]*(?:\.[#0]+)?/);if(!a)return String(i);const c=a[0],h=l.slice(0,a.index),u=l.slice(a.index+c.length),p=c.includes(","),M=c.includes(".")?c.split(".")[1].length:t??0,f=r.toLocaleString("ko-KR",{minimumFractionDigits:M,maximumFractionDigits:M,useGrouping:p});return h+f+u}function Ue(d,e="yyyy-MM-dd"){if(!d)return"";const t=d instanceof Date?d:new Date(d);if(isNaN(t.getTime()))return String(d);const s=t.getFullYear(),i=String(t.getMonth()+1).padStart(2,"0"),n=String(t.getDate()).padStart(2,"0");return e.replace("yyyy",String(s)).replace("MM",i).replace("dd",n)}function bt(d,e,t){const s=Me(d,e.mask),i=document.createElement("span");i.style.cssText="display:flex;align-items:center;gap:3px;overflow:hidden;width:100%;box-sizing:border-box;";const n=document.createElement("span");n.style.cssText="flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:monospace;letter-spacing:0.4px;color:var(--og-mask-text,#888);",n.textContent=s;const o=document.createElement("button");return o.title="클릭하면 원문 표시",o.setAttribute("aria-label","마스킹 해제"),o.innerHTML='<svg width="13" height="13" viewBox="0 0 16 16" fill="currentColor"><path d="M16 8s-3-5.5-8-5.5S0 8 0 8s3 5.5 8 5.5S16 8 16 8z"/><path d="M8 5.5A2.5 2.5 0 1 0 8 10.5 2.5 2.5 0 0 0 8 5.5zm0 4A1.5 1.5 0 1 1 8 6.5a1.5 1.5 0 0 1 0 3z" fill="#fff"/></svg>',o.style.cssText="flex-shrink:0;background:none;border:none;cursor:pointer;color:#c0c0c0;padding:1px 2px;line-height:0;border-radius:3px;display:flex;align-items:center;",o.addEventListener("mouseover",()=>{o.style.color="var(--og-primary,#1976d2)",o.style.background="rgba(25,118,210,0.08)"}),o.addEventListener("mouseout",()=>{o.style.color="#c0c0c0",o.style.background="none"}),o.addEventListener("click",l=>{l.stopPropagation(),n.textContent=d,n.style.fontFamily="",n.style.letterSpacing="",n.style.color="",o.remove(),(e._maskRevealedRows??(e._maskRevealedRows=new Set)).add(t)}),i.appendChild(n),i.appendChild(o),i}class he{render(e){var r;const t=document.createElement("span");t.className="og-cell-text";const s=je(e);if(s!==null)return t.textContent=s,t.style.cssText="overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;",t;const{value:i,column:n,rowIndex:o}=e;let l;if(n.valueMap&&i!=null&&n.valueMap[i]?l=n.valueMap[i]:l=i==null?"":String(i),n.mask){const a=n._maskRevealed===!0,c=((r=n._maskRevealedRows)==null?void 0:r.has(o))===!0;if(!a&&!c)return bt(l,n,o)}return t.textContent=l,t.style.cssText="overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;",t}}class yt{constructor(e=[],t){this._opts=e.map(s=>typeof s=="string"?{label:s,value:s}:{label:s.label??s.text??String(s.value??""),value:s.value}),this._fn=t??null}render(e){const t=document.createElement("span");t.className="og-cell-text",t.style.cssText="overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;";const s=e.value;if(s==null||s==="")return t;const i=String(s),o=(this._fn?this._fn(e.row,e.rowIndex).map(l=>typeof l=="string"?{label:l,value:l}:{label:l.label??l.text??String(l.value??""),value:l.value}):this._opts).find(l=>String(l.value)===i);return t.textContent=o?o.label:i,t}}class ue{render(e){const t=document.createElement("span");t.className="og-cell-number";const s=je(e);return s!==null?(t.textContent=s,t.style.cssText="overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;width:100%;text-align:right;",t):(t.textContent=mt(e.value,e.column.format??"#,##0",e.column.precision,e.column.currency),t.style.cssText="overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;width:100%;text-align:right;",t)}}class pe{render(e){const t=document.createElement("span");return t.className="og-cell-date",t.textContent=Ue(e.value,e.column.format),t.style.cssText="overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;",t}}class ge{render(e){const t=document.createElement("span");t.className="og-cell-checkbox",t.style.cssText="display:flex;align-items:center;justify-content:center;height:100%;";const s=document.createElement("input");return s.type="checkbox",s.checked=!!e.value,s.disabled=!0,s.style.cssText+="cursor:pointer;pointer-events:none;",t.appendChild(s),t}}class Se{constructor(e){this.def=e}render(e){var n,o,l;const t=document.createElement("span");t.style.cssText="display:flex;align-items:center;justify-content:center;height:100%;";const s=document.createElement("button");s.className=`og-cell-btn${(n=this.def)!=null&&n.buttonClass?" "+this.def.buttonClass:""}`;const i=(o=this.def)==null?void 0:o.label;return typeof i=="function"?s.textContent=i(e.value,e.row):s.textContent=i??String(e.value??"btn"),s.style.cssText=`
18
- padding:2px 10px;border:1px solid var(--og-primary,#1976d2);
19
- border-radius:4px;background:var(--og-row-bg,#fff);color:var(--og-primary,#1976d2);
20
- cursor:pointer;font-size:12px;white-space:nowrap;transition:background 0.12s;
21
- ${((l=this.def)==null?void 0:l.style)??""}
22
- `,s.addEventListener("mouseover",()=>s.style.background="var(--og-primary-light,#e3f2fd)"),s.addEventListener("mouseout",()=>s.style.background="var(--og-row-bg,#fff)"),t.appendChild(s),t}}class Fe{constructor(e,t){this.colorMap=e,this.labelMap=t}render(e){var l,r,a;const t=document.createElement("span");t.style.cssText="display:flex;align-items:center;height:100%;";const s=document.createElement("span"),i=e.value==null?"":String(e.value),n=((l=this.labelMap)==null?void 0:l[i])??((r=e.column.valueMap)==null?void 0:r[i])??i;s.textContent=n;const o=((a=this.colorMap)==null?void 0:a[i])??"#666";return s.style.cssText=`
23
- display:inline-block;padding:2px 8px;border-radius:12px;font-size:11px;
24
- background:${o}22;color:${o};border:1px solid ${o}66;
25
- white-space:nowrap;
26
- `,t.appendChild(s),t}}class Te{constructor(e,t){this.hrefFn=e,this.target=t}render(e){const t=document.createElement("a");return t.className="og-cell-link",t.textContent=e.value==null?"":String(e.value),t.href=this.hrefFn?this.hrefFn(e.value,e.row):"#",this.target&&(t.target=this.target),t.style.cssText="color:var(--og-primary,#1976d2);text-decoration:underline;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;",this.hrefFn||t.addEventListener("click",s=>s.preventDefault()),t}}class wt{constructor(e){this.templateFn=e}render(e){const t=document.createElement("div");return t.className="og-cell-template",t.style.cssText="display:flex;align-items:center;height:100%;overflow:hidden;",t.innerHTML=this.templateFn(e.value,e.row,e.rowIndex),t}}class vt{constructor(e){this.def=e}render(e){var a,c,h,u,p;const t=document.createElement("span");t.style.cssText="display:flex;align-items:center;justify-content:center;height:100%;";const s=document.createElement("img"),i=(a=this.def)!=null&&a.srcFn?this.def.srcFn(e.value,e.row):String(e.value??"");s.src=i;const n=((c=this.def)==null?void 0:c.width)??28,o=((h=this.def)==null?void 0:h.height)??28,l=((u=this.def)==null?void 0:u.radius)??4;s.style.cssText=`width:${n}px;height:${o}px;object-fit:cover;border-radius:${l}px;display:block;`;const r=(p=this.def)==null?void 0:p.alt;return s.alt=typeof r=="function"?r(e.value,e.row):r??"",s.onerror=()=>{s.style.display="none"},t.appendChild(s),t}}class xt{constructor(e){this.def=e}render(e){var a,c,h,u;const t=document.createElement("span");t.style.cssText="display:flex;align-items:center;gap:5px;width:100%;padding:0 4px;box-sizing:border-box;";const s=((a=this.def)==null?void 0:a.max)??100,i=Number(e.value)||0,n=Math.min(100,Math.max(0,i/s*100)),o=(c=this.def)!=null&&c.colorFn?this.def.colorFn(i):((h=this.def)==null?void 0:h.color)??"var(--og-primary,#1976d2)",l=document.createElement("div");l.className="og-progress-track",l.style.cssText="flex:1;height:10px;background:#e0e0e0;border-radius:5px;overflow:hidden;";const r=document.createElement("div");if(r.className="og-progress-fill",r.style.cssText=`width:${n}%;height:100%;background:${o};border-radius:5px;`,l.appendChild(r),t.appendChild(l),((u=this.def)==null?void 0:u.showLabel)!==!1){const p=document.createElement("span");p.style.cssText="font-size:11px;color:#666;white-space:nowrap;min-width:28px;text-align:right;",p.textContent=`${Math.round(n)}%`,t.appendChild(p)}return t}}class Ct{constructor(e){this.def=e}render(e){var c,h,u,p;const t=document.createElement("span");t.style.cssText="display:flex;align-items:center;justify-content:center;height:100%;";const s=Array.isArray(e.value)?e.value.map(Number):[];if(!s.length)return t.textContent="-",t;const i=((c=this.def)==null?void 0:c.width)??80,n=((h=this.def)==null?void 0:h.height)??22,o=((u=this.def)==null?void 0:u.color)??"#1976d2",l=((p=this.def)==null?void 0:p.chartType)??"bar",r=document.createElement("canvas");r.width=i,r.height=n,r.style.cssText="display:block;";const a=r.getContext("2d");if(a){const M=Math.max(...s,1),f=Math.min(...s,0),E=M-f||1,x=s.length;if(l==="bar"){const g=i/x;s.forEach((w,L)=>{const v=(w-f)/E*(n-2);a.fillStyle=o,a.fillRect(L*g+1,n-v-1,g-2,v)})}else{const g=s.map((w,L)=>({x:L/(x-1||1)*i,y:n-(w-f)/E*(n-4)-2}));l==="area"&&(a.fillStyle=o+"33",a.beginPath(),a.moveTo(g[0].x,n),g.forEach(w=>a.lineTo(w.x,w.y)),a.lineTo(g[g.length-1].x,n),a.closePath(),a.fill()),a.strokeStyle=o,a.lineWidth=1.5,a.beginPath(),g.forEach((w,L)=>L===0?a.moveTo(w.x,w.y):a.lineTo(w.x,w.y)),a.stroke()}}return t.appendChild(r),t}}class De{render(e){const t=document.createElement("span");t.style.cssText="display:flex;align-items:center;justify-content:center;height:100%;";const s=!!e.value,i=document.createElement("span");i.className="og-switch"+(s?" og-switch--on":""),i.style.cssText=`display:inline-block;width:34px;height:18px;border-radius:9px;
27
- background:${s?"var(--og-primary,#1976d2)":"#bdbdbd"};
28
- position:relative;transition:background 0.2s;cursor:pointer;flex-shrink:0;pointer-events:none;`;const n=document.createElement("span");return n.style.cssText=`position:absolute;top:2px;left:${s?"16px":"2px"};
29
- width:14px;height:14px;border-radius:50%;background:#fff;
30
- transition:left 0.2s;box-shadow:0 1px 3px rgba(0,0,0,0.3);`,i.appendChild(n),t.appendChild(i),t}}class Mt{constructor(e){this.def=e}render(e){var o,l;const t=document.createElement("span");t.style.cssText="display:flex;align-items:center;gap:1px;height:100%;";const s=((o=this.def)==null?void 0:o.max)??5,i=Math.round(Number(e.value)||0),n=((l=this.def)==null?void 0:l.color)??"#ffa000";for(let r=1;r<=s;r++){const a=document.createElement("span");a.textContent="★",a.style.cssText=`font-size:14px;color:${r<=i?n:"#e0e0e0"};line-height:1;`,t.appendChild(a)}return t}}class _e{render(e){const t=document.createElement("span");t.style.cssText="display:flex;align-items:center;justify-content:center;height:100%;pointer-events:none;";const s=document.createElement("input");return s.type="radio",s.checked=!!e.value,s.setAttribute("aria-checked",e.value?"true":"false"),s.setAttribute("aria-label",e.column.header??"선택"),e.column.group&&(s.name=`og-radio-${e.rowIndex}-${e.column.group}`),s.style.cssText="width:14px;height:14px;cursor:pointer;accent-color:var(--og-primary,#1976d2);",t.appendChild(s),t}}class fe{render(e){const t=document.createElement("span");if(t.style.cssText="display:flex;align-items:center;justify-content:center;height:100%;overflow:hidden;",!e.value)return t;const s=document.createElement("img");return s.src=String(e.value),s.alt=e.column.alt??e.column.field,s.style.cssText="max-width:100%;max-height:100%;object-fit:contain;display:block;",s.setAttribute("role","img"),t.appendChild(s),t}}function Rt(d){const e=document.createElement("div");return e.innerHTML=d,e.querySelectorAll("script,iframe,object,embed").forEach(t=>t.remove()),e.querySelectorAll("*").forEach(t=>{for(const s of[...t.attributes])s.name.startsWith("on")&&t.removeAttribute(s.name);if(t.tagName==="A"){const s=t.getAttribute("href")??"";/^javascript:/i.test(s)&&t.removeAttribute("href")}}),e.innerHTML}class me{render(e){const t=document.createElement("span");t.style.cssText="display:block;overflow:hidden;width:100%;";const s=e.column.sanitize!==!1,i=String(e.value??"");return t.innerHTML=s?Rt(i):i,t}}const Et=["212222","222122","222221","121223","121322","131222","122213","122312","132212","221213","221312","231212","112232","122132","122231","113222","123122","123221","223211","221132","221231","213212","223112","312131","311222","321122","321221","312212","322112","322211","212123","212321","232121","111323","131123","131321","112313","132113","132311","211313","231113","231311","112133","112331","132131","113123","113321","133121","313121","211331","231131","213113","213311","213131","311123","311321","331121","312113","312311","332111","314111","221411","431111","111224","111422","121124","121421","141122","141221","112214","112412","122114","122411","142112","142211","241211","221114","413111","241112","134111","111242","121142","121241","114212","124112","124211","411212","421112","421211","212141","214121","412121","111143","111341","131141","114113","114311","411113","411311","113141","114131","311141","411131","211412","211214","211232"],kt="2331112";function $e(d){let e="",t=!0;for(const s of d)e+=(t?"1":"0").repeat(+s),t=!t;return e}function Lt(d){const e=[104];for(const s of d){const i=s.charCodeAt(0)-32;i>=0&&i<=94&&e.push(i)}let t=104;for(let s=1;s<e.length;s++)t+=e[s]*s;return e.push(t%103),e.map(s=>$e(Et[s])).join("")+$e(kt)+"11"}class be{render(e){const t=String(e.value??""),s=e.column.barcodeHeight??28,i=document.createElement("div");i.style.cssText="display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;overflow:hidden;gap:1px;",i.setAttribute("role","img"),i.setAttribute("aria-label",`바코드: ${t}`),i.innerHTML=St(t,s);const n=document.createElement("span");return n.textContent=t,n.style.cssText="font-size:9px;font-family:monospace;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%;",i.appendChild(n),i}}function St(d,e){if(!d)return"";const t=Lt(d),s=1.4,i=6,n=t.length*s+i*2,o=[];let l=0,r=i;for(;l<t.length;)if(t[l]==="1"){let a=0;for(;l+a<t.length&&t[l+a]==="1";)a++;o.push(`<rect x="${r.toFixed(2)}" y="0" width="${(a*s).toFixed(2)}" height="${e}"/>`),r+=a*s,l+=a}else r+=s,l++;return`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${n.toFixed(2)} ${e}" width="${n.toFixed(2)}" height="${e}" style="display:block" aria-hidden="true"><g fill="currentColor">${o.join("")}</g></svg>`}function Ft(d){const e=d.renderer;if(!e)switch(d.type){case"number":return new ue;case"date":return new pe;case"boolean":return new ge;case"radio":return new _e;case"img":return new fe;case"html":return new me;case"barcode":return new be;case"select":return new yt(d.options??[],d.optionsFn);default:return new he}if(typeof e=="string")switch(e){case"number":return new ue;case"date":return new pe;case"checkbox":return new ge;case"button":return new Se;case"link":return new Te;case"badge":return new Fe;case"switch":return new De;case"radio":return new _e;case"img":return new fe;case"html":return new me;case"barcode":return new be;default:return new he}switch(e.type){case"button":return new Se(e);case"checkbox":return new ge;case"link":return new Te(e.hrefFn,e.target);case"template":return new wt(e.templateFn);case"badge":return new Fe(e.colorMap,e.labelMap??e.valueMap);case"image":return new vt(e);case"progress":return new xt(e);case"sparkline":return new Ct(e);case"switch":return new De;case"rating":return new Mt(e);case"number":return new ue;case"date":return new pe;case"radio":return new _e;case"img":return new fe;case"html":return new me;case"barcode":return new be;default:return new he}}class Tt{constructor(e,t,s){this._cellMap=new Map,this._root=e,this._opts=t,this._cbs=s,this._header=D("div","og-header"),this._header.style.cssText="flex-shrink:0;overflow-x:auto;overflow-y:hidden;border:0;border-bottom:1px solid var(--og-border-color,#e0e0e0);scrollbar-width:none;",this._bodyWrap=D("div","og-body-wrapper"),this._bodyWrap.style.cssText="flex:1;overflow:auto;position:relative;",this._bodyWrap.style.setProperty("--scrollbar-size","8px"),this._body=D("div","og-body"),this._body.style.cssText="position:relative;",this._bodyWrap.appendChild(this._body),e.appendChild(this._header),e.appendChild(this._bodyWrap),this._bodyWrap.addEventListener("scroll",()=>{this._header.scrollLeft=this._bodyWrap.scrollLeft},{passive:!0})}get bodyWrapper(){return this._bodyWrap}updateSize(e,t){this._bodyWrap.style.height=`${e-t}px`}renderHeader(e,t,s,i,n){var p,M;this._header.innerHTML="";const o=n._frozenCount??0;let l=0;n.stateColumn&&(l+=24),n.draggable&&(l+=18),n.rowNumber&&(l+=44),n.checkColumn&&(l+=36);const r=l+t.reduce((f,E,x)=>f+(s[x]??n.defaultColumnWidth),0);this._header.style.background="var(--og-header-bg,#f5f5f5)";const a=D("table","og-header-table");a.setAttribute("role","presentation"),a.style.cssText=`table-layout:fixed;border-collapse:collapse;border-spacing:0;margin:0;width:${r}px;background:var(--og-header-bg,#f5f5f5);`;const c=e.length;let h=0;const u=(f,E,x,g="")=>{const w=D("th",`og-header-cell og-extra-col ${g}`);w.setAttribute("rowspan",String(c)),w.textContent=x,ze(w,{width:`${E}px`,minWidth:`${E}px`,textAlign:"center",borderRight:"1px solid var(--og-border-color,#e0e0e0)",borderBottom:"1px solid var(--og-border-color,#e0e0e0)",borderTop:"0",borderLeft:"0",lineHeight:"normal",verticalAlign:"middle",padding:"0",fontSize:"11px",color:"#999",userSelect:"none",boxSizing:"border-box",background:"var(--og-header-bg,#f5f5f5)"}),o>0&&(w.style.position="sticky",w.style.left=`${h}px`,w.style.zIndex="4"),h+=E,f.appendChild(w)};for(let f=0;f<e.length;f++){const E=D("tr","og-header-row");if(E.style.height=`${n.headerHeight}px`,f===0&&(n.stateColumn&&u(E,24,""),n.draggable&&u(E,18,""),n.rowNumber&&u(E,44,"No"),n.checkColumn)){const x=D("th","og-header-cell og-extra-col");x.setAttribute("rowspan",String(c)),x.style.cssText="width:36px;min-width:36px;text-align:center;border-right:1px solid var(--og-border-color,#e0e0e0);border-bottom:1px solid var(--og-border-color,#e0e0e0);border-top:0;border-left:0;line-height:normal;vertical-align:middle;background:var(--og-header-bg,#f5f5f5);box-sizing:border-box;",o>0&&(x.style.position="sticky",x.style.left=`${h}px`,x.style.zIndex="4"),h+=36;const g=document.createElement("input");g.type="checkbox",g.setAttribute("aria-label","전체 행 선택"),g.style.cssText="width:16px;height:16px;",g.addEventListener("change",()=>this._cbs.onAllCheck(g.checked)),x.appendChild(g),E.appendChild(x)}for(const x of e[f]??[]){const g=D("th","og-header-cell"),w=x.column;x.colSpan>1&&(g.colSpan=x.colSpan),x.rowSpan>1&&(g.rowSpan=x.rowSpan);const L=x.colSpan===1?t.findIndex(_=>_.field===w.field):-1;if(x.colSpan===1){const _=L>=0?s[L]??n.defaultColumnWidth:w.width??n.defaultColumnWidth;g.style.width=`${_}px`,g.style.minWidth=`${_}px`}const v=i.find(_=>_.field===w.field),C=w.sortable!==!1&&n.sortable&&x.colSpan===1;if(g.setAttribute("role","columnheader"),g.setAttribute("scope","col"),C&&(g.setAttribute("aria-sort",v?v.dir==="asc"?"ascending":"descending":"none"),g.tabIndex=L===0?0:-1,g.addEventListener("keydown",_=>{if(_.key==="Enter"||_.key===" ")_.preventDefault(),this._cbs.onHeaderClick(w.field,_.shiftKey);else if(_.key==="ArrowRight"){_.preventDefault();const b=g.nextElementSibling;(b==null?void 0:b.tagName)==="TH"&&b.focus()}else if(_.key==="ArrowLeft"){_.preventDefault();const b=g.previousElementSibling;(b==null?void 0:b.tagName)==="TH"&&b.focus()}})),L>=0&&L<o){let _=0;n.stateColumn&&(_+=24),n.draggable&&(_+=18),n.rowNumber&&(_+=44),n.checkColumn&&(_+=36);for(let b=0;b<L;b++)_+=s[b]??n.defaultColumnWidth;g.classList.add("og-frozen"),L===o-1&&g.classList.add("og-frozen-last"),g.style.left=`${_}px`}ze(g,{padding:"4px 8px",boxSizing:"border-box",background:"var(--og-header-bg)",color:"var(--og-header-color)",lineHeight:"normal",verticalAlign:"middle",fontSize:"var(--og-font-size)",textAlign:w.headerAlign??"center",borderTop:"0",borderLeft:"0",borderRight:"1px solid var(--og-border-color,#e0e0e0)",borderBottom:"1px solid var(--og-border-color,#e0e0e0)",userSelect:"none",cursor:C?"pointer":"default",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis",position:"relative"}),g.title=(typeof w.tooltip=="string"?w.tooltip:w.header??w.field)??"";const F=D("span");if(F.textContent=w.header??w.field,F.style.cssText="overflow:hidden;text-overflow:ellipsis;white-space:nowrap;",g.appendChild(F),v){g.classList.add("og-sorted");const _=D("span","og-sort-icon");_.textContent=v.dir==="asc"?" ↑":" ↓",g.appendChild(_)}if(w.filterable!==!1&&n.filterable&&x.colSpan===1){const _=D("span","og-filter-icon"),b=((M=(p=n._activeFilters)==null?void 0:p[w.field])==null?void 0:M.length)>0;_.textContent=b?"⊿":"▿",_.title="필터",_.style.cssText="margin-left:3px;cursor:pointer;font-size:10px;opacity:0.6;",b&&_.classList.add("og-filter-icon--active"),_.addEventListener("click",T=>{T.stopPropagation(),this._cbs.onFilterIconClick(w.field,_)}),g.appendChild(_)}if(w.resizable!==!1){const _=D("div","og-resize-handle");_.style.cssText="position:absolute;right:0;top:0;bottom:0;width:4px;cursor:col-resize;z-index:1;",g.appendChild(_);const b=L;Dt(_,g,T=>{b>=0&&this._cbs.onColResize(b,T)})}n.columnReorder&&L>=0&&x.colSpan===1&&(g.draggable=!0,g.addEventListener("dragstart",_=>{var b;this._cbs.onColDragStart(L),g.classList.add("og-col-dragging"),(b=_.dataTransfer)==null||b.setData("text/plain",String(L))}),g.addEventListener("dragend",()=>{g.classList.remove("og-col-dragging"),this._header.querySelectorAll(".og-col-drop-over").forEach(_=>_.classList.remove("og-col-drop-over"))}),g.addEventListener("dragover",_=>{_.preventDefault();const b=this._cbs.getColDragIdx();b!==null&&b!==L&&(this._header.querySelectorAll(".og-col-drop-over").forEach(T=>T.classList.remove("og-col-drop-over")),g.classList.add("og-col-drop-over"))}),g.addEventListener("dragleave",()=>{g.classList.remove("og-col-drop-over")}),g.addEventListener("drop",_=>{_.preventDefault(),g.classList.remove("og-col-drop-over"),this._cbs.onColDrop(L)})),C&&g.addEventListener("click",_=>{_.target.classList.contains("og-resize-handle")||this._cbs.onHeaderClick(w.field,_.shiftKey)}),E.appendChild(g)}a.appendChild(E)}this._header.appendChild(a)}renderBody(e,t,s,i,n,o,l,r,a,c,h=null,u,p,M={},f){var w,L;Object.keys(M).length&&(o={...o,...M}),this._body.innerHTML="",this._cellMap.clear();const E=o.autoHeight===!0;this._body.classList.toggle("og-autoheight",E),this._body.style.height=E?"":`${r}px`;const x=o._frozenCount??0;{let v=0;o.stateColumn&&(v+=24),o.draggable&&(v+=18),o.rowNumber&&(v+=44),o.checkColumn&&(v+=36);const C=v+i.reduce((F,K,_)=>F+(n[_]??o.defaultColumnWidth),0);this._body.style.minWidth=`${C}px`}if(t<e)return;const g=document.createDocumentFragment();for(let v=e;v<=t;v++){const C=h?h[v]:null,F=C&&C._isGroup===!0,K=C&&C._isTree===!0;if(F){const m=C,S=`__${m._groupField}:${m._groupValue}`,z=D("div","og-group-row"),ie=l+(v-e)*o.rowHeight;z.style.cssText=[E?"":`top:${ie}px;height:${o.rowHeight}px;`,"display:flex;align-items:stretch;cursor:pointer;",`padding-left:${4+m._depth*12}px;`,"background:var(--og-header-bg,#f5f5f5);","border:0;border-bottom:1px solid var(--og-border-color,#e0e0e0);"].join(""),z.setAttribute("role","row"),z.setAttribute("aria-expanded",m._expanded?"true":"false"),z.setAttribute("aria-rowindex",String(v+1)),z.setAttribute("aria-level",String(m._depth+1));let V=0;if(o.stateColumn&&(V+=24),o.draggable&&(V+=18),o.rowNumber&&(V+=44),o.checkColumn&&(V+=36),V>0){const y=D("div","og-group-state-cell");y.style.cssText=[`width:${V}px;min-width:${V}px;flex-shrink:0;`,"display:flex;align-items:center;justify-content:center;","font-size:10px;font-weight:700;gap:2px;","border-right:1px solid var(--og-border-color,#e0e0e0);"].join("");const I=m._states??{added:0,edited:0,removed:0};if(I.added>0){const H=D("span");H.textContent=`+${I.added}`,H.style.cssText="color:var(--og-row-added-bg,#2e7d32);background:#e8f5e9;padding:1px 3px;border-radius:3px;",y.appendChild(H)}if(I.edited>0){const H=D("span");H.textContent=`M${I.edited}`,H.style.cssText="color:#e65100;background:#fff8e1;padding:1px 3px;border-radius:3px;",y.appendChild(H)}if(I.removed>0){const H=D("span");H.textContent=`D${I.removed}`,H.style.cssText="color:var(--og-row-removed-bg,#c62828);background:#ffebee;padding:1px 3px;border-radius:3px;",y.appendChild(H)}z.appendChild(y)}let O=!1;for(let y=0;y<i.length;y++){const I=i[y],H=n[y]??o.defaultColumnWidth,ne=m._summaryFmt!==void 0&&I.field in(m._summaryFmt??{}),B=D("div","og-group-cell");if(B.style.cssText=[`width:${H}px;min-width:${H}px;flex-shrink:0;`,"padding:2px 8px;box-sizing:border-box;overflow:hidden;","border-right:1px solid var(--og-border-color,#e0e0e0);","display:flex;align-items:center;","white-space:nowrap;text-overflow:ellipsis;"].join(""),ne){const j=m._summaryFmt[I.field];B.textContent=j!==""?j:"-",B.style.justifyContent="flex-end",B.style.color="var(--og-primary,#1976d2)",B.style.fontWeight="600"}else if(!O){O=!0;const j=D("span","og-group-arrow");j.textContent=m._expanded?"▾ ":"▸ ",j.style.cssText="color:var(--og-primary,#1976d2);margin-right:4px;flex-shrink:0;",B.appendChild(j);const U=D("span","og-group-label");U.textContent=`${m._groupLabel} (${m._childCount}건)`,U.style.cssText="overflow:hidden;text-overflow:ellipsis;font-weight:600;",B.appendChild(U),B.style.gap="0"}z.appendChild(B)}z.addEventListener("click",()=>u==null?void 0:u(S)),g.appendChild(z);continue}const _=K?C:null,b=_?_.data:h?C:s.getRowByIndex(v);if(!b)continue;const T=K||F?"none":s.getRowState(v),$=D("div","og-row");if($.setAttribute("role","row"),$.setAttribute("aria-rowindex",String(v+1)),!E){const m=l+(v-e)*o.rowHeight;$.style.top=`${m}px`,$.style.height=`${o.rowHeight}px`}let A=v%2===0?"var(--og-row-bg,#fff)":"var(--og-row-alt-bg,#fafafa)";$.style.background=A,T==="added"&&$.classList.add("og-state-added"),T==="edited"&&$.classList.add("og-state-edited"),T==="removed"&&$.classList.add("og-state-removed"),a.has(v)&&$.classList.add("og-selected"),$.setAttribute("aria-selected",a.has(v)?"true":"false"),T==="added"&&(A="var(--og-row-added-bg,#e8f5e9)"),T==="edited"&&(A="var(--og-row-edited-bg,#fff8e1)"),T==="removed"&&(A="var(--og-row-removed-bg,#ffebee)"),a.has(v)&&(A="var(--og-row-selected-bg,#bbdefb)");const ae=v;$.addEventListener("click",m=>{this._cbs.onCellClick(ae,-1,m)});const de=new Map;let P=0;if(o.stateColumn){const m=D("div","og-cell og-col-state"),S={added:"✚",edited:"✎",removed:"✖",none:""},z={added:"#2e7d32",edited:"#bf360c",removed:"#c62828",none:""};m.textContent=S[T]??"",m.style.color=z[T]??"",m.title=T,x>0&&(m.style.position="sticky",m.style.left=`${P}px`,m.style.zIndex="2",m.style.background=A),P+=24,$.appendChild(m)}const Q=this._cbs.getDndManager();if(o.draggable&&Q){const m=Q.attachHandle($,v,o._totalRows??t+1);x>0&&(m.style.position="sticky",m.style.left=`${P}px`,m.style.zIndex="2",m.style.background=A),P+=18,$.appendChild(m)}if(o.rowNumber){const m=D("div","og-cell og-col-rownum");m.textContent=String(v+1),x>0&&(m.style.position="sticky",m.style.left=`${P}px`,m.style.zIndex="2",m.style.background=A),P+=44,$.appendChild(m)}if(o.checkColumn){const m=D("div","og-cell og-col-check"),S=document.createElement("input");S.type="checkbox",S.checked=c.has(v),S.setAttribute("aria-label",`${v+1}행 선택`),S.addEventListener("click",z=>z.stopPropagation()),S.addEventListener("change",z=>{z.stopPropagation(),this._cbs.onRowCheck(v,S.checked)}),m.appendChild(S),x>0&&(m.style.position="sticky",m.style.left=`${P}px`,m.style.zIndex="2",m.style.background=A),P+=36,$.appendChild(m)}for(let m=0;m<i.length;m++){const S=i[m],z=n[m]??o.defaultColumnWidth,ie=o.editable&&S.editable!==!1,V=m===0,O=f&&!f.isEmpty?f.getInfo(v,m):null;if(O!=null&&O.hidden){const k=D("div","og-cell og-cell--merge-ph");k.style.cssText=`width:${z}px;min-width:${z}px;flex-shrink:0;visibility:hidden;box-sizing:border-box;`,$.appendChild(k);continue}const y=D("div","og-cell");y.setAttribute("role","gridcell"),y.setAttribute("aria-colindex",String(m+1));const I=(O==null?void 0:O.rowSpan)??1,H=(O==null?void 0:O.colSpan)??1,ne=I>1?I*o.rowHeight:o.rowHeight;let B=z;if(H>1)for(let k=1;k<H;k++)B+=n[m+k]??o.defaultColumnWidth;const j=m<x;let U=0;if(j){o.stateColumn&&(U+=24),o.draggable&&(U+=18),o.rowNumber&&(U+=44),o.checkColumn&&(U+=36);for(let k=0;k<m;k++)U+=n[k]??o.defaultColumnWidth;y.classList.add("og-frozen-cell"),m===x-1&&y.classList.add("og-frozen-last")}y.style.width=`${B}px`,y.style.minWidth=`${B}px`,y.style.maxWidth=`${B}px`,I>1&&(y.style.height=`${ne}px`),j&&(y.style.background=A),_&&V&&(y.style.padding="0"),y.style.overflow="hidden",I>1?(y.style.height=`${ne}px`,y.style.position="absolute",y.style.zIndex="3",y.style.background=A&&A!=="inherit"?A:"var(--og-row-bg, #fff)",y.style.borderTop="0",y.style.borderLeft="0",y.style.borderBottom="1px solid var(--og-border-color, #e0e0e0)"):j&&(y.style.position="sticky",y.style.left=`${U}px`,y.style.zIndex="1"),S.type==="number"||S.align==="right"?y.classList.add("og-cell--right"):S.align==="center"&&y.classList.add("og-cell--center"),ie&&y.classList.add("og-cell--editable"),S.wrap&&y.classList.add("og-cell--wrap"),ie||y.setAttribute("aria-readonly","true"),H>1&&y.setAttribute("aria-colspan",String(H)),I>1&&y.setAttribute("aria-rowspan",String(I)),((w=o._focusCell)==null?void 0:w.ri)===v&&((L=o._focusCell)==null?void 0:L.ci)===m&&(y.classList.add("og-cell-focused"),y.tabIndex=-1);const Z=b?b[S.field]:null;y.setAttribute("aria-label",`${S.header}: ${Z==null?"":String(Z)}`),S.tooltip!=null?y.title=typeof S.tooltip=="function"?String(S.tooltip(Z,b)??""):String(S.tooltip):o.tooltips&&Z!=null&&Z!==""&&(y.title=String(Z));let ke=y;if(_&&V){const k=D("div","og-tree-cell"),G=_._ancestorHasMore??[];for(let N=0;N<_._depth;N++){const q=D("span","og-tree-guide");G[N]&&q.classList.add("og-tree-guide--line"),k.appendChild(q)}if(_._depth>0){const N=D("span","og-tree-connector");N.classList.add(_._isLastChild?"og-tree-connector--last":"og-tree-connector--mid"),k.appendChild(N)}const oe=D("span","og-tree-toggle-wrap");if(!_._hasChildren){const N=D("span","og-tree-leaf-dot");oe.appendChild(N)}k.appendChild(oe);const W=document.createElement("i");if(_._hasChildren){const N=Ae(S.treeNodeIcon,b,!0,_._expanded);W.className=_._expanded?`${N} og-tree-node-icon og-tree-node-icon--branch og-tree-node-icon--open og-tree-node-icon--toggle`:`${N} og-tree-node-icon og-tree-node-icon--branch og-tree-node-icon--toggle`,W.setAttribute("role","button"),W.setAttribute("tabindex","0"),W.setAttribute("aria-expanded",_._expanded?"true":"false"),W.setAttribute("aria-label",_._expanded?"접기":"펼치기"),W.addEventListener("click",q=>{q.stopPropagation(),p==null||p(_._treeId)}),W.addEventListener("keydown",q=>{(q.key==="Enter"||q.key===" ")&&(q.preventDefault(),q.stopPropagation(),p==null||p(_._treeId))})}else{const N=Ae(S.treeNodeIcon,b,!1,!1);W.setAttribute("aria-hidden","true"),W.className=`${N} og-tree-node-icon og-tree-node-icon--leaf`}k.appendChild(W),y.appendChild(k),ke=k}if(S.cellStyle){const k=b[S.field],G=typeof S.cellStyle=="function"?S.cellStyle(k,b,v):S.cellStyle;Object.assign(y.style,G)}const et=Ft(S).render({value:b[S.field],row:b,rowIndex:v,column:S,colIndex:m,isSelected:a.has(v),rowState:T});ke.appendChild(et);const X=v,Y=m;if(y.addEventListener("click",k=>{k.stopPropagation(),this._cbs.onCellClick(X,Y,k)}),y.addEventListener("dblclick",k=>{k.stopPropagation(),this._cbs.onCellDblClick(X,Y,k)}),y.addEventListener("mouseover",k=>{k.stopPropagation(),this._cbs.onCellMouseOver(X,Y,k)}),y.addEventListener("mouseout",k=>{k.stopPropagation(),this._cbs.onCellMouseOut(X,Y,k)}),y.addEventListener("mousedown",k=>{k.stopPropagation(),this._cbs.onCellMouseDown(X,Y,k)}),y.addEventListener("mouseup",k=>{k.stopPropagation(),this._cbs.onCellMouseUp(X,Y,k)}),y.addEventListener("mousemove",k=>{k.stopPropagation(),this._cbs.onCellMouseMove(X,Y,k)}),de.set(m,y),I>1){const k=document.createElement("div");k.style.cssText=[`width:${z}px;min-width:${z}px;height:${o.rowHeight}px;`,"flex-shrink:0;box-sizing:border-box;","border-right:1px solid var(--og-border-color,#e0e0e0);"].join(""),$.appendChild(k);let G=0;o.stateColumn&&(G+=24),o.draggable&&(G+=18),o.rowNumber&&(G+=44),o.checkColumn&&(G+=36);for(let W=0;W<m;W++)G+=n[W]??o.defaultColumnWidth;const oe=l+(v-e)*o.rowHeight;y.style.left=`${G}px`,y.style.top=`${oe}px`,g.appendChild(y)}else $.appendChild(y)}this._cellMap.set(v,de),g.appendChild($)}if(s.rowCount===0){const v=D("div","og-empty-message");v.textContent="데이터가 없습니다.",v.style.cssText="width:100%;",g.appendChild(v)}this._body.appendChild(g)}getCellEl(e,t){var s;return(s=this._cellMap.get(e))==null?void 0:s.get(t)}destroy(){this._root.innerHTML=""}}function Ae(d,e,t,s){let i;return d?typeof d=="function"?i=d(e,t,s):t?i=s?d.branchOpen??"bi-folder2-open":d.branch??"bi-folder2":i=d.leaf??"bi-file-earmark":i=t?s?"bi-folder2-open":"bi-folder2":"bi-file-earmark",i.startsWith("bi ")?i:`bi ${i}`}function D(d,e){const t=document.createElement(d);return e&&(t.className=e),t}function ze(d,e){Object.assign(d.style,e)}function He(d,e,t="text/plain;charset=utf-8"){const s=new Blob([d],{type:t}),i=URL.createObjectURL(s),n=document.createElement("a");n.href=i,n.download=e,n.click(),URL.revokeObjectURL(i)}function Dt(d,e,t){let s=0,i=0;d.addEventListener("mousedown",n=>{n.stopPropagation(),n.preventDefault(),s=n.clientX,i=e.offsetWidth;const o=r=>{const a=Math.max(40,i+r.clientX-s);e.style.width=`${a}px`,e.style.minWidth=`${a}px`},l=r=>{document.removeEventListener("mousemove",o),document.removeEventListener("mouseup",l),t(Math.max(40,i+r.clientX-s))};document.addEventListener("mousemove",o),document.addEventListener("mouseup",l)})}class $t{constructor(e){this._selectedRows=new Set,this._checkedRows=new Set,this._data=e}get selectedRows(){return this._selectedRows}get checkedRows(){return this._checkedRows}selectSingle(e){this._selectedRows.clear(),this._selectedRows.add(e)}selectToggle(e){this._selectedRows.has(e)?this._selectedRows.delete(e):this._selectedRows.add(e)}clearSelection(){this._selectedRows.clear()}check(e,t){t?this._checkedRows.add(e):this._checkedRows.delete(e)}checkAll(e,t){if(e)for(let s=0;s<t;s++)this._checkedRows.add(s);else this._checkedRows.clear()}checkByValue(e,t){for(let s=0;s<this._data.rowCount;s++)t.includes(this._data.getCellValue(s,e))&&this._checkedRows.add(s)}uncheckAll(){this._checkedRows.clear()}checkById(e){}addCheckById(e){}uncheckById(e){}getSelections(){return[...this._selectedRows].map(e=>this._data.getRowByIndex(e)).filter(Boolean)}getChecked(){return[...this._checkedRows].map(e=>({row:this._data.getRowByIndex(e),rowIndex:e}))}getAllChecked(){return this.getChecked().map(e=>e.row)}getActiveRow(){return this._selectedRows.size>0?[...this._selectedRows][0]:-1}activate(e){this._selectedRows.clear(),this._selectedRows.add(e)}deselect(){this._selectedRows.clear()}reset(){this._selectedRows.clear(),this._checkedRows.clear()}}class ye{constructor(){this._onKeyDown=e=>{e.stopPropagation(),e.key==="Enter"?(e.preventDefault(),this._onCommit(this.input.value)):e.key==="Escape"&&this._onCancel()},this._onBlur=()=>{this._onCommit(this.input.value)}}mount(e,t,s,i){this._container=e,this._onCommit=s,this._onCancel=i,e.setAttribute("aria-haspopup","dialog"),e.setAttribute("aria-expanded","true"),this.input=document.createElement("input"),this.input.type="date",this.input.className="og-cell-input",this.input.setAttribute("aria-label",t.column.header??"날짜 선택");const n=t.value;if(n){const o=n instanceof Date?n:new Date(n);isNaN(o.getTime())||(this.input.value=Ue(o,"yyyy-MM-dd"))}this.input.addEventListener("keydown",this._onKeyDown),this.input.addEventListener("blur",this._onBlur),e.appendChild(this.input)}getValue(){var e;return(e=this.input)==null?void 0:e.value}focus(){var e;(e=this.input)==null||e.focus()}destroy(){var e,t,s;(e=this._container)==null||e.setAttribute("aria-expanded","false"),(t=this.input)==null||t.removeEventListener("keydown",this._onKeyDown),(s=this.input)==null||s.removeEventListener("blur",this._onBlur)}}function Ie(d){return d.map(e=>typeof e=="string"?{label:e,value:e}:{label:e.label??e.text??String(e.value??""),value:e.value})}class we{constructor(e=[],t){this._options=Ie(e),this._optionsFn=t??null}mount(e,t,s,i){this._container=e,this._onCommit=s,this._onCancel=i,e.setAttribute("aria-haspopup","listbox"),e.setAttribute("aria-expanded","true"),this.select=document.createElement("select"),this.select.className="og-cell-select",this.select.setAttribute("aria-label",t.column.header??"선택");const n=this._optionsFn?Ie(this._optionsFn(t.row,t.rowIndex)):this._options;for(const l of n){const r=document.createElement("option");r.value=String(l.value),r.textContent=l.label,this.select.appendChild(r)}const o=t.value==null?"":String(t.value);n.some(l=>String(l.value)===o)&&(this.select.value=o),this.select.addEventListener("change",()=>s(this.select.value)),this.select.addEventListener("blur",()=>s(this.select.value)),this.select.addEventListener("keydown",l=>{l.key==="Escape"&&i()}),e.appendChild(this.select)}getValue(){var e;return(e=this.select)==null?void 0:e.value}focus(){var e;(e=this.select)==null||e.focus()}destroy(){var e;(e=this._container)==null||e.setAttribute("aria-expanded","false")}}class ve{constructor(){this._onKeyDown=e=>{e.stopPropagation(),e.key==="Enter"||e.key==="Tab"?(e.preventDefault(),this._onCommit(this.input.value)):e.key==="Escape"&&this._onCancel()},this._onBlur=()=>{this._onCommit(this.input.value)}}mount(e,t,s,i){this._onCommit=s,this._onCancel=i,this.input=document.createElement("input"),this.input.type="text",this.input.value=t.value==null?"":String(t.value),this.input.style.cssText=`
31
- width:100%;height:100%;border:none;outline:none;padding:0 8px;
32
- font-size:var(--og-font-size,13px);font-family:var(--og-font-family,sans-serif);
33
- background:var(--og-row-bg,#fff);box-sizing:border-box;
34
- `,this.input.addEventListener("keydown",this._onKeyDown),this.input.addEventListener("blur",this._onBlur),e.appendChild(this.input)}getValue(){var e;return(e=this.input)==null?void 0:e.value}focus(){var e,t;(e=this.input)==null||e.focus(),(t=this.input)==null||t.select()}destroy(){var e,t;(e=this.input)==null||e.removeEventListener("keydown",this._onKeyDown),(t=this.input)==null||t.removeEventListener("blur",this._onBlur)}}class xe{constructor(e){this._onKeyDown=t=>{t.stopPropagation(),t.key==="Enter"||t.key==="Tab"?(t.preventDefault(),this._commit()):t.key==="Escape"&&this._onCancel()},this._onBlur=()=>{this._commit()},this.min=e==null?void 0:e.min,this.max=e==null?void 0:e.max,this.step=e==null?void 0:e.step}mount(e,t,s,i){this._onCommit=s,this._onCancel=i,this.input=document.createElement("input"),this.input.type="number",this.input.value=t.value==null?"":String(t.value),this.min!=null&&(this.input.min=String(this.min)),this.max!=null&&(this.input.max=String(this.max)),this.step!=null&&(this.input.step=String(this.step)),this.input.style.cssText=`
35
- width:100%;height:100%;border:none;outline:none;padding:0 8px;
36
- font-size:var(--og-font-size,13px);text-align:right;
37
- background:var(--og-row-bg,#fff);box-sizing:border-box;
38
- `,this.input.addEventListener("keydown",this._onKeyDown),this.input.addEventListener("blur",this._onBlur),e.appendChild(this.input)}_commit(){const e=this.input.value===""?null:Number(this.input.value);this._onCommit(e)}getValue(){var e,t;return((e=this.input)==null?void 0:e.value)===""?null:Number((t=this.input)==null?void 0:t.value)}focus(){var e,t;(e=this.input)==null||e.focus(),(t=this.input)==null||t.select()}destroy(){var e,t;(e=this.input)==null||e.removeEventListener("keydown",this._onKeyDown),(t=this.input)==null||t.removeEventListener("blur",this._onBlur)}}class Ce{mount(e,t,s,i){this._onCommit=s,e.style.cssText+="display:flex;align-items:center;justify-content:center;",this.chk=document.createElement("input"),this.chk.type="checkbox",this.chk.checked=!!t.value,this.chk.style.cursor="pointer",this.chk.addEventListener("change",()=>s(this.chk.checked)),e.appendChild(this.chk)}getValue(){var e;return(e=this.chk)==null?void 0:e.checked}focus(){var e;(e=this.chk)==null||e.focus()}destroy(){}}function Be(d){const e=d.editor;if(!e)switch(d.type){case"number":return new xe;case"date":return new ye;case"boolean":return new Ce;case"select":return new we(d.options??[],d.optionsFn);default:return new ve}if(typeof e=="string")switch(e){case"number":return new xe;case"date":return new ye;case"select":return new we(d.options??[],d.optionsFn);case"checkbox":return new Ce;default:return new ve}switch(e.type){case"number":{const t={};return e.min!=null&&(t.min=e.min),e.max!=null&&(t.max=e.max),e.step!=null&&(t.step=e.step),new xe(t)}case"date":return new ye;case"select":return new we(e.options??[],d.optionsFn);case"checkbox":return new Ce;default:return new ve}}function te(d){const e=typeof d.renderer=="string"?d.renderer:d.renderer&&typeof d.renderer=="object"?d.renderer.type:"";return d.type==="boolean"||d.type==="checkbox"||e==="checkbox"||e==="switch"}class At{constructor(e){this._activeEditor=null,this._editCell=null,this._focusCell=null,this._dragColIdx=null,this._d=e}get activeEditor(){return this._activeEditor}get editCell(){return this._editCell}get focusCell(){return this._focusCell}get dragColIdx(){return this._dragColIdx}set dragColIdx(e){this._dragColIdx=e}setFocusCell(e,t){this._focusCell={ri:e,ci:t},this._d.scrollToRow(e),this._d.doRender();const s=this._d.getVisibleLeaves()[t],i=this._d.data.getRowByIndex(e);if(s&&i){const n=i[s.field];this._d.announce(`${e+1}행 ${t+1}열, ${s.header}: ${n==null?"빈 값":String(n)}`)}}clearFocusCell(){this._focusCell=null}startEditByKey(e,t){var a,c,h;const s=this._d.getVisibleLeaves()[t];if(!s)return;if(te(s)){const u=this._d.getOptions();if(s.editable!==!1&&(s.editable!==void 0||u.editable)){const M=this._d.data.getRowByIndex(e);M&&this._d.writeCell(e,s.field,!M[s.field])}return}const i=this._d.data.getRowByIndex(e);if(s.editable===!1||typeof s.editable=="function"&&!s.editable(i,e))return;this.commitEdit();const n=(a=this._d.getRenderer())==null?void 0:a.getCellEl(e,t);if(!n)return;n.innerHTML="";const o=Be(s);this._activeEditor=o,this._editCell={ri:e,ci:t};const l={type:"editStart",rowIndex:e,columnIndex:t,field:s.field,oldValue:i==null?void 0:i[s.field],newValue:i==null?void 0:i[s.field],row:i,column:s};this._d.emit("editStart",l),(h=(c=this._d.getOptions()).onEditStart)==null||h.call(c,l),n.classList.add("og-editing");const r={value:i==null?void 0:i[s.field],row:i,rowIndex:e,column:s,colIndex:t,isSelected:!0,rowState:"none"};o.mount(n,r,u=>this.commitEditWithValue(e,t,u),()=>this.cancelEdit()),requestAnimationFrame(()=>o.focus())}startEdit(e,t,s){var h,u;const i=this._d.getOptions();if(!i.editable)return;const n=this._d.getVisibleLeaves()[t];if(!n||te(n))return;const o=this._d.data.getRowByIndex(e);if(n.editable===!1||typeof n.editable=="function"&&!n.editable(o,e)||!n.editable&&!i.editable)return;this.commitEdit();const l=(h=this._d.getRenderer())==null?void 0:h.getCellEl(e,t);if(!l)return;l.innerHTML="";const r=Be(n);this._activeEditor=r,this._editCell={ri:e,ci:t};const a={type:"editStart",rowIndex:e,columnIndex:t,field:n.field,oldValue:o==null?void 0:o[n.field],newValue:o==null?void 0:o[n.field],row:o,column:n};this._d.emit("editStart",a),(u=i.onEditStart)==null||u.call(i,a),l.classList.add("og-editing");const c={value:o==null?void 0:o[n.field],row:o,rowIndex:e,column:n,colIndex:t,isSelected:!0,rowState:"none"};r.mount(l,c,p=>this.commitEditWithValue(e,t,p),()=>this.cancelEdit()),requestAnimationFrame(()=>r.focus())}commitEdit(){if(!this._activeEditor||!this._editCell)return;const e=this._activeEditor.getValue(),{ri:t,ci:s}=this._editCell;this._finishEdit(t,s,e,!1)}commitEditWithValue(e,t,s){this._finishEdit(e,t,s,!1)}cancelEdit(){if(!this._editCell)return;const{ri:e,ci:t}=this._editCell;this._finishEdit(e,t,void 0,!0)}_finishEdit(e,t,s,i){var l,r,a;if(!this._activeEditor)return;const n=this._d.getVisibleLeaves()[t],o=(l=this._d.getRenderer())==null?void 0:l.getCellEl(e,t);if(o&&(this._activeEditor.destroy(),o.classList.remove("og-editing")),this._activeEditor=null,this._editCell=null,!i&&n){const c=this._d.data.getCellValue(e,n.field);if(s!==c){this._d.data.updateCell(e,n.field,s);const h=this._d.data.getRowByIndex(e),u=this._d.getOptions(),p={type:"editEnd",rowIndex:e,columnIndex:t,field:n.field,oldValue:c,newValue:s,row:h,column:n};this._d.emit("editEnd",p),(r=u.onEditEnd)==null||r.call(u,p),this._d.emit("dataChange",this._d.data.getData()),(a=u.onDataChange)==null||a.call(u,this._d.data.getData())}}this._d.doRender(),requestAnimationFrame(()=>this._d.getContainer().focus({preventScroll:!0}))}}class zt{constructor(e,t,s,i,n){this._selects=new Map,this._selected={},this._config=t,this._onFilter=s,this._onReset=i,this._el=document.createElement("fieldset"),this._el.className="og-filter-select";const o=document.createElement("legend");o.className="og-filter-select-legend",o.textContent=t.legend??"필터",this._el.appendChild(o);const l=document.createElement("div");l.className="og-filter-select-row";for(const a of t.columns){const c=`og-fsel-${a.field}`,h=document.createElement("div");h.className="og-filter-select-group";const u=document.createElement("label");u.htmlFor=c,u.textContent=a.label,u.className="og-filter-select-label";const p=document.createElement("select");p.id=c,p.className="og-filter-select-sel",p.setAttribute("aria-label",a.label),n&&p.setAttribute("aria-controls",n),a.dependsOn?this._fill(p,[],!1):this._fill(p,this._resolve(a,""),!0),p.addEventListener("change",()=>this._onChange(a.field,p.value)),h.appendChild(u),h.appendChild(p),l.appendChild(h),this._selects.set(a.field,p)}const r=document.createElement("button");r.type="button",r.textContent="초기화",r.className="og-filter-select-reset",r.setAttribute("aria-label","필터 초기화"),r.addEventListener("click",()=>this._reset()),this._el.appendChild(l),this._el.appendChild(r),e.insertBefore(this._el,e.firstChild)}_resolve(e,t){if(e.options)return e.options;let s=e.data??[];e.dependsOn&&e.dependsOnKey&&t&&(s=s.filter(o=>String(o[e.dependsOnKey]??"")===t));const i=e.valueKey??"value",n=e.textKey??i;return s.map(o=>({value:String(o[i]??""),text:String(o[n]??o[i]??"")}))}_fill(e,t,s){e.innerHTML="";const i=document.createElement("option");i.value="",i.textContent="전체",e.appendChild(i);for(const n of t){const o=document.createElement("option");o.value=n.value,o.textContent=n.text,e.appendChild(o)}e.disabled=!s}_onChange(e,t){const s=this._config.columns.find(n=>n.field===e),i=s.filterKey??s.field;t?(this._selected[e]=t,this._onFilter(i,[{operator:"=",value:t}])):(delete this._selected[e],this._onReset(i)),this._cascade(e)}_cascade(e){const t=this._selected[e]??"";for(const s of this._config.columns){if(s.dependsOn!==e)continue;const i=this._selects.get(s.field);if(!i)continue;const n=s.filterKey??s.field;t?(this._fill(i,this._resolve(s,t),!0),i.value="",delete this._selected[s.field],this._onReset(n)):(this._fill(i,[],!1),delete this._selected[s.field],this._onReset(n),this._cascade(s.field))}}_reset(){this._selected={};for(const e of this._config.columns){const t=this._selects.get(e.field),s=e.filterKey??e.field;t&&(e.dependsOn?this._fill(t,[],!1):(t.value="",t.disabled=!1),this._onReset(s))}}reset(){this._reset()}destroy(){this._el.remove()}}class Ht{constructor(e,t,s){this._page=1,this._totalRows=0,this._pageSize=t,this._onChange=s,this._el=document.createElement("div"),this._el.className="og-pagination",this._el.style.cssText=`
39
- display:flex;align-items:center;justify-content:center;gap:4px;
40
- padding:6px 8px;border-top:1px solid var(--og-border-color,#e0e0e0);
41
- background:var(--og-header-bg,#f5f5f5);flex-shrink:0;user-select:none;
42
- font-size:12px;color:var(--og-text-color,#333);
43
- `,e.appendChild(this._el),this._render()}get page(){return this._page}get pageSize(){return this._pageSize}get totalPages(){return Math.max(1,Math.ceil(this._totalRows/this._pageSize))}setTotalRows(e){this._totalRows=e,this._page>this.totalPages&&(this._page=this.totalPages),this._render()}setPageSize(e){this._pageSize=e,this._page=1,this._render(),this._emit()}goTo(e){const t=Math.max(1,Math.min(e,this.totalPages));t!==this._page&&(this._page=t,this._render(),this._emit())}getRange(){const e=(this._page-1)*this._pageSize,t=Math.min(e+this._pageSize-1,this._totalRows-1);return{start:e,end:t}}_emit(){this._onChange({page:this._page,pageSize:this._pageSize,totalRows:this._totalRows,totalPages:this.totalPages})}_render(){this._el.innerHTML="";const e=this.totalPages,t=document.createElement("span");t.style.cssText="display:flex;align-items:center;gap:3px;margin-right:8px;";const s=document.createElement("span");s.textContent="행/페이지:",s.style.color="#888";const i=document.createElement("select");i.style.cssText="padding:2px 4px;border:1px solid var(--og-border-color,#e0e0e0);border-radius:3px;font-size:11px;cursor:pointer;";for(const c of[10,20,50,100,200]){const h=document.createElement("option");h.value=String(c),h.textContent=String(c),c===this._pageSize&&(h.selected=!0),i.appendChild(h)}i.addEventListener("change",()=>this.setPageSize(Number(i.value))),t.appendChild(s),t.appendChild(i),this._el.appendChild(t);const n=document.createElement("span"),{start:o,end:l}=this.getRange();n.textContent=this._totalRows>0?`${o+1}–${l+1} / ${this._totalRows}건`:"0건",n.style.cssText="margin-right:8px;color:#888;",this._el.appendChild(n);const r=(c,h,u)=>{const p=document.createElement("button");return p.textContent=c,p.disabled=u,p.style.cssText=`
44
- min-width:28px;height:24px;padding:0 6px;
45
- border:1px solid var(--og-border-color,#e0e0e0);border-radius:3px;
46
- background:${u?"#f5f5f5":"#fff"};
47
- color:${u?"#bbb":"var(--og-text-color,#333)"};
48
- cursor:${u?"default":"pointer"};font-size:12px;
49
- `,u||p.addEventListener("click",()=>this.goTo(h)),p};this._el.appendChild(r("«",1,this._page===1)),this._el.appendChild(r("‹",this._page-1,this._page===1));const a=It(this._page,e);for(const c of a)if(c===-1){const h=document.createElement("span");h.textContent="…",h.style.padding="0 3px",this._el.appendChild(h)}else{const h=r(String(c),c,c===this._page);c===this._page&&(h.style.background="var(--og-primary,#1976d2)",h.style.color="#fff",h.style.borderColor="var(--og-primary,#1976d2)"),this._el.appendChild(h)}this._el.appendChild(r("›",this._page+1,this._page===e)),this._el.appendChild(r("»",e,this._page===e))}destroy(){this._el.remove()}}function It(d,e){if(e<=7)return Array.from({length:e},(s,i)=>i+1);const t=[1];d>3&&t.push(-1);for(let s=Math.max(2,d-1);s<=Math.min(e-1,d+1);s++)t.push(s);return d<e-2&&t.push(-1),t.push(e),t}class Bt{constructor(e,t,s,i){this._dx=t-e.left,this._dy=s-e.top;const n=document.createElement("div");n.className="og-drag-ghost",n.style.cssText=`position:fixed;left:0;top:0;width:${e.width}px;height:${Math.min(e.height,40)}px;transform:translate(${e.left}px,${e.top}px);background:rgba(25,118,210,0.12);border:2px dashed #1976d2;box-sizing:border-box;pointer-events:none;z-index:10000;border-radius:3px;opacity:0.92;display:flex;align-items:center;padding-left:10px;font-size:12px;color:#1565c0;font-weight:600;white-space:nowrap;overflow:hidden;`,i>1&&(n.textContent=`${i}개 행 이동`),document.body.appendChild(n),this._el=n}move(e,t){this._el.style.transform=`translate(${e-this._dx}px,${t-this._dy}px)`}destroy(){this._el.remove()}}class We{constructor(e="#1976d2"){const t=document.createElement("div");t.className="og-drop-indicator",t.style.cssText="position:absolute;left:0;right:0;display:none;align-items:center;pointer-events:none;z-index:9998;transform:translateY(-50%);";const s=n=>{const o=document.createElement("div"),l=n==="left"?`border-left:7px solid ${e}`:`border-right:7px solid ${e}`;return o.style.cssText=`width:0;height:0;flex-shrink:0;border-top:5px solid transparent;border-bottom:5px solid transparent;${l};`,o},i=document.createElement("div");i.style.cssText=`flex:1;height:3px;background:${e};border-radius:2px;box-shadow:0 0 0 1px rgba(255,255,255,0.7);`,t.append(s("left"),i,s("right")),this._el=t}showIn(e,t){this._el.parentElement!==e&&(this._el.remove(),e.appendChild(this._el)),this._el.style.display="flex",this._el.style.top=`${t}px`}hide(){this._el.style.display="none"}destroy(){this._el.remove()}}const Ne=(d,e,t)=>Math.max(e,Math.min(t,d));class Wt{constructor(e,t,s,i=null,n=()=>1){this._bodyEl=e,this._rowHeight=t,this._onDrop=s,this._cross=i,this._getDragCount=n,this._drag=null,this._selfIndicator=new We("#1976d2"),this._crossIndicator=new We("#2e7d32"),this._onMouseMove=this._onMouseMove.bind(this),this._onMouseUp=this._onMouseUp.bind(this)}attachHandle(e,t,s){const i=document.createElement("div");return i.className="og-drag-handle",i.innerHTML="⠿",i.style.cssText=`
50
- width:18px;min-width:18px;height:100%;
51
- display:flex;align-items:center;justify-content:center;
52
- cursor:grab;font-size:14px;color:#bbb;flex-shrink:0;
53
- user-select:none;border-right:1px solid var(--og-border-color,#e0e0e0);
54
- `,i.addEventListener("mousedown",n=>{n.preventDefault(),n.stopPropagation(),this._startDrag(n,e,t,s)}),i}_startDrag(e,t,s,i){const n=t.getBoundingClientRect(),o=this._getDragCount(s);this._drag={fromIndex:s,bodyEl:this._bodyEl,rowHeight:this._rowHeight,totalRows:i,ghost:new Bt(n,e.clientX,e.clientY,o),currentTarget:s,crossTarget:null},document.addEventListener("mousemove",this._onMouseMove,!0),document.addEventListener("mouseup",this._onMouseUp,!0)}_onMouseMove(e){if(!this._drag)return;const t=this._drag;if(t.ghost.move(e.clientX,e.clientY),this._cross){const n=this._cross.resolveTarget(e.clientX,e.clientY);if(n&&n.bodyEl!==t.bodyEl){const o=n.bodyEl.getBoundingClientRect(),l=e.clientY-o.top+n.bodyEl.scrollTop,r=Ne(Math.round(l/n.rowHeight),0,n.totalRows);t.crossTarget={bodyEl:n.bodyEl,index:r},this._selfIndicator.hide(),this._crossIndicator.showIn(n.bodyEl,r*n.rowHeight);return}}t.crossTarget=null,this._crossIndicator.hide();const s=t.bodyEl.getBoundingClientRect(),i=e.clientY-s.top+t.bodyEl.scrollTop;t.currentTarget=Ne(Math.round(i/t.rowHeight),0,t.totalRows-1),this._selfIndicator.showIn(t.bodyEl,t.currentTarget*t.rowHeight)}_onMouseUp(e){if(document.removeEventListener("mousemove",this._onMouseMove,!0),document.removeEventListener("mouseup",this._onMouseUp,!0),!this._drag)return;const{fromIndex:t,currentTarget:s,ghost:i,crossTarget:n}=this._drag;this._drag=null,i.destroy(),this._selfIndicator.hide(),this._crossIndicator.hide(),n&&this._cross?this._cross.onCrossDrop(t,n.bodyEl,n.index):t!==s&&this._onDrop(t,s)}destroy(){var e;document.removeEventListener("mousemove",this._onMouseMove,!0),document.removeEventListener("mouseup",this._onMouseUp,!0),(e=this._drag)==null||e.ghost.destroy(),this._selfIndicator.destroy(),this._crossIndicator.destroy(),this._drag=null}}class J{constructor(){this._map=new Map}static _key(e,t){return`${e}:${t}`}applyMergeCells(e){this._map.clear();for(const t of e){const s=Math.max(1,t.rowSpan??1),i=Math.max(1,t.colSpan??1);this._map.set(J._key(t.row,t.col),{rowSpan:s,colSpan:i,hidden:!1});for(let n=0;n<s;n++)for(let o=0;o<i;o++)n===0&&o===0||this._map.set(J._key(t.row+n,t.col+o),{rowSpan:1,colSpan:1,hidden:!0})}}applyAutoMerge(e,t,s){var i,n;this._map.clear();for(let o=0;o<t.length;o++){const l=t[o],r=s[o];let a=0;for(let c=1;c<=e.length;c++){const h=(i=e[c-1])==null?void 0:i[r],u=c<e.length?(n=e[c])==null?void 0:n[r]:void 0;if(c===e.length||u!==h){const p=c-a;if(p>1){this._map.set(J._key(a,l),{rowSpan:p,colSpan:1,hidden:!1});for(let M=a+1;M<c;M++)this._map.set(J._key(M,l),{rowSpan:1,colSpan:1,hidden:!0})}a=c}}}}getInfo(e,t){return this._map.get(J._key(e,t))??null}clear(){this._map.clear()}get isEmpty(){return this._map.size===0}}const Nt=[{id:"sort-asc",label:"오름차순 정렬",icon:"↑",action:"sortAsc"},{id:"sort-desc",label:"내림차순 정렬",icon:"↓",action:"sortDesc"},{type:"divider"},{id:"find",label:"찾기",icon:"🔍",action:"find"},{type:"divider"},{id:"excel",label:"Excel로 저장",icon:"📊",action:"excel"},{id:"csv",label:"CSV로 저장",icon:"📄",action:"csv"},{id:"print",label:"인쇄",icon:"🖨",action:"print"}];class Ot{constructor(e,t){this._anchor=e,this._actions=t,this._el=null,this._docClick=null,this._docKey=null,this._docScroll=null,this._docMouseMove=null,this._focusIdx=-1}open(e,t){this.close();const s=t??Nt,i=document.createElement("div");i.className="og-context-menu",i.setAttribute("role","menu");for(const l of s){if(l.type==="divider"){const c=document.createElement("div");c.className="og-cm-divider",c.setAttribute("role","separator"),i.appendChild(c);continue}const r=document.createElement("button");if(r.className="og-cm-item",r.setAttribute("role","menuitem"),r.setAttribute("tabindex","-1"),l.disabled&&(r.classList.add("og-cm-disabled"),r.setAttribute("aria-disabled","true")),l.icon){const c=document.createElement("span");if(c.className="og-cm-icon",/^[a-zA-Z][\w-]*(\s+[\w-]+)+$/.test(l.icon.trim())){const h=document.createElement("i");h.className=l.icon,c.appendChild(h)}else c.textContent=l.icon;c.setAttribute("aria-hidden","true"),r.appendChild(c)}const a=document.createElement("span");a.className="og-cm-label",a.textContent=l.label??"",r.appendChild(a),r.addEventListener("click",c=>{c.stopPropagation(),l.disabled||this._runAction(l),this.close()}),i.appendChild(r)}const n=this._anchor.closest("[data-og-theme]"),o=n==null?void 0:n.getAttribute("data-og-theme");o&&i.setAttribute("data-og-theme",o),document.body.appendChild(i),this._el=i,this._docMouseMove=l=>{if(!this._el)return;const r=this._el.getBoundingClientRect();(l.clientX<r.left-4||l.clientX>r.right+4||l.clientY<r.top-4||l.clientY>r.bottom+4)&&this.close()},this._position(i,e.clientX,e.clientY,()=>{this._el===i&&document.addEventListener("mousemove",this._docMouseMove,{capture:!0,passive:!0})}),this._docClick=l=>{i.contains(l.target)||this.close()},this._docKey=l=>{if(l.key==="Escape"){this.close();return}if(l.key==="ArrowDown"){l.preventDefault(),this._moveFocus(1);return}if(l.key==="ArrowUp"){l.preventDefault(),this._moveFocus(-1);return}if(l.key==="Enter"){const r=i.querySelector(".og-cm-item:focus");r==null||r.click()}},this._docScroll=()=>this.close(),setTimeout(()=>{document.addEventListener("click",this._docClick),document.addEventListener("keydown",this._docKey),window.addEventListener("scroll",this._docScroll,{passive:!0})},0),this._focusIdx=-1,this._moveFocus(1)}close(){var e;(e=this._el)==null||e.remove(),this._el=null,this._docClick&&document.removeEventListener("click",this._docClick),this._docKey&&document.removeEventListener("keydown",this._docKey),this._docScroll&&window.removeEventListener("scroll",this._docScroll),this._docMouseMove&&document.removeEventListener("mousemove",this._docMouseMove,{capture:!0}),this._docClick=this._docKey=this._docScroll=this._docMouseMove=null,this._focusIdx=-1}destroy(){this.close()}_position(e,t,s,i){e.style.cssText="position:fixed;visibility:hidden;left:0;top:0;",requestAnimationFrame(()=>{const{width:n,height:o}=e.getBoundingClientRect(),l=window.innerWidth,r=window.innerHeight,a=t+n>l?Math.max(0,t-n):t,c=s+o>r?Math.max(0,s-o):s;e.style.cssText=`position:fixed;left:${a}px;top:${c}px;z-index:9999;`,i==null||i()})}_moveFocus(e){var s;if(!this._el)return;const t=Array.from(this._el.querySelectorAll(".og-cm-item:not(.og-cm-disabled)"));t.length&&(this._focusIdx=(this._focusIdx+e+t.length)%t.length,(s=t[this._focusIdx])==null||s.focus())}_runAction(e){if(typeof e.action=="function"){e.action();return}switch(e.action){case"sortAsc":this._actions.onSortAsc();break;case"sortDesc":this._actions.onSortDesc();break;case"find":this._actions.onFind();break;case"excel":this._actions.onExcel();break;case"csv":this._actions.onCsv();break;case"print":this._actions.onPrint();break}}}class Oe{constructor(e,t){this._sheets=new Map,this._active="",this._onSwitch=t,this._tabBar=this._buildTabBar(e)}add(e,t=[],s=[]){if(this._sheets.has(e))throw new Error(`WorksheetManager: 시트 '${e}'이 이미 존재합니다`);this._sheets.set(e,{name:e,columns:t,data:s}),this._renderTabs(),this._sheets.size===1&&this.switch(e)}remove(e){if(!this._sheets.has(e))return;if(this._sheets.size===1)throw new Error("WorksheetManager: 마지막 시트는 삭제할 수 없습니다");const t=this._active===e;this._sheets.delete(e),this._renderTabs(),t&&this.switch(this._sheets.keys().next().value)}rename(e,t){if(!this._sheets.has(e))return;if(this._sheets.has(t))throw new Error(`WorksheetManager: 시트 '${t}'이 이미 존재합니다`);this._sheets.get(e);const s=Array.from(this._sheets.entries()).map(([i,n])=>i===e?[t,{...n,name:t}]:[i,n]);this._sheets=new Map(s),this._active===e&&(this._active=t),this._renderTabs()}switch(e){const t=this._sheets.get(e);if(!t)throw new Error(`WorksheetManager: 시트 '${e}'을 찾을 수 없습니다`);this._active=e,this._renderTabs(),this._onSwitch(e,t)}get(e){return this._sheets.get(e)}getNames(){return Array.from(this._sheets.keys())}getActive(){return this._active}syncData(e,t){const s=this._sheets.get(e);s&&(s.data=t)}destroy(){this._tabBar.remove()}_buildTabBar(e){const t=document.createElement("div");return t.className="og-sheet-tabs",e.appendChild(t),t}_renderTabs(){this._tabBar.innerHTML="";for(const t of this._sheets.keys()){const s=document.createElement("button");s.className="og-sheet-tab",s.textContent=t,s.setAttribute("role","tab"),s.setAttribute("aria-selected",t===this._active?"true":"false"),t===this._active&&s.classList.add("og-sheet-tab--active"),s.addEventListener("click",()=>{t!==this._active&&this.switch(t)}),s.addEventListener("dblclick",()=>this._startRename(s,t)),this._tabBar.appendChild(s)}const e=document.createElement("button");e.className="og-sheet-add",e.textContent="+",e.setAttribute("aria-label","새 워크시트 추가"),e.addEventListener("click",()=>{const t=`Sheet${this._sheets.size+1}`;this.add(t,[],[]),this.switch(t)}),this._tabBar.appendChild(e)}_startRename(e,t){const s=document.createElement("input");s.className="og-sheet-tab-rename",s.value=t,e.replaceWith(s),s.focus(),s.select();const i=()=>{const n=s.value.trim()||t;try{n!==t?this.rename(t,n):this._renderTabs()}catch{this._renderTabs()}};s.addEventListener("blur",i),s.addEventListener("keydown",n=>{n.key==="Enter"&&s.blur(),n.key==="Escape"&&(s.value=t,s.blur())})}}class Kt{constructor(e){this._d=e}_readCssVar(e){return getComputedStyle(this._d.getContainer()).getPropertyValue(e).trim()}_hexToXlsxRgb(e){const t=e.trim(),s=t.match(/^rgba?\(\s*(\d+),\s*(\d+),\s*(\d+)/i);if(s)return[s[1],s[2],s[3]].map(n=>parseInt(n).toString(16).padStart(2,"0")).join("").toUpperCase();const i=t.replace("#","").toUpperCase();return i.length===3?i[0]+i[0]+i[1]+i[1]+i[2]+i[2]:i.length===6?i:""}exportExcel(e){const t=typeof e=="string"?{filename:e}:e??{};let s=t.filename??"export";s.toLowerCase().endsWith(".xlsx")||(s+=".xlsx");const i=t.sheetName??(this._d.getOptions().ariaLabel||"Sheet1"),n=this._d.getData(),o=this._d.getColLayout().visibleLeaves.filter(r=>{var a;return!((a=t.exceptFields)!=null&&a.includes(r.field))}),l=t.includeHeader!==!1;Promise.resolve().then(()=>require("./xlsx.min-Bx-LxWOf.cjs")).then(r=>r.xlsx_min).then(({utils:r,writeFile:a})=>{var _;const c=[];l&&c.push(o.map(b=>b.header));for(const b of n)c.push(o.map(T=>{const $=b[T.field];if(t.maskOnExport&&T.mask&&this._d.getMaskEnabled(T.field))return Me($==null?"":String($),T.mask);const A=$;return A==null||A===""?"":T.type==="number"&&typeof A=="number"?A:typeof A=="boolean"?A?"✓":"":typeof A=="object"?"":String(A)}));const h=r.aoa_to_sheet(c),u=this._d.getColWidths(),p=this._d.getColLayout();h["!cols"]=o.map(b=>({wpx:u[p.getColumnIndex(b.field)]??100})),h["!rows"]=c.map((b,T)=>({hpx:T===0&&l?22:19}));const M=t.styleMode??"theme";let f="1565C0",E="FFFFFF",x="FFFFFF",g="EEF2FF",w="212121",L="BDBDBD",v=10;if(M==="theme"){const b=$=>this._hexToXlsxRgb($);f=b(this._readCssVar("--og-header-bg"))||f,E=b(this._readCssVar("--og-header-color"))||E,x=b(this._readCssVar("--og-row-bg"))||x,g=b(this._readCssVar("--og-row-alt-bg"))||g,w=b(this._readCssVar("--og-row-color"))||w,L=b(this._readCssVar("--og-border-color"))||L;const T=this._readCssVar("--og-font-size");T&&(v=Math.max(8,Math.round(parseFloat(T)*.75)))}const C=M==="none",F={hdrFont:C?{}:{bold:!0,color:{rgb:E},sz:v,name:"맑은 고딕"},dataFont:C?{}:{sz:v,color:{rgb:w},name:"맑은 고딕"},hdrFill:C?{}:{patternType:"solid",fgColor:{rgb:f}},evenFill:C?{}:{patternType:"solid",fgColor:{rgb:x}},oddFill:C?{}:{patternType:"solid",fgColor:{rgb:g}},hdrBorder:C?{}:{top:{style:"medium",color:{rgb:f}},bottom:{style:"medium",color:{rgb:f}},left:{style:"thin",color:{rgb:f}},right:{style:"thin",color:{rgb:f}}},dataBorder:C?{}:{top:{style:"thin",color:{rgb:L}},bottom:{style:"thin",color:{rgb:L}},left:{style:"thin",color:{rgb:L}},right:{style:"thin",color:{rgb:L}}}};c.forEach((b,T)=>{const $=l&&T===0,ae=(l?T-1:T)%2===0;b.forEach((de,P)=>{const Q=r.encode_cell({r:T,c:P});h[Q]||(h[Q]={t:"s",v:""});const m=o[P],S=m.type==="number"||m.align==="right",z=$?"center":S?"right":m.align??"left";h[Q].s={font:$?F.hdrFont:F.dataFont,fill:$?F.hdrFill:ae?F.evenFill:F.oddFill,border:$?F.hdrBorder:F.dataBorder,alignment:{horizontal:z,vertical:"center",wrapText:!1}}})});const K=r.book_new();r.book_append_sheet(K,h,i),a(K,s,{cellStyles:!0}),(_=t.onAfter)==null||_.call(t,new Blob([]))}).catch(()=>{console.error("Excel 내보내기 실패: xlsx 패키지를 확인하세요.")})}exportCsv(e){const t=typeof e=="string"?{filename:e}:e??{},s=this._d.getData(),i=this._d.getColLayout().visibleLeaves,n=i.map(r=>`"${r.header}"`).join(","),o=s.map(r=>i.map(a=>{const c=r[a.field]??"";if(t.maskOnExport&&a.mask&&this._d.getMaskEnabled(a.field))return Me(String(c),a.mask);const h=c;return typeof h=="string"&&h.includes(",")?`"${h}"`:h}).join(",")),l=t.filename??"export.csv";He("\uFEFF"+[n,...o].join(`
55
- `),l)}exportJson(e){const t=typeof e=="string"?e:(e==null?void 0:e.filename)??"export.json";He(JSON.stringify(this._d.getData(),null,2),t,"application/json")}print(e){const t=(e==null?void 0:e.title)??"OPEN_GRID",s=(e==null?void 0:e.footerText)??"",i=this._d.getData(),n=this._d.getColLayout().visibleLeaves.filter(h=>{var u;return!((u=e==null?void 0:e.excludeFields)!=null&&u.includes(h.field))}),o=n.map(h=>`<th>${h.header??h.field}</th>`).join(""),l=i.map(h=>`<tr>${n.map(u=>`<td>${String(h[u.field]??"")}</td>`).join("")}</tr>`).join(""),r=s?`<div class="og-print-footer">${s}</div>`:"",a=`<!DOCTYPE html>
56
- <html lang="ko"><head>
57
- <meta charset="UTF-8"><title>${t}</title>
58
- <style>
59
- @page{margin:0;}
60
- body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:12px;margin:0;padding:1cm;}
61
- h2{margin:0 0 10px;font-size:14px;color:#333;}
62
- p{margin:0 0 8px;font-size:11px;color:#999;}
63
- table{border-collapse:collapse;width:100%;}
64
- th,td{border:1px solid #ccc;padding:5px 8px;text-align:left;white-space:nowrap;}
65
- th{background:#f5f5f5;font-weight:600;color:#333;}
66
- tr:nth-child(even) td{background:#fafafa;}
67
- .og-print-footer{position:fixed;bottom:0;left:0;right:0;padding:6px 1cm;font-size:10px;color:#888;border-top:1px solid #e5e7eb;background:#fff;text-align:center;}
68
- </style>
69
- </head><body>
70
- <h2>${t}</h2>
71
- <p>${i.length}행 × ${n.length}열 · ${new Date().toLocaleString("ko-KR")}</p>
72
- <table>
73
- <thead><tr>${o}</tr></thead>
74
- <tbody>${l}</tbody>
75
- </table>
76
- ${r}
77
- <script>window.addEventListener('load',()=>{window.print();window.addEventListener('afterprint',()=>window.close());});<\/script>
78
- </body></html>`,c=window.open("","_blank","width=960,height=640");c&&(c.document.write(a),c.document.close())}exportSheetsExcel(e){const t=this._d.getWsManager();if(!t){this.exportExcel(e??"workbook");return}const s=e??"workbook.xlsx";Promise.resolve().then(()=>require("./xlsx.min-Bx-LxWOf.cjs")).then(i=>i.xlsx_min).then(({utils:i,writeFile:n})=>{const o=i.book_new(),l=this._d.getOptions();for(const r of t.getNames()){const a=t.get(r),c=a.columns.length?a.columns:l.columns,h=[c.map(p=>p.header)];for(const p of a.data)h.push(c.map(M=>{const f=p[M.field];return f==null?"":typeof f=="boolean"?f?"✓":"":M.type==="number"&&typeof f=="number"?f:String(f)}));const u=i.aoa_to_sheet(h);u["!cols"]=c.map(()=>({wpx:100})),i.book_append_sheet(o,u,r)}n(o,s.endsWith(".xlsx")?s:s+".xlsx",{cellStyles:!0})}).catch(()=>console.error("exportSheetsExcel: xlsx 패키지를 확인하세요."))}}class Pt{constructor(e){this._d=e}fmtNum(e,t){if(!t)return Math.round(e).toLocaleString("ko-KR");const s=t.match(/[#0][#0,]*(?:\.[#0]+)?|\d+/),i=s?t.slice(0,s.index):"",n=s?t.slice(s.index+s[0].length):"",o=s?s[0]:t,l=o.includes("#")||o.includes(","),r=o.match(/\.(\d+)$/),a=r?parseInt(r[1],10):/^\d+$/.test(o)?parseInt(o,10):0,c=Math.abs(e).toFixed(a),[h="0",u]=c.split("."),p=l?h.replace(/\B(?=(\d{3})+(?!\d))/g,","):h,M=u!==void 0?`${p}.${u}`:p,f=`${i}${M}${n}`;return e<0?`-${f}`:f}computeValues(){const e=this._d.getOptions().footer;if(!e||e.length===0)return[];const t=this._d.getData();return e.filter(s=>s.field&&s.op).map(s=>{const i=s.field,n=s.op,o=t.map(h=>h[i]).filter(h=>h!=null&&h!=="");let l=null;const r=n.toUpperCase();if(r==="SUM")l=o.length>0?R.sum(o.map(h=>String(h))):null;else if(r==="AVG")l=o.length>0?R.sum(o.map(h=>String(h))).div(R.from(String(o.length))):null;else if(r==="COUNT"){const h=o.length;return{_field:i,_value:h,_formatted:h.toLocaleString("ko-KR")}}else r==="MAX"?l=o.length>0?R.max(o.map(h=>String(h))):null:r==="MIN"&&(l=o.length>0?R.min(o.map(h=>String(h))):null);if(!l)return{_field:i,_value:null,_formatted:""};const a=l.toNumber(),c=this.fmtNum(a,s.format);return{_field:i,_value:a,_formatted:c}})}render(){var h;const e=this._d.getContainer(),t=e.querySelector(".og-footer-bar");t==null||t.remove();const s=this._d.getOptions(),i=s.footer;if(!i||i.length===0)return;const n=this._d.getColLayout().visibleLeaves,o=this._d.getColWidths()??n.map(u=>u.width??100),l=new Map(this.computeValues().map(u=>[u._field,u])),r=document.createElement("div");r.className="og-footer-bar",r.style.cssText=["display:flex;align-items:stretch;",`min-height:${s.footerHeight}px;`,"border-top:2px solid var(--og-primary,#1976d2);","background:var(--og-header-bg,#f5f5f5);","overflow:hidden;flex-shrink:0;font-size:13px;font-weight:600;"].join("");let a=0;if(s.stateColumn&&(a+=24),s.draggable&&(a+=18),s.rowNumber&&(a+=44),s.checkColumn&&(a+=36),a>0){const u=document.createElement("div");u.style.cssText=`width:${a}px;flex-shrink:0;border-right:1px solid var(--og-border-color,#e0e0e0);`,r.appendChild(u)}let c=0;for(const u of i){const p=Math.max(1,u.colspan??1);let M=0;for(let w=0;w<p;w++)M+=o[c+w]??100;const f=n[c];c+=p;const E=document.createElement("div");E.style.cssText=[`width:${M}px;min-width:${M}px;flex-shrink:0;`,"padding:4px 8px;box-sizing:border-box;overflow:hidden;","border-right:1px solid var(--og-border-color,#e0e0e0);","white-space:nowrap;text-overflow:ellipsis;"].join("");const x=u.field,g=x?l.get(x):null;if(g){const w=g._formatted??String(g._value??""),L=u.label?`${u.label}: `:"";E.textContent=L+w,E.title=`${((h=u.op)==null?void 0:h.toUpperCase())??""} = ${w}`,E.style.color="var(--og-primary,#1976d2)",E.style.textAlign=u.align??((f==null?void 0:f.type)==="number","right")}else u.label&&(E.textContent=u.label,E.style.textAlign=u.align??"left",E.style.color="var(--og-row-color,#212121)");r.appendChild(E)}s.footerPosition==="top"?e.insertBefore(r,e.firstChild):e.appendChild(r)}}class Vt{constructor(e){this._d=e}handleKeyDown(e){const t=this._d.getEditMgr();if(t.activeEditor)return;this._d.handleCellKeyEvt("cellKeyDown",e);const s=this._d.getData(),i=this._d.getColLayout(),n=s.rowCount,o=i.visibleLeaves.length;if(n===0||o===0)return;if((e.ctrlKey||e.metaKey)&&e.key==="c"){e.preventDefault(),this._copyToClipboard();return}if((e.ctrlKey||e.metaKey)&&e.key==="v"){e.preventDefault(),this._pasteFromClipboard();return}const l=this._d.getOptions();if((e.ctrlKey||e.metaKey)&&l.draggable&&t.focusCell){if(e.key==="ArrowDown"){e.preventDefault();const r=t.focusCell.ci!==void 0?t.focusCell.ri:0;r<n-1&&(this._d.handleRowDrop(r,r+1),this._d.setFocusCell(r+1,t.focusCell.ci),this._d.announce(`행 ${r+1}을(를) ${r+2}번째 위치로 이동`));return}if(e.key==="ArrowUp"){e.preventDefault();const r=t.focusCell.ri;r>0&&(this._d.handleRowDrop(r,r-1),this._d.setFocusCell(r-1,t.focusCell.ci),this._d.announce(`행 ${r+1}을(를) ${r}번째 위치로 이동`));return}}switch(e.key){case"ArrowDown":{e.preventDefault();const r=t.focusCell,a=r?Math.min(r.ri+1,n-1):0;this._d.setFocusCell(a,(r==null?void 0:r.ci)??0);break}case"ArrowUp":{e.preventDefault();const r=t.focusCell,a=r?Math.max(r.ri-1,0):0;this._d.setFocusCell(a,(r==null?void 0:r.ci)??0);break}case"ArrowRight":{e.preventDefault();const r=t.focusCell;if(!r){this._d.setFocusCell(0,0);break}r.ci<o-1?this._d.setFocusCell(r.ri,r.ci+1):r.ri<n-1&&this._d.setFocusCell(r.ri+1,0);break}case"ArrowLeft":{e.preventDefault();const r=t.focusCell;if(!r){this._d.setFocusCell(0,0);break}r.ci>0?this._d.setFocusCell(r.ri,r.ci-1):r.ri>0&&this._d.setFocusCell(r.ri-1,o-1);break}case"Tab":{e.preventDefault();const r=t.focusCell;if(!r){this._d.setFocusCell(0,0);break}e.shiftKey?r.ci>0?this._d.setFocusCell(r.ri,r.ci-1):r.ri>0&&this._d.setFocusCell(r.ri-1,o-1):r.ci<o-1?this._d.setFocusCell(r.ri,r.ci+1):r.ri<n-1&&this._d.setFocusCell(r.ri+1,0);break}case"Home":{if(e.preventDefault(),e.ctrlKey||e.metaKey)this._d.setFocusCell(0,0);else{const r=t.focusCell;this._d.setFocusCell((r==null?void 0:r.ri)??0,0)}break}case"End":{if(e.preventDefault(),e.ctrlKey||e.metaKey)this._d.setFocusCell(n-1,o-1);else{const r=t.focusCell;this._d.setFocusCell((r==null?void 0:r.ri)??0,o-1)}break}case"PageDown":{e.preventDefault();const r=t.focusCell,a=this._d.getOptions().pageSize??10,c=Math.min(r?r.ri+a:a-1,n-1);this._d.setFocusCell(c,(r==null?void 0:r.ci)??0);break}case"PageUp":{e.preventDefault();const r=t.focusCell,a=this._d.getOptions().pageSize??10,c=r?Math.max(r.ri-a,0):0;this._d.setFocusCell(c,(r==null?void 0:r.ci)??0);break}case" ":{if(t.focusCell){e.preventDefault();const r=t.focusCell.ri,a=this._d.getRowMgr();this._d.getOptions().checkColumn?(a.check(r,!a.checkedRows.has(r)),this._d.doRender()):(a.selectToggle(r),this._d.doRender())}break}case"F2":case"Enter":{t.focusCell&&this._d.getOptions().editable&&(e.preventDefault(),t.startEditByKey(t.focusCell.ri,t.focusCell.ci));break}case"Escape":{t.clearFocusCell(),this._d.doRender();break}}}_copyToClipboard(){var o;if(!this._d.getOptions().clipboard)return;const t=this._d.getEditMgr(),s=this._d.getColLayout(),i=this._d.getData();let n="";if(t.focusCell){const{ri:l,ci:r}=t.focusCell,a=s.visibleLeaves[r];a&&(n=String(i.getCellValue(l,a.field)??""))}else if(this._d.getRowMgr().selectedRows.size>0){const l=s.visibleLeaves;n=[...this._d.getRowMgr().selectedRows].sort((a,c)=>a-c).map(a=>{const c=i.getRowByIndex(a);return l.map(h=>String((c==null?void 0:c[h.field])??"")).join(" ")}).join(`
79
- `)}n&&((o=navigator.clipboard)==null||o.writeText(n).catch(()=>{}))}_pasteFromClipboard(){var s;const e=this._d.getOptions();if(!e.clipboard||!e.editable)return;const t=this._d.getEditMgr();t.focusCell&&((s=navigator.clipboard)==null||s.readText().then(i=>{if(!i)return;const{ri:n,ci:o}=t.focusCell,l=i.split(`
80
- `),r=this._d.getColLayout().visibleLeaves,a=this._d.getData();for(let c=0;c<l.length;c++){const h=l[c].split(" ");for(let u=0;u<h.length;u++){const p=n+c,M=o+u,f=r[M];f&&p<a.rowCount&&a.updateCell(p,f.field,h[u])}}this._d.emit("dataChange",a.getData()),this._d.doRender()}).catch(()=>{}))}}class jt{constructor(e){this._bar=null,this._input=null,this._count=null,this._filter="",this._d=e}get findFilter(){return this._filter}init(e){const t=document.createElement("div");t.className="og-find-bar",t.hidden=!0;const s=document.createElement("span");s.className="og-find-label",s.textContent="찾기";const i=document.createElement("input");i.type="text",i.className="og-find-input",i.placeholder="검색어 입력...",i.setAttribute("aria-label","그리드 내 검색");const n=document.createElement("span");n.className="og-find-count";const o=document.createElement("button");o.className="og-find-close",o.textContent="✕",o.setAttribute("aria-label","찾기 닫기"),t.appendChild(s),t.appendChild(i),t.appendChild(n),t.appendChild(o),e.insertBefore(t,e.firstChild),i.addEventListener("input",()=>{this._filter=i.value.trim(),this._apply()}),i.addEventListener("keydown",l=>{l.key==="Escape"&&this.close()}),o.addEventListener("click",()=>this.close()),this._bar=t,this._input=i,this._count=n}open(){this._bar&&(this._bar.hidden=!1,this._input.focus(),this._input.select())}close(){this._bar&&(this._bar.hidden=!0,this._filter="",this._input.value="",this._count&&(this._count.textContent=""),this._apply())}_apply(){var i,n;const e=this._d.getData(),t=this._d.getColLayout().visibleLeaves.map(o=>o.field);e.setFindFilter(this._filter,t),e.applyFilter(this._d.getFilters());const s=e.rowCount;(i=this._d.getVs())==null||i.setTotalRows(s),(n=this._d.getPagination())==null||n.setTotalRows(s),this._count&&(this._count.textContent=this._filter?`${s}건`:""),this._d.doRender()}}function Ge(d){return d&&d._isGroup===!0}function Ke(d,e,t=[],s=new Set,i){return e.length?qe(d,e,0,t,s,"",i):[]}function qe(d,e,t,s,i,n,o){const l=e[t],r=new Map;for(const c of d){const h=c[l];r.has(h)||r.set(h,[]),r.get(h).push(c)}const a=[];for(const[c,h]of r){const u=`${n}__${l}:${c}`,p=i.has(u);let M;t<e.length-1?M=qe(h,e,t+1,s,i,u,o):M=h;const{summary:f,summaryFmt:E}=Ut(h,s),x=Gt(h,o);a.push({_isGroup:!0,_groupField:l,_groupValue:c,_groupLabel:c==null?"(없음)":String(c),_depth:t,_expanded:p,_childCount:h.length,_summary:f,_summaryFmt:E,_states:x,children:M})}return a}function Ut(d,e){const t={},s={};for(const i of e){const n=d.map(a=>a[i.field]).filter(a=>a!=null&&a!=="");let o=null;const l=i.op.toUpperCase();if(l==="SUM")o=n.length>0?R.sum(n.map(String)):null;else if(l==="AVG")o=n.length>0?R.sum(n.map(String)).div(R.from(String(n.length))):null;else if(l==="COUNT"){t[i.field]=d.length,s[i.field]=d.length.toLocaleString("ko-KR");continue}else l==="MAX"?o=n.length>0?R.max(n.map(String)):null:l==="MIN"&&(o=n.length>0?R.min(n.map(String)):null);if(!o){t[i.field]=null,s[i.field]="";continue}const r=o.toNumber();t[i.field]=r,s[i.field]=qt(r,i.format)}return{summary:t,summaryFmt:s}}function Gt(d,e){if(!e)return{added:0,edited:0,removed:0};let t=0,s=0,i=0;for(const n of d){const o=e(n);o==="added"?t++:o==="edited"?s++:o==="removed"&&i++}return{added:t,edited:s,removed:i}}function qt(d,e){if(e==null)return d%1===0?d.toLocaleString("ko-KR"):parseFloat(d.toFixed(6)).toLocaleString("ko-KR",{minimumFractionDigits:2,maximumFractionDigits:6});const t=e.includes("#")||e.includes(","),s=e.match(/\.(\d+)$/),i=s?parseInt(s[1],10):/^\d+$/.test(e)?parseInt(e,10):0,n=Math.abs(d).toFixed(i),[o="0",l]=n.split("."),r=t?o.replace(/\B(?=(\d{3})+(?!\d))/g,","):o,a=l!==void 0?`${r}.${l}`:r;return d<0?`-${a}`:a}function Xe(d){const e=[];for(const t of d)if(e.push(t),t._expanded)for(const s of t.children)Ge(s)?e.push(...Xe([s])):e.push(s);return e}function Ye(d,e=""){const t=[];for(const s of d){const i=`${e}__${s._groupField}:${s._groupValue}`;t.push(i);const n=s.children.filter(o=>Ge(o));n.length&&t.push(...Ye(n,i))}return t}function Re(d,e,t=new Set){const{idField:s,parentIdField:i,expandOnLoad:n=!1}=e,o=new Map,l=[];for(const c of d){const h=c[s],u={_isTree:!0,_treeId:h,_treeParentId:c[i],_depth:0,_expanded:n||t.has(h),_hasChildren:!1,_childCount:0,_isLastChild:!1,_ancestorHasMore:[],data:c,children:[]};o.set(h,u)}for(const c of o.values()){const h=c._treeParentId;if(h==null||h===""||!o.has(h))l.push(c);else{const p=o.get(h);p.children.push(c),p._hasChildren=!0}}function r(c,h){for(const u of c)u._depth=h,u._childCount=Je(u),r(u.children,h+1)}r(l,0);function a(c,h){for(let u=0;u<c.length;u++){const p=c[u],M=u===c.length-1;p._isLastChild=M,p._ancestorHasMore=h,p.children.length>0&&a(p.children,[...h,!M])}}return a(l,[]),l}function Je(d){let e=d.children.length;for(const t of d.children)e+=Je(t);return e}function Qe(d){const e=[];for(const t of d)e.push(t),t._expanded&&t.children.length>0&&e.push(...Qe(t.children));return e}function Xt(d,e){d.has(e)?d.delete(e):d.add(e)}function Ee(d){const e=[];for(const t of d)e.push(t._treeId),t.children.length&&e.push(...Ee(t.children));return e}class Yt{constructor(e){this._groupFields=[],this._groupExpandedKeys=new Set,this._groupFlatRows=[],this._isGroupMode=!1,this._treeRoots=[],this._treeFlatRows=[],this._treeExpandedKeys=new Set,this._isTreeMode=!1,this._d=e}get isGroupMode(){return this._isGroupMode}get isTreeMode(){return this._isTreeMode}get groupFlatRows(){return this._groupFlatRows}get treeFlatRows(){return this._treeFlatRows}groupBy(e){this._groupFields=e,this._groupExpandedKeys.clear(),this._isGroupMode=e.length>0,this.rebuildGroups()}clearGroup(){var t;this._groupFields=[],this._groupExpandedKeys.clear(),this._isGroupMode=!1,this._groupFlatRows=[];const e=this._d.getData().length;(t=this._d.getVs())==null||t.setTotalRows(e),this._d.doRender()}expandAll(){if(!this._isGroupMode)return;const e=Ke(this._d.getData(),this._groupFields,this._getSummaryDefs());Ye(e).forEach(t=>this._groupExpandedKeys.add(t)),this.rebuildGroups()}collapseAll(){this._groupExpandedKeys.clear(),this._isGroupMode&&this.rebuildGroups()}handleGroupToggle(e){this._groupExpandedKeys.has(e)?this._groupExpandedKeys.delete(e):this._groupExpandedKeys.add(e),this.rebuildGroups()}rebuildGroups(){var n;const e=this._d.getData(),t=this._d.getDataLayer(),s=o=>{const l=e.indexOf(o);return l>=0?t.getRowState(l):"none"},i=Ke(e,this._groupFields,this._getSummaryDefs(),this._groupExpandedKeys,s);this._groupFlatRows=Xe(i),(n=this._d.getVs())==null||n.setTotalRows(this._groupFlatRows.length),this._d.doRenderFull(this._groupFlatRows.length)}enableTree(){this._isTreeMode=!0,this._isGroupMode=!1;const e=this._d.getOptions();if(e.expandOnLoad){const t=Re(this._d.getData(),{idField:e.treeId,parentIdField:e.treeParentId});Ee(t).forEach(s=>this._treeExpandedKeys.add(s))}this.rebuildTree()}disableTree(){var t;this._isTreeMode=!1,this._treeRoots=[],this._treeFlatRows=[],this._treeExpandedKeys.clear();const e=this._d.getData().length;(t=this._d.getVs())==null||t.setTotalRows(e),this._d.doRender()}expandNodes(e,t=!0){const s=Array.isArray(e)?e:[e];for(const i of s)t?this._treeExpandedKeys.add(i):this._treeExpandedKeys.delete(i);this._isTreeMode&&this.rebuildTree()}expandAllNodes(){this._isTreeMode&&(Ee(this._treeRoots).forEach(e=>this._treeExpandedKeys.add(e)),this.rebuildTree())}collapseAllNodes(){this._isTreeMode&&(this._treeExpandedKeys.clear(),this.rebuildTree())}handleTreeToggle(e){Xt(this._treeExpandedKeys,e),this.rebuildTree()}rebuildTree(){var t;const e=this._d.getOptions();this._treeRoots=Re(this._d.getData(),{idField:e.treeId,parentIdField:e.treeParentId,expandOnLoad:e.expandOnLoad},this._treeExpandedKeys),this._treeFlatRows=Qe(this._treeRoots),(t=this._d.getVs())==null||t.setTotalRows(this._treeFlatRows.length),this._d.doRenderFull(this._treeFlatRows.length)}_getSummaryDefs(){const e=this._d.getOptions().summary;if(!e)return[];if(e.rows&&e.rows.length>0)return e.fields.flatMap(s=>e.rows.map(i=>({field:s,op:i.op,format:i.format})));const t=Array.isArray(e.ops)?e.ops:e.ops?[e.ops]:["SUM"];return e.fields.map(s=>({field:s,op:t[0]??"SUM",format:e.format}))}}class Jt{constructor(e){this._sortList=[],this._filters={},this._d=e}get sortList(){return this._sortList}get filters(){return this._filters}handleSortClick(e,t){var l;const s=this._d.getOptions();if(!s.sortable)return;const i=this._sortList.findIndex(r=>r.field===e);if(i>=0){const r=this._sortList[i];r.dir==="asc"?r.dir="desc":this._sortList.splice(i,1)}else(!t||!s.multiSort)&&(this._sortList=[]),this._sortList.push({field:e,dir:"asc"});this._d.getData().applySort(this._sortList),this._d.renderHeader(),this._d.doRender();const n=this._sortList.find(r=>r.field===e),o=n?n.dir==="asc"?"오름차순":"내림차순":"정렬 해제";this._d.announce(`${e} ${o} 정렬`),this._d.emit("sortChange",{sortList:this._sortList}),(l=s.onSortChange)==null||l.call(s,{field:e,dir:(n==null?void 0:n.dir)??"asc",sortList:this._sortList})}sort(e,t="asc"){if(Array.isArray(e))this._sortList=e;else{const s=this._sortList.findIndex(i=>i.field===e);s>=0?this._sortList[s].dir=t:this._sortList=[{field:e,dir:t}],this._d.getOptions().multiSort||(this._sortList=this._sortList.slice(-1))}this._d.getData().applySort(this._sortList),this._d.renderHeader(),this._d.doRender(),this._d.emit("sortChange",{sortList:this._sortList})}resetSort(){this._sortList=[],this._d.getData().applySort([]),this._d.renderHeader(),this._d.doRender()}initSort(e){this._sortList=[...e],this._d.getData().applySort(this._sortList)}getSortState(){return[...this._sortList]}setFilter(e,t){var s,i;this._filters[e]=t,this.applyFilters(),this._d.renderHeader(),this._d.doRender(),this._d.emit("filterChange",{field:e,filterItems:t,allFilters:this._filters}),(i=(s=this._d.getOptions()).onFilterChange)==null||i.call(s,{field:e,filterItems:t,allFilters:this._filters})}resetFilter(e){e?delete this._filters[e]:this._filters={},this.applyFilters(),this._d.renderHeader(),this._d.doRender()}getFilterState(){return{...this._filters}}restoreFilter(e){this._filters={...e},this.applyFilters()}applyFilters(){var s,i;const e=this._d.getData();e.setFindFilter(this._d.getFindFilter(),this._d.getColLayout().visibleLeaves.map(n=>n.field)),e.applyFilter(this._filters);const t=e.rowCount;(s=this._d.getVs())==null||s.setTotalRows(t),(i=this._d.getPagination())==null||i.setTotalRows(t)}}class Qt{constructor(e){this._d=e}handleCellClick(e,t,s){var a,c,h,u,p,M,f;const i=this._d.getOptions(),n=this._d.getRowMgr(),o=this._d.getEditMgr();i.selection==="single"||i.selection==="row"?n.selectSingle(e):i.selection==="multiple"&&(s.ctrlKey||s.metaKey?n.selectToggle(e):n.selectSingle(e));const l=this._d.getData().getRowByIndex(e),r=this._d.getColLayout().visibleLeaves[t];if(l&&r){const E=r.editable!==!1&&(r.editable!==void 0||i.editable);if(te(r)&&E){const C=l[r.field];this._d.writeCell(e,r.field,!C)}if(r.type==="radio"){const C=r.group;for(const F of this._d.getColLayout().visibleLeaves)F.type==="radio"&&F.field!==r.field&&(!C||F.group===C)&&this._d.getData().updateCell(e,F.field,!1);this._d.writeCell(e,r.field,!0)}let x=l[r.field];if(x===void 0&&r.formula)try{const C=r.formulaPrecision??30,F=Ve(r.formula,l,C);x=F instanceof R?r.precision!=null?F.toFixed(r.precision):F.toString():String(F)}catch{}const g={type:"cellClick",rowIndex:e,columnIndex:t,field:r.field,value:x,row:l,column:r,target:s.target,originalEvent:s};this._d.emit("cellClick",g),(a=i.onCellClick)==null||a.call(i,g);const w={type:"rowClick",rowIndex:e,row:l,target:s.target,originalEvent:s};this._d.emit("rowClick",w),(c=i.onRowClick)==null||c.call(i,w);const L=r.type==="select";!(o.activeEditor!=null&&((h=o.editCell)==null?void 0:h.ri)===e&&((u=o.editCell)==null?void 0:u.ci)===t)&&(i.editMode==="click"||L)&&!te(r)&&o.startEdit(e,t,s)}o.activeEditor&&((p=o.editCell)==null?void 0:p.ri)===e&&((M=o.editCell)==null?void 0:M.ci)===t||(this._d.doRender(),this._d.emit("selectionChange",{rows:n.getSelections(),rowIndexes:[...n.selectedRows]}),(f=i.onSelectionChange)==null||f.call(i,{rows:n.getSelections(),rowIndexes:[...n.selectedRows],cells:[]}))}handleCellDblClick(e,t,s){var a,c;const i=this._d.getData().getRowByIndex(e),n=this._d.getColLayout().visibleLeaves[t];if(!i||!n)return;const o=this._d.getOptions(),l={type:"cellDblClick",rowIndex:e,columnIndex:t,field:n.field,value:i[n.field],row:i,column:n,target:s.target,originalEvent:s};this._d.emit("cellDblClick",l),(a=o.onCellDblClick)==null||a.call(o,l);const r={type:"rowDblClick",rowIndex:e,row:i,target:s.target,originalEvent:s};this._d.emit("rowDblClick",r),(c=o.onRowDblClick)==null||c.call(o,r),o.editMode==="dblclick"&&this._d.getEditMgr().startEdit(e,t,s)}handleCellMouseOver(e,t,s){var a,c;const i=this._d.getData().getRowByIndex(e),n=this._d.getColLayout().visibleLeaves[t];if(!i||!n)return;const o=this._d.getOptions(),l={type:"cellMouseOver",rowIndex:e,columnIndex:t,field:n.field,value:i[n.field],row:i,column:n,target:s.target,originalEvent:s};this._d.emit("cellMouseOver",l),(a=o.onCellMouseOver)==null||a.call(o,l);const r={type:"rowMouseOver",rowIndex:e,row:i,target:s.target,originalEvent:s};this._d.emit("rowMouseOver",r),(c=o.onRowMouseOver)==null||c.call(o,r)}handleCellMouseOut(e,t,s){var a,c;const i=this._d.getData().getRowByIndex(e),n=this._d.getColLayout().visibleLeaves[t];if(!i||!n)return;const o=this._d.getOptions(),l={type:"cellMouseOut",rowIndex:e,columnIndex:t,field:n.field,value:i[n.field],row:i,column:n,target:s.target,originalEvent:s};this._d.emit("cellMouseOut",l),(a=o.onCellMouseOut)==null||a.call(o,l);const r={type:"rowMouseOut",rowIndex:e,row:i,target:s.target,originalEvent:s};this._d.emit("rowMouseOut",r),(c=o.onRowMouseOut)==null||c.call(o,r)}handleCellMouseDown(e,t,s){var a,c;const i=this._d.getData().getRowByIndex(e),n=this._d.getColLayout().visibleLeaves[t];if(!i||!n)return;const o=this._d.getOptions(),l={type:"cellMouseDown",rowIndex:e,columnIndex:t,field:n.field,value:i[n.field],row:i,column:n,target:s.target,originalEvent:s};this._d.emit("cellMouseDown",l),(a=o.onCellMouseDown)==null||a.call(o,l);const r={type:"rowMouseDown",rowIndex:e,row:i,target:s.target,originalEvent:s};this._d.emit("rowMouseDown",r),(c=o.onRowMouseDown)==null||c.call(o,r)}handleCellMouseUp(e,t,s){var a,c;const i=this._d.getData().getRowByIndex(e),n=this._d.getColLayout().visibleLeaves[t];if(!i||!n)return;const o=this._d.getOptions(),l={type:"cellMouseUp",rowIndex:e,columnIndex:t,field:n.field,value:i[n.field],row:i,column:n,target:s.target,originalEvent:s};this._d.emit("cellMouseUp",l),(a=o.onCellMouseUp)==null||a.call(o,l);const r={type:"rowMouseUp",rowIndex:e,row:i,target:s.target,originalEvent:s};this._d.emit("rowMouseUp",r),(c=o.onRowMouseUp)==null||c.call(o,r)}handleCellMouseMove(e,t,s){var a,c;const i=this._d.getData().getRowByIndex(e),n=this._d.getColLayout().visibleLeaves[t];if(!i||!n)return;const o=this._d.getOptions(),l={type:"cellMouseMove",rowIndex:e,columnIndex:t,field:n.field,value:i[n.field],row:i,column:n,target:s.target,originalEvent:s};this._d.emit("cellMouseMove",l),(a=o.onCellMouseMove)==null||a.call(o,l);const r={type:"rowMouseMove",rowIndex:e,row:i,target:s.target,originalEvent:s};this._d.emit("rowMouseMove",r),(c=o.onRowMouseMove)==null||c.call(o,r)}handleCellKeyEvt(e,t){var c,h,u;const s=this._d.getEditMgr();if(!s.focusCell||s.activeEditor)return;const{ri:i,ci:n}=s.focusCell,o=this._d.getData().getRowByIndex(i),l=this._d.getColLayout().visibleLeaves[n];if(!o||!l)return;const r=this._d.getOptions(),a={type:e,rowIndex:i,columnIndex:n,field:l.field,value:o[l.field],row:o,column:l,key:t.key,target:this._d.getContainer(),originalEvent:t};this._d.emit(e,a),e==="cellKeyDown"?(c=r.onCellKeyDown)==null||c.call(r,a):e==="cellKeyUp"?(h=r.onCellKeyUp)==null||h.call(r,a):(u=r.onCellKeyPress)==null||u.call(r,a)}}class Zt{constructor(){this._triggers=new Map}add(e,t){this._triggers.has(e)||this._triggers.set(e,[]),this._triggers.get(e).push(t)}remove(e,t){const s=this._triggers.get(e);if(s){const i=s.indexOf(t);i>=0&&s.splice(i,1)}}clear(e){e?this._triggers.delete(e):this._triggers.clear()}mkCtx(e,t){let s=!1;return{operation:e,args:t,result:void 0,extra:{},timestamp:Date.now(),get cancelled(){return s},cancel(){s=!0}}}exec(e,t){const s=this._triggers.get(e)??[];for(const i of s)if(i(t),t.cancelled)return!1;if(e.startsWith("after:")){const i=this._triggers.get("complete")??[];for(const n of i)n(t)}return!0}}const le="";function Ze(d){const e=Object.entries(d).filter(([,t])=>t!==le).map(([t,s])=>` ${JSON.stringify(t)}: src[${JSON.stringify(s)}],`);return`// crossGridMapping 옵션에 이 함수를 그대로 지정하세요.
81
- function mapRow(src) {
82
- return {
83
- `+e.join(`
84
- `)+(e.length?`
85
- `:"")+` };
86
- }`}function es(d){return e=>{const t={};for(const[s,i]of Object.entries(d))i!==le&&(t[s]=e[i]);return t}}function ts(d,e){if(d.length!==e.length)return!1;const t=new Set(e);return d.every(s=>t.has(s))}function ss(d,e){return new Promise(t=>{const s=new Set(d.map(C=>C.field)),i={};for(const C of e)i[C.field]=s.has(C.field)?C.field:le;const n=document.createElement("div");n.className="og-mapper-overlay",n.setAttribute("role","dialog"),n.setAttribute("aria-modal","true"),n.setAttribute("aria-label","그리드 필드 매핑"),n.style.cssText="position:fixed;inset:0;z-index:100000;background:rgba(0,0,0,0.45);display:flex;align-items:center;justify-content:center;font-family:var(--og-font-family,-apple-system,sans-serif);";const o=document.createElement("div");o.style.cssText="background:#fff;border-radius:10px;box-shadow:0 12px 40px rgba(0,0,0,0.3);width:min(620px,92vw);max-height:88vh;overflow:auto;color:#222;",n.appendChild(o);const l=document.createElement("div");l.style.cssText="padding:18px 20px 8px;",l.innerHTML='<div style="font-size:16px;font-weight:700;">필드 매핑</div><div style="font-size:12.5px;color:#666;margin-top:4px;line-height:1.5;">두 그리드의 필드 구조가 다릅니다. <b>타깃 필드</b>마다 어떤 <b>소스 필드</b>의 값을 가져올지 지정하세요. 아래 스크립트를 복사해 <code>crossGridMapping</code> 에 baking 하면 다음부터는 이 창 없이 자동 변환됩니다.</div>',o.appendChild(l);const r=document.createElement("div");r.style.cssText="padding:6px 20px;";const a='<option value="">(비움)</option>'+d.map(C=>`<option value="${ee(C.field)}">${ee(C.header)} &lt;${ee(C.field)}&gt;</option>`).join("");for(const C of e){const F=document.createElement("div");F.style.cssText="display:flex;align-items:center;gap:10px;padding:7px 0;border-bottom:1px solid #f0f0f0;";const K=document.createElement("div");K.style.cssText="flex:1;font-size:13px;min-width:0;",K.innerHTML=`<span style="font-weight:600;">${ee(C.header)}</span><span style="color:#999;font-size:11.5px;"> &lt;${ee(C.field)}&gt;</span>`;const _=document.createElement("span");_.textContent="←",_.style.cssText="color:#888;flex-shrink:0;";const b=document.createElement("select");b.style.cssText="flex:1;min-width:0;padding:6px 8px;border:1px solid #ccc;border-radius:6px;font-size:13px;background:#fff;",b.innerHTML=a,b.value=i[C.field]??le,b.addEventListener("change",()=>{i[C.field]=b.value,f()}),F.append(K,_,b),r.appendChild(F)}o.appendChild(r);const c=document.createElement("div");c.style.cssText="padding:10px 20px 4px;";const h=document.createElement("div");h.style.cssText="display:flex;align-items:center;justify-content:space-between;margin-bottom:6px;",h.innerHTML='<span style="font-size:12.5px;font-weight:600;color:#444;">생성된 변환 스크립트</span>';const u=document.createElement("button");u.type="button",u.textContent="복사",u.style.cssText="font-size:12px;padding:4px 10px;border:1px solid #ccc;border-radius:6px;background:#f7f7f7;cursor:pointer;",h.appendChild(u);const p=document.createElement("pre");p.style.cssText="margin:0;background:#0d1117;color:#c9d1d9;padding:12px;border-radius:8px;font-family:ui-monospace,Consolas,monospace;font-size:12px;line-height:1.5;overflow:auto;max-height:180px;",c.append(h,p),o.appendChild(c);function M(){return Ze(i)}function f(){p.textContent=M()}f(),u.addEventListener("click",()=>{var F;const C=M();(F=navigator.clipboard)==null||F.writeText(C).then(()=>{u.textContent="복사됨!",setTimeout(()=>u.textContent="복사",1200)},()=>{u.textContent="복사 실패",setTimeout(()=>u.textContent="복사",1200)})});const E=document.createElement("div");E.style.cssText="display:flex;justify-content:flex-end;gap:8px;padding:14px 20px 18px;";const x=document.createElement("button");x.type="button",x.textContent="취소",x.style.cssText="font-size:13px;padding:8px 16px;border:1px solid #ccc;border-radius:7px;background:#fff;cursor:pointer;";const g=document.createElement("button");g.type="button",g.textContent="적용 후 이동",g.style.cssText="font-size:13px;padding:8px 16px;border:0;border-radius:7px;background:#1976d2;color:#fff;cursor:pointer;font-weight:600;",E.append(x,g),o.appendChild(E);let w=!1;function L(C){w||(w=!0,document.removeEventListener("keydown",v),n.remove(),t(C))}function v(C){C.key==="Escape"&&L(null)}x.addEventListener("click",()=>L(null)),n.addEventListener("mousedown",C=>{C.target===n&&L(null)}),g.addEventListener("click",()=>L({mapping:{...i},script:M()})),document.addEventListener("keydown",v),document.body.appendChild(n),g.focus()})}function ee(d){return String(d).replace(/[&<>"]/g,e=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"})[e])}class is{constructor(){this._map=new Map}register(e,t){this._map.set(e,t)}unregister(e){this._map.delete(e)}get(e){return this._map.get(e)}get size(){return this._map.size}resolveAt(e,t,s){const i=document.elementFromPoint(e,t),n=i==null?void 0:i.closest(".og-body-wrapper");if(!n)return null;const o=this._map.get(n);return!o||o===s?null:o}}const re=new is,Pe="_ogRowId";class ns extends tt{constructor(e,t){var i;super(),this._vs=null,this._ro=null,this._renderer=null,this._trigMgr=new Zt,this._destroyed=!1,this._autoHeightWarned=!1,this._colWidths=[],this._userWidths=new Map,this._filterPanel=null,this._filterSelect=null,this._pagination=null,this._dnd=null,this._mergeEngine=new J,this._liveRegion=null,this._ctxMenu=null,this._cmHandler=null,this._cmKbdHandler=null,this._wsManager=null;const s=typeof e=="string"?document.querySelector(e):e;if(!s)throw new Error(`OpenGrid: container not found: ${e}`);this._container=s,this._options={height:"100%",width:"100%",rowHeight:32,headerHeight:34,footerHeight:30,autoHeight:!1,fillWidth:!1,defaultColumnWidth:100,editable:!1,editMode:"dblclick",history:!0,historySize:100,selection:"single",clipboard:!0,sortable:!0,multiSort:!0,filterable:!0,defaultSort:[],frozenColumns:0,frozenRows:0,rowNumber:!1,stateColumn:!1,checkColumn:!1,draggable:!1,crossGrid:!1,crossGridMapping:"auto",mergeCells:!1,groupBy:[],summary:void 0,treeMode:"auto",treeId:"id",treeParentId:"parentId",expandOnLoad:!1,pagination:!1,pageSize:50,footer:void 0,footerPosition:"bottom",theme:"default",cssVars:{},ariaLabel:"OPEN_GRID 데이터 그리드",...t},this._data=new it(Pe),this._rowMgr=new $t(this._data),this._colLayout=new ce(this._options.columns,this._options.frozenColumns),this._editMgr=new At({data:this._data,colLayout:this._colLayout,getRenderer:()=>this._renderer,getContainer:()=>this._container,getOptions:()=>this._options,emit:(n,...o)=>this.emit(n,...o),doRender:()=>this._doRender(...this._visRange()),announce:n=>this._announce(n),writeCell:(n,o,l)=>this.writeCell(n,o,l),scrollToRow:n=>{var o;return(o=this._vs)==null?void 0:o.scrollToRow(n)},getVisibleLeaves:()=>this._colLayout.visibleLeaves}),this._exportMgr=new Kt({getData:()=>this._data.getData(),getColLayout:()=>this._colLayout,getColWidths:()=>this._colWidths,getOptions:()=>this._options,getContainer:()=>this._container,getMaskEnabled:n=>this.getMaskEnabled(n),getWsManager:()=>this._wsManager}),this._footerMgr=new Pt({getData:()=>this._data.getData(),getColLayout:()=>this._colLayout,getColWidths:()=>this._colWidths,getOptions:()=>this._options,getContainer:()=>this._container}),this._kbdMgr=new Vt({getEditMgr:()=>this._editMgr,getRowMgr:()=>this._rowMgr,getData:()=>this._data,getColLayout:()=>this._colLayout,getOptions:()=>this._options,setFocusCell:(n,o)=>this._setFocusCell(n,o),handleRowDrop:(n,o)=>this._handleRowDrop(n,o),doRender:()=>this._doRender(...this._visRange()),announce:n=>this._announce(n),emit:(n,...o)=>this.emit(n,...o),visRange:()=>this._visRange(),handleCellKeyEvt:(n,o)=>this._handleCellKeyEvt(n,o)}),this._sfMgr=new Jt({getData:()=>this._data,getColLayout:()=>this._colLayout,getFindFilter:()=>this._findMgr.findFilter,getVs:()=>this._vs,getPagination:()=>this._pagination,getOptions:()=>this._options,renderHeader:()=>this._renderHeader(),doRender:()=>this._doRender(...this._visRange()),announce:n=>this._announce(n),emit:(n,...o)=>this.emit(n,...o)}),this._findMgr=new jt({getColLayout:()=>this._colLayout,getData:()=>this._data,getFilters:()=>this._sfMgr.filters,getVs:()=>this._vs,getPagination:()=>this._pagination,doRender:()=>this._doRender(...this._visRange())}),this._cellEvt=new Qt({getData:()=>this._data,getColLayout:()=>this._colLayout,getOptions:()=>this._options,getEditMgr:()=>this._editMgr,getRowMgr:()=>this._rowMgr,emit:(n,...o)=>this.emit(n,...o),writeCell:(n,o,l)=>this.writeCell(n,o,l),doRender:()=>this._doRender(...this._visRange()),getContainer:()=>this._container}),this._grpMgr=new Yt({getData:()=>this._data.getData(),getDataLayer:()=>this._data,getOptions:()=>this._options,getVs:()=>this._vs,doRenderFull:n=>this._doRender(0,n-1),doRender:()=>this._doRender(...this._visRange())}),this._mount(),this._bindOptionEvents(),(i=this._options.defaultSort)!=null&&i.length&&this._sfMgr.initSort(this._options.defaultSort),requestAnimationFrame(()=>{var n,o;this.emit("ready",this),(o=(n=this._options).onReady)==null||o.call(n,this)})}_mount(){var s,i;this._container.classList.add("og-container");const e=this._options.height,t=this._options.width;this._container.style.height=typeof e=="number"?`${e}px`:String(e),this._container.style.width=typeof t=="number"?`${t}px`:String(t),this._container.style.display="flex",this._container.style.flexDirection="column",this._container.style.overflow="hidden",this._container.style.boxSizing="border-box",this._container.style.border="1px solid var(--og-border-color, #e0e0e0)",this._container.style.fontFamily="var(--og-font-family, -apple-system, sans-serif)",this._container.style.fontSize="var(--og-font-size, 13px)",this._container.setAttribute("data-og-theme",this._options.theme);for(const[n,o]of Object.entries(this._options.cssVars))this._container.style.setProperty(n,o);this._renderer=new Tt(this._container,this._options,{onHeaderClick:(n,o)=>this._handleSortClick(n,o),onCellClick:(n,o,l)=>this._handleCellClick(n,o,l),onCellDblClick:(n,o,l)=>this._handleCellDblClick(n,o,l),onCellMouseOver:(n,o,l)=>this._handleCellMouseOver(n,o,l),onCellMouseOut:(n,o,l)=>this._handleCellMouseOut(n,o,l),onCellMouseDown:(n,o,l)=>this._handleCellMouseDown(n,o,l),onCellMouseUp:(n,o,l)=>this._handleCellMouseUp(n,o,l),onCellMouseMove:(n,o,l)=>this._handleCellMouseMove(n,o,l),onRowCheck:(n,o)=>this._handleRowCheck(n,o),onAllCheck:n=>this._handleAllCheck(n),onColResize:(n,o)=>this._handleColResize(n,o),onFilterIconClick:(n,o)=>this._handleFilterIconClick(n,o),getDndManager:()=>this._dnd,onColDragStart:n=>{this._editMgr.dragColIdx=n},onColDrop:n=>{this._editMgr.dragColIdx!==null&&this._editMgr.dragColIdx!==n&&this._reorderColumn(this._editMgr.dragColIdx,n),this._editMgr.dragColIdx=null},getColDragIdx:()=>this._editMgr.dragColIdx}),this._filterPanel=new rt(this._container,(n,o)=>this.setFilter(n,o),n=>this.resetFilter(n)),this._container.setAttribute("role","grid"),this._container.setAttribute("aria-label",this._options.ariaLabel??((s=this._options.cssVars)==null?void 0:s["aria-label"])??"OPEN_GRID 데이터 그리드"),this._container.setAttribute("aria-rowcount","0"),this._container.setAttribute("aria-colcount",String(this._options.columns.filter(n=>!n.hidden).length)),this._liveRegion=document.createElement("div"),this._liveRegion.setAttribute("aria-live","polite"),this._liveRegion.setAttribute("aria-atomic","true"),this._liveRegion.className="og-live-region",this._container.insertAdjacentElement("beforebegin",this._liveRegion),this._container.tabIndex=0,this._container.addEventListener("keydown",n=>this._handleKeyDown(n)),this._container.addEventListener("keyup",n=>this._handleCellKeyEvt("cellKeyUp",n)),this._container.addEventListener("keypress",n=>this._handleCellKeyEvt("cellKeyPress",n)),this._vs=new ot(this._renderer.bodyWrapper,{rowHeight:this._options.rowHeight,onRender:(n,o)=>this._doRender(n,o)}),re.register(this._renderer.bodyWrapper,this),this._options.draggable&&(this._dnd=new Wt(this._renderer.bodyWrapper,this._options.rowHeight,(n,o)=>this._handleRowDrop(n,o),this._options.crossGrid?{resolveTarget:(n,o)=>{const l=re.resolveAt(n,o,this);return!l||!l._options.crossGrid?null:{bodyEl:l._crossBodyEl(),rowHeight:l._options.rowHeight,totalRows:l._data.rowCount}},onCrossDrop:(n,o,l)=>this._handleCrossGridDrop(n,o,l)}:void 0,n=>this._dragRowSet(n).length)),this._options.pagination&&(this._pagination=new Ht(this._container,this._options.pageSize,n=>{this.emit("pageChange",n),this._doRender(...this._visRange())})),this._findMgr.init(this._container),this._initContextMenu(),(i=this._options.worksheets)!=null&&i.length&&this._initWorksheets(),this._ro=new ResizeObserver(()=>this._onResize()),this._ro.observe(this._container),this._onResize()}_initContextMenu(){const e=this._options.contextMenu;e!==!1&&(this._cmHandler&&this._container.removeEventListener("contextmenu",this._cmHandler),this._cmKbdHandler&&this._container.removeEventListener("keydown",this._cmKbdHandler),this._cmHandler=this._cmKbdHandler=null,this._ctxMenu=new Ot(this._container,{onSortAsc:()=>{const t=this._colLayout.visibleLeaves[0];t&&this.orderBy(t.field,"asc")},onSortDesc:()=>{const t=this._colLayout.visibleLeaves[0];t&&this.orderBy(t.field,"desc")},onFind:()=>this._findMgr.open(),onExcel:()=>this.exportExcel(),onCsv:()=>this.exportCsv(),onPrint:()=>this.print()}),this._cmHandler=t=>{var l;const s=t.target.closest(".og-cell");if(!s)return;t.preventDefault();const i=Number(s.dataset.colIndex??-1),n=this._colLayout.visibleLeaves[i];n&&this._ctxMenu&&(this._ctxMenu._actions.onSortAsc=()=>this.orderBy(n.field,"asc"),this._ctxMenu._actions.onSortDesc=()=>this.orderBy(n.field,"desc"));const o=Array.isArray(e)?e:void 0;(l=this._ctxMenu)==null||l.open(t,o)},this._container.addEventListener("contextmenu",this._cmHandler),this._cmKbdHandler=t=>{var s;if(t.shiftKey&&t.key==="F10"){t.preventDefault();const i=this._container.getBoundingClientRect(),n={clientX:i.left+80,clientY:i.top+40};(s=this._ctxMenu)==null||s.open(n)}},this._container.addEventListener("keydown",this._cmKbdHandler))}openContextMenu(e,t){var s;(s=this._ctxMenu)==null||s.open(e,t)}closeContextMenu(){var e;(e=this._ctxMenu)==null||e.close()}setFilterSelect(e){var t;(t=this._filterSelect)==null||t.destroy(),this._filterSelect=null,e&&(this._container.id||(this._container.id=`og-${Math.random().toString(36).slice(2,7)}`),this._filterSelect=new zt(this._container,e,(s,i)=>this.setFilter(s,i),s=>this.resetFilter(s),this._container.id))}setOptions(e){var t;if(Object.assign(this._options,e),"contextMenu"in e&&((t=this._ctxMenu)==null||t.destroy(),this._ctxMenu=null,this._initContextMenu()),"groupBy"in e||"summary"in e){const s=e.groupBy??[];s.length>0?this._grpMgr.groupBy(s):this.clearGroup();return}this._renderHeader(),this._doRender(...this._visRange())}setMaskEnabled(e,t){var i;const s=this._colLayout.getColumnByField(e);s&&(t?(s._maskRevealed=!1,(i=s._maskRevealedRows)==null||i.clear()):s._maskRevealed=!0,this._doRender(...this._visRange()))}getMaskEnabled(e){const t=this._colLayout.getColumnByField(e);return t?t._maskRevealed!==!0:!1}_initWorksheets(){const e=this._options.worksheets;this._wsManager=new Oe(this._container,(t,s)=>{this._data.setData(s.data),this._colLayout=new ce(s.columns.length?s.columns:this._options.columns,this._options.frozenColumns),this._doRender(...this._visRange()),this._renderHeader()});for(const t of e)this._wsManager.add(t.name,t.columns??this._options.columns,t.data??[])}addWorksheet(e,t,s){this._wsManager||(this._wsManager=new Oe(this._container,(i,n)=>{this._data.setData(n.data),this._colLayout=new ce(n.columns.length?n.columns:this._options.columns,this._options.frozenColumns),this._doRender(...this._visRange()),this._renderHeader()})),this._wsManager.add(e,t??this._options.columns,s??[])}removeWorksheet(e){var t;(t=this._wsManager)==null||t.remove(e)}switchWorksheet(e){var t;(t=this._wsManager)==null||t.switch(e)}renameWorksheet(e,t){var s;(s=this._wsManager)==null||s.rename(e,t)}getWorksheet(e){var t;return(t=this._wsManager)==null?void 0:t.get(e)}getWorksheetNames(){var e;return((e=this._wsManager)==null?void 0:e.getNames())??[]}exportSheetsExcel(e){this._exportMgr.exportSheetsExcel(e)}_paginationHeight(){return this._options.pagination?38:0}_onResize(){const{width:e,height:t}=this._container.getBoundingClientRect();if(!e)return;const s=t-this._options.headerHeight-this._paginationHeight();this._renderer.updateSize(t-this._paginationHeight(),this._options.headerHeight),this._vs.setViewportHeight(s),this._recalcWidths(e),this._renderHeader(),this._doRender(...this._visRange())}_recalcWidths(e){this._colWidths=this._colLayout.computeWidths(e-(this._options.stateColumn?24:0)-(this._options.draggable?18:0)-(this._options.rowNumber?44:0)-(this._options.checkColumn?36:0),this._options.defaultColumnWidth),this._userWidths.size&&this._colLayout.visibleLeaves.forEach((t,s)=>{const i=this._userWidths.get(t.field);i!=null&&(this._colWidths[s]=i)})}_renderHeader(){var e;(e=this._renderer)==null||e.renderHeader(this._colLayout.buildHeaderCells(),this._colLayout.visibleLeaves,this._colWidths,this._sfMgr.sortList,{...this._options,_activeFilters:this._sfMgr.filters,_frozenCount:this._colLayout.frozenCount})}_doRender(e,t){var n;if(!this._renderer||!this._vs)return;const s=this._vs.getVisibleRange(),i=this._options.autoHeight===!0;i&&([e,t]=this._visRange(),!this._autoHeightWarned&&t-e+1>2e3&&(this._autoHeightWarned=!0,console.warn(`[OpenGrid] autoHeight 는 가상 스크롤이 아니라 전 행(${t-e+1}행)을 렌더합니다. 행이 많으면 고정 rowHeight(가상 스크롤) 사용을 권장합니다.`))),this._renderer.renderBody(e,t,this._data,this._colLayout.visibleLeaves,this._colWidths,this._options,i?0:s.offsetY,i?0:this._vs.getTotalHeight(),this._rowMgr.selectedRows,this._rowMgr.checkedRows,this._grpMgr.isGroupMode?this._grpMgr.groupFlatRows:this._grpMgr.isTreeMode?this._grpMgr.treeFlatRows:null,o=>this._grpMgr.handleGroupToggle(o),this._grpMgr.isTreeMode?o=>this._grpMgr.handleTreeToggle(o):void 0,{_totalRows:this._data.rowCount,_frozenCount:this._colLayout.frozenCount,_focusCell:this._editMgr.focusCell},this._mergeEngine),(n=this._options.footer)!=null&&n.length&&this._renderFooterEl()}_handleGroupToggle(e){this._grpMgr.handleGroupToggle(e)}_visRange(){var t;if(this._options.pagination&&this._pagination){const{start:s,end:i}=this._pagination.getRange();return[s,i]}if(this._options.autoHeight)return[0,(this._grpMgr.isGroupMode?this._grpMgr.groupFlatRows.length:this._grpMgr.isTreeMode?this._grpMgr.treeFlatRows.length:this._data.rowCount)-1];const e=(t=this._vs)==null?void 0:t.getVisibleRange();return[(e==null?void 0:e.startIndex)??0,Math.min(((e==null?void 0:e.endIndex)??30)+this._visCount()+5,this._data.rowCount-1)]}_visCount(){const e=this._container.getBoundingClientRect().height;return Math.ceil((e-this._options.headerHeight-this._paginationHeight())/this._options.rowHeight)+5}_handleSortClick(e,t){this._sfMgr.handleSortClick(e,t)}_isToggleCol(e){return te(e)}_handleCellClick(e,t,s){this._cellEvt.handleCellClick(e,t,s)}_handleCellDblClick(e,t,s){this._cellEvt.handleCellDblClick(e,t,s)}_handleCellMouseOver(e,t,s){this._cellEvt.handleCellMouseOver(e,t,s)}_handleCellMouseOut(e,t,s){this._cellEvt.handleCellMouseOut(e,t,s)}_handleCellMouseDown(e,t,s){this._cellEvt.handleCellMouseDown(e,t,s)}_handleCellMouseUp(e,t,s){this._cellEvt.handleCellMouseUp(e,t,s)}_handleCellMouseMove(e,t,s){this._cellEvt.handleCellMouseMove(e,t,s)}_handleCellKeyEvt(e,t){this._cellEvt.handleCellKeyEvt(e,t)}_handleRowCheck(e,t){this._rowMgr.check(e,t),this._doRender(...this._visRange()),this.emit("rowCheck",{rowIndex:e,checked:t,row:this._data.getRowByIndex(e)})}_handleFilterIconClick(e,t){var i,n;if((i=this._filterPanel)!=null&&i.isOpen){this._filterPanel.close();return}const s=this._sfMgr.filters[e]??[];(n=this._filterPanel)==null||n.open(e,t,s)}_handleAllCheck(e){this._rowMgr.checkAll(e,this._data.rowCount),this._doRender(...this._visRange()),this.emit("allCheck",{checked:e})}_handleRowDrop(e,t){var s,i;this._data.moveRow(e,t),this._doRender(...this._visRange()),this.emit("rowDrop",{fromIndex:e,toIndex:t}),(i=(s=this._options).onRowDrop)==null||i.call(s,{fromIndex:e,toIndex:t})}_crossBodyEl(){return this._renderer.bodyWrapper}_dragRowSet(e){const t=[...this._rowMgr.selectedRows];return t.length>1&&t.includes(e)?t.sort((s,i)=>s-i):[e]}_handleCrossGridDrop(e,t,s){const i=re.get(t);!i||i===this||this.moveRowsTo(i,this._dragRowSet(e),s)}async moveRowsTo(e,t,s){const i=e;if(!i||i===this||!t.length)return!1;const n=[...new Set(t)].sort((c,h)=>c-h),o=s??i._data.rowCount;let l=n.map(c=>{const h={...this._data.getRowByIndex(c)};return delete h[Pe],h});const r=await this._resolveCrossTransform(i);if(r===!1)return!1;r&&(l=l.map(c=>r(c)));const a={sourceGrid:this,targetGrid:i,rows:l,sourceIndexes:n,targetIndex:o};return this._fireGridDropBefore(a)===!1||a.cancel||i._fireGridDropBefore(a)===!1||a.cancel?!1:(l.forEach((c,h)=>i.insertRow(c,o+h)),[...n].sort((c,h)=>h-c).forEach(c=>this.deleteRow(c)),this._fireGridDropAfter(a),i._fireGridDropAfter(a),this._fireGridDropComplete(a),i._fireGridDropComplete(a),!0)}async moveCheckedTo(e){const t=this._rowMgr.getChecked().map(s=>s.rowIndex);return t.length?(this._rowMgr.uncheckAll(),this.moveRowsTo(e,t)):!1}async _resolveCrossTransform(e){var l,r;const t=this._options.crossGridMapping;if(typeof t=="function")return t;if(t!=="interactive")return null;const s=this._colLayout.visibleLeaves.map(a=>({field:a.field,header:a.header})),i=e._colLayout.visibleLeaves.map(a=>({field:a.field,header:a.header}));if(ts(s.map(a=>a.field),i.map(a=>a.field)))return null;const n=await ss(s,i);if(!n)return!1;const o={sourceGrid:this,targetGrid:e,mapping:n.mapping,script:n.script};return this.emit("gridDropMapping",o),(r=(l=this._options).onGridDropMapping)==null||r.call(l,o),console.log(`[OpenGrid] cross-grid mapping script:
87
- `+Ze(n.mapping)),es(n.mapping)}_fireGridDropBefore(e){var t,s;return this.emit("gridDropBefore",e),(s=(t=this._options).onGridDropBefore)==null?void 0:s.call(t,e)}_fireGridDropAfter(e){var t,s;this.emit("gridDropAfter",e),(s=(t=this._options).onGridDropAfter)==null||s.call(t,e)}_fireGridDropComplete(e){var t,s;this.emit("gridDropComplete",e),(s=(t=this._options).onGridDropComplete)==null||s.call(t,e)}reorderRow(e,t){this._data.moveRow(e,t),this._doRender(...this._visRange())}_handleColResize(e,t){this._colWidths[e]!==void 0&&(this._colWidths[e]=t);const s=this._colLayout.visibleLeaves[e];s&&this._userWidths.set(s.field,t),this._renderHeader(),this._doRender(...this._visRange())}_handleKeyDown(e){this._kbdMgr.handleKeyDown(e)}_setFocusCell(e,t){this._rowMgr.selectSingle(e),this._editMgr.setFocusCell(e,t)}_announce(e){this._liveRegion&&(this._liveRegion.textContent="",setTimeout(()=>{this._liveRegion&&(this._liveRegion.textContent=e)},50))}_bindOptionEvents(){this._options.onCellClick&&this.on("cellClick",this._options.onCellClick),this._options.onCellDblClick&&this.on("cellDblClick",this._options.onCellDblClick),this._options.onRowClick&&this.on("rowClick",this._options.onRowClick),this._options.onEditStart&&this.on("editStart",this._options.onEditStart),this._options.onEditEnd&&this.on("editEnd",this._options.onEditEnd),this._options.onSortChange&&this.on("sortChange",this._options.onSortChange),this._options.onFilterChange&&this.on("filterChange",this._options.onFilterChange),this._options.onScroll&&this.on("scroll",this._options.onScroll),this._options.onDataChange&&this.on("dataChange",this._options.onDataChange),this._options.onSelectionChange&&this.on("selectionChange",this._options.onSelectionChange),this._options.onRowDblClick&&this.on("rowDblClick",this._options.onRowDblClick),this._options.onRowMouseOver&&this.on("rowMouseOver",this._options.onRowMouseOver),this._options.onRowMouseOut&&this.on("rowMouseOut",this._options.onRowMouseOut),this._options.onRowMouseDown&&this.on("rowMouseDown",this._options.onRowMouseDown),this._options.onRowMouseUp&&this.on("rowMouseUp",this._options.onRowMouseUp),this._options.onRowMouseMove&&this.on("rowMouseMove",this._options.onRowMouseMove),this._options.onCellMouseOver&&this.on("cellMouseOver",this._options.onCellMouseOver),this._options.onCellMouseOut&&this.on("cellMouseOut",this._options.onCellMouseOut),this._options.onCellMouseDown&&this.on("cellMouseDown",this._options.onCellMouseDown),this._options.onCellMouseUp&&this.on("cellMouseUp",this._options.onCellMouseUp),this._options.onCellMouseMove&&this.on("cellMouseMove",this._options.onCellMouseMove),this._options.onCellKeyDown&&this.on("cellKeyDown",this._options.onCellKeyDown),this._options.onCellKeyUp&&this.on("cellKeyUp",this._options.onCellKeyUp),this._options.onCellKeyPress&&this.on("cellKeyPress",this._options.onCellKeyPress)}setData(e){var s;const t=this._trigMgr.mkCtx("setData",[e]);this._trigMgr.exec("before:setData",t)&&(this._rowMgr.reset(),this._data.setData(e),this._applyFilters(),this._grpMgr.isTreeMode?this._grpMgr.rebuildTree():this._grpMgr.isGroupMode?this._grpMgr.rebuildGroups():(s=this._vs)==null||s.setTotalRows(this._data.rowCount),this._container.setAttribute("aria-rowcount",String(this._data.rowCount)),this._container.setAttribute("aria-colcount",String(this._colLayout.visibleLeaves.length)),this._announce(`${this._data.rowCount}행 데이터 로드됨`),this.emit("dataChange",this._data.getData()),t.result=e.length,this._trigMgr.exec("after:setData",t))}getData(){return this._data.getData()}getSourceRows(){return this._data.getOriginalData()}pushData(e){var i,n;const t=[...this._data.getAllData(),...e];this._data.setData(t);const s=this._data.rowCount;(i=this._vs)==null||i.setTotalRows(s),(n=this._pagination)==null||n.setTotalRows(s)}prefixData(e){var i,n;const t=[...e,...this._data.getAllData()];this._data.setData(t);const s=this._data.rowCount;(i=this._vs)==null||i.setTotalRows(s),(n=this._pagination)==null||n.setTotalRows(s)}clearData(){var e,t;this._rowMgr.reset(),this._data.clearData(),(e=this._vs)==null||e.setTotalRows(0),(t=this._pagination)==null||t.setTotalRows(0),this._doRender(0,-1),this.emit("dataChange",[])}insertRow(e,t="last"){var o,l,r,a;const s=this._trigMgr.mkCtx("insertRow",[e,t]);if(!this._trigMgr.exec("before:insertRow",s))return;const i=t==="before"?0:t==="after"?this._data.rowCount:t;this._data.addRow(e,i);const n=this._data.rowCount;(o=this._vs)==null||o.setTotalRows(n),(l=this._pagination)==null||l.setTotalRows(n),this._doRender(...this._visRange()),this.emit("dataChange",this._data.getData()),(a=(r=this._options).onDataChange)==null||a.call(r,this._data.getData()),s.result={rowCount:n,item:e},this._trigMgr.exec("after:insertRow",s)}pushRow(e){var i,n,o,l;(Array.isArray(e)?e:[e]).forEach(r=>this._data.addRow(r,"last"));const s=this._data.rowCount;(i=this._vs)==null||i.setTotalRows(s),(n=this._pagination)==null||n.setTotalRows(s),this._doRender(...this._visRange()),this.emit("dataChange",this._data.getData()),(l=(o=this._options).onDataChange)==null||l.call(o,this._data.getData())}appendRows(e){this.pushRow(e)}unshiftRow(e){var i,n,o,l;(Array.isArray(e)?e:[e]).forEach(r=>this._data.addRow(r,"first"));const s=this._data.rowCount;(i=this._vs)==null||i.setTotalRows(s),(n=this._pagination)==null||n.setTotalRows(s),this._doRender(...this._visRange()),this.emit("dataChange",this._data.getData()),(l=(o=this._options).onDataChange)==null||l.call(o,this._data.getData())}prependRows(e){this.unshiftRow(e)}deleteRow(e){var o,l,r,a;const t=this._trigMgr.mkCtx("deleteRow",[e]),s=Array.isArray(e)?[...e]:[e];if(t.extra={rows:s.map(c=>this._data.getRowByIndex(c))},!this._trigMgr.exec("before:deleteRow",t))return;const i=s.sort((c,h)=>h-c);i.forEach(c=>this._data.removeRow(c));const n=this._data.rowCount;(o=this._vs)==null||o.setTotalRows(n),(l=this._pagination)==null||l.setTotalRows(n),this._doRender(...this._visRange()),this.emit("dataChange",this._data.getData()),(a=(r=this._options).onDataChange)==null||a.call(r,this._data.getData()),t.result={deleted:i.length,rowCount:n},this._trigMgr.exec("after:deleteRow",t)}deleteById(e){}readCell(e,t){return this._data.getCellValue(e,t)}getDisplayValue(e,t){const s=this.readCell(e,t);return s==null?"":String(s)}writeCell(e,t,s){var c,h,u,p;const i=this.readCell(e,t),n=this._trigMgr.mkCtx("writeCell",[e,t,s]);if(n.extra={oldValue:i,rowIndex:e,field:t},!this._trigMgr.exec("before:writeCell",n))return;this._data.updateCell(e,t,s);const o=this._data.getRowByIndex(e),l=this._colLayout.getColumnByField(t),r=this._colLayout.getColumnIndex(t),a={type:"editEnd",rowIndex:e,columnIndex:r,field:t,oldValue:i,newValue:s,row:o,column:l};this.emit("editEnd",a),(h=(c=this._options).onEditEnd)==null||h.call(c,a),this.emit("dataChange",this._data.getData()),(p=(u=this._options).onDataChange)==null||p.call(u,this._data.getData()),this._doRender(...this._visRange()),n.result={rowIndex:e,field:t,oldValue:i,newValue:s},this._trigMgr.exec("after:writeCell",n)}getRowAt(e){return this._data.getRowByIndex(e)}getChanges(){return this._data.getChanges()}getEditedRows(){return this._data.getEditedRows()}getChangedRows(){return this._data.getChangedRows()}getChangedColumns(){return this._data.getChangedColumns()}getAddedRows(){return this._data.getAddedRows()}getRemovedRows(){return this._data.getRemovedRows()}getOriginalRow(e){return this._data.getOriginalRow(e)}getRowsWithState(e){return this._data.getRowsWithState(e)}undo(){}redo(){}clearHistory(){}getColumnDefs(){return this._colLayout.visibleLeaves}getAllColumnDefs(){return this._colLayout.leaves}getColumnCount(){return this._colLayout.visibleLeaves.length}applyColumns(e){const t=this._trigMgr.mkCtx("applyColumns",[e]);this._trigMgr.exec("before:applyColumns",t)&&(this._colLayout.setColumns(e),this._recalcWidths(this._container.getBoundingClientRect().width),this._renderHeader(),this._doRender(...this._visRange()),t.result={columnCount:e.length},this._trigMgr.exec("after:applyColumns",t))}insertColumn(e,t){this._colLayout.addColumn(e,t),this._recalcWidths(this._container.getBoundingClientRect().width),this._renderHeader(),this._doRender(...this._visRange())}deleteColumn(e){this._colLayout.removeColumn(e),this._recalcWidths(this._container.getBoundingClientRect().width),this._renderHeader(),this._doRender(...this._visRange())}_reorderColumn(e,t){var o,l;const s=this._colLayout.visibleLeaves.map(r=>r);if(e<0||t<0||e>=s.length||t>=s.length)return;const i=[...this._options.columns],[n]=i.splice(e,1);i.splice(t,0,n),this._options.columns=i,this.applyColumns(i),(l=(o=this._options).onColumnReorder)==null||l.call(o,{fromIndex:e,toIndex:t,field:n.field??""})}hideColumn(e){this._colLayout.hideColumn(e),this._recalcWidths(this._container.getBoundingClientRect().width),this._renderHeader(),this._doRender(...this._visRange())}showColumn(e){this._colLayout.showColumn(e),this._recalcWidths(this._container.getBoundingClientRect().width),this._renderHeader(),this._doRender(...this._visRange())}getColumnIndex(e){return this._colLayout.getColumnIndex(e)}getFieldAt(e){var t;return((t=this._colLayout.getColumnByIndex(e))==null?void 0:t.field)??""}getColValues(e,t=!1){return this._data.getData().map(s=>s[e])}getUniqueValues(e,t=!1){return[...new Set(this.getColValues(e,t))]}setColWidths(e){}calcColWidths(e=!1){return[]}getSelections(){return this._rowMgr.getSelections()}getActiveRow(){return this._rowMgr.getActiveRow()}activate(e){this._rowMgr.activate(e),this._doRender(...this._visRange())}deselect(){this._rowMgr.deselect(),this._doRender(...this._visRange())}getChecked(){return this._rowMgr.getChecked()}getAllChecked(){return this._rowMgr.getAllChecked()}checkById(e){}addCheckById(e){}checkByValue(e,t){this._rowMgr.checkByValue(e,t),this._doRender(...this._visRange())}uncheckById(e){}uncheckAll(){this._rowMgr.uncheckAll(),this._doRender(...this._visRange())}orderBy(e,t="asc"){const s=this._trigMgr.mkCtx("orderBy",[e,t]);this._trigMgr.exec("before:orderBy",s)&&(this._sfMgr.sort(e,t),s.result={sortList:this._sfMgr.sortList},this._trigMgr.exec("after:orderBy",s))}resetOrder(){this._sfMgr.resetSort()}setFilter(e,t){const s=this._trigMgr.mkCtx("setFilter",[e,t]);this._trigMgr.exec("before:setFilter",s)&&(this._sfMgr.setFilter(e,t),s.result={field:e,filteredCount:this._data.rowCount},this._trigMgr.exec("after:setFilter",s))}resetFilter(e){this._sfMgr.resetFilter(e)}getFilterState(){return this._sfMgr.getFilterState()}restoreFilter(e){this._sfMgr.restoreFilter(e)}_applyFilters(){this._sfMgr.applyFilters()}freeze(e){this._colLayout.setFrozen(e),this._renderHeader(),this._doRender(...this._visRange())}mergeCells(e){this._mergeEngine.applyMergeCells(e),this._doRender(...this._visRange())}autoMerge(e){const t=this._colLayout.visibleLeaves,s=[],i=[];for(const n of e){const o=t.findIndex(l=>l.field===n);o>=0&&(s.push(o),i.push(n))}this._mergeEngine.applyAutoMerge(this._data.getData(),s,i),this._doRender(...this._visRange())}clearMerge(){this._mergeEngine.clear(),this._doRender(...this._visRange())}freezeRows(e){}groupBy(e){const t=this._trigMgr.mkCtx("groupBy",[e]);this._trigMgr.exec("before:groupBy",t)&&(this._grpMgr.groupBy(e),t.result={fields:e},this._trigMgr.exec("after:groupBy",t))}clearGroup(){this._grpMgr.clearGroup()}expandAll(){this._grpMgr.expandAll()}collapseAll(){this._grpMgr.collapseAll()}enableTree(){this._grpMgr.enableTree()}disableTree(){this._grpMgr.disableTree()}expandNodes(e,t=!0){this._grpMgr.expandNodes(e,t)}expandAllNodes(){this._grpMgr.expandAllNodes()}collapseAllNodes(){this._grpMgr.collapseAllNodes()}addTreeRow(e,t,s){}exportExcel(e){this._exportMgr.exportExcel(e)}exportCsv(e){this._exportMgr.exportCsv(e)}exportJson(e){this._exportMgr.exportJson(e)}print(e){this._exportMgr.print(e)}toArray(e=!0){const t=this._data.getData();if(e)return t;const s=this._colLayout.visibleLeaves;return t.map(i=>s.map(n=>i[n.field]))}jumpToRow(e){var t;this._rowMgr.selectSingle(e),(t=this._vs)==null||t.scrollToRow(e),this._doRender(...this._visRange())}jumpToCol(e){}getScrollPos(){var e,t;return{x:((e=this._renderer)==null?void 0:e.bodyWrapper.scrollLeft)??0,y:((t=this._renderer)==null?void 0:t.bodyWrapper.scrollTop)??0}}setFooter(e){this._options.footer=e,this._renderFooterEl()}getFooterData(){return this._footerMgr.computeValues()}getFooterValue(e){var t;return((t=this._footerMgr.computeValues().find(s=>s._field===e))==null?void 0:t._value)??null}_renderFooterEl(){this._footerMgr.render()}resize(e,t){e&&(this._container.style.width=`${e}px`),t&&(this._container.style.height=`${t}px`),this._onResize()}setTheme(e){this._container.setAttribute("data-og-theme",e)}setThemeVar(e,t){this._container.style.setProperty(e,t)}addTrigger(e,t){return this._trigMgr.add(e,t),this}removeTrigger(e,t){return this._trigMgr.remove(e,t),this}clearTriggers(e){return this._trigMgr.clear(e),this}_mkCtx(e,t){return this._trigMgr.mkCtx(e,t)}_trig(e,t){return this._trigMgr.exec(e,t)}destroy(){var e,t,s,i,n,o,l,r;this._destroyed||(this._destroyed=!0,this._renderer&&re.unregister(this._renderer.bodyWrapper),this._trigMgr.clear(),(e=this._ro)==null||e.disconnect(),(t=this._vs)==null||t.destroy(),(s=this._filterPanel)==null||s.destroy(),(i=this._dnd)==null||i.destroy(),this._cmHandler&&this._container.removeEventListener("contextmenu",this._cmHandler),this._cmKbdHandler&&this._container.removeEventListener("keydown",this._cmKbdHandler),this._cmHandler=this._cmKbdHandler=null,(n=this._ctxMenu)==null||n.destroy(),(o=this._wsManager)==null||o.destroy(),(l=this._renderer)==null||l.destroy(),(r=this._liveRegion)==null||r.remove(),this._liveRegion=null,this._container.innerHTML="",this._container.classList.remove("og-container"),this.removeAllListeners())}}exports.OpenGrid=ns;exports.buildTree=Re;
88
- //# sourceMappingURL=OpenGrid-ClmeIJYR.cjs.map