@ninebone/datagrid 0.0.14 โ 0.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -8
- package/dist/nine-table.js +351 -250
- package/dist/nine-table.js.map +1 -1
- package/dist/nine-table.umd.js +25 -23
- package/dist/nine-table.umd.js.map +1 -1
- package/package.json +7 -2
- package/dist/css/nine-table.css +0 -1795
package/dist/nine-table.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nine-table.js","names":["traceOrigin","trace","GROUP_IDX","GROUP_IDX","start","end","mid","target","elementDebounceState","el","state","pointerEvent","pointerFn","debounceTime","dblClickEvent","dblClickFn","_text","stripHtml","tmp","html","canvas","context","_font","w","h","v","cleanText","metrics","ascent","descent","trace$1","trace","NINE_TABLE","ngRow","#parent","parent","#newrow","ngData","#host","host","#initialize","item","validRecords","#getValidRecords","at","targetRecord","colnm","idx","rowData","rowIndex","colIndex","value","#conv","fields","#defaultHeight","templateElements","#getDefaultMeta","loadData","dataSource","#invalidate","#nextId","rowid","jsonArray","arr","o","json","record","#json2Array","#defaultInsert","row","updateState","targetIndex","#getIndexFromRow","processedArr","arrIndex","records","b","a","targetId","index","COL_IDX","isSingle","targetArr","result","i","ngDataManager","ds","rowIdx","nRow","rowidx","#init","#fields","f","found","fieldName","fName","#adjust","map","name","type","rawTables","tbl","fieldType","attr","expr","lastIndex","targetField","NineTableSheets","NineTableSheetsFooter","#render","isMultiSelect","tabItem","#switchSheet","updateSplitters","sheets","s","activeSheets","sheet","currentIdx","targetSplitter","tabBar","body","tabItems","sheetElements","isActive","clickedTab","activeTabs","targetSheet","tabsHtml","table","SheetTabItem","Toolbar","#bindEvents","#customContainer","#syncStateFromHost","isSimple","showToolbar","showMenu","caption","titleEl","link","currentCaption","menuBtn","element","text","NineTableHScrollBar","#owner","initWhenReady","#elements","#observeResize","#resizeObserver","#dragging","track","thumb","bodyWidth","tableWidth","needsHScroll","trackWidth","thumbWidth","currentLeft","maxScrollLeft","l","maxThumbLeft","trackBound","targetX","x","delayScroll","#interval1","#interval2","thumbLeft","#thumbMoveTo","pos","currentThumbLeft","clearTimer","evt","e","trackRect","onMouseMove","moveEvent","onMouseUp","NineTableVScrollBar","#sheet","viewRecords","totalCount","scrollHolder","rawContentHeight","MAX_BROWSER_HEIGHT","useScaling","scaleFactor","contentHeight","#getScaleInfo","fixedHeight","bodyHeight","viewHeight","needsVScroll","trackHeight","thumbHeight","currentScrollTop","maxScrollTop","thumbTop","maxThumbTop","#startY","#startThumbTop","deltaY","targetThumbTop","ratio","rowHeight","visibleRowCount","targetRow","clickY","scrollInterval","startContinuousScroll","scrollStep","$firstTr","direction","currentRow","stopContinuousScroll","GROUP_IDX$1","GroupingManager","#groupColumns","#groupMap","groupColumns","sourceTable","$cell","$tr","#isApplying","groupId","rowIds","dataManager","Grouping","validRaw","rawRecords","groupMap","nestedTree","#buildNestedMap","flatResult","renderItems","#flattenTree","counter","isLastLevel","depth","groupKey","subMapOrRecords","mapOrArray","parentId","#collectLeafRowIds","groupRecord","resultArr","#collectLeafRecords","remainingCols","key","subRecords","subVal","r","RowManager","#initResizeObserver","#templateRowHeights","sum","bodyViewport","#cachedTemplateHeight","#measureAndCacheHeight","#renderAllContainers","#handleScroll","force","#isGrouped","#handleGroupedScroll","scrollTop","templateLength","rawTotalVirtualHeight","totalVirtualHeight","actualScrollTop","maxStartIndex","clampedScrollTop","startIndex","firstTr","#element","currentStartIndex","$tbody","dataIndex","#bindRowData","allRenderItems","totalVirtualCount","bodyContent","getItemHeight","dataRowsHeight","groupHeightsTotal","itemHeights","viewportClientHeight","accumulatedHeight","offsetY","visibleRowsCount","dynamicBuffer","targetStart","targetEnd","renderedItems","container","selector","trs","itemIndex","chunkTrs","virtualIndex","isTrGroup","tr","subIdx","#bindGroupRowData","subRowIndex","matrixRow","indices","allRecords","childrenRecords","customComp","$el","#containerTemplates","tableEl","tbody","templateTrs","#sheetHeight","#isProgrammaticScroll","dataRow","targetScrollTop","rawTargetScrollTop","onRendered","trTemplates","fragment","renderedTrs","#updateRowCount","visibleRows","#BUFFER_ROW_COUNT","groupDepth","#cachedRowCount","#renderRows","#syncRowHeights","targetFixedType","clonedTr","targetTbody","tmpl","leftTable","bodyTable","rightTable","leftRows","bodyRows","rightRows","maxRows","heights","maxHeight","entry","entries","height","TableCompiler","$table","$srcTable","#syncColAttributes","fixed","$col","cols","grid","rowSpan","colSpan","c","CellSelection","#initEvents","sameGroupTrs","t","$td","col","r1","startRow","endRow","r2","c1","startCol","endCol","c2","containers","expanded","loopCount","#getMatrixRow","cell","cellEndRow","cellEndCol","nsR","neR","nsC","neC","#range","mainZone","lastMatrixRow","lastCol","targetCell","allCells","rect","targetTr","CellNavigation","#currentCell","#currentTr","#isCellLeftVisible","#isCellRightVisible","isVisible","#isCellBelowVisible","#isCellAboveVisible","scrollTopIndex","#getVisibleRowCount","currentCell","#findCell","nextCell","#getPreviousCell","#getNextCell","#getUpCell","#getDownCell","#moveCellH","#moveCellV","nextCol","cellCol","cellRect","viewportRect","theadHeight","bodyViewport2","viewportHeight","RESIZE_OFFSET","ColResizer","#panel","#tooltip","#onPointerMove","#onPointerDown","#onDblClick","containerType","firstColgroup","totalWidth","colWidths","colIdx","tables","targetCols","globalColIndex","firstContainer","resolvedContainerType","width","sourceCol","headerPart","offsetX","isLeftEdge","isRightEdge","prevCell","#targetCell","#targetContainerType","#getContainerType","baseColIndex","#targetColIndex","#checkIsAutoFit","#nextColIndex","nextColEl","#nextColStartWidth","targetRect","sheetRect","#startCellWidth","#startLeft","attrW","#startColWidth","#startX","#updatePositions","#onDragMove","#onDragEnd","diff","clientX","isAutoFit","maxDiff","minDiff","currentColWidth","realCellWidth","maxCellWidth","currentCellWidth","sizeBadge","finalWidth","newColWidth","newNextWidth","tbodyCell","extraPadding","fieldIdx","font","headerText","maxTextWidth","val","size","calculatedWidth","ColResizerPanel","#renderer","ColMover","#grip","#indi","root","y","nested","headerCells","hasStrictChildren","isValidGroup","parentGroupRange","subCell","subStart","subSpan","subEnd","isRealGroup","groupRange","#getColGroupRange","origTable","minLeft","maxRight","minTop","maxBottom","targetCells","cCol","cEnd","isGroup","computedStyle","groupWidth","groupHeight","headerContent","clonedCell","style","#checkIsMovable","startX","startY","cancelTimer","#timer","onPointerMovePending","#startDrag","#isDragging","preview","#createGroupHeaderPreview","#sourceCell","#sourceColIndex","#shiftX","bounds","relativeTop","fullHeight","#updateGripPosition","#onPointerUp","#getDeepElementFromPoint","targetColIndex","colMinLeft","colMaxRight","cRect","midX","calculatedTargetCol","indicatorLeft","sourceGroup","movingSpan","sourceRowStart","sourceRowEnd","targetRowStart","targetRowEnd","isRowSpanCompatible","isOutOfBoundsOfParent","pStart","pEnd","isDroppingInsideOtherGroup","spannedCells","sCell","sRowStart","sRowEnd","sStart","sEnd","moveEndCol","isSelfGroup","left","colgroup","targetCol","toColIndex","spanCount","isInRange","fromColIndex","targetViewportCol","fixedType","group","cells","targetRowCell","ColFixManager","baseCol","fixedAttr","targetBoundaryCol","theadTrs","cellBoundaryFound","cEndCol","action","fixType","cIdx","minBaseCol","maxEndCol","rSpan","rIdx","isBroken","isColFixed","NineTableFilterPanel","#closeHandler","#nineTable","#view","#onInput","#onSelectAll","#onOk","#button","filterBtn","panelWidth","top","searchBox","#loadVirtualFilterItems","path","filteredRecords","activeFilters","exprEngine","bindKey","colInfo","exprKey","filterKey","activeSelectedVals","uniqueMap","rawVal","displayVal","uniqueList","valA","valB","numA","numB","selectAllChk","filterRecords","checkedRecords","chk","filterParams","selectedVals","query","data2Idx","matchedValues","isChecked","chkIdx","NineTableFilterButton","#onClick","#columns","seen","uniqueKey","isFiltered","panel","Filtering","#filters","#initFilterPanel","#filterPanel","#isFiltering","#applyFiltering","jsonFilter","oFilter","k","sheetIndex","filterRules","targetKey","allowedValues","isExpr","isPass","recordIdx","allowedSet","Sorting","#handleSort","colName","exprVal","isAsc","isDesc","existingColIndex","m","ruleData","#applySorting","#syncHeaderUI","colRule","asc","SheetView","#cachedVisibleRecords","#viewIndexes","visibleRecords","#convSingle","filterSlot","#sortingColumns","groupResult","columns","rulesWithIdx","rule","idxA","idxB","isEmptyA","isEmptyB","strA","strB","PreCompiler","#ensureColgroup","#ensureThead","#ensureSectionTbodys","#ensureRowIndicator","#normalizeColAttributes","#createColIndicator","#normalizeCollapsibleAttributes","#generateCell","#initColExpanders","#initFilterButtons","#applyInitialCellWidths","thead","firstRow","cnt","td","#numToExcelCol","background","num","headTbody","footTbody","colCount","containerWidth","defaultWidth","widthVal","targetAttributes","autoIdCounter","$tbl","tagName","$datalist","$option","uniqueFuncName","cellType","originalContent","hostFilter","tableFilter","finalFiltering","currentWidth","expandBtn","targetWidth","rows","section","indicatorCell","startColIdx","targetIdx","NineTableSheet","#rowManager","#index","#colResizer","#filtering","#grouping","#colMover","#colFix","#cellSelection","#cellNavigation","#source","attrTrue","sourceTableTrue","#isSimple","callback","#renderSplitContainers","#updateContainerWidths","#adjustOverlay","$thead","$overlay","#autoFit","enable","totalOriginalWidth","colList","collapsedTotalWidth","availableWidth","allocatedTotal","calculatedCols","exactWidth","baseWidth","remainderPixels","uncollapsedCols","#syncHeaderAndFooterHeights","#initRowHoverEvent","prefix","firstTable","#createSplitTable","offsetHeight","sheetBottom","tbodyBottom","bodyContainer","scrollLeft","#sorting","leftHeaderRows","bodyHeaderRows","rightHeaderRows","#applyMaxHeights","leftFooterRows","bodyFooterRows","rightFooterRows","activeRowIndex","relatedTarget","LayoutManager","owner","#applyAutoHeight","maxDisplayRows","maxRowHeight","toolbarEl","footerEl","toolbarHeight","footerHeight","calculatedHeight","isAutoHeight","sheetCount","sheetsHtml","className","sheetId","cssImports","ExprEngine","match","trimmedExpr","compiledExpr","evalFn","#exprCache","rowItem","NineTable","#shadowRoot","#dataManager","#templateCnt","#bindDynamicSetters","#layoutManager","#dispatchLoad","checkCount","checkTimer","loadSheetCnt","$sheet","#customStyle","activeSheet","toRowid","provider","methods","styleEl","fn","idOrIndex","extractedMethodNames","matches","internalValue","methodName","newValue","BasicCellElement","exprCache","CellElement","#cell","#tr","#attr","curRow","renderer","rawRecord","prop","defaultValue","\"display\"","data","cleanExpr","childRecords","funcName","field","acc","EditableCellElement","CellInputText","#target","#initEvent","#maxbyte","maxByteNum","event","CellInputNumber","#onKeyDown","#validate","#max","#min","#scale","str","selectionStart","scale","validKey","isNumKey","CellInputColor","#btn","#dataSource","datalistId","datalist","option","#rendererColor","#isValidColor","g","CellInputDate","#type","formattedVal","d","isValid","#isValidDate","year","month","day","isleap","hour","min","week","CellCheckbox","#label","#trueText","#falseText","#isRadio","trueValue","childHtml","displayText","#enable","#readonly","#visible","CellRadio","#rendererRadio","matchIndex","#radioList","codeVal","#keyName","nameVal","#valueName","label","input","span","CellComboPanel","grd","itemsAttr","fieldKeys","valueName","activeColumnCount","multi","formattedData","keyName","selectedKeys","separator","#isOpen","btnEl","btnRect","panelHeight","upwardTop","#initData","viewContainer","#onClickRow","keyword","CellCombo","#multi","#multiSeparator","#togglePanel","#targetBtn","#getDisplayText","#validateInput","keys","list","CellRenderer","CellButton","#cellButtonClick","customEvent","rawValue","CellRowIndicator","#mainTarget","#subTarget","#statusTarget","displayNum","formattedNum","splitIndex","prefixPart","suffixPart","isSorted","isFitered","ColExpand","singleWidth","currentW","splitWidth","ContextMenu","#tableHost","targetTable","#getTargetSheet","items","activeTableId","activeTable","containerElement","targetTableAttr","rootUl","parsedList","#traverseUl","ulEl","child","spanEl","n","subUl","useDefault","rawItems","customItems","#parseCustomMenuItems","fixManager","#getFixManager","currentFixState","isFixable","isHeaderCell","fixMenuItem","cleanedItems","targetParent","menuItems","#buildMenuItems","#handleMenuClick","#syncMenuStates","isFiltering","autoFit","showTitle","menuId","#onContextMenu","MenuPanel","#onCallback","#appendItems","#bindClickEvents","cellRightX","wrapper","calculatedLeft","calculatedTop","li","condition","sep","parentUl"],"sources":["../src/core/protype.js","../src/external/NoPeer.js","../src/core/constants.js","../src/data/ngData.js","../src/data/ngDataManager.js","../src/data/Fields.js","../src/layout/nine-table-sheets.js","../src/layout/nine-table-sheets-footer.js","../src/layout/nine-table-toolbar.js","../src/layout/nine-table-hscrollbar.js","../src/layout/nine-table-vscrollbar.js","../src/data/Grouping.js","../src/layout/core/RowManager.js","../src/layout/core/TableCompiler.js","../src/cell-manager/CellSelection.js","../src/cell-manager/CellNavigation.js","../src/col/ColResizer.js","../src/col/ColMover.js","../src/col/ColFixManager.js","../src/data/Filtering.js","../src/data/Sorting.js","../src/data/SheetView.js","../src/layout/core/PreCompiler.js","../src/layout/nine-table-sheet.js","../src/layout/core/LayoutManager.js","../src/core/ExprEngine.js","../src/core/nine-table.js","../src/cell/core/BasicCellElement.js","../src/cell/core/CellElement.js","../src/cell/cell-input-text.js","../src/cell/cell-input-number.js","../src/cell/cell-input-color.js","../src/cell/cell-input-date.js","../src/cell/cell-checkbox.js","../src/cell/cell-radio.js","../src/cell/cell-combo-panel.js","../src/cell/cell-combo.js","../src/cell/cell-renderer.js","../src/cell/cell-button.js","../src/cell/cell-row-indicator.js","../src/col/col-expand.js","../src/menu/nine-table-menu.js","../src/menu/nine-table-menu-panel.js"],"sourcesContent":["Array.prototype.nineBinarySearch = function(target) {\n //this.sort((a, b) => { return a > b ? 1 : -1; });\n\n let start = 0;\n let end = this.length - 1;\n let mid;\n\n while (start <= end) {\n mid = parseInt((start + end) / 2);\n\n if (target === this[mid]) {\n return mid;\n } else {\n if (target < this[mid]) {\n end = mid - 1;\n } else {\n start = mid + 1;\n }\n }\n }\n\n return -1;\n};\n\nconst elementDebounceState = new WeakMap();\n\nHTMLElement.prototype.addDebounseEventListener = function(\n dblClickEvent,\n dblClickFn,\n pointerEvent,\n pointerFn,\n debounceTime = 500\n) {\n const el = this;\n\n if (!elementDebounceState.has(el)) {\n elementDebounceState.set(el, { timer: null, cancelFn: null });\n }\n const state = elementDebounceState.get(el);\n\n el.addEventListener(pointerEvent, (e) => {\n e.actualTarget = e.target;\n\n if (state.timer) {\n clearTimeout(state.timer);\n state.timer = null;\n }\n\n // ๐ก 500ms ๋์ ๋๊ธฐํ ๋ค์์ผ ์ค์ pointerFn์ด ์คํ๋จ\n state.timer = setTimeout(() => {\n state.timer = null;\n state.cancelFn = pointerFn.call(el, e);\n }, debounceTime);\n });\n\n el.addEventListener(dblClickEvent, (e) => {\n if (state.timer) {\n clearTimeout(state.timer);\n state.timer = null;\n }\n\n if (state.cancelFn) {\n state.cancelFn();\n state.cancelFn = null;\n }\n\n dblClickFn.call(el, e);\n });\n};\n\n\nnine.measureTextSize = (_text, _font = '12px sans-serif') => {\n if (typeof _text === 'number') _text = _text + \"\";\n if (!_text) return { width: null, height: null };\n\n const stripHtml = (html) => {\n const tmp = document.createElement(\"DIV\");\n tmp.innerHTML = html;\n return tmp.textContent || tmp.innerText || \"\";\n };\n\n _text = _text.replaceAll(\"\\n\", \"<br>\");\n\n let canvas = document.body.querySelector('canvas#_nine_measure_canvas_');\n if (!canvas) {\n canvas = document.createElement('canvas');\n canvas.id = '_nine_measure_canvas_';\n canvas.style.cssText = 'position: absolute; visibility: hidden; pointer-events: none; left: -9999px;';\n document.body.appendChild(canvas);\n }\n\n const context = canvas.getContext('2d');\n context.font = _font;\n\n let w = 0;\n let h = 0;\n\n for (let v of _text.split(\"<br>\")) {\n const cleanText = stripHtml(v);\n const metrics = context.measureText(cleanText);\n\n w = Math.max(w, metrics.width);\n\n const ascent = metrics.fontBoundingBoxAscent || 10;\n const descent = metrics.fontBoundingBoxDescent || 3;\n h += ascent + descent;\n }\n\n return {\n width: w,\n height: h\n };\n};","import { trace as traceOrigin } from '@ninebone/util';\n\nexport class Trace extends traceOrigin.constructor {\n constructor() {\n super();\n this.init(\"nine-table\", \"green\");\n }\n}\n\nexport const trace = new Trace();\n","export const NINE_TABLE = {\n META: {\n INDEX: {\n ROWID: 0,\n ROW_STATE: 1,\n FILTER: 2,\n GROUP: 3,\n // SELECT: 2,\n // EXPAND: 3\n }\n },\n ROW_STATE: {\n EMPTY: 0,\n NORMAL: 1,\n INSERT: 2,\n UPDATE: 3,\n DELETE: 9\n },\n EVENT: {\n LOAD: \"load\",\n CELL_BUTTON_CLICK: \"cell-button-click\",\n },\n};","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\n\nexport class ngRow {\n\t#parent;\n\t#newrow = -1;\n\n\tconstructor(parent) {\n\t\tthis.#parent = parent;\n\t}\n\n\tget at() {\n\t\treturn this.#newrow;\n\t}\n\tset at(v) {\n\t\tthis.#newrow = parseInt(v, 10);\n\t}\n\n\tcount = () => this.#parent.rawRecords.length;\n}\n\nexport class ngData {\n\t#host;\n\t#parent;\n\t#nextId = 0;\n\t#defaultHeight = [];\n\n\tstatic META_INDEX = {\n\t\tFILTER: 0,\n\t\t// GROUP: 1,\n\t\t// SELECT: 2,\n\t\t// EXPAND: 3\n\t};\n\n\tstatic ROW_STATE = {\n\t\tEMPTY: 'EMPTY',\n\t\tNORMAL: 'NORMAL',\n\t\tINSERT: 'INSERT',\n\t\tUPDATE: 'UPDATE',\n\t\tDELETE: 'DELETE'\n\t};\n\n\tconstructor(host, parent) {\n\t\tthis.#host = host;\n\t\tthis.#parent = parent;\n\t\tthis.#initialize();\n\t}\n\n\n\t#getValidRecords = () => {\n\t\tconst rawRecords = this.#parent.rawRecords || [];\n\t\treturn rawRecords.filter(item => item.m._[NINE_TABLE.META.INDEX.ROW_STATE] !== NINE_TABLE.ROW_STATE.DELETE);\n\t};\n\n\tget count() {\n\t\treturn this.length;\n\t}\n\n\tcount = () => {\n\t\treturn this.length;\n\t};\n\n\tgetArray = (at, colnm) => {\n\t\tconst validRecords = this.#getValidRecords();\n\n\t\tif (at === undefined || at === null) {\n\t\t\treturn validRecords; // ๋ณํ ์์ด ๋ฐฐ์ด ๊ทธ๋๋ก ๋ฐํ (๋ ๋๋ง ์ต์ ํ)\n\t\t}\n\n\t\tif (at < 0 || at >= validRecords.length) return null;\n\n\t\tconst targetRecord = validRecords[at];\n\n\t\tif (colnm != null) {\n\t\t\tconst fields = this.getHostFields();\n\t\t\tconst idx = fields.indexOf(colnm);\n\t\t\treturn (idx >= 0) ? targetRecord.v[idx] : null;\n\t\t}\n\n\t\treturn targetRecord;\n\t};\n\n\tsetArray = (rowIndex, colIndex, value) => {\n\t\tconst validRecords = this.#getValidRecords();\n\t\tconst rowData = validRecords[rowIndex];\n\n\t\tconst oldValue = rowData.v[colIndex];\n\t\tif (oldValue !== value && rowData.__ng.rowState !== ngData.ROW_STATE.INSERT) {\n\t\t\trowData.__ng.rowState = ngData.ROW_STATE.UPDATE;\n\t\t}\n\n\t\trowData.v[colIndex] = value;\n\t};\n\n\n\tget = (at, colnm) => {\n\t\tconst validRecords = this.#getValidRecords();\n\n\t\tif (at === undefined || at === null) {\n\t\t\treturn this.#conv(validRecords);\n\t\t}\n\n\t\tif (at < 0 || at >= validRecords.length) return null;\n\n\t\tconst targetRecord = validRecords[at];\n\t\tconst fields = this.getHostFields();\n\n\t\tif (colnm != null) {\n\t\t\tconst idx = fields.indexOf(colnm);\n\t\t\treturn (idx >= 0) ? targetRecord.v[idx] : null;\n\t\t}\n\n\t\treturn this.#conv(targetRecord);\n\t};\n\n\tgetAll = () => {\n\t\treturn this.#parent.rawRecords || [];\n\t};\n\n\tgetHostFields = () => {\n\t\treturn typeof this.#host.fields?.get === 'function' ? this.#host.fields.get() : [];\n\t};\n\n\t#initialize = () => {\n\t\tthis.#defaultHeight = [];\n\t\tconst templateElements = this.#host.template || [];\n\t\tArray.from(templateElements).forEach(el => {\n\t\t\tthis.#defaultHeight.push(el.getBoundingClientRect?.().height || 24);\n\t\t});\n\n\t\t(this.#parent.rawRecords || []).forEach(v => {\n\t\t\tif (!v.__ng) v.__ng = this.#getDefaultMeta();\n\t\t\tv.__ng.height = this.#defaultHeight.slice();\n\t\t});\n\t};\n\n\tget source() {\n\t\treturn this.#conv(this.#parent.rawRecords);\n\t}\n\tset source(v) {\n\t\tthis.set(v);\n\t}\n\n\t#invalidate = () => {\n\t\tthis.#host.shadowRoot.querySelectorAll(\"nine-table-sheet\").forEach($el => {\n\t\t\t$el.invalidate();\n\t\t});\n\n\t\tthis.#host.shadowRoot.querySelector(\"nine-table-sheets-footer\")?.refresh();\n\t};\n\n\tset = (dataSource) => {\n\n\t\tconst loadData = () => {\n\t\t\tthis.#host.loading = true;\n\t\t\tsetTimeout(() => {\n\t\t\t\ttry {\n\t\t\t\t\tthis.clear();\n\t\t\t\t\tthis.add(dataSource, false);\n\t\t\t\t\tthis.#invalidate();\n\t\t\t\t} finally {\n\t\t\t\t\tthis.#host.loading = false;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif (this.#host.loaded) {\n\t\t\tloadData();\n\t\t}\n\t\telse {\n\t\t\tthis.#host.addEventListener(NINE_TABLE.EVENT.LOAD, e => {\n\t\t\t\tloadData();\n\t\t\t}, { once: true });\n\t\t}\n\t};\n\n\tget nextId() {\n\t\treturn this.#nextId++;\n\t}\n\n\tget length() {\n\t\treturn this.#getValidRecords().length;\n\t}\n\n\tget count() {\n\t\treturn this.length;\n\t}\n\n\tgetRowCount() {\n\t\treturn this.length;\n\t}\n\n\t#getDefaultMeta = (rowid = 0) => {\n\t\treturn {\n\t\t\trowState: ngData.ROW_STATE.EMPTY,\n\t\t\tdeleted: false,\n\t\t\tfiltered: false,\n\t\t\theight: this.#defaultHeight.slice(),\n\t\t\to: {},\n\t\t\tc: {},\n\t\t\t__: [0, 0, 0, 0, ngData.ROW_STATE.EMPTY, false, false, true, false, true, true, false, this.#defaultHeight.slice(), -1, {}, {}],\n\t\t\t_: [rowid, NINE_TABLE.ROW_STATE.EMPTY, [], []],\n\t\t};\n\t};\n\n\treset = () => {\n\t\tthis.#parent.rawRecords = [];\n\t\tthis.#invalidate();\n\t};\n\n\tclear = () => {\n\t\tthis.#parent.rawRecords = [];\n\t\tif (this.#parent.viewRecords?.reset) {\n\t\t\tthis.#parent.viewRecords.reset();\n\t\t}\n\n\t\tthis.#nextId = 0;\n\n\t\tthis.#invalidate();\n\t};\n\n\t#json2Array = (jsonArray) => {\n\t\tif (!Array.isArray(jsonArray)) jsonArray = [jsonArray];\n\n\t\tconst fields = this.getHostFields().length > 0 ? this.getHostFields() : Object.keys(jsonArray[0] || {});\n\t\tconst arr = [];\n\n\t\tjsonArray.forEach(json => {\n\t\t\tconst o = { v: [] };\n\t\t\tfields.forEach(colnm => {\n\t\t\t\to.v.push(json[colnm] !== undefined && json[colnm] !== null ? json[colnm] : \"\");\n\t\t\t});\n\t\t\tarr.push(o);\n\t\t});\n\n\t\treturn arr;\n\t};\n\n\t#defaultInsert = (arr) => {\n\t\tif (!Array.isArray(arr)) arr = [arr];\n\t\tarr.forEach(o => {\n\t\t\tconst rowid = this.nextId;\n\n\t\t\to.m = this.#getDefaultMeta(rowid);\n\t\t\to.__ng = o.m;\n\t\t\to.__ng.rowid = rowid;\n\t\t\t//o.__ng.rowState = ngData.ROW_STATE.INSERT;\n\n\t\t\to.m._[NINE_TABLE.META.INDEX.ROWID] = rowid;\n\t\t\to.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.EMPTY;\n\t\t});\n\t\treturn arr;\n\t};\n\n\t#getIndexFromRow = (rowid) => {\n\t\tconst index = this.#parent.rawRecords.findIndex(record => {\n\t\t\tif (!record || !record.m || !record.m._) return false;\n\t\t\treturn record.m._[NINE_TABLE.META.INDEX.ROWID] === rowid;\n\t\t});\n\n\t\treturn index;\n\t}\n\n\tadd = (dataSource, updateState = true) => {\n\t\tif (dataSource === undefined) dataSource = {};\n\t\tconst arr = this.#json2Array(dataSource);\n\n\t\tthis.#parent.rawRecords = this.#parent.rawRecords.concat(this.#defaultInsert(arr));\n\n\t\tconst row = this.count() - 1;\n\t\tif (updateState) {\n\t\t\tarr.forEach((_, idx) => {\n\t\t\t\tconst target = this.#parent.rawRecords[this.#parent.rawRecords.length - 1 - idx];\n\t\t\t\tif (target) target.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.INSERT;\n\t\t\t});\n\t\t}\n\n\t\tthis.#invalidate();\n\n\t\treturn row;\n\t};\n\n\n\tinsert = (rowid, dataSource, updateState = true) => {\n\t\t//trace.log(\"์ฐพ์ rowid:\", rowid);\n\n\t\tif (dataSource === undefined) dataSource = {};\n\t\tconst arr = this.#json2Array(dataSource);\n\t\tif (arr.length === 0) return -1;\n\n\t\tlet targetIndex = this.#getIndexFromRow(rowid);\n\t\t/**\n\t\tif (rowid !== undefined && rowid !== null) {\n\t\t\ttargetIndex = this.#parent.rawRecords.findIndex(record => {\n\t\t\t\tif (!record || !record.m || !record.m._) return false;\n\t\t\t\treturn record.m._[NINE_TABLE.META.INDEX.ROWID] === rowid;\n\t\t\t});\n\t\t} */\n\n\t\tconst processedArr = this.#defaultInsert(arr);\n\n\t\t//if (targetIndex === -1) {\n\t\t//\ttargetIndex = this.#parent.rawRecords.length;\n\t\t//}\n\n\t\tthis.#parent.rawRecords.splice(targetIndex, 0, ...processedArr);\n\n\t\tif (updateState) {\n\t\t\tprocessedArr.forEach((_, idx) => {\n\t\t\t\tconst target = this.#parent.rawRecords[targetIndex + idx];\n\n\t\t\t\tif (target && target.m && target.m._) {\n\t\t\t\t\ttarget.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.INSERT;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.#invalidate();\n\n\t\treturn processedArr[0].m._[NINE_TABLE.META.INDEX.ROWID]; // ์ฝ์
๋ ์ค์ ๋ฐฐ์ด ์ธ๋ฑ์ค ๋ฐํ\n\t};\n\n\tremove = (v) => {\n\t\tlet arr = [];\n\t\tif (Array.isArray(v)) {\n\t\t\tarr = at;\n\t\t//} else if (typeof at === \"undefined\") {\n\t\t//\tarr = [this.#parent.host.row.at];\n\t\t} else {\n\t\t\tarr = [parseInt(v, 10)];\n\t\t}\n\n\t\tlet arrIndex = [];\n\t\tarr.forEach(rowid => {\n\t\t\tarrIndex.push(this.#getIndexFromRow(rowid));\n\t\t});\n\n\t\tconst records = this.#parent.rawRecords;//this.#getValidRecords();\n\n\t\tarrIndex.sort((a, b) => b - a).forEach(index => {\n\t\t\t//if (validRecords[index]) {\n\t\t\t\tconst targetId = records[index].m._[NINE_TABLE.META.INDEX.ROWID];\n\n\t\t\t\tif (records[index].m._[NINE_TABLE.META.INDEX.ROW_STATE] === NINE_TABLE.ROW_STATE.INSERT) {\n\t\t\t\t\tthis.#parent.rawRecords = this.#parent.rawRecords.filter(item => item.m._[NINE_TABLE.META.INDEX.ROWID] !== targetId);\n\t\t\t\t} else {\n\t\t\t\t\tthis.#parent.rawRecords.forEach(item => {\n\t\t\t\t\t\tif (item.m._[NINE_TABLE.META.INDEX.ROWID] === targetId) {\n\t\t\t\t\t\t\titem.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.DELETE;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t//}\n\t\t});\n\n\t\tthis.#invalidate();\n\t};\n\n\tsetValue = (rowid, colnm, value) => {\n\n\t\trowid = parseInt(rowid, 10);\n\t\tconst fields = this.getHostFields();\n\t\tconst COL_IDX = fields.indexOf(colnm);\n\t\tif (COL_IDX < 0) return;\n\n\t\tconst index = this.#getIndexFromRow(rowid);\n\n\t\tconst records = this.#parent.rawRecords;\n\t\tconst rowData = records[index];\n\t\tif (!rowData) return;\n\n\t\tconst oldValue = rowData.v[COL_IDX];\n\t\tif (oldValue !== value && rowData.m._[NINE_TABLE.META.INDEX.ROW_STATE] !== NINE_TABLE.ROW_STATE.INSERT) {\n\t\t\trowData.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.UPDATE;\n\t\t}\n\n\t\trowData.v[COL_IDX] = value;\n\t};\n\n\t#conv = (arr) => {\n\t\tif (!arr) return arr;\n\n\t\tconst isSingle = !Array.isArray(arr);\n\t\tconst targetArr = isSingle ? [arr] : arr;\n\t\tconst fields = this.getHostFields();\n\n\t\tconst result = targetArr.filter(o => !o.__ng?.deleted).map(o => {\n\t\t\tconst t = {};\n\t\t\tfields.forEach((colnm, i) => {\n\t\t\t\tt[colnm] = o.v ? o.v[i] : o[colnm];\n\t\t\t});\n\t\t\tt.__ng = o.__ng;\n\t\t\treturn t;\n\t\t});\n\n\t\treturn isSingle ? result[0] : result;\n\t};\n}\n","import { ngRow, ngData } from \"./ngData.js\";\n\nexport class ngDataManager {\n\t#host;\n\n\tconstructor(host) {\n\t\tthis.#host = host;\n\n\t\tthis.row = new ngRow(this);\n\t\tthis.data = new ngData(this.#host, this);\n\n\t\tthis.rawRecords = [];\n\t\tthis.viewRecords = [];\n\t\tthis.delRecords = [];\n\t\tthis.pageCnt = 25;\n\n\t\tthis.viewRecords.reset = () => {\n\t\t\tif (this.#host.view?.redraw) this.#host.view.redraw();\n\t\t};\n\n\t\tthis.setDataSource = (ds) => {\n\t\t\tif (this.data) this.data.reset();\n\n\t\t\tthis.rawRecords = [];\n\t\t\tthis.viewRecords = [];\n\t\t\tthis.delRecords = [];\n\n\t\t\tthis.data.set(ds || []);\n\t\t};\n\n\t\tthis.getRowState = (nRow) => {\n\t\t\tconst rowIdx = parseInt(nRow, 10);\n\t\t\tif (rowIdx >= this.data.count()) return;\n\t\t\treturn this.data.getValidData()[rowIdx]?.__ng?.rowState;\n\t\t};\n\n\t\tthis.getRowPosition = () => this.row.at;\n\t\tthis.setRowPosition = (nRow) => { this.row.at = nRow; };\n\n\t\tthis.scrollTo_V1 = (nRow) => {\n\t\t\tif (nRow < 0) nRow = 0;\n\t\t\tif (nRow >= this.rawRecords.length) nRow = this.rawRecords.length - 1;\n\n\t\t\tthis.viewRecords.rawIndex = nRow;\n\t\t\tif (this.viewRecords.reset) this.viewRecords.reset();\n\n\t\t\treturn (nRow <= 0 || nRow >= this.rawRecords.length - 1) ? false : true;\n\t\t};\n\n\t\tthis.getColumn = (rowidx, colnm) => this.data.get(rowidx, colnm);\n\n\t\tthis.setColumn = (rowidx, colnm, v) => {\n\t\t\trowidx = parseInt(rowidx, 10);\n\t\t\tthis.data.setValue(rowidx, colnm, v);\n\t\t};\n\n\t\t// ์ด๊ธฐ ๋น ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ\n\t\tthis.setDataSource([]);\n\t}\n}","import { trace } from \"@nopeer\";\n\nexport class fields {\n\t#host;\n\t#fields = [];\n\n\tconstructor(host) {\n\t\tthis.#host = host;\n\t\tthis.#init();\n\t};\n\n\tget() {\n\t\treturn this.#fields.map(f => f.name);\n\t};\n\n\tgetFields() {\n\t\treturn this.#fields;\n\t}\n\n\tgetType(fieldName) {\n\t\tconst found = this.#fields.find(f => f.name === fieldName);\n\t\treturn found ? found.type : 'string';\n\t}\n\n\tadd = (arr, type = 'string') => {\n\t\tarr.forEach(fName => {\n\t\t\tif (!this.#fields.some(f => f.name === fName)) {\n\t\t\t\tthis.#fields.push({ name: fName, type: type });\n\t\t\t}\n\t\t});\n\t\tthis.#adjust();\n\t};\n\n\tindexOf(v) {\n\t\treturn this.#fields.findIndex(f => f.name === v);\n\t};\n\n\tincludes(v) {\n\t\treturn this.#fields.some(f => f.name === v);\n\t};\n\n\t#adjust = () => {\n\t\tconst map = new Map();\n\t\tthis.#fields.forEach(f => {\n\t\t\tmap.set(f.name, f.type);\n\t\t});\n\n\t\tthis.#fields = Array.from(map, ([name, type]) => ({ name, type }));\n\n\t\tthis.#fields = this.#fields.filter(f => f.name !== \"\" && f.name !== \"__ng\");\n\n\t\tthis.#fields.sort((a, b) => { return (a.name.length < b.name.length) ? 1 : -1; });\n\t};\n\n\t#init = () => {\n\t\tthis.#fields = [];\n\n\t\tconst rawTables = Array.from(this.#host.querySelectorAll(\"table\"));\n\n\t\tif (!rawTables || rawTables.length === 0) return;\n\n\t\tfor (const tbl of rawTables) {\n\n\t\t\ttbl.querySelectorAll('[data-bind]').forEach((el) => {\n\t\t\t\tconst fieldName = el.dataset.bind;\n\t\t\t\tconst fieldType = el.getAttribute(\"data-type\") || 'string';\n\n\t\t\t\tif (fieldName) {\n\t\t\t\t\tthis.#fields.push({ name: fieldName, type: fieldType });\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst exprAttrs = [\n\t\t\t\t\"data-expr\", \"background-color\", \"color\", \"tooltip\",\n\t\t\t\t\"visible\", \"readonly\", \"enable-button\", \"enable-check\",\n\t\t\t\t\"class-expr\", \"icon-color\", \"icon-src\"\n\t\t\t];\n\n\t\t\texprAttrs.forEach(attr => {\n\t\t\t\ttbl.querySelectorAll(`[${attr}]`).forEach((el) => {\n\t\t\t\t\tlet expr = el.getAttribute(attr);\n\t\t\t\t\tif (!expr) return;\n\n\t\t\t\t\tif (expr.indexOf(\"data.\") < 0) {\n\t\t\t\t\t\tconst lastIndex = expr.search(/[(]/g);\n\n\t\t\t\t\t\tif (lastIndex > 0) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\texpr = String(window[expr.substring(0, lastIndex).trim()]);\n\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\texpr = \"\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\texpr.split(\"data.\").forEach(v => {\n\t\t\t\t\t\tif (v.trim() != \"\") {\n\t\t\t\t\t\t\tconst lastIndex = v.search(/[^_A-Za-z0-9]/g);\n\t\t\t\t\t\t\tlet targetField = '';\n\n\t\t\t\t\t\t\tif (lastIndex >= 0) {\n\t\t\t\t\t\t\t\ttargetField = v.substring(0, lastIndex);\n\t\t\t\t\t\t\t} else if (expr.startsWith(\"data.\")) {\n\t\t\t\t\t\t\t\ttargetField = v.replace(\"data.\", \"\");\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (targetField) {\n\t\t\t\t\t\t\t\tthis.#fields.push({ name: targetField, type: 'string' });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tthis.#adjust();\n\t};\n};","export class NineTableSheets extends HTMLElement {\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#init();\n }\n\n #init = () => {\n\n };\n\n}\n\nif (!customElements.get('nine-table-sheets')) {\n customElements.define('nine-table-sheets', NineTableSheets);\n}","export class NineTableSheetsFooter extends HTMLElement {\n #host;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#init();\n }\n\n refresh = () => {\n this.querySelector(\"#row-count\").innerHTML = this.#host.data.count().toLocaleString();\n };\n\n #init = () => {\n this.#host = this.getRootNode().host;\n\n this.#render();\n\n this.querySelector('.nine-tab-bar')?.addEventListener('click', (e) => {\n const isMultiSelect = e.ctrlKey || e.metaKey || e.shiftKey;\n const tabItem = e.target.closest('nt-sheets-tab-item');\n\n if (!tabItem) return;\n\n const index = parseInt(tabItem.dataset.index, 10);\n this.#switchSheet(index, isMultiSelect);\n });\n\n setTimeout(() => {\n this.#switchSheet(0, false);\n })\n };\n\n #switchSheet = (index, isMultiSelect = false) => {\n\n const updateSplitters = () => {\n const sheets = Array.from(this.#host.shadowRoot.querySelectorAll('nine-table-sheet'));\n const splitters = Array.from(this.#host.shadowRoot.querySelectorAll('nine-splitter'));\n\n splitters.forEach(s => s.style.setProperty('display', 'none'));\n\n const activeSheets = sheets\n .map((sheet, idx) => ({ sheet, idx }))\n .filter(({ sheet }) => sheet.classList.contains('active'));\n\n if (activeSheets.length < 2) return;\n\n for (let i = 0; i < activeSheets.length - 1; i++) {\n const currentIdx = activeSheets[i].idx;\n\n const targetSplitter = this.#host.shadowRoot.querySelector(`nine-splitter[data-split-index=\"${currentIdx}\"]`);\n if (targetSplitter) {\n targetSplitter.style.setProperty('display', '');\n }\n }\n };\n\n const tabBar = this.querySelector('.nine-tab-bar');\n const body = this.#host.shadowRoot.querySelector('nine-table-sheets-body');\n const tabItems = tabBar.querySelectorAll('nt-sheets-tab-item');\n const sheetElements = body.querySelectorAll('nine-table-sheet');\n\n if (!tabItems[index]) return;\n\n if (!isMultiSelect) {\n tabItems.forEach((tab, idx) => {\n tab.setActive(idx === index);\n });\n\n sheetElements.forEach((sheet, idx) => {\n const isActive = idx === index;\n sheet.classList.toggle('active', isActive);\n sheet.style.flex = isActive ? '1 1 100%' : '';\n });\n } else {\n const clickedTab = tabItems[index];\n const activeTabs = tabBar.querySelectorAll('nt-sheets-tab-item.active');\n\n if (clickedTab.classList.contains('active') && activeTabs.length <= 1) {\n return;\n }\n\n clickedTab.classList.toggle('active');\n const targetSheet = body.querySelector(`nine-table-sheet[data-index=\"${index}\"]`);\n if (targetSheet) {\n targetSheet.classList.toggle('active');\n if (!targetSheet.classList.contains('active')) {\n targetSheet.style.flex = '';\n }\n }\n }\n\n const activeSheets = body.querySelectorAll('nine-table-sheet.active');\n\n activeSheets?.forEach(sheet => {\n sheet.style.flex = (activeSheets.length > 1) ? '1 1 0%' : '1 1 100%';\n\n if (typeof sheet.refreshLayout === 'function') {\n sheet.refreshLayout();\n } else {\n sheet.invalidate?.();\n }\n });\n\n updateSplitters();\n };\n\n #render() {\n const rawElements = Array.from(this.#host.children);\n const rawTables = rawElements.filter(el => (el.tagName.toUpperCase() === 'TABLE'));\n\n const tabsHtml = rawTables.map((table, idx) => {\n const className = idx === 0 ? 'active' : '';\n const tabName = table.getAttribute('caption') || `Sheet ${idx + 1}`;\n\n return `<nt-sheets-tab-item class=\"${className}\" data-index=\"${idx}\">${tabName}</nt-sheets-tab-item>`;\n }).join('');\n\n this.innerHTML = `\n <div class=\"nine-tab-bar\">${tabsHtml}</div>\n <div class=\"sheets-counter\">Total : <span id=\"row-count\">0</span></div>\n `;\n };\n}\n\nexport class SheetTabItem extends HTMLElement {\n constructor() {\n super();\n }\n\n connectedCallback() {\n\n }\n\n setActive(isActive) {\n this.classList.toggle('active', isActive);\n }\n}\n\nif (!customElements.get('nt-sheets-tab-item')) {\n customElements.define('nt-sheets-tab-item', SheetTabItem);\n}\n\nif (!customElements.get('nine-table-sheets-footer')) {\n customElements.define('nine-table-sheets-footer', NineTableSheetsFooter);\n}","import { trace } from \"@nopeer\";\n\nexport class Toolbar extends HTMLElement {\n #host;\n #customContainer;\n\n connectedCallback() {\n this.#host = this.getRootNode().host;\n this.#render();\n this.#bindEvents();\n }\n\n #render() {\n this.innerHTML = `\n <div class=\"ng-toolbar-left\">\n <button type=\"button\" class=\"ng-toolbar-menu-btn\" title=\"Menu\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#374151\" stroke-width=\"2\">\n <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\"></line>\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"></line>\n <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\"></line>\n </svg>\n </button>\n <span class=\"ng-toolbar-title\"></span>\n </div>\n\n <div class=\"ng-toolbar-custom\" id=\"custom-container\"></div>\n `;\n\n this.#customContainer = this.querySelector('#custom-container');\n this.#syncStateFromHost();\n }\n\n #syncStateFromHost() {\n const isSimple = this.#host.getAttribute('theme') === 'simple' || this.#host.classList.contains('simple');\n const showToolbar = this.#host.getAttribute('show-toolbar') !== 'false';\n const showMenu = this.#host.getAttribute('show-menu') !== 'false';\n const caption = this.#host.getAttribute('caption') || '';\n\n if (isSimple || !showToolbar) {\n this.setAttribute('hidden', '');\n } else {\n this.removeAttribute('hidden');\n }\n\n this.setAttribute('show-menu', showMenu ? 'true' : 'false');\n this.updateCaption(caption);\n }\n\n #bindEvents() {\n const titleEl = this.querySelector('.ng-toolbar-title');\n if (titleEl) {\n titleEl.addEventListener('dblclick', () => {\n const link = '<font color=\"green\">https://www.ninegrid.net</font>';\n const currentCaption = this.#host.getAttribute('caption') || '';\n titleEl.innerHTML = titleEl.innerHTML === link ? currentCaption : link;\n });\n }\n\n const menuBtn = this.querySelector('.ng-toolbar-menu-btn');\n if (menuBtn) {\n menuBtn.addEventListener('click', () => {\n this.#host.dispatchEvent(new CustomEvent('toolbar-menu-click', {\n bubbles: true,\n composed: true,\n detail: { targetTable: this.#host }\n }));\n });\n }\n }\n\n addCustomElement(element) {\n if (this.#customContainer) {\n this.#customContainer.append(element);\n }\n }\n\n updateCaption(text) {\n const titleEl = this.querySelector('.ng-toolbar-title');\n if (titleEl) titleEl.textContent = text;\n }\n}\n\nif (!customElements.get('nine-table-toolbar')) {\n customElements.define('nine-table-toolbar', Toolbar);\n}","// ui/nine-table-hscrollbar.js\nimport { trace } from \"@nopeer\";\n\nexport class NineTableHScrollBar extends HTMLElement {\n #owner;\n #dragging = false;\n #elements;\n #interval1;\n #interval2;\n #resizeObserver;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#owner = this.closest(\"nine-table-sheet\") || this.getRootNode().host;\n if (!this.#owner) return;\n\n this.innerHTML = `\n <button class='scroll-left' disabled><div class='scroll-icon'></div></button>\n <div class='scroll-track'><div class='scroll-thumb'></div></div>\n <button class='scroll-right' disabled><div class='scroll-icon'></div></button>\n `;\n\n const initWhenReady = () => {\n const body = this.#owner.querySelector(\".ng-sheet-body .ng-container-body\");\n if (!body) {\n setTimeout(initWhenReady, 10);\n return;\n }\n\n this.#elements = {\n container : body,\n track : this.querySelector(\".scroll-track\"),\n thumb : this.querySelector(\".scroll-thumb\"),\n left : this.querySelector(\".scroll-left\"),\n right : this.querySelector(\".scroll-right\"),\n };\n\n this.#init();\n this.#observeResize();\n this.refresh();\n };\n\n initWhenReady();\n }\n\n disconnectedCallback() {\n if (this.#resizeObserver) {\n this.#resizeObserver.disconnect();\n }\n }\n\n #observeResize = () => {\n if (!this.#owner) return;\n const body = this.#owner.querySelector(\".ng-sheet-body .ng-container-body\");\n if (!body) return;\n\n this.#resizeObserver = new ResizeObserver(() => {\n this.refresh();\n });\n this.#resizeObserver.observe(body);\n };\n\n refresh = () => {\n\n if (!this.#owner || !this.#elements || this.#dragging) return;\n\n const body = this.#elements.container;\n const table = body.querySelector(\"table\");\n if (!table) return;\n\n const track = this.#elements.track;\n const thumb = this.#elements.thumb;\n\n const bodyWidth = body.clientWidth;\n const tableWidth = table.scrollWidth;\n\n const needsHScroll = (bodyWidth !== 0 && tableWidth > bodyWidth);\n this.#owner.classList.toggle('hscroll-visible', needsHScroll);\n\n if (!needsHScroll) {\n return;\n }\n\n const trackWidth = track.clientWidth;\n if (trackWidth <= 0) return;\n\n const thumbWidth = Math.max(Math.min(trackWidth * (bodyWidth / tableWidth), trackWidth), 20);\n thumb.style.width = `${thumbWidth}px`;\n\n const currentLeft = body.scrollLeft;\n const maxScrollLeft = tableWidth - bodyWidth;\n\n let l = 0;\n if (maxScrollLeft > 0) {\n l = parseInt((currentLeft / maxScrollLeft) * (trackWidth - thumbWidth), 10);\n }\n if (l < 0) l = 0;\n\n const maxThumbLeft = trackWidth - thumbWidth;\n if (l > maxThumbLeft) l = maxThumbLeft;\n\n thumb.style.left = `${l}px`;\n\n this.#elements.left.disabled = (l === 0);\n this.#elements.right.disabled = (l >= maxThumbLeft - 1);\n };\n\n #thumbMoveTo = (x) => {\n if (!this.#elements) return false;\n\n const body = this.#elements.container;\n const table = body.querySelector(\"table\");\n if (!table) return false;\n\n const trackBound = this.#elements.track.getBoundingClientRect();\n const thumbWidth = this.#elements.thumb.clientWidth;\n\n let targetX = x;\n if (targetX < 0) targetX = 0;\n const maxThumbLeft = trackBound.width - thumbWidth;\n if (targetX > maxThumbLeft) targetX = maxThumbLeft;\n targetX = parseInt(targetX, 10);\n\n this.#elements.thumb.style.left = `${targetX}px`;\n\n this.#elements.left.disabled = (targetX === 0);\n this.#elements.right.disabled = (targetX >= maxThumbLeft - 1);\n\n const bodyWidth = body.clientWidth;\n const tableWidth = table.scrollWidth;\n const maxScrollLeft = tableWidth - bodyWidth;\n\n if (maxThumbLeft > 0 && maxScrollLeft > 0) {\n const newScrollLeft = (targetX / maxThumbLeft) * maxScrollLeft;\n body.scrollLeft = newScrollLeft;\n }\n\n return (targetX > 0 && targetX < maxThumbLeft - 1);\n };\n\n #init = () => {\n const delayScroll = (pos) => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n\n const thumbLeft = parseInt(this.#elements.thumb.style.left || 0, 10);\n this.#thumbMoveTo(thumbLeft + pos);\n\n this.#interval1 = setInterval(() => {\n clearInterval(this.#interval1);\n\n this.#interval2 = setInterval(() => {\n const currentThumbLeft = parseInt(this.#elements.thumb.style.left || 0, 10);\n if (!this.#thumbMoveTo(currentThumbLeft + pos)) {\n clearInterval(this.#interval2);\n }\n }, 50);\n }, 500);\n };\n\n const clearTimer = () => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n };\n\n //['mouseup', 'mouseleave', 'touchend'].forEach(evt => {\n ['mouseup', 'mouseleave'].forEach(evt => {\n this.#elements.left.addEventListener(evt, clearTimer);\n this.#elements.right.addEventListener(evt, clearTimer);\n this.#elements.track.addEventListener(evt, clearTimer);\n });\n\n this.#elements.left.addEventListener(\"mousedown\", e => { if (e.button !== 0) return; delayScroll(-20); });\n this.#elements.right.addEventListener(\"mousedown\", e => { if (e.button !== 0) return; delayScroll(20); });\n //this.#elements.left.addEventListener(\"touchstart\", () => delayScroll(-20));\n //this.#elements.right.addEventListener(\"touchstart\", () => delayScroll(20));\n\n this.#elements.track.addEventListener(\"mousedown\", e => {\n if (e.button !== 0) return;\n e.preventDefault();\n const trackRect = this.#elements.track.getBoundingClientRect();\n const thumbWidth = this.#elements.thumb.clientWidth;\n this.#thumbMoveTo(e.clientX - trackRect.left - (thumbWidth / 2));\n });\n\n this.#elements.thumb.addEventListener(\"mousedown\", e => {\n if (e.button !== 0) return;\n e.stopPropagation();\n e.preventDefault();\n this.#dragging = true;\n this.shiftX = e.clientX - this.#elements.thumb.getBoundingClientRect().left;\n\n const onMouseMove = (moveEvent) => {\n if (!this.#dragging) return;\n const trackRect = this.#elements.track.getBoundingClientRect();\n this.#thumbMoveTo(moveEvent.clientX - trackRect.left - this.shiftX);\n };\n\n const onMouseUp = () => {\n this.#dragging = false;\n clearTimer();\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n this.refresh();\n };\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n });\n };\n}\n\nif (!customElements.get('nine-table-hscrollbar')) {\n customElements.define(\"nine-table-hscrollbar\", NineTableHScrollBar);\n}","// ui/nine-table-vscrollbar.js\nimport { trace } from \"@nopeer\";\n\nexport class NineTableVScrollBar extends HTMLElement {\n #host;\n #sheet;\n #dragging = false;\n #elements;\n #startY = 0;\n #startScrollTop = 0;\n #startThumbTop = 0;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#host = this.getRootNode().host;\n this.#sheet = this.closest(\"nine-table-sheet\");\n\n this.innerHTML = `\n <button class='scroll-top' disabled><div class='scroll-icon'></div></button>\n <div class='scroll-track'><div class='scroll-thumb'></div></div>\n <button class='scroll-bottom' disabled><div class='scroll-icon'></div></button>\n `;\n\n const initWhenReady = () => {\n const body = this.#sheet.querySelector(\".ng-sheet-body\");\n if (!body) {\n setTimeout(initWhenReady, 10);\n return;\n }\n\n this.#elements = {\n container: body,\n track: this.querySelector(\".scroll-track\"),\n thumb: this.querySelector(\".scroll-thumb\"),\n top: this.querySelector(\".scroll-top\"),\n bottom: this.querySelector(\".scroll-bottom\"),\n };\n\n this.#init();\n this.refresh();\n };\n\n initWhenReady();\n }\n\n #getScaleInfo = () => {\n const viewRecords = this.#sheet.view.getArray();\n const totalCount = viewRecords ? viewRecords.length : 0;\n\n const scrollHolder = this.#sheet.elements?.scrollHolder;\n let rawContentHeight = scrollHolder ? parseFloat(scrollHolder.style.height) || 0 : 0;\n\n if (!rawContentHeight || rawContentHeight <= 0) {\n const isGrouped = this.#sheet.sourceTable?.querySelector(\"tbody tr[grouping='true']\") ? true : false;\n if (isGrouped && this.#sheet.rowManager) {\n rawContentHeight = (body.scrollHeight > body.clientHeight) ? body.scrollHeight : (totalCount * 30);\n } else {\n const rowHeight = this.#sheet.getRowHeight() || 1;\n rawContentHeight = totalCount * rowHeight;\n }\n }\n\n const MAX_BROWSER_HEIGHT = 15000000;\n const useScaling = rawContentHeight > MAX_BROWSER_HEIGHT;\n\n let scaleFactor = 1;\n let contentHeight = rawContentHeight;\n\n if (useScaling) {\n scaleFactor = MAX_BROWSER_HEIGHT / rawContentHeight;\n contentHeight = MAX_BROWSER_HEIGHT;\n }\n\n return { rawContentHeight, contentHeight, scaleFactor, useScaling, totalCount };\n };\n\n\n refresh = () => {\n if (this.#dragging) return;\n\n if (!this.#sheet || !this.#sheet.elements || !this.#elements) return;\n\n const body = this.#elements.container;\n const track = this.#elements.track;\n const thumb = this.#elements.thumb;\n const { contentHeight } = this.#getScaleInfo();\n\n const fixedHeight = (this.#sheet.querySelector('thead')?.offsetHeight || 0) +\n (this.#sheet.querySelector('tfoot')?.offsetHeight || 0) +\n (this.#sheet.querySelector('tbody.head')?.offsetHeight || 0);\n\n const bodyHeight = (this.#sheet.querySelector('.ng-sheet-body').offsetHeight || 0);\n const viewHeight = bodyHeight - fixedHeight;\n\n const viewRecords = this.#sheet.view.getArray();\n const totalCount = viewRecords.length;\n\n const rawContentHeight = this.#sheet.getRowHeight() * totalCount;\n\n const needsVScroll = (rawContentHeight > viewHeight);\n\n this.#sheet.classList.toggle('vscroll-visible', needsVScroll);\n\n if (!needsVScroll) {\n return;\n }\n\n const trackHeight = track.clientHeight;\n if (trackHeight <= 0) return;\n\n const thumbHeight = Math.max(Math.min(trackHeight * (bodyHeight / rawContentHeight), trackHeight), 20);\n thumb.style.height = `${thumbHeight}px`;\n\n const currentScrollTop = body.scrollTop;\n const maxScrollTop = Math.max(contentHeight - this.#sheet.rowManager.getRowHeight(), 1);\n\n let thumbTop = 0;\n if (maxScrollTop > 0) {\n thumbTop = (currentScrollTop / maxScrollTop) * (trackHeight - thumbHeight);\n }\n\n const maxThumbTop = trackHeight - thumbHeight;\n if (thumbTop < 0) thumbTop = 0;\n if (thumbTop > maxThumbTop) thumbTop = maxThumbTop;\n\n thumb.style.top = `${thumbTop}px`;\n\n this.#elements.top.disabled = (currentScrollTop <= 0);\n this.#elements.bottom.disabled = (currentScrollTop >= maxScrollTop - 1);\n };\n\n #init = () => {\n\n this.#elements.thumb.addEventListener(\"mousedown\", (e) => {\n if (e.button !== 0) return;\n e.stopPropagation();\n e.preventDefault();\n this.#dragging = true;\n\n this.#startY = e.clientY;\n this.#startThumbTop = parseFloat(this.#elements.thumb.style.top) || 0;\n const trackRect = this.#elements.track.getBoundingClientRect();\n const trackHeight = trackRect.height;\n const thumbHeight = this.#elements.thumb.clientHeight;\n const maxThumbTop = trackHeight - thumbHeight;\n\n const onMouseMove = (moveEvent) => {\n if (!this.#dragging) return;\n if (maxThumbTop <= 0) return;\n\n\n const deltaY = moveEvent.clientY - this.#startY;\n let targetThumbTop = this.#startThumbTop + deltaY;\n\n if (targetThumbTop < 0) targetThumbTop = 0;\n if (targetThumbTop > maxThumbTop) targetThumbTop = maxThumbTop;\n\n this.#elements.thumb.style.top = `${targetThumbTop}px`;\n\n const ratio = targetThumbTop / maxThumbTop;\n\n const rowHeight =this.#sheet.getRowHeight();\n const viewHeight = (this.#sheet.querySelector('.ng-sheet-body').offsetHeight || 0) -\n (this.#sheet.elements.body.thead?.offsetHeight || 0) -\n (this.#sheet.elements.body.tfoot?.offsetHeight || 0) -\n (this.#sheet.elements.body.tbody.head.offsetHeight || 0);\n\n const visibleRowCount = Math.floor(viewHeight / rowHeight);\n\n const { totalCount } = this.#getScaleInfo();\n const targetRow = Math.floor(ratio * (totalCount - visibleRowCount + 1));\n\n this.#sheet.rowManager.scrollToDataRow(targetRow);\n\n const { rawContentHeight, contentHeight } = this.#getScaleInfo();\n const currentScrollTop = this.#elements.container.scrollTop;\n const maxScrollTop = Math.max(contentHeight - this.#sheet.rowManager.getRowHeight(), 0);\n\n this.#elements.top.disabled = (currentScrollTop <= 0);\n this.#elements.bottom.disabled = (currentScrollTop >= maxScrollTop - 1);\n };\n\n const onMouseUp = () => {\n this.#dragging = false;\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n };\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n });\n\n this.#elements.track.addEventListener(\"mousedown\", (e) => {\n if (e.button !== 0 || e.target === this.#elements.thumb) return;\n const trackRect = this.#elements.track.getBoundingClientRect();\n const thumbHeight = this.#elements.thumb.clientHeight;\n const trackHeight = this.#elements.track.clientHeight;\n const maxThumbTop = trackHeight - thumbHeight;\n\n if (maxThumbTop > 0) {\n const clickY = e.clientY - trackRect.top - (thumbHeight / 2);\n const ratio = Math.max(0, Math.min(1, clickY / maxThumbTop));\n\n const { totalCount } = this.#getScaleInfo();\n const targetRow = Math.max(0, Math.min(Math.floor(ratio * (totalCount - 1)), totalCount - 1));\n\n\n if (targetRow >= 0 && this.#sheet.rowManager && typeof this.#sheet.rowManager.scrollToDataRow === 'function') {\n this.#sheet.rowManager.scrollToDataRow(targetRow, 'top');\n }\n }\n this.refresh();\n });\n\n let scrollInterval = null;\n\n const startContinuousScroll = (direction) => {\n if (scrollInterval) return;\n\n const scrollStep = () => {\n const $firstTr = this.#sheet.querySelector(\"tbody.body tr\");\n\n if (!$firstTr || $firstTr.dataset.row === undefined) {\n return;\n }\n\n if (direction === 'down' && this.#sheet.isLastRow()) {\n return;\n }\n\n const currentRow = parseInt($firstTr.dataset.row, 10);\n const targetRow = direction === 'down' ? currentRow+1 : Math.max(0, currentRow-1);\n\n this.#sheet.rowManager.scrollToDataRow(targetRow, null, () => {\n this.refresh();\n });\n };\n\n scrollStep();\n scrollInterval = setInterval(scrollStep, 200); // 100ms ๊ฐ๊ฒฉ ๋ฐ๋ณต\n };\n\n const stopContinuousScroll = () => {\n if (scrollInterval) {\n clearInterval(scrollInterval);\n scrollInterval = null;\n }\n };\n\n this.#elements.top.addEventListener(\"mousedown\", (e) => {\n if (e.button !== 0) return;\n startContinuousScroll('up');\n });\n\n this.#elements.bottom.addEventListener(\"mousedown\", (e) => {\n if (e.button !== 0) return;\n startContinuousScroll('down');\n });\n\n document.addEventListener(\"mouseup\", stopContinuousScroll);\n this.#elements.top.addEventListener(\"mouseleave\", stopContinuousScroll);\n this.#elements.bottom.addEventListener(\"mouseleave\", stopContinuousScroll);\n };\n}\n\nif (!customElements.get('nine-table-vscrollbar')) {\n customElements.define(\"nine-table-vscrollbar\", NineTableVScrollBar);\n}\n\n","import { trace } from \"@nopeer\";\n\nexport const GROUP_IDX = {\n\tID: 0,\n\tDEPTH: 1,\n\tNAME: 2,\n\tCHILDREN: 3,\n};\n\nexport class GroupingManager {\n\t#sheet;\n\t#host;\n\t#groupColumns = [];\n\t#groupMap = new Map(); // ๊ทธ๋ฃน๋ณ ์์ ID ๋งคํ ๊ด๋ฆฌ์ฉ\n\t#isApplying = false;\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = this.#sheet.getRootNode().host;\n\t}\n\n\tget columns() {\n\t\treturn this.#groupColumns;\n\t}\n\n\tget groupMap() {\n\t\treturn this.#groupMap;\n\t}\n\n\tinitialize = () => {\n\t\tlet groupColumns = [];\n\t\tconst sourceTable = this.#sheet.sourceTable;\n\t\tif (sourceTable) {\n\t\t\tsourceTable.querySelectorAll('tbody tr[grouping=\"true\"]').forEach(($tr) => {\n\t\t\t\tconst $cell =$tr.querySelector(`[cell-type=\"tree\"]`);\n\t\t\t\tif ($cell &&$cell.dataset.bind) {\n\t\t\t\t\tgroupColumns.push($cell.dataset.bind);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.#groupColumns = groupColumns;\n\t};\n\n\tapply() {\n\n\t\tif (this.#isApplying) return;\n\t\tthis.#isApplying = true;\n\n\t\tlet groupColumns = [];\n\t\tconst sourceTable = this.#sheet.sourceTable;\n\t\tif (sourceTable) {\n\t\t\tsourceTable.querySelectorAll('tbody tr[grouping=\"true\"]').forEach(($tr) => {\n\t\t\t\tconst $cell =$tr.querySelector(`[cell-type=\"tree\"]`);\n\t\t\t\tif ($cell &&$cell.dataset.bind) {\n\t\t\t\t\tgroupColumns.push($cell.dataset.bind);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.#groupColumns = groupColumns;\n\n\t\tthis.#isApplying = false;\n\t\tthis.#sheet.scrollToY(0);\n\t\tthis.#sheet.view.refresh();\n\t}\n\n\tclear() {\n\t\tthis.#groupColumns = [];\n\t\tthis.#groupMap.clear();\n\t\tthis.#isApplying = false;\n\t\tthis.#sheet.scrollToY(0);\n\t\tthis.#sheet.view.refresh();\n\t}\n\n\tsetGroupMap(map) {\n\t\tthis.#groupMap = map;\n\t}\n\n\tgetChildrenRowIds(groupId) {\n\t\treturn this.#groupMap.get(groupId) || [];\n\t}\n\n\tgetChildrenRecords(groupId) {\n\t\tconst rowIds = this.getChildrenRowIds(groupId);\n\t\tconst dataManager = this.#host.data;\n\t\treturn rowIds.map(rowid => dataManager.getArray(rowid)).filter(Boolean);\n\t}\n}\n\nexport class Grouping {\n\n\tstatic apply(rawRecords, groupColumns = [], fields = []) {\n\t\tif (!groupColumns || groupColumns.length === 0) {\n\t\t\treturn { headers: [], renderItems: [], groupMap: new Map() };\n\t\t}\n\n\t\tconst validRaw = rawRecords.filter(o => !o.__ng?.deleted);\n\t\tconst groupMap = new Map();\n\n\t\tconst nestedTree = Grouping.#buildNestedMap(validRaw, groupColumns, fields);\n\t\tconst flatResult = [];\n\t\tconst renderItems = [];\n\n\t\tGrouping.#flattenTree(nestedTree, 0, groupColumns, flatResult, renderItems, groupMap, \"\");\n\n\t\treturn { headers: flatResult, renderItems, groupMap };\n\t}\n\n\tstatic #flattenTree(mapOrArray, depth, groupColumns, resultArr, renderItems, groupMap, parentId) {\n\t\tlet counter = 0;\n\t\tconst isLastLevel = (depth === groupColumns.length - 1); // ๐ก ์ฐ์ฐ์ ์์ ๋ฐ์\n\n\t\tfor (let [groupKey, subMapOrRecords] of mapOrArray.entries()) {\n\t\t\tconst groupId = parentId ? `${parentId}_${counter++}` : `g_${counter++}`;\n\n\t\t\tconst rowIds = Grouping.#collectLeafRowIds(subMapOrRecords);\n\t\t\tgroupMap.set(groupId, rowIds);\n\n\t\t\tconst groupRecord = [];\n\t\t\tgroupRecord[GROUP_IDX.ID] = groupId;\n\t\t\tgroupRecord[GROUP_IDX.DEPTH] = depth;\n\t\t\tgroupRecord[GROUP_IDX.NAME] = groupKey;\n\t\t\tgroupRecord[GROUP_IDX.CHILDREN] = rowIds;\n\n\t\t\tgroupRecord.__isGroupHeader = true;\n\t\t\tgroupRecord.__groupId = groupId;\n\n\t\t\tresultArr.push(groupRecord);\n\n\t\t\trenderItems.push({\n\t\t\t\ttype: 'group',\n\t\t\t\trecord: groupRecord,\n\t\t\t\tgroupId: groupId\n\t\t\t});\n\n\t\t\tif (!isLastLevel && subMapOrRecords instanceof Map) {\n\t\t\t\tGrouping.#flattenTree(subMapOrRecords, depth + 1, groupColumns, resultArr, renderItems, groupMap, groupId);\n\t\t\t} else {\n\t\t\t\tconst leafRecords = Grouping.#collectLeafRecords(subMapOrRecords);\n\t\t\t\tleafRecords.forEach(record => {\n\t\t\t\t\trecord.__isGroupHeader = false;\n\t\t\t\t\trecord.__groupId = groupId;\n\t\t\t\t\tresultArr.push(record);\n\n\t\t\t\t\trenderItems.push({\n\t\t\t\t\t\ttype: 'data',\n\t\t\t\t\t\trecord: record,\n\t\t\t\t\t\tgroupId: groupId\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic #buildNestedMap(records, groupColumns, fields) {\n\t\tconst colIndex = fields.indexOf(groupColumns[0]);\n\t\tconst remainingCols = groupColumns.slice(1);\n\t\tconst map = new Map();\n\n\t\trecords.forEach(record => {\n\t\t\tconst key = colIndex >= 0 ? record.v[colIndex] : '(Unknown)';\n\t\t\tif (!map.has(key)) map.set(key, []);\n\t\t\tmap.get(key).push(record);\n\t\t});\n\n\t\tif (remainingCols.length > 0) {\n\t\t\tconst result = new Map();\n\t\t\tfor (let [key, subRecords] of map.entries()) {\n\t\t\t\tresult.set(key, Grouping.#buildNestedMap(subRecords, remainingCols, fields));\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t\treturn map;\n\t}\n\n\tstatic #collectLeafRowIds(subMapOrRecords) {\n\t\tlet rowIds = [];\n\t\tif (subMapOrRecords instanceof Map) {\n\t\t\tfor (let subVal of subMapOrRecords.values()) {\n\t\t\t\trowIds = rowIds.concat(Grouping.#collectLeafRowIds(subVal));\n\t\t\t}\n\t\t} else if (Array.isArray(subMapOrRecords)) {\n\t\t\trowIds = rowIds.concat(subMapOrRecords.map(r => r.__ng?.rowid ?? r.m?._?.[0]));\n\t\t}\n\t\treturn rowIds;\n\t}\n\n\tstatic #collectLeafRecords(subMapOrRecords) {\n\t\tlet records = [];\n\t\tif (subMapOrRecords instanceof Map) {\n\t\t\tfor (let subVal of subMapOrRecords.values()) {\n\t\t\t\trecords = records.concat(Grouping.#collectLeafRecords(subVal));\n\t\t\t}\n\t\t} else if (Array.isArray(subMapOrRecords)) {\n\t\t\trecords = records.concat(subMapOrRecords);\n\t\t}\n\t\treturn records;\n\t}\n}","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\nimport { GROUP_IDX } from \"@/data/Grouping.js\";\n\nexport class RowManager {\n #BUFFER_ROW_COUNT = 3;\n\n #host;\n #sheet;\n #element;\n\n #containerTemplates = new Map();\n\n #templateRowHeights = [];\n #cachedTemplateHeight = null;\n\n #resizeObserver = null;\n #sheetHeight = 0;\n #cachedRowCount;\n\n #isProgrammaticScroll = false;\n #isGrouped = false;\n\n constructor(sheet) {\n this.#host = sheet.getRootNode().host;\n this.#sheet = sheet;\n\n this.#initResizeObserver();\n }\n\n getRowHeight() {\n return this.#templateRowHeights.reduce((sum, h) => sum + h, 0);//this.#cachedTemplateHeight;\n }\n\n refresh = (force = false) => {\n\n if (!this.#sheet.classList.contains('active')) return;\n\n const bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n if (!bodyViewport) return;\n\n const wasInvalidHeight = !this.#cachedTemplateHeight || this.#cachedTemplateHeight <= 0;\n\n if (wasInvalidHeight) {\n this.#measureAndCacheHeight();\n if (this.#cachedTemplateHeight && this.#cachedTemplateHeight > 0) {\n this.#renderAllContainers();\n }\n }\n\n\n this.#handleScroll(bodyViewport.scrollTop, force);\n\n this.#sheet.querySelector('nine-table-vscrollbar')?.refresh();\n };\n\n #handleScroll = (scrollTop, force = false) => {\n\n if (this.#isGrouped) {\n this.#handleGroupedScroll(scrollTop, force);\n return;\n }\n\n const rowHeight = this.#cachedTemplateHeight;\n if (!rowHeight || rowHeight <= 0) return;\n\n const viewRecords = this.#sheet.view.getArray();\n const totalCount = viewRecords.length;\n\n if (totalCount === 0) {\n this.#sheet.elements.scrollHolder.style.height = '0px';\n return;\n }\n\n const templateLength = this.#sheet.templateLength;\n\n const fixedHeight = (this.#sheet.elements.body.thead?.offsetHeight || 0) +\n (this.#sheet.elements.body.tfoot?.offsetHeight || 0) +\n this.#sheet.elements.body.tbody.head.offsetHeight;\n\n const viewHeight = this.#sheet.querySelector('.ng-sheet-body').offsetHeight || 0;\n const rawTotalVirtualHeight = Math.max(totalCount * rowHeight - (viewHeight - fixedHeight - rowHeight), 0);\n\n const MAX_BROWSER_HEIGHT = 15000000;\n const useScaling = rawTotalVirtualHeight > MAX_BROWSER_HEIGHT;\n\n let scaleFactor = 1;\n let totalVirtualHeight = rawTotalVirtualHeight;\n\n if (useScaling) {\n scaleFactor = MAX_BROWSER_HEIGHT / rawTotalVirtualHeight;\n totalVirtualHeight = MAX_BROWSER_HEIGHT;\n }\n\n\n this.#sheet.elements.scrollHolder.style.height = `${totalVirtualHeight}px`;\n\n const actualScrollTop = useScaling ? (scrollTop / scaleFactor) : scrollTop;\n\n\n\n const maxStartIndex = Math.max(0, totalCount - 1);\n const clampedScrollTop = Math.min(actualScrollTop, rawTotalVirtualHeight);\n const startIndex = Math.max(0, Math.min(Math.floor(clampedScrollTop / rowHeight), maxStartIndex));\n\n /*\n * FIX: Use GPU-accelerated transform3d instead of 'top' positioning.\n * On mobile devices (iOS Safari), direct 'top' updates trigger expensive\n * layout reflows and cause severe scrolling lag during inertia touch scrolls.\n * translate3d forces hardware compositing for buttery-smooth performance.\n */\n this.#sheet.elements.left.tbody.body.style.transform =\n this.#sheet.elements.body.tbody.body.style.transform =\n this.#sheet.elements.right.tbody.body.style.transform = `translate3d(0px, -${clampedScrollTop % rowHeight}px, 0px)`;\n\n\n const firstTr = this.#element.firstTr;\n const currentStartIndex = firstTr && firstTr.dataset.row !== undefined ? parseInt(firstTr.dataset.row, 10) : -1;\n\n if (!force && currentStartIndex === startIndex) {\n return;\n }\n\n [\n this.#sheet.elements.left.tbody.body,\n this.#sheet.elements.body.tbody.body,\n this.#sheet.elements.right.tbody.body\n ].forEach(($tbody, tbodyIdx) => {\n if (!$tbody) return;\n\n const rows = $tbody.querySelectorAll('tbody.body tr');\n\n rows.forEach(($tr, index) => {\n const dataIndex = startIndex + Math.floor(index / templateLength);\n\n if (dataIndex >= totalCount) {\n $tr.style.display = 'none';\n $tr.dataset.matrixRow = null;\n $tr.dataset.row = null;\n $tr.dataset.index = null;\n return;\n }\n\n const record = viewRecords[dataIndex];//this.#sheet.view.getArray(dataIndex);\n\n if (!record) {\n $tr.style.display = 'none';\n return;\n }\n\n const rowid = record.m._[NINE_TABLE.META.INDEX.ROWID];\n\n $tr.style.display = '';\n\n this.#bindRowData($tr, record, rowid, dataIndex);\n });\n });\n\n this.#sheet.selection.refresh();\n };\n\n\n #handleGroupedScroll = (scrollTop, force = false) => {\n\n const allRenderItems = this.#sheet.view.getArray() || [];\n const totalVirtualCount = allRenderItems.length;\n\n if (totalVirtualCount === 0) {\n this.#sheet.elements.scrollHolder.style.height = '0px';\n return;\n }\n\n\n const bodyContent = this.#sheet.querySelector('.ng-sheet-body .ng-sheet-body-content');\n const templateLength = this.#sheet.templateLength || 1;\n\n const getItemHeight = (item) => {\n if (item.type === 'group') {\n const depth = item.record[GROUP_IDX.DEPTH] || 0;\n const groupHeight = this.#templateRowHeights[depth] || this.#cachedTemplateHeight / templateLength;\n return groupHeight;\n } else {\n let dataRowsHeight = 0;\n const templateLength = this.#sheet.templateLength || 1;\n\n let groupHeightsTotal = 0;\n for(let i = 0; i < templateLength - 1; i++) {\n groupHeightsTotal += this.#templateRowHeights[i] || 0;\n }\n dataRowsHeight = this.#cachedTemplateHeight - groupHeightsTotal;\n\n return dataRowsHeight > 0 ? dataRowsHeight : this.#cachedTemplateHeight;\n }\n };\n\n\n let totalVirtualHeight = 0;\n const itemHeights = new Array(totalVirtualCount);\n for (let i = 0; i < totalVirtualCount; i++) {\n const h = getItemHeight(allRenderItems[i]);\n itemHeights[i] = h;\n totalVirtualHeight += h;\n }\n\n this.#sheet.elements.scrollHolder.style.height = `${totalVirtualHeight}px`;\n\n const viewportClientHeight = this.#sheet.clientHeight;\n\n let accumulatedHeight = 0;\n let startIndex = 0;\n\n for (let i = 0; i < totalVirtualCount; i++) {\n const h = itemHeights[i];\n if (accumulatedHeight + h > scrollTop) {\n startIndex = i;\n break;\n }\n accumulatedHeight += h;\n startIndex = i;\n }\n\n const offsetY = scrollTop - accumulatedHeight;\n if (bodyContent) {\n bodyContent.querySelectorAll(\"tbody\").forEach(($tbody) => {\n $tbody.style.top = `-${Math.max(0, offsetY)}px`;\n });\n }\n\n const firstTr = this.#element.firstTr;\n const currentStartIndex = firstTr && firstTr.dataset.virtualIndex !== undefined\n ? parseInt(firstTr.dataset.virtualIndex, 10)\n : -1;\n\n if (!force && currentStartIndex === startIndex) {\n return;\n }\n\n const visibleRowsCount = Math.ceil(viewportClientHeight / (this.#cachedTemplateHeight / templateLength));\n const dynamicBuffer = (this.#sheet.grouping.columns?.length || 1) * 15;\n const targetStart = startIndex;\n const targetEnd = Math.min(totalVirtualCount, startIndex + visibleRowsCount + dynamicBuffer);\n const renderedItems = allRenderItems.slice(targetStart, targetEnd);\n\n ['.ng-container-body', '.ng-container-left', '.ng-container-right'].forEach(selector => {\n const container = this.#sheet.querySelector(`.ng-sheet-body ${selector}`);\n if (!container) return;\n\n const trs = Array.from(container.querySelectorAll('tbody.body tr'));\n\n for (let i = 0; i < trs.length; i += templateLength) {\n const itemIndex = Math.floor(i / templateLength);\n const item = renderedItems[itemIndex];\n const chunkTrs = trs.slice(i, i + templateLength);\n\n if (!item || itemIndex >= renderedItems.length) {\n chunkTrs.forEach(tr => {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n });\n continue;\n }\n\n const dataIndex = startIndex + itemIndex;\n\n chunkTrs.forEach((tr, subIdx) => {\n const virtualIndex = startIndex + itemIndex;\n tr.dataset.virtualIndex = virtualIndex;\n tr.dataset.row = (item.type === 'data') ? dataIndex : '';\n\n const isTrGroup = tr.getAttribute('grouping') === 'true';\n\n if (item.type === 'group') {\n if (isTrGroup) {\n const depth = item.record[GROUP_IDX.DEPTH];\n if (subIdx === depth) {\n tr.style.display = '';\n this.#bindGroupRowData(tr, allRenderItems, item.record, virtualIndex);\n } else {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n }\n } else {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n }\n } else {\n if (isTrGroup) {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n } else {\n tr.style.display = '';\n\n const rowid = item.record.m?.rowid ?? 0;\n this.#bindRowData(tr, item.record, rowid, virtualIndex);\n }\n }\n });\n }\n });\n\n this.#sheet.selection.refresh();\n };\n\n #bindGroupRowData = ($tr, allRenderItems, groupRecord, virtualIndex) => {\n const templateLength = this.#sheet.templateLength || 1;\n const subRowIndex = parseInt($tr.dataset.subrow, 10) || 0;\n const matrixRow = (virtualIndex * templateLength) + subRowIndex;\n\n const indices = groupRecord[GROUP_IDX.CHILDREN];\n const allRecords = this.#host.data.getArray();\n const childrenRecords = indices ? indices.map(idx => allRecords[idx]).filter(Boolean) : [];\n\n\n $tr.dataset.virtualIndex = virtualIndex;\n $tr.dataset.row = '';\n $tr.dataset.matrixRow = matrixRow;\n $tr.data = childrenRecords;//groupRecord;\n $tr.dataset.groupId = groupRecord[GROUP_IDX.ID];\n\n\n Array.from($tr.cells).forEach(($cell) => {\n\n $cell.dataset.row = virtualIndex;\n\n const customComp = Array.from($cell.children).find($el =>\n $el.tagName.toLowerCase().startsWith('cell-') || typeof $el.refresh === 'function'\n );\n\n\n if (customComp !== undefined && typeof customComp.refresh === 'function') {\n customComp?.refresh();\n }\n });\n };\n\n #bindRowData = ($tr, record, rowid, dataIndex) => {\n const templateLength = this.#sheet.templateLength || 1;\n const subRowIndex = parseInt($tr.dataset.subrow, 10) || 0;\n const matrixRow = (dataIndex * templateLength) + subRowIndex;\n\n $tr.dataset.index = dataIndex;\n $tr.dataset.row = rowid;\n $tr.dataset.matrixRow = matrixRow;\n $tr.data = record;\n\n Array.from($tr.cells).forEach(($cell) => {\n $cell.dataset.index = dataIndex;\n $cell.dataset.row = rowid;\n\n const customComp = Array.from($cell.children).find($el =>\n $el.tagName.toLowerCase().startsWith('cell-') && typeof $el.refresh === 'function'\n );\n\n customComp?.refresh();\n });\n };\n\n initialize = () => {\n\n this.#isGrouped = this.#sheet.sourceTable.querySelector(\"tbody tr[grouping='true']\") ? true : false;\n\n this.#cachedTemplateHeight = null;\n this.#containerTemplates.clear();\n\n this.#element = {\n scrollTables: this.#sheet.querySelectorAll('.ng-sheet-body table'),\n firstTr: this.#sheet.querySelector('.ng-sheet-body .ng-container-body tbody.body tr'),\n };\n\n ['.ng-container-body', '.ng-container-left', '.ng-container-right'].forEach(selector => {\n const container = this.#sheet.querySelector(`.ng-sheet-body ${selector}`);\n if (!container) return;\n\n const tableEl = container.querySelector('table');\n if (!tableEl) return;\n\n const tbody = tableEl.querySelector('tbody.body');\n if (!tbody) return;\n\n const trs = Array.from(tbody.querySelectorAll('tr'));\n const templateTrs = trs.map(tr => tr.cloneNode(true));\n this.#containerTemplates.set(selector, templateTrs);\n });\n\n const bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\n if (bodyViewport) {\n this.#sheetHeight = bodyViewport.clientHeight;\n\n this.#measureAndCacheHeight();\n this.#renderAllContainers();\n this.#handleScroll(bodyViewport.scrollTop, true);\n\n bodyViewport.addEventListener('scroll', (e) => {\n\n if (this.#isProgrammaticScroll) return;\n\n const rowHeight = this.#cachedTemplateHeight || 0;\n const totalCount = this.#sheet.view.getArray()?.length || 0;\n const rawTotalVirtualHeight = totalCount * rowHeight;\n\n if (rawTotalVirtualHeight <= bodyViewport.clientHeight) {\n return;\n }\n\n this.#handleScroll(bodyViewport.scrollTop);\n\n this.#sheet.querySelector('nine-table-vscrollbar').refresh();\n\n }, { passive: true });\n }\n };\n\n scrollToDataRow(dataRow, align = 'top', onRendered) {\n\n const bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\n const viewRecords = this.#sheet.view.getArray();\n const totalCount = viewRecords?.length || 0;\n\n const targetRow = Math.max(0, Math.min(dataRow, totalCount - 1));\n let targetScrollTop = 0;\n\n if (this.#isGrouped) {\n const maxScrollTop = Math.max(bodyViewport.scrollHeight - bodyViewport.clientHeight, 1);\n // targetRow๊ฐ ์ ์ฒด totalCount์์ ์ฐจ์งํ๋ ๋น์จ(ratio)๋งํผ ์ค์ ์คํฌ๋กค ์ต๋ ๋์ด์ ๊ณฑํด์ค\n const ratio = targetRow / Math.max(totalCount - 1, 1);\n targetScrollTop = ratio * maxScrollTop;\n } else {\n\n const rowHeight = this.#cachedTemplateHeight;\n const rawTargetScrollTop = targetRow * rowHeight;\n\n const fixedHeight = (this.#sheet.elements.body.thead?.offsetHeight || 0) +\n (this.#sheet.elements.body.tfoot?.offsetHeight || 0) +\n this.#sheet.elements.body.tbody.head.offsetHeight;\n\n const viewHeight = bodyViewport.offsetHeight || 0;\n const rawTotalVirtualHeight = Math.max(totalCount * rowHeight + fixedHeight - viewHeight, 0);\n\n const MAX_BROWSER_HEIGHT = 15000000;\n const useScaling = rawTotalVirtualHeight > MAX_BROWSER_HEIGHT;\n\n let scaleFactor = 1;\n if (useScaling) {\n scaleFactor = MAX_BROWSER_HEIGHT / rawTotalVirtualHeight;\n }\n\n targetScrollTop = rawTargetScrollTop * scaleFactor;\n }\n\n this.#isProgrammaticScroll = true;\n bodyViewport.scrollTop = targetScrollTop;\n this.#handleScroll(targetScrollTop);\n\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n this.#isProgrammaticScroll = false;\n if (typeof onRendered === 'function') onRendered();\n });\n });\n }\n\n\n\n destroy = () => {\n if (this.#resizeObserver) {\n this.#resizeObserver.disconnect();\n this.#resizeObserver = null;\n }\n };\n\n #measureAndCacheHeight = () => {\n if (!this.#sheet.classList.contains('active')) return;\n\n if (!this.#sheet.sourceTable) return;\n\n const trTemplates = this.#sheet.sourceTable?.querySelectorAll('tbody.body tr');\n\n const $tbody = this.#sheet.querySelector('.ng-sheet-body .ng-container-body tbody.body');\n\n $tbody.querySelectorAll('tr').forEach(tr => tr.remove());\n\n const fragment = document.createDocumentFragment();\n trTemplates.forEach($tr => fragment.appendChild($tr.cloneNode(true)));\n $tbody.appendChild(fragment);\n\n const renderedTrs = $tbody.querySelectorAll('tr');\n\n this.#templateRowHeights = [];\n renderedTrs.forEach($tr => {\n this.#templateRowHeights.push(Math.max($tr.offsetHeight, 24));\n });\n\n renderedTrs.forEach(tr => tr.remove());\n\n this.#cachedTemplateHeight = this.#templateRowHeights.reduce((sum, h) => sum + h, 0);\n\n this.#updateRowCount();\n };\n\n #updateRowCount = () => {\n\n if (this.#sheetHeight > 0 && this.#cachedTemplateHeight > 0) {\n const visibleRows = Math.ceil(this.#sheetHeight / this.#cachedTemplateHeight);\n\n let dynamicBuffer = this.#BUFFER_ROW_COUNT;\n if (this.#isGrouped && this.#sheet.grouping) {\n const groupDepth = this.#sheet.grouping.columns?.length || 1;\n dynamicBuffer += (groupDepth * 15);\n }\n\n this.#cachedRowCount = visibleRows + dynamicBuffer;\n }\n };\n\n #renderAllContainers = () => {\n\n ['.ng-container-body', '.ng-container-left', '.ng-container-right'].forEach(selector => {\n const container = this.#sheet.querySelector(`.ng-sheet-body ${selector}`);\n if (container && container.querySelector('tbody')) {\n this.#renderRows(container);\n }\n });\n\n this.#syncRowHeights();\n };\n\n #renderRows = (container) => {\n let targetFixedType = null;\n if (container.classList.contains('ng-container-left')) targetFixedType = 'left';\n else if (container.classList.contains('ng-container-right')) targetFixedType = 'right';\n\n const templateTrs = Array.from(this.#sheet.sourceTable.querySelectorAll('tbody.body tr')).map(tr => {\n const clonedTr = tr.cloneNode(true);\n\n if (targetFixedType === 'left') {\n clonedTr.querySelectorAll('th,td').forEach($cell => {\n if ($cell.getAttribute('fixed') !== 'left') $cell.remove();\n });\n } else if (targetFixedType === 'right') {\n clonedTr.querySelectorAll('th,td').forEach($cell => {\n if ($cell.getAttribute('fixed') !== 'right') $cell.remove();\n });\n } else {\n clonedTr.querySelectorAll('[fixed=left], [fixed=right]').forEach($cell => {\n $cell.remove();\n });\n }\n\n return clonedTr;\n });\n\n if (templateTrs.length === 0) return;\n\n const targetTbody = container.querySelector('tbody.body');\n if (!targetTbody) return;\n\n targetTbody.querySelectorAll(\"tr\").forEach(tr => tr.remove());\n\n const fragment = document.createDocumentFragment();\n for (let i = 0; i < this.#cachedRowCount; i++) {\n templateTrs.forEach(tmpl => fragment.appendChild(tmpl.cloneNode(true)));\n }\n\n\n targetTbody.appendChild(fragment);\n\n if (container.classList.contains('ng-container-body')) {\n this.#element.firstTr = targetTbody.querySelector('tr');\n }\n };\n\n\n\n #syncRowHeights = () => {\n const leftTable = this.#sheet.querySelector('.ng-sheet-body .ng-container-left table');\n const bodyTable = this.#sheet.querySelector('.ng-sheet-body .ng-container-body table');\n const rightTable = this.#sheet.querySelector('.ng-sheet-body .ng-container-right table');\n\n if (bodyTable) {\n const leftRows = leftTable ? Array.from(leftTable.querySelectorAll('tbody tr')) : [];\n const bodyRows = Array.from(bodyTable.querySelectorAll('tbody tr'));\n const rightRows = rightTable ? Array.from(rightTable.querySelectorAll('tbody tr')) : [];\n\n const maxRows = Math.max(leftRows.length, bodyRows.length, rightRows.length);\n\n for (let i = 0; i < maxRows; i++) {\n const heights = [\n leftRows[i]?.getBoundingClientRect().height || 0,\n bodyRows[i]?.getBoundingClientRect().height || 0,\n rightRows[i]?.getBoundingClientRect().height || 0\n ];\n const maxHeight = Math.max(...heights);\n\n if (maxHeight > 0) {\n if (leftRows[i]) leftRows[i].style.height = `${maxHeight}px`;\n if (bodyRows[i]) bodyRows[i].style.height = `${maxHeight}px`;\n if (rightRows[i]) rightRows[i].style.height = `${maxHeight}px`;\n }\n }\n }\n };\n\n #initResizeObserver = () => {\n\n if (!this.#sheet || !(this.#sheet instanceof HTMLElement)) return;\n\n this.#resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n\n const sheetEl = entry.target;\n if (!sheetEl.classList.contains('active')) continue;\n\n const height = entry.contentRect.height;\n const width = entry.contentRect.width;\n\n if (width > 0 && this.#sheet.isAutoFitCol) {\n this.#sheet.autoFit(true);\n }\n\n if (height > 0 && this.#sheetHeight !== height) {\n this.#sheetHeight = height;\n this.#updateRowCount();\n\n if (this.#cachedTemplateHeight !== null) {\n this.#renderAllContainers();\n this.refresh();\n }\n }\n }\n });\n\n this.#resizeObserver.observe(this.#sheet);\n };\n}","import { trace } from \"@nopeer\";\n\nexport const COLLAPSED_WIDTH = 16;\n\nexport class TableCompiler {\n\n static compile($srcTable) {\n\n const $table = $srcTable.cloneNode(true);\n\n TableCompiler.resetColIndex($table, $table.querySelectorAll('thead tr'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tbody.body tr[grouping=\"true\"]'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tbody.body tr:not([grouping=\"true\"])'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tfoot tr'));\n\n TableCompiler.#syncColAttributes($table);\n\n return $table;\n }\n\n static recompile($table) {\n\n\n TableCompiler.resetColIndex($table, $table.querySelectorAll('thead tr'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tbody.body tr[grouping=\"true\"]'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tbody.body tr:not([grouping=\"true\"])'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tfoot tr'));\n\n TableCompiler.#syncColAttributes($table);\n\n return $table;\n }\n\n static #syncColAttributes($table) {\n\n $table.querySelectorAll('colgroup col').forEach(($col, i) => {\n $col.setAttribute('data-col', i);\n const fixed = $col.getAttribute('fixed');\n\n $table.querySelectorAll(`[data-col=\"${i}\"]`).forEach($el => {\n fixed ? $el.setAttribute('fixed', fixed) : $el.removeAttribute('fixed');\n });\n });\n }\n\n static resetColIndex($table, trs) {\n\n const cols = $table.querySelectorAll('colgroup col');\n const grid = Array.from({ length: trs.length }, () => Array(cols.length).fill(null));\n\n trs.forEach(($tr, index) => {\n\n $tr.dataset.subrow = index;\n\n let colIndex = 0;\n\n $tr.querySelectorAll('th, td').forEach($cell => {\n\n while (colIndex < cols.length && grid[index][colIndex] !== null) {\n colIndex++;\n }\n\n $cell.dataset.col = colIndex;\n\n const rowSpan = $cell.rowSpan || 1;\n const colSpan = $cell.colSpan || 1;\n\n for (let r = 0; r < rowSpan; r++) {\n for (let c = 0; c < colSpan; c++) {\n if (index + r < trs.length && colIndex + c < cols.length) {\n grid[index + r][colIndex + c] = $cell;\n }\n }\n }\n\n colIndex += colSpan;\n });\n });\n }\n\n}","import { trace } from \"@nopeer\";\n\nexport class CellSelection {\n\t#sheet;\n\t#range = { startRow: -1, startCol: -1, endRow: -1, endCol: -1 };\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#initEvents();\n\t}\n\n\t#getMatrixRow(tr) {\n\t\tif (!tr) return { dataRow: -1, subRowIndex: -1, matrixRow: -1 };\n\n\t\tconst dataRow = parseInt(tr.dataset.index, 10);\n\t\tif (isNaN(dataRow)) return { dataRow: -1, subRowIndex: -1, matrixRow: -1 };\n\n\t\tconst tbody = tr.closest('tbody');\n\t\tconst trs = Array.from(tbody.querySelectorAll('tr'));\n\n\t\tconst sameGroupTrs = trs.filter(t => parseInt(t.dataset.index, 10) === dataRow);\n\t\tconst subRowIndex = sameGroupTrs.indexOf(tr);\n\t\tconst templateLength = sameGroupTrs.length > 0 ? sameGroupTrs.length : 1;\n\n\t\tconst matrixRow = (dataRow * templateLength) + (subRowIndex >= 0 ? subRowIndex : (tr.sectionRowIndex % templateLength));\n\n\t\treturn { dataRow, subRowIndex, matrixRow };\n\t}\n\n\tsetFocus(matrixRow, col) {\n\t\tthis.#sheet.querySelectorAll(`tr.selected-start`).forEach($tr => {\n\t\t\t$tr.classList.remove(\"selected-start\");\n\t\t\t$tr.querySelectorAll(`td.selected-start`).forEach($td => {\n\t\t\t\t$td.classList.remove(\"selected-start\");\n\t\t\t});\n\t\t});\n\n\t\tconst $td = this.#sheet.querySelector(`.ng-sheet-body-content tr[data-matrix-row=\"${matrixRow}\"] td[data-col=\"${col}\"]`);\n\t\tif (!$td) return;\n\n\t\t$td.classList.add(\"selected-start\");\n\t\t$td.closest('tr')?.classList.add(\"selected-start\");\n\t}\n\n\tsetRange(startRow, startCol, endRow, endCol) {\n\t\tlet r1 = Math.min(startRow, endRow);\n\t\tlet r2 = Math.max(startRow, endRow);\n\t\tlet c1 = Math.min(startCol, endCol);\n\t\tlet c2 = Math.max(startCol, endCol);\n\n\t\tconst containers = this.#sheet.querySelectorAll('.ng-container-left, .ng-container-body, .ng-container-right');\n\n\t\tlet expanded = true;\n\t\tlet loopCount = 0;\n\n\t\twhile (expanded && loopCount < 5) {\n\t\t\texpanded = false;\n\t\t\tloopCount++;\n\n\t\t\tcontainers.forEach(container => {\n\n\t\t\t\tconst visibleTrs = Array.from(container.querySelectorAll('tbody tr')).filter(tr => {\n\t\t\t\t\treturn tr.style.display !== 'none'; // ํน์ tr.offsetHeight > 0 ์ฒดํฌ\n\t\t\t\t});\n\n\t\t\t\tvisibleTrs.forEach(tr => {\n\t\t\t\t\tconst { matrixRow } = this.#getMatrixRow(tr);\n\t\t\t\t\tif (matrixRow < 0) return;\n\n\t\t\t\t\ttr.querySelectorAll('td, th').forEach(cell => {\n\t\t\t\t\t\tconst col = parseInt(cell.dataset.col, 10);\n\t\t\t\t\t\tif (isNaN(col)) return;\n\n\t\t\t\t\t\tconst rowSpan = parseInt(cell.rowSpan || 1, 10);\n\t\t\t\t\t\tconst colSpan = parseInt(cell.colSpan || 1, 10);\n\n\t\t\t\t\t\tconst cellEndRow = matrixRow + rowSpan - 1;\n\t\t\t\t\t\tconst cellEndCol = col + colSpan - 1;\n\n\t\t\t\t\t\tconst isIntersecting = cellEndRow >= r1 && matrixRow <= r2 && cellEndCol >= c1 && col <= c2;\n\n\t\t\t\t\t\tif (isIntersecting) {\n\t\t\t\t\t\t\tconst nsR = Math.min(r1, matrixRow);\n\t\t\t\t\t\t\tconst neR = Math.max(r2, cellEndRow);\n\t\t\t\t\t\t\tconst nsC = Math.min(c1, col);\n\t\t\t\t\t\t\tconst neC = Math.max(c2, cellEndCol);\n\n\t\t\t\t\t\t\tif (nsR !== r1 || neR !== r2 || nsC !== c1 || neC !== c2) {\n\t\t\t\t\t\t\t\tr1 = nsR; r2 = neR; c1 = nsC; c2 = neC;\n\t\t\t\t\t\t\t\texpanded = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tthis.#range = { startRow: r1, startCol: c1, endRow: r2, endCol: c2 };\n\n\t\t//this.#sheet.view.clearSelectedRange();\n\t\t//this.#sheet.view.setSelectedRange(r1, r2, c1, c2);\n\n\t\tthis.render();\n\t}\n\n\tget minRow() {\n\t\treturn this.#range.startRow;\n\t};\n\tget maxRow() {\n\t\treturn this.#range.endRow;\n\t};\n\tget minCol() {\n\t\treturn this.#range.startCol;\n\t};\n\tget maxCol() {\n\t\treturn this.#range.endCol;\n\t};\n\n\trefresh = () => {\n\t\tthis.render();\n\t}\n\n\trender = () => {\n\t\tconst { startRow, startCol, endRow, endCol } = this.#range;\n\n\t\tconst containers = this.#sheet.querySelectorAll(\n\t\t\t'.ng-container-left, .ng-container-body, .ng-container-right'\n\t\t);\n\n\t\tcontainers.forEach(container => {\n\t\t\tcontainer.querySelectorAll('.selected, .selected-top, .selected-bottom, .selected-left, .selected-right, .selected-start').forEach(el => {\n\t\t\t\tel.classList.remove('selected', 'selected-top', 'selected-bottom', 'selected-left', 'selected-right', 'selected-start');\n\t\t\t});\n\n\t\t\tcontainer.querySelectorAll('tr.selected-start').forEach(tr => {\n\t\t\t\ttr.classList.remove('selected-start');\n\t\t\t});\n\t\t});\n\n\t\tif (startRow < 0 || startCol < 0) return;\n\n\t\tcontainers.forEach((container) => {\n\t\t\tconst visibleTrs = Array.from(container.querySelectorAll('tbody tr')).filter(tr => {\n\t\t\t\treturn tr.style.display !== 'none';\n\t\t\t});\n\n\t\t\tvisibleTrs.forEach(tr => {\n\t\t\t\tconst { matrixRow } = this.#getMatrixRow(tr);\n\t\t\t\tif (matrixRow < 0) return;\n\n\n\t\t\t\tif (matrixRow >= startRow && matrixRow <= endRow) {\n\t\t\t\t\ttr.classList.add('selected');\n\t\t\t\t}\n\n\t\t\t\t//trace.log(this.#sheet.view);\n\n\n\t\t\t\ttr.querySelectorAll('td, th').forEach(cell => {\n\t\t\t\t\tconst col = parseInt(cell.dataset.col, 10);\n\t\t\t\t\tif (isNaN(col)) return;\n\n\t\t\t\t\tconst rowSpan = parseInt(cell.rowSpan || 1, 10);\n\t\t\t\t\tconst colSpan = parseInt(cell.colSpan || 1, 10);\n\n\t\t\t\t\tconst cellEndRow = matrixRow + rowSpan - 1;\n\t\t\t\t\tconst cellEndCol = col + colSpan - 1;\n\n\t\t\t\t\tconst isSelected = cellEndRow >= startRow && matrixRow <= endRow && cellEndCol >= startCol && col <= endCol;\n\t\t\t\t\tif (!isSelected) return;\n\n\t\t\t\t\tcell.classList.add('selected');\n\n\t\t\t\t\tif (matrixRow <= startRow) cell.classList.add('selected-top');\n\t\t\t\t\tif (cellEndRow >= endRow) cell.classList.add('selected-bottom');\n\t\t\t\t\tif (col <= startCol) cell.classList.add('selected-left');\n\t\t\t\t\tif (cellEndCol >= endCol) cell.classList.add('selected-right');\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\t#initEvents() {\n\t\tconst mainZone = this.#sheet.querySelector('.ng-sheet-body');\n\t\tif (!mainZone) {\n\t\t\treturn;\n\t\t}\n\n\t\tmainZone.addEventListener('mousedown', (e) => {\n\t\t\tif (e.button !== 0) return;\n\n\t\t\tconst cell = e.target.closest('td, th');\n\t\t\tif (!cell) return;\n\t\t\tif (cell.dataset.row === undefined || cell.dataset.col === undefined) return;\n\n\t\t\tthis.#sheet.style.userSelect = 'none';\n\t\t\tthis.#sheet.style.webkitUserSelect = 'none';\n\n\t\t\tconst tr = cell.closest('tr');\n\t\t\tconst { matrixRow: startRow } = this.#getMatrixRow(tr);\n\t\t\tconst startCol = parseInt(cell.dataset.col, 10);\n\n\t\t\tif (startRow < 0) {\n\t\t\t\tthis.#sheet.style.userSelect = '';\n\t\t\t\tthis.#sheet.style.webkitUserSelect = '';\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.setFocus(startRow, startCol);\n\t\t\tthis.setRange(startRow, startCol, startRow, startCol);\n\n\t\t\tlet lastMatrixRow = startRow;\n\t\t\tlet lastCol = startCol;\n\n\t\t\tconst onMouseMove = (moveEvent) => {\n\t\t\t\tconst targetEl = document.elementFromPoint(moveEvent.clientX, moveEvent.clientY);\n\t\t\t\tlet targetCell = targetEl?.closest('td, th');\n\n\t\t\t\tif (!targetCell || !this.#sheet.contains(targetCell)) {\n\t\t\t\t\tconst allCells = this.#sheet.querySelectorAll('.ng-sheet-body-content tbody tr td, .ng-sheet-body-content tbody tr:not(.nodata) th');\n\t\t\t\t\tfor (const c of allCells) {\n\t\t\t\t\t\tconst rect = c.getBoundingClientRect();\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tmoveEvent.clientX >= rect.left &&\n\t\t\t\t\t\t\tmoveEvent.clientX <= rect.right &&\n\t\t\t\t\t\t\tmoveEvent.clientY >= rect.top &&\n\t\t\t\t\t\t\tmoveEvent.clientY <= rect.bottom\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\ttargetCell = c;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!targetCell) return;\n\t\t\t\tif (targetCell.dataset.row === undefined || targetCell.dataset.col === undefined) return;\n\n\t\t\t\tconst targetTr = targetCell.closest('tr');\n\t\t\t\tconst { matrixRow: endRow } = this.#getMatrixRow(targetTr);\n\t\t\t\tconst endCol = parseInt(targetCell.dataset.col, 10);\n\n\t\t\t\tif (endRow < 0) return;\n\t\t\t\tif (lastMatrixRow === endRow && lastCol === endCol) return;\n\n\t\t\t\tlastMatrixRow = endRow;\n\t\t\t\tlastCol = endCol;\n\n\t\t\t\tthis.setRange(startRow, startCol, endRow, endCol);\n\t\t\t};\n\n\t\t\tconst onMouseUp = () => {\n\t\t\t\tthis.#sheet.style.userSelect = '';\n\t\t\t\tthis.#sheet.style.webkitUserSelect = '';\n\n\t\t\t\tdocument.removeEventListener('mousemove', onMouseMove);\n\t\t\t\tdocument.removeEventListener('mouseup', onMouseUp);\n\t\t\t};\n\n\t\t\tdocument.addEventListener('mousemove', onMouseMove);\n\t\t\tdocument.addEventListener('mouseup', onMouseUp);\n\t\t});\n\t}\n}","import { trace } from \"@nopeer\";\n\nexport class CellNavigation {\n\t#sheet;\n\t#host;\n\n\t#currentCell = null;\n\t#currentTr = null;\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = sheet.getRootNode().host;\n\n\t\tthis.#initEvents();\n\t}\n\n\tget currentCell() {\n\t\treturn this.#currentCell;\n\t}\n\n\tset currentCell(cell) {\n\t\tif (!cell) return;\n\n\t\tthis.#currentCell = cell;\n\t\tcell.focus({ preventScroll: true });\n\n\t\tthis.#currentTr = cell.closest(\"tr\");\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\n\t\tthis.#sheet.selection.setFocus(matrixRow, this.#currentCell.dataset.col);\n\t}\n\n\n\t#moveCellH = (e, cell) => {\n\n\t\tif (!cell) return;\n\n\t\tswitch (e.code) {\n\t\t\tcase \"Tab\":\n\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\tif (!this.#isCellLeftVisible(cell)) {\n\t\t\t\t\t\tcell.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (!this.#isCellRightVisible(cell)) {\n\t\t\t\t\t\tcell.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowRight\":\n\t\t\t\tif (!this.#isCellRightVisible(cell)) {\n\t\t\t\t\tcell.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowLeft\":\n\t\t\t\tif (!this.#isCellLeftVisible(cell)) {\n\t\t\t\t\tcell.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis.currentCell = cell;\n\t\tthis.#sheet.selection.setRange(this.#currentTr.dataset.matrixRow, cell.dataset.col, this.#currentTr.dataset.matrixRow, cell.dataset.col);\n\t};\n\n\t#moveCellV = (e, cell) => {\n\t\tif (cell) {\n\t\t\tlet isVisible = false;\n\t\t\tswitch (e.code) {\n\t\t\t\tcase \"Enter\":\n\t\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\t\tif (this.#isCellBelowVisible(cell)) {\n\t\t\t\t\t\t\tisVisible = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (this.#isCellBelowVisible(cell)) {\n\t\t\t\t\t\t\tisVisible = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"ArrowDown\":\n\t\t\t\t\tif (this.#isCellBelowVisible(cell)) {\n\t\t\t\t\t\tisVisible = true;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"ArrowUp\":\n\t\t\t\t\tif (this.#isCellAboveVisible(cell)) {\n\t\t\t\t\t\tisVisible = true;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (isVisible) {\n\t\t\t\tthis.currentCell = cell;\n\t\t\t\tthis.#sheet.selection.setRange(this.#currentTr.dataset.matrixRow, cell.dataset.col, this.#currentTr.dataset.matrixRow, cell.dataset.col);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tconst dataIndex = parseInt(this.#currentTr.dataset.index, 10);\n\t\tlet scrollTopIndex = -1;\n\t\tswitch (e.code) {\n\t\t\tcase \"Enter\":\n\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\tconst visibleRowCount = this.#getVisibleRowCount();\n\t\t\t\t\tscrollTopIndex = Math.max(dataIndex - visibleRowCount + 0, 0);\n\t\t\t\t} else {\n\t\t\t\t\tscrollTopIndex = Math.min(dataIndex, this.#sheet.view.count());\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tscrollTopIndex = Math.min(dataIndex, this.#sheet.view.count());\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowUp\":\n\t\t\t\tconst visibleRowCount = this.#getVisibleRowCount();\n\t\t\t\tscrollTopIndex = Math.max(dataIndex - visibleRowCount + 0, 0);\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (scrollTopIndex < 0) return;\n\n\t\tlet matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst rowSpan = parseInt(this.#currentCell.rowSpan, 10) || 1;\n\n\t\tswitch (e.code) {\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tmatrixRow += rowSpan;\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowUp\":\n\t\t\t\tmatrixRow --;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis.#sheet.rowManager.scrollToDataRow(scrollTopIndex, null, () => {\n\t\t\tconst currentCell = this.#findCell(matrixRow, col);\n\n\t\t\tif (currentCell) {\n\t\t\t\tthis.currentCell = currentCell;\n\t\t\t\tthis.#sheet.selection.setRange(this.#currentTr.dataset.matrixRow, currentCell.dataset.col, this.#currentTr.dataset.matrixRow, currentCell.dataset.col);\n\t\t\t}\n\t\t});\n\t}\n\n\tmoveCell = (e) => {\n\n\t\tif (e.target.tagName === \"INPUT\") {\n\t\t\tif ([\"text\"].includes(e.target.type)) {\n\t\t\t\tif ([\"ArrowLeft\",\"ArrowRight\",\"Home\",\"End\"].includes(e.code)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ([\"date\",\"datetime-local\",\"time\",\"week\",\"month\"].includes(e.target.type)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (!this.#currentCell || !this.#currentTr) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet nextCell;\n\t\tswitch (e.code) {\n\t\t\tcase \"Tab\":\n\t\t\t\tnextCell = e.shiftKey ? this.#getPreviousCell() : this.#getNextCell();\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowRight\":\n\t\t\t\tnextCell = this.#getNextCell();\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowLeft\":\n\t\t\t\tnextCell = this.#getPreviousCell();\n\t\t\t\tbreak;\n\t\t\tcase \"Enter\":\n\t\t\t\tnextCell = e.shiftKey ? this.#getUpCell() : this.#getDownCell();\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tnextCell = this.#getDownCell();\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowUp\":\n\t\t\t\tnextCell = this.#getUpCell();\n\t\t\t\tbreak;\n\t\t}\n\n\t\te.preventDefault();\n\n\t\tif ([\"ArrowLeft\",\"ArrowRight\",\"Tab\"].includes(e.code)) {\n\t\t\tthis.#moveCellH(e, nextCell);\n\t\t}\n\t\telse if ([\"Enter\",\"ArrowUp\",\"ArrowDown\"].includes(e.code)) {\n\t\t\tthis.#moveCellV(e, nextCell);\n\t\t}\n\t}\n\n\t#getNextCell = () => {\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst colSpan = parseInt(this.#currentCell.colSpan, 10) || 1;\n\t\tconst dataIndex = parseInt(this.#currentTr.dataset.index, 10);\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\n\t\tconst nextCol = col + colSpan;\n\n\t\tlet nextCell = this.#sheet.querySelector(`tbody tr[data-matrix-row=\"${matrixRow}\"] td[data-col=\"${nextCol}\"]`);\n\t\tif (!nextCell) {\n\t\t\tnextCell = this.#sheet.querySelector(`tbody tr[data-index=\"${dataIndex}\"] td[data-col=\"${nextCol}\"]`);\n\t\t}\n\n\t\treturn nextCell;\n\t}\n\n\t#getPreviousCell = () => {\n\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst dataIndex = parseInt(this.#currentTr.dataset.index, 10);\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\n\t\tlet nextCell;\n\t\tfor (let i = col - 1; i >= 0; i--) {\n\t\t\tnextCell = this.#sheet.querySelector(`tbody tr[data-matrix-row=\"${matrixRow}\"] td[data-col=\"${i}\"]`);\n\t\t\tif (!nextCell) {\n\t\t\t\tnextCell = this.#sheet.querySelector(`tbody tr[data-index=\"${dataIndex}\"] td[data-col=\"${i}\"]`);\n\t\t\t}\n\n\t\t\tif (nextCell) break;\n\t\t}\n\n\t\treturn nextCell;\n\t}\n\n\n\n\t#findCell = (matrixRow, col) => {\n\n\t\tconst $tr = this.#sheet.querySelector(`tbody tr[data-matrix-row=\"${matrixRow}\"]`);\n\t\tif (!$tr) return;\n\n\t\tconst dataIndex = parseInt($tr.dataset.index, 10);\n\n\t\tlet targetCell = this.#sheet.querySelector(`tbody tr[data-matrix-row=\"${matrixRow}\"] td[data-col=\"${col}\"]`);\n\t\tif (!targetCell) {\n\t\t\tthis.#sheet.querySelectorAll(`tbody tr[data-matrix-row=\"${matrixRow}\"] td`).forEach($cell => {\n\t\t\t\tconst cellCol = parseInt($cell.dataset.col, 10);\n\t\t\t\tconst colSpan = parseInt($cell.colSpan, 10) || 1;\n\n\t\t\t\tif (col >= cellCol && col < cellCol + colSpan) {\n\t\t\t\t\ttargetCell = $cell;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (!targetCell) {\n\t\t\t\ttargetCell = this.#sheet.querySelector(`tbody tr[data-index=\"${dataIndex}\"] td[data-col=\"${col}\"]`);\n\n\t\t\t\tif (!targetCell) {\n\t\t\t\t\tthis.#sheet.querySelectorAll(`tbody tr[data-index=\"${dataIndex}\"] td`).forEach($cell => {\n\t\t\t\t\t\tconst cellCol = parseInt($cell.dataset.col, 10);\n\t\t\t\t\t\tconst colSpan = parseInt($cell.colSpan, 10) || 1;\n\n\t\t\t\t\t\tif (col >= cellCol && col < cellCol + colSpan) {\n\t\t\t\t\t\t\ttargetCell = $cell;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn targetCell;\n\t}\n\n\t#getUpCell = () => {\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\n\t\treturn this.#findCell(matrixRow - 1, col);\n\t}\n\n\t#getDownCell = () => {\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\t\tconst rowSpan = parseInt(this.#currentCell.rowSpan, 10) || 1;\n\n\t\treturn this.#findCell(matrixRow + rowSpan, col);\n\t}\n\n\t// 1. ์์ชฝ ์๋ฆผ ์ฒดํฌ (๊ธฐ์ค: bodyViewport)\n\t#isCellAboveVisible = (cell) => {\n\t\tconst bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\t\tif (!bodyViewport || !cell) return true;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst viewportRect = bodyViewport.getBoundingClientRect();\n\t\tconst theadHeight = bodyViewport.querySelector('thead')?.offsetHeight || 0;\n\n\t\t// ์
์ ์๋จ์ด ํค๋ ์๋์ชฝ๋ณด๋ค ์์ ์์ผ๋ฉด ์๋ฆฐ(์ ๋ณด์ด๋) ์ํ\n\t\treturn cellRect.top >= (viewportRect.top + theadHeight);\n\t}\n\n\t// 2. ์๋์ชฝ ์๋ฆผ ์ฒดํฌ (๊ธฐ์ค: bodyViewport)\n\t#isCellBelowVisible = (cell) => {\n\t\tconst bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\t\tif (!bodyViewport || !cell) return true;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst viewportRect = bodyViewport.getBoundingClientRect();\n\n\t\t// ์
์ ํ๋จ์ด ๋ทฐํฌํธ ํ๋จ๋ณด๋ค ์๋์ ์์ผ๋ฉด ์๋ฆฐ ์ํ\n\t\treturn cellRect.bottom <= viewportRect.bottom;\n\t}\n\n\t// 3. ์ผ์ชฝ ์๋ฆผ ์ฒดํฌ (๊ธฐ์ค: bodyViewport2)\n\t#isCellLeftVisible = (cell) => {\n\t\tconst bodyViewport2 = this.#sheet.querySelector('.ng-container-body'); // ๋๋ ์ข์ฐ ์คํฌ๋กค์ ๋ด๋นํ๋ ๋ทฐํฌํธ\n\t\tif (!bodyViewport2 || !cell) return true;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst viewportRect = bodyViewport2.getBoundingClientRect();\n\n\t\t// ์
์ ์ข์ธก์ด ๋ทฐํฌํธ ์ข์ธก๋ณด๋ค ์ผ์ชฝ์ ์์ผ๋ฉด ์๋ฆฐ ์ํ\n\t\treturn cellRect.left >= viewportRect.left;\n\t}\n\n\t// 4. ์ค๋ฅธ์ชฝ ์๋ฆผ ์ฒดํฌ (๊ธฐ์ค: bodyViewport2)\n\t#isCellRightVisible = (cell) => {\n\t\tconst bodyViewport2 = this.#sheet.querySelector('.ng-container-body');\n\t\tif (!bodyViewport2 || !cell) return true;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst viewportRect = bodyViewport2.getBoundingClientRect();\n\n\t\t// ์
์ ์ฐ์ธก์ด ๋ทฐํฌํธ ์ฐ์ธก๋ณด๋ค ์ค๋ฅธ์ชฝ์ ์์ผ๋ฉด ์๋ฆฐ ์ํ\n\t\treturn cellRect.right <= viewportRect.right;\n\t}\n\n\t// ๐ก ํ์ํ๋ค๋ฉด ์ด 4๊ฐ๋ฅผ ์กฐํฉํด์ ์ ์ฒด ๊ฐ์์ฑ์ ํ๋จํ๋ ํตํฉ ํจ์๋ ์ฝ๊ฒ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.\n\t#isCellVisible = (cell) => {\n\t\treturn this.#isCellAboveVisible(cell) &&\n\t\t\tthis.#isCellBelowVisible(cell) &&\n\t\t\tthis.#isCellLeftVisible(cell) &&\n\t\t\tthis.#isCellRightVisible(cell);\n\t}\n\n\t#getVisibleRowCount = () => {\n\t\tconst bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\t\tconst viewportHeight = bodyViewport.clientHeight - (bodyViewport.querySelector('thead')?.offsetHeight || 0);\n\t\tconst rowHeight = this.#sheet.rowManager.getRowHeight();\n\n\t\t// ๋ทฐํฌํธ ๋์ด์ ๋ค์ด์ค๋ ํ ๊ฐ์ ๊ณ์ฐ (์์์ ๋ฒ๋ฆผ)\n\t\treturn Math.max(1, Math.floor(viewportHeight / rowHeight));\n\t}\n\n\t#initEvents() {\n\t\tthis.#sheet.addEventListener('mousedown', (e) => {\n\t\t\tif (e.button !== 0) return;\n\t\t\tconst cell = e.target.closest('td, th');\n\t\t\tif (!cell) return;\n\t\t\tif (cell.dataset.index === undefined || cell.dataset.col === undefined) return;\n\t\t\tthis.currentCell = cell;\n\t\t});\n\n\t\tthis.#sheet.addEventListener('keydown', (e) => {\n\t\t\tif ([\"Enter\", \"Tab\", \"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"].includes(e.code)) {\n\t\t\t\tthis.moveCell(e);\n\t\t\t}\n\t\t});\n\t}\n}","// ui/col/ColResizer.js\nimport { trace } from \"@nopeer\";\nimport { COLLAPSED_WIDTH } from \"@/layout/core/TableCompiler.js\";\n\nconst RESIZE_OFFSET = 2; // ๐ฏ ๋ฆฌ์ฌ์ด์ฆ ๊ฐ์ง ์์ญ ์คํ์
์ ์๋จ์ผ๋ก ์ถ์ถ\n\nexport class ColResizer {\n #sheet;\n #host;\n #panel;\n #tooltip;\n\n #targetColIndex = null;\n #nextColIndex = null;\n #targetContainerType = null;\n #targetCell = null;\n #startX = 0;\n #startColWidth = 0;\n #nextColStartWidth = 0;\n #startCellWidth = 0;\n #startLeft = 0;\n\n constructor(sheet) {\n this.#sheet = sheet;\n this.#host = sheet.getRootNode().host;\n this.#panel = this.#sheet.querySelector('nine-table-col-resizer-panel');\n\n this.#tooltip = this.#panel.querySelector('.resizer-overlay');\n this.bindEvents();\n }\n\n destroy() {\n this.#sheet.removeEventListener('pointermove', this.#onPointerMove);\n this.#sheet.removeEventListener('pointerdown', this.#onPointerDown);\n this.#sheet.removeEventListener('dblclick', this.#onDblClick);\n }\n\n refreshLayout(containerType = 'body') {\n const containers = Array.from(this.#sheet.querySelectorAll(`.ng-container-${containerType}`));\n if (containers.length === 0) return;\n\n const isFixedContainer = containerType === 'left' || containerType === 'right';\n const isAutoFit = !isFixedContainer && (\n this.#sheet.isAutoFitCol ||\n containers[0].querySelector('table')?.getAttribute('auto-fit-col') === 'true'\n );\n\n if (!isAutoFit) {\n\n const firstColgroup = containers[0].querySelector('table colgroup');\n if (!firstColgroup) return;\n\n let totalWidth = 0;\n const colWidths = {};\n\n Array.from(firstColgroup.querySelectorAll('col')).forEach(col => {\n const colIdx = col.getAttribute('data-col');\n const w = parseInt(col.getAttribute('width'), 10);\n if (!isNaN(w)) {\n colWidths[colIdx] = w;\n totalWidth += w;\n }\n });\n\n containers.forEach(container => {\n const tables = container.querySelectorAll('table');\n\n if (containerType === 'body') {\n tables.forEach(tbl => {\n tbl.style.width = `${totalWidth}px`;\n //tbl.style.minWidth = `${totalWidth}px`;\n });\n } else {\n container.style.flex = `0 0 ${totalWidth}px`;\n container.style.width = `${totalWidth}px`;\n container.style.minWidth = `${totalWidth}px`;\n container.style.maxWidth = `${totalWidth}px`;\n\n tables.forEach(tbl => {\n tbl.style.width = `${totalWidth}px`;\n tbl.style.minWidth = `${totalWidth}px`;\n tbl.style.maxWidth = `${totalWidth}px`;\n\n Object.entries(colWidths).forEach(([colIdx, w]) => {\n tbl.querySelectorAll(`th[data-col=\"${colIdx}\"], td[data-col=\"${colIdx}\"]`).forEach(cell => {\n cell.style.width = `${w}px`;\n cell.style.minWidth = `${w}px`;\n cell.style.maxWidth = `${w}px`;\n });\n });\n });\n }\n });\n } else {\n containers.forEach(container => {\n const tables = container.querySelectorAll('table');\n tables.forEach(tbl => {\n //tbl.style.width = '100%';\n //tbl.style.minWidth = '100%';\n //tbl.style.maxWidth = '';\n });\n });\n }\n\n this.#sheet.querySelector('nine-table-hscrollbar')?.refresh();\n }\n\n setColumnWidth(globalColIndex, width, containerType = null) {\n\n let targetCols = [];\n\n targetCols = Array.from(this.#sheet.querySelectorAll(`table colgroup col[data-col=\"${globalColIndex}\"]`));\n\n if (targetCols.length === 0) return;\n\n const firstContainer = targetCols[0].closest('.ng-container-left, .ng-container-body, .ng-container-right');\n const resolvedContainerType = containerType || (\n firstContainer?.classList.contains('ng-container-left') ? 'left' :\n firstContainer?.classList.contains('ng-container-right') ? 'right' : 'body'\n );\n\n targetCols.forEach(col => {\n col.setAttribute('width', width);\n col.style.width = `${width}px`;\n });\n\n const sourceCol = this.#sheet.sourceTable?.querySelector(`colgroup col[data-col=\"${globalColIndex}\"]`);\n if (sourceCol) {\n sourceCol.setAttribute('width', width);\n sourceCol.style.width = `${width}px`;\n }\n\n this.refreshLayout(resolvedContainerType);\n\n if (resolvedContainerType === 'left' || resolvedContainerType === 'right') {\n this.refreshLayout('body');\n }\n\n this.#sheet.rowManager?.refresh();\n }\n\n #checkIsAutoFit(targetCell) {\n if (this.#sheet.isAutoFitCol) return true;\n const table = targetCell?.closest('table');\n if (table && table.getAttribute('auto-fit-col') === 'true') return true;\n return false;\n }\n\n bindEvents() {\n this.#sheet.addEventListener('pointermove', this.#onPointerMove);\n //this.#sheet.addEventListener('pointerdown', this.#onPointerDown);\n //this.#sheet.addEventListener('dblclick', this.#onDblClick);\n\n this.#sheet.addDebounseEventListener('dblclick', this.#onDblClick, 'pointerdown', this.#onPointerDown);\n }\n\n #getContainerType(cell) {\n const container = cell.closest('.ng-container-left, .ng-container-body, .ng-container-right');\n if (!container) return null;\n if (container.classList.contains('ng-container-left')) return 'left';\n if (container.classList.contains('ng-container-right')) return 'right';\n return 'body';\n }\n\n #onPointerMove = (e) => {\n\n\n const headerPart = e.target.closest('thead');\n if (!headerPart) return;\n\n const cell = e.target.closest('th, td');\n\n headerPart.querySelectorAll('.resizable-edge').forEach(el => {\n if (el !== cell) el.classList.remove('resizable-edge');\n });\n\n if (!cell || cell.dataset.col === undefined) return;\n if (cell.getAttribute('collapsed') === 'true') return;\n\n const rect = cell.getBoundingClientRect();\n const offsetX = e.clientX - rect.left;\n const isLeftEdge = offsetX <= RESIZE_OFFSET;\n const isRightEdge = (rect.width - offsetX) <= RESIZE_OFFSET;\n\n if (isLeftEdge) {\n const prevCell = cell.previousElementSibling;\n if (!prevCell || prevCell.getAttribute('collapsed') === 'true') {\n cell.classList.remove('resizable-edge');\n return;\n }\n }\n\n if (isLeftEdge || isRightEdge) {\n cell.classList.add('resizable-edge');\n } else {\n cell.classList.remove('resizable-edge');\n }\n };\n\n #onPointerDown = (e) => {\n\n const headerPart = e.actualTarget.closest('thead');\n if (!headerPart) return;\n\n const cell = e.actualTarget.closest('th, td');\n\n if (!cell || !cell.classList.contains('resizable-edge')) return;\n\n\n\n e.preventDefault();\n const rect = cell.getBoundingClientRect();\n const offsetX = e.clientX - rect.left;\n\n let targetCell = cell;\n\n if (offsetX <= RESIZE_OFFSET) {\n const prevCell = cell.previousElementSibling;\n if (prevCell && prevCell.dataset.col !== undefined && prevCell.getAttribute('collapsed') !== 'true') {\n targetCell = prevCell;\n } else if (!cell.previousElementSibling) {\n return;\n }\n }\n\n this.#targetCell = targetCell;\n this.#targetContainerType = this.#getContainerType(targetCell);\n\n const container = this.#sheet.querySelector(`.ng-container-${this.#targetContainerType}`);\n if (!container) return;\n\n const baseColIndex = parseInt(targetCell.dataset.col, 10);\n const colSpan = targetCell.colSpan || 1;\n this.#targetColIndex = baseColIndex + colSpan - 1;\n\n const isAutoFit = this.#checkIsAutoFit(targetCell);\n if (isAutoFit) {\n this.#nextColIndex = this.#targetColIndex + 1;\n const nextColEl = container.querySelector(`col[data-col=\"${this.#nextColIndex}\"]`);\n if (nextColEl) {\n this.#nextColStartWidth = parseInt(nextColEl.getAttribute('width'), 10) || 100;\n } else {\n this.#nextColIndex = null;\n }\n } else {\n this.#nextColIndex = null;\n }\n\n const targetRect = targetCell.getBoundingClientRect();\n const sheetRect = this.#sheet.getBoundingClientRect();\n\n this.#startCellWidth = targetRect.width;\n this.#startLeft = targetRect.left - sheetRect.left;\n\n const targetColEl = container.querySelector(`col[data-col=\"${this.#targetColIndex}\"]`);\n const attrW = targetColEl?.getAttribute('width');\n this.#startColWidth = (attrW && !isNaN(parseInt(attrW, 10))) ? parseInt(attrW, 10) : targetRect.width / colSpan;\n\n this.#startX = e.clientX;\n\n if (this.#panel) {\n this.#panel.classList.add('active');\n this.#updatePositions(e.clientX);\n }\n\n window.addEventListener('pointermove', this.#onDragMove);\n window.addEventListener('pointerup', this.#onDragEnd, { once: true });\n };\n\n #updatePositions(clientX) {\n let diff = clientX - this.#startX;\n const isAutoFit = this.#checkIsAutoFit(this.#targetCell);\n\n if (isAutoFit && this.#nextColIndex !== null) {\n const maxDiff = this.#nextColStartWidth - COLLAPSED_WIDTH;\n const minDiff = -(this.#startColWidth - COLLAPSED_WIDTH);\n diff = Math.max(minDiff, Math.min(diff, maxDiff));\n }\n\n const currentColWidth = Math.max(COLLAPSED_WIDTH, this.#startColWidth + diff);\n\n const targetRect = this.#targetCell.getBoundingClientRect();\n let realCellWidth = clientX - targetRect.left;\n\n if (isAutoFit && this.#nextColIndex !== null) {\n const maxCellWidth = this.#startCellWidth + (this.#nextColStartWidth - COLLAPSED_WIDTH);\n realCellWidth = Math.min(realCellWidth, maxCellWidth);\n }\n\n const currentCellWidth = Math.max(COLLAPSED_WIDTH, realCellWidth);\n\n if (this.#panel) {\n this.#panel.style.setProperty('--col-resizer-tooltip-left', `${this.#startLeft}px`);\n this.#panel.style.setProperty('--col-resizer-tooltip-width', `${currentCellWidth}px`);\n }\n\n const sizeBadge = this.#tooltip?.querySelector('.size-badge');\n if (sizeBadge) {\n sizeBadge.textContent = `${Math.round(currentColWidth)}px`;\n }\n }\n\n #onDragMove = (e) => {\n this.#updatePositions(e.clientX);\n };\n\n #onDragEnd = (e) => {\n window.removeEventListener('pointermove', this.#onDragMove);\n\n const diff = e.clientX - this.#startX;\n const isAutoFit = this.#checkIsAutoFit(this.#targetCell);\n let finalWidth = 0;\n\n if (isAutoFit && this.#nextColIndex !== null) {\n let newColWidth = Math.max(COLLAPSED_WIDTH, this.#startColWidth + diff);\n let newNextWidth = this.#startColWidth + this.#nextColStartWidth - newColWidth;\n\n if (newNextWidth < COLLAPSED_WIDTH) {\n newNextWidth = COLLAPSED_WIDTH;\n newColWidth = this.#startColWidth + this.#nextColStartWidth - COLLAPSED_WIDTH;\n }\n\n this.setColumnWidth(this.#targetColIndex, newColWidth, this.#targetContainerType);\n this.setColumnWidth(this.#nextColIndex, newNextWidth, this.#targetContainerType);\n finalWidth = newColWidth;\n } else {\n const newColWidth = Math.max(COLLAPSED_WIDTH, this.#startColWidth + diff);\n if (this.#targetColIndex !== null && this.#targetContainerType) {\n this.setColumnWidth(this.#targetColIndex, newColWidth, this.#targetContainerType);\n finalWidth = newColWidth;\n }\n }\n\n if (this.#targetCell) {\n const targetCell = this.#targetCell;\n if (targetCell.getAttribute('collapsed') !== 'true' && finalWidth > 20) {\n targetCell.dataset.expandWidth = String(finalWidth);\n }\n }\n\n if (this.#panel) {\n this.#tooltip?.classList.add('fade-out');\n setTimeout(() => {\n this.#panel.classList.remove('active');\n this.#tooltip?.classList.remove('fade-out');\n }, 150);\n }\n\n this.#targetColIndex = null;\n this.#nextColIndex = null;\n this.#targetContainerType = null;\n this.#targetCell = null;\n };\n\n #onDblClick = (e) => {\n\n const targetEl = e.target;\n let cell = targetEl.closest('th, td');\n if (!cell || !cell.classList.contains('resizable-edge')) return;\n\n const rect = cell.getBoundingClientRect();\n const offsetX = e.clientX - rect.left;\n\n if (offsetX <= RESIZE_OFFSET) {\n cell = cell.previousElementSibling;\n }\n\n const baseColIndex = parseInt(cell.dataset.col, 10);\n const tbodyCell = this.#sheet.querySelector(`tbody.body [data-col=\"${baseColIndex}\"]`);\n if (!tbodyCell || !tbodyCell.dataset.bind || tbodyCell.classList.contains(\"CELL-RADIO\")) return;\n\n let extraPadding = 0;\n Array.from(tbodyCell.firstElementChild.children).forEach(($el) => {\n switch ($el.tagName) {\n case 'SPAN': extraPadding += 8; break;\n case 'DIV': extraPadding += 8; break;\n case 'BUTTON': extraPadding += 32; break;\n case 'SELECT': extraPadding += 32; break;\n case 'INPUT':\n switch (($el.type || 'text').toLowerCase()) {\n // 1. ์ฒดํฌ๋ฐ์ค / ๋ผ๋์ค (๋น๊ต์ ์ข์ ์์ญ)\n case 'checkbox':\n case 'radio':\n extraPadding += 12;\n break;\n\n // 2. ๋ฒํผ ๊ณ์ด input\n case 'button':\n case 'submit':\n case 'reset':\n case 'image':\n extraPadding += 16;\n break;\n\n // 3. ํน์ ์์ ฏ (์ปฌ๋ฌ, ํ์ผ, ์ฌ๋ผ์ด๋)\n case 'color':\n case 'file':\n case 'range':\n extraPadding += 24;\n break;\n\n // 4. ํ๋ฉด์ ์ ๋ณด์ด๋ hidden ํ๋\n case 'hidden':\n extraPadding += 0;\n break;\n\n // 5. ํ
์คํธ ๋ฐ ์ซ์, ๋ ์ง ๋ฑ ์ผ๋ฐ ์
๋ ฅ ํ๋ (๊ธฐ๋ณธ๊ฐ)\n case 'text':\n case 'search':\n case 'tel':\n case 'url':\n case 'email':\n case 'password':\n case 'number':\n case 'date':\n case 'time':\n case 'datetime-local':\n case 'month':\n case 'week':\n default:\n extraPadding += 16;\n break;\n }\n break;\n }\n });\n\n const fieldIdx = this.#host.fields.get().indexOf(tbodyCell.dataset.bind);\n\n const computedStyle = window.getComputedStyle(tbodyCell);\n const font = computedStyle.font || '12px sans-serif';\n\n const headerText = cell.innerText || \"\";\n const headerSize = nine.measureTextSize(headerText, font);\n let maxTextWidth = (headerSize.width || 0) + 16;\n\n this.#host.execute(() => {\n\n this.#sheet.view.getArray().forEach((record, idx) => {\n const val = String(tbodyCell.dataset.expr ? this.#host.exprEngine.evaluate(tbodyCell.dataset.expr, record, idx) : record.v[fieldIdx] ?? \"\").trim();\n const size = nine.measureTextSize(val, font);\n if (size.width && size.width > maxTextWidth) {\n maxTextWidth = size.width;\n }\n });\n\n const calculatedWidth = Math.max(32, Math.min(400, Math.ceil(maxTextWidth) + extraPadding));\n\n this.setColumnWidth(tbodyCell.dataset.col, calculatedWidth, this.#getContainerType(cell));\n })\n };\n}\n\n\nexport class ColResizerPanel extends HTMLElement {\n #target;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n\n this.#renderer();\n }\n\n #renderer = () => {\n this.innerHTML = `\n <div class=\"resizer-overlay\">\n <span class=\"size-badge\">0px</span>\n </div>\n `;\n };\n}\n\nif (!customElements.get('nine-table-col-resizer-panel')) {\n customElements.define(\"nine-table-col-resizer-panel\", ColResizerPanel);\n}\n","// ui/col/ColMover.js\nimport { trace } from \"@nopeer\";\n\nexport class ColMover {\n #sheet;\n #grip;\n #indi;\n\n #isDragging = false;\n #sourceCell = null;\n #sourceColIndex = null;\n #targetColIndex = null;\n #shiftX = 0;\n #timer = null;\n\n constructor(sheet) {\n this.#sheet = sheet;\n this.#grip = this.#sheet.querySelector('.ng-col-mover-grip');\n this.#indi = this.#sheet.querySelector('.ng-col-mover-indi');\n this.bindEvents();\n }\n\n bindEvents() {\n this.#sheet.addEventListener('pointerdown', this.#onPointerDown);\n }\n\n #checkIsMovable() {\n const host = this.#sheet.getRootNode()?.host;\n return this.#sheet.getAttribute('col-movable') === 'true' || host?.getAttribute('col-movable') === 'true';\n }\n\n #getDeepElementFromPoint(x, y) {\n const root = this.#sheet.getRootNode();\n let el = root.elementFromPoint ? root.elementFromPoint(x, y) : document.elementFromPoint(x, y);\n\n while (el && el.shadowRoot && el.shadowRoot.elementFromPoint) {\n const nested = el.shadowRoot.elementFromPoint(x, y);\n if (!nested || nested === el) break;\n el = nested;\n }\n\n return el;\n }\n\n #getColGroupRange(cell) {\n if (!cell || cell.dataset.col === undefined) return null;\n\n const startCol = parseInt(cell.dataset.col, 10);\n const colSpan = cell.colSpan || 1;\n const endCol = startCol + colSpan - 1;\n const rowIndex = cell.closest('tr')?.sectionRowIndex ?? 0;\n\n const table = cell.closest('table');\n if (!table) return { startCol, colSpan, endCol, rowIndex, isGroup: false, parentGroupRange: null, isValidGroup: true };\n\n const headerCells = table.querySelectorAll('thead th, thead td');\n let hasStrictChildren = false;\n let isValidGroup = true;\n let parentGroupRange = null;\n\n for (const subCell of headerCells) {\n if (subCell === cell || subCell.dataset.col === undefined) continue;\n\n const subStart = parseInt(subCell.dataset.col, 10);\n const subSpan = subCell.colSpan || 1;\n const subEnd = subStart + subSpan - 1;\n const subRowIndex = subCell.closest('tr')?.sectionRowIndex ?? 0;\n\n if (subRowIndex < rowIndex && subStart <= startCol && subEnd >= endCol && subSpan > colSpan) {\n if (!parentGroupRange) {\n parentGroupRange = { startCol: subStart, endCol: subEnd };\n } else {\n parentGroupRange.startCol = Math.max(parentGroupRange.startCol, subStart);\n parentGroupRange.endCol = Math.min(parentGroupRange.endCol, subEnd);\n }\n }\n\n const isOverlap = !(subEnd < startCol || subStart > endCol);\n if (isOverlap) {\n const isFullyContained = (subStart >= startCol && subEnd <= endCol);\n\n if (isFullyContained) {\n if (subSpan < colSpan) {\n hasStrictChildren = true;\n }\n } else if (subStart < startCol || subEnd > endCol) {\n if (!(subStart <= startCol && subEnd >= endCol)) {\n isValidGroup = false;\n }\n }\n }\n }\n\n const isRealGroup = hasStrictChildren && isValidGroup;\n\n return {\n startCol,\n colSpan: isRealGroup ? colSpan : 1,\n endCol: isRealGroup ? endCol : startCol,\n rowIndex,\n isGroup: isRealGroup,\n parentGroupRange,\n isValidGroup\n };\n }\n\n #createGroupHeaderPreview(cell) {\n const groupRange = this.#getColGroupRange(cell);\n if (!groupRange) return null;\n\n const { startCol, endCol, isGroup } = groupRange;\n\n // ํต์ฌ: ํ
์ด๋ธ์ด ์ฌ๋ฌ ๊ฐ์ธ ๊ตฌ์กฐ์ด๋ฏ๋ก cell์ด ์ํ ๋ฐ๋ก ๊ทธ ํ
์ด๋ธ์ ์ง์ ๊ฐ์ ธ์ต๋๋ค.\n const origTable = cell.closest('table');\n if (!origTable) return null;\n\n let minLeft = Infinity, maxRight = -Infinity, minTop = Infinity, maxBottom = -Infinity;\n const targetCells = [];\n\n origTable.querySelectorAll('thead th, thead td').forEach(c => {\n if (c.dataset.col === undefined) return;\n const cCol = parseInt(c.dataset.col, 10);\n const cSpan = c.colSpan || 1;\n const cEnd = cCol + cSpan - 1;\n\n const isTarget = isGroup\n ? (cCol >= startCol && cEnd <= endCol)\n : (c === cell);\n\n if (isTarget) {\n const rect = c.getBoundingClientRect();\n minLeft = Math.min(minLeft, rect.left);\n maxRight = Math.max(maxRight, rect.right);\n minTop = Math.min(minTop, rect.top);\n maxBottom = Math.max(maxBottom, rect.bottom);\n\n const computedStyle = window.getComputedStyle(c);\n targetCells.push({ el: c, rect, style: computedStyle });\n }\n });\n\n if (targetCells.length === 0) return null;\n\n const groupWidth = maxRight - minLeft;\n const groupHeight = maxBottom - minTop;\n\n const headerContent = document.createElement('div');\n headerContent.className = 'grip-header-content';\n headerContent.style.position = 'relative';\n headerContent.style.width = `${groupWidth}px`;\n headerContent.style.height = `${groupHeight}px`;\n\n targetCells.forEach(({ el, rect, style }) => {\n const clonedCell = el.cloneNode(true);\n\n clonedCell.style.position = 'absolute';\n clonedCell.style.left = `${rect.left - minLeft}px`;\n clonedCell.style.top = `${rect.top - minTop}px`;\n\n clonedCell.style.width = `${rect.width}px`;\n clonedCell.style.minWidth = `${rect.width}px`;\n clonedCell.style.maxWidth = 'none';\n\n clonedCell.style.height = `${rect.height}px`;\n clonedCell.style.boxSizing = 'border-box';\n clonedCell.style.margin = '0';\n\n clonedCell.style.backgroundColor = style.backgroundColor !== 'transparent' && style.backgroundColor !== 'rgba(0, 0, 0, 0)'\n ? style.backgroundColor\n : '#f9fafb';\n clonedCell.style.color = style.color;\n clonedCell.style.font = style.font;\n clonedCell.style.fontWeight = style.fontWeight;\n clonedCell.style.fontSize = style.fontSize;\n clonedCell.style.textAlign = style.textAlign;\n clonedCell.style.padding = style.padding;\n clonedCell.style.border = style.border;\n clonedCell.style.borderRight = style.borderRight;\n clonedCell.style.borderBottom = style.borderBottom;\n clonedCell.style.display = 'flex';\n clonedCell.style.alignItems = 'center';\n clonedCell.style.justifyContent = style.textAlign === 'center' ? 'center' : (style.textAlign === 'right' ? 'flex-end' : 'flex-start');\n\n headerContent.appendChild(clonedCell);\n });\n\n return {\n element: headerContent,\n bounds: {\n left: minLeft,\n right: maxRight,\n top: minTop,\n bottom: maxBottom,\n width: groupWidth,\n height: groupHeight\n }\n };\n }\n\n #onPointerDown = (e) => {\n if (!this.#checkIsMovable()) return;\n\n const headerPart = e.target.closest('.ng-sheet-header');\n if (!headerPart) return;\n\n const cell = e.target.closest('th, td');\n if (!cell || cell.classList.contains('resizable-edge') || ['INPUT', 'BUTTON'].includes(e.target.tagName)) return;\n if (cell.dataset.col === undefined) return;\n\n e.preventDefault();\n\n const startX = e.clientX;\n const startY = e.clientY;\n\n const cancelTimer = () => {\n if (this.#timer) {\n clearTimeout(this.#timer);\n this.#timer = null;\n }\n window.removeEventListener('pointermove', onPointerMovePending);\n window.removeEventListener('pointerup', cancelTimer);\n window.removeEventListener('pointercancel', cancelTimer);\n };\n\n const onPointerMovePending = (moveEvent) => {\n const dist = Math.hypot(moveEvent.clientX - startX, moveEvent.clientY - startY);\n if (dist > 5) {\n cancelTimer();\n }\n };\n\n this.#timer = setTimeout(() => {\n cancelTimer();\n this.#startDrag(e, cell);\n }, 500);\n\n window.addEventListener('pointermove', onPointerMovePending);\n window.addEventListener('pointerup', cancelTimer, { once: true });\n window.addEventListener('pointercancel', cancelTimer, { once: true });\n };\n\n #startDrag(e, cell) {\n if (this.#isDragging) return;\n\n const preview = this.#createGroupHeaderPreview(cell);\n if (!preview) return;\n\n this.#isDragging = true;\n this.#sourceCell = cell;\n this.#sourceColIndex = parseInt(cell.dataset.col, 10);\n\n const sheetRect = this.#sheet.getBoundingClientRect();\n const { bounds, element } = preview;\n\n this.#shiftX = e.clientX - bounds.left;\n\n if (this.#grip) {\n this.#grip.replaceChildren(element);\n\n const relativeTop = bounds.top - sheetRect.top;\n const fullHeight = sheetRect.height - relativeTop;\n\n this.#grip.style.width = `${bounds.width}px`;\n this.#grip.style.height = `${fullHeight}px`;\n this.#grip.style.top = `${relativeTop}px`;\n this.#grip.style.display = 'block';\n\n this.#updateGripPosition(e.clientX);\n }\n\n document.body.style.cursor = 'move';\n\n window.addEventListener('pointermove', this.#onPointerMove);\n window.addEventListener('pointerup', this.#onPointerUp, { once: true });\n }\n\n #onPointerMove = (e) => {\n if (!this.#isDragging) return;\n\n this.#updateGripPosition(e.clientX);\n\n if (this.#grip) this.#grip.style.pointerEvents = 'none';\n if (this.#indi) this.#indi.style.pointerEvents = 'none';\n\n const targetElement = this.#getDeepElementFromPoint(e.clientX, e.clientY);\n const targetCell = targetElement?.closest('.ng-sheet-header th, .ng-sheet-header td');\n\n if (targetCell && targetCell.dataset.col !== undefined) {\n const targetColIndex = parseInt(targetCell.dataset.col, 10);\n const sheetRect = this.#sheet.getBoundingClientRect();\n const table = targetCell.closest('table');\n\n let colMinLeft = Infinity;\n let colMaxRight = -Infinity;\n\n if (table) {\n table.querySelectorAll('thead th, thead td').forEach(c => {\n if (c.dataset.col === undefined) return;\n const cCol = parseInt(c.dataset.col, 10);\n const cSpan = c.colSpan || 1;\n const cEnd = cCol + cSpan - 1;\n\n if (cCol <= targetColIndex && cEnd >= targetColIndex) {\n const cRect = c.getBoundingClientRect();\n colMinLeft = Math.min(colMinLeft, cRect.left);\n colMaxRight = Math.max(colMaxRight, cRect.right);\n }\n });\n }\n\n if (colMinLeft === Infinity) {\n const rect = targetCell.getBoundingClientRect();\n colMinLeft = rect.left;\n colMaxRight = rect.right;\n }\n\n const midX = colMinLeft + ((colMaxRight - colMinLeft) / 2);\n let calculatedTargetCol = 0;\n let indicatorLeft = 0;\n\n if (e.clientX < midX) {\n calculatedTargetCol = targetColIndex;\n indicatorLeft = colMinLeft - sheetRect.left;\n } else {\n const colSpan = targetCell.colSpan || 1;\n calculatedTargetCol = targetColIndex + colSpan;\n indicatorLeft = colMaxRight - sheetRect.left;\n }\n\n const sourceGroup = this.#getColGroupRange(this.#sourceCell);\n const movingSpan = sourceGroup.colSpan;\n\n const sourceRowStart = sourceGroup.rowIndex;\n const sourceRowSpan = this.#sourceCell.rowSpan || 1;\n const sourceRowEnd = sourceRowStart + sourceRowSpan - 1;\n\n const targetRowStart = targetCell.closest('tr')?.sectionRowIndex ?? 0;\n const targetRowSpan = targetCell.rowSpan || 1;\n const targetRowEnd = targetRowStart + targetRowSpan - 1;\n\n const isRowSpanCompatible = !(sourceRowEnd < targetRowStart || sourceRowStart > targetRowEnd);\n\n let isOutOfBoundsOfParent = false;\n if (sourceGroup.parentGroupRange) {\n const { startCol: pStart, endCol: pEnd } = sourceGroup.parentGroupRange;\n if (calculatedTargetCol < pStart || (calculatedTargetCol + movingSpan - 1) > pEnd) {\n isOutOfBoundsOfParent = true;\n }\n }\n\n let isDroppingInsideOtherGroup = false;\n if (table) {\n const spannedCells = table.querySelectorAll('thead th[colspan], thead td[colspan]');\n\n for (const sCell of spannedCells) {\n if (sCell === this.#sourceCell) continue;\n\n const sRowStart = sCell.closest('tr')?.sectionRowIndex ?? 0;\n const sRowSpan = sCell.rowSpan || 1;\n const sRowEnd = sRowStart + sRowSpan - 1;\n\n const isVerticalOverlap = !(sourceRowEnd < sRowStart || sourceRowStart > sRowEnd);\n if (!isVerticalOverlap) continue;\n\n const sStart = parseInt(sCell.dataset.col, 10);\n const sSpan = sCell.colSpan || 1;\n const sEnd = sStart + sSpan - 1;\n\n if (calculatedTargetCol > sStart && calculatedTargetCol < sEnd + 1) {\n isDroppingInsideOtherGroup = true;\n break;\n }\n\n const moveEndCol = calculatedTargetCol + movingSpan - 1;\n const isCrossIntersecting = (\n (calculatedTargetCol > sStart && calculatedTargetCol <= sEnd && moveEndCol > sEnd) ||\n (calculatedTargetCol < sStart && moveEndCol >= sStart && moveEndCol < sEnd)\n );\n\n if (isCrossIntersecting) {\n isDroppingInsideOtherGroup = true;\n break;\n }\n }\n }\n\n const isSelfGroup = (\n calculatedTargetCol >= sourceGroup.startCol &&\n calculatedTargetCol <= sourceGroup.endCol + 1\n );\n\n const isInvalidMove = !isRowSpanCompatible || isSelfGroup || isOutOfBoundsOfParent || isDroppingInsideOtherGroup || !sourceGroup.isValidGroup;\n\n if (isInvalidMove) {\n this.#targetColIndex = null;\n if (this.#indi) this.#indi.style.display = 'none';\n if (this.#grip) this.#grip.classList.add('invalid');\n } else {\n this.#targetColIndex = calculatedTargetCol;\n if (this.#grip) this.#grip.classList.remove('invalid');\n\n if (this.#indi) {\n const headerPart = targetCell.closest('.ng-sheet-header');\n const headerRect = headerPart.getBoundingClientRect();\n const relativeTop = headerRect.top - sheetRect.top;\n const fullHeight = sheetRect.height - relativeTop;\n\n this.#indi.style.top = `${relativeTop}px`;\n this.#indi.style.height = `${fullHeight}px`;\n this.#indi.style.left = `${indicatorLeft - 1}px`;\n this.#indi.style.display = 'block';\n }\n }\n } else {\n if (this.#indi) this.#indi.style.display = 'none';\n if (this.#grip) this.#grip.classList.add('invalid');\n this.#targetColIndex = null;\n }\n };\n\n #updateGripPosition(clientX) {\n if (!this.#grip) return;\n const sheetRect = this.#sheet.getBoundingClientRect();\n const left = clientX - sheetRect.left - this.#shiftX;\n this.#grip.style.left = `${left}px`;\n }\n\n #onPointerUp = (e) => {\n if (!this.#isDragging) return;\n\n window.removeEventListener('pointermove', this.#onPointerMove);\n document.body.style.cursor = '';\n\n if (this.#grip) {\n this.#grip.style.display = 'none';\n this.#grip.replaceChildren();\n }\n if (this.#indi) this.#indi.style.display = 'none';\n\n if (\n this.#targetColIndex !== null &&\n this.#sourceColIndex !== null &&\n this.#targetColIndex !== this.#sourceColIndex &&\n this.#targetColIndex !== this.#sourceColIndex + 1\n ) {\n this.moveColumn(this.#sourceColIndex, this.#targetColIndex);\n }\n\n this.#isDragging = false;\n this.#sourceCell = null;\n this.#sourceColIndex = null;\n this.#targetColIndex = null;\n };\n\n moveColumn(fromColIndex, toColIndex) {\n\n const colgroup = this.#sheet.sourceTable.querySelector('colgroup');\n const targetCol = colgroup.querySelector(`col[data-col=\"${toColIndex}\"]`);\n\n const sourceGroup = this.#getColGroupRange(this.#sourceCell);\n if (!sourceGroup || !sourceGroup.isValidGroup) return;\n\n const spanCount = sourceGroup.colSpan;\n const isInRange = (idx) => idx >= fromColIndex && idx < fromColIndex + spanCount;\n\n // 1. colgroup ๋ด <col> ์ด๋ ๋ฐ fixed ์ค์ \n const targetViewportCol = this.#sheet.querySelector(`.ng-sheet-body-content col[data-col=\"${toColIndex}\"]`);\n const fixedType = targetViewportCol?.closest('.ng-container-left') ? 'left' : targetViewportCol?.closest('.ng-container-right') ? 'right' : null;\n\n colgroup.querySelectorAll('col').forEach(col => {\n if (isInRange(parseInt(col.getAttribute('data-col'), 10))) {\n fixedType ? col.setAttribute('fixed', fixedType) : col.removeAttribute('fixed');\n colgroup.insertBefore(col, targetCol);\n }\n });\n\n ['thead', 'tbody', 'tfoot'].forEach(group => {\n this.#sheet.sourceTable.querySelectorAll(`${group} tr`).forEach(tr => {\n const cells = Array.from(tr.children);\n const targetRowCell = cells.find(c => parseInt(c.dataset.col, 10) >= toColIndex);\n\n cells.forEach(cell => {\n if (isInRange(parseInt(cell.dataset.col, 10))) {\n tr.insertBefore(cell, targetRowCell || null);\n }\n });\n });\n });\n\n this.#sheet.recompileAndRefresh();\n }\n\n destroy() {\n this.#sheet.removeEventListener('pointerdown', this.#onPointerDown);\n }\n}","// ui/col/ColFixManager.js\nimport { trace } from \"@nopeer\";\n\nexport class ColFixManager {\n #sheet;\n\n constructor(sheet) {\n this.#sheet = sheet;\n }\n\n getFixState(targetCell, table) {\n if (!targetCell || !table) return 'none';\n\n const container = targetCell.closest('.ng-container-left, .ng-container-right, .ng-container-body');\n if (container?.classList.contains('ng-container-left')) return 'left';\n if (container?.classList.contains('ng-container-right')) return 'right';\n\n const baseCol = parseInt(targetCell.dataset.col, 10);\n if (!isNaN(baseCol)) {\n const colEl = table.querySelector(`colgroup col[data-col=\"${baseCol}\"]`);\n const fixedAttr = colEl?.getAttribute('fixed');\n if (fixedAttr) return fixedAttr;\n }\n\n return 'none';\n }\n\n canFixColumn(targetCell, table) {\n if (!targetCell || targetCell.tagName !== 'TH' || !table) return false;\n\n const baseCol = parseInt(targetCell.dataset.col, 10);\n const colSpan = targetCell.colSpan || 1;\n if (isNaN(baseCol)) return false;\n\n const targetBoundaryCol = baseCol + colSpan - 1;\n const theadTrs = Array.from(table.querySelectorAll('thead tr'));\n\n if (theadTrs.length <= 1) return true;\n\n for (const tr of theadTrs) {\n const cells = Array.from(tr.querySelectorAll('th, td'));\n let cellBoundaryFound = false;\n\n for (const cell of cells) {\n const cCol = parseInt(cell.dataset.col, 10);\n const cSpan = cell.colSpan || 1;\n const cEndCol = cCol + cSpan - 1;\n\n if (cCol <= targetBoundaryCol && targetBoundaryCol < cEndCol) {\n return false;\n }\n\n if (cEndCol === targetBoundaryCol) {\n cellBoundaryFound = true;\n break;\n }\n }\n\n if (!cellBoundaryFound) return false;\n }\n\n return true;\n }\n\n executeFixToggle(action, targetCell, fixType = 'left') {\n if (!this.#sheet || !targetCell) return;\n\n const sourceTable = this.#sheet.sourceTable;\n if (!sourceTable) return;\n\n const baseCol = parseInt(targetCell.dataset.col, 10);\n const colSpan = targetCell.colSpan || 1;\n const targetColIndex = baseCol + colSpan - 1;\n\n if (isNaN(targetColIndex)) return;\n\n const colgroup = sourceTable.querySelector('colgroup');\n if (!colgroup) return;\n\n const cols = Array.from(colgroup.querySelectorAll('col'));\n\n if (action === 'fix-column') {\n cols.forEach(col => {\n const idx = parseInt(col.getAttribute('data-col'), 10);\n if (idx <= targetColIndex) {\n col.setAttribute('fixed', fixType);\n }\n });\n\n ['thead', 'tbody', 'tfoot'].forEach(group => {\n sourceTable.querySelectorAll(`${group} tr`).forEach(tr => {\n Array.from(tr.children).forEach(cell => {\n const cIdx = parseInt(cell.dataset.col, 10);\n if (!isNaN(cIdx) && cIdx <= targetColIndex) {\n cell.setAttribute('fixed', fixType);\n }\n });\n });\n });\n\n } else if (action === 'unfix-column') {\n let minBaseCol = baseCol;\n let maxEndCol = baseCol + colSpan - 1;\n\n ['thead', 'tbody', 'tfoot'].forEach(group => {\n sourceTable.querySelectorAll(`${group} tr`).forEach((tr, rIdx) => {\n Array.from(tr.children).forEach(cell => {\n const cCol = parseInt(cell.dataset.col, 10);\n const cSpan = cell.colSpan || 1;\n const cEnd = cCol + cSpan - 1;\n const rSpan = cell.rowSpan || 1;\n const trIndex = tr.sectionRowIndex ?? rIdx;\n\n const isVerticalOverlap = !(trIndex + rSpan - 1 < cell.closest('tr').sectionRowIndex || trIndex > (cell.closest('tr').sectionRowIndex + rSpan - 1));\n\n const isHorizontalOverlap = !(cEnd < baseCol || cCol > targetColIndex);\n\n if (isHorizontalOverlap) {\n minBaseCol = Math.min(minBaseCol, cCol);\n maxEndCol = Math.max(maxEndCol, cEnd);\n }\n });\n });\n });\n\n cols.forEach(col => {\n const idx = parseInt(col.getAttribute('data-col'), 10);\n if (idx >= minBaseCol) {\n col.removeAttribute('fixed');\n }\n });\n\n let isBroken = false;\n cols.forEach(col => {\n if (isBroken) {\n col.removeAttribute('fixed');\n } else if (!col.getAttribute('fixed')) {\n isBroken = true;\n }\n });\n\n ['thead', 'tbody', 'tfoot'].forEach(group => {\n sourceTable.querySelectorAll(`${group} tr`).forEach(tr => {\n Array.from(tr.children).forEach(cell => {\n const cIdx = parseInt(cell.dataset.col, 10);\n if (isNaN(cIdx)) return;\n\n const correspondingCol = cols.find(c => parseInt(c.getAttribute('data-col'), 10) === cIdx);\n const isColFixed = correspondingCol?.getAttribute('fixed');\n\n if (isColFixed) {\n cell.setAttribute('fixed', isColFixed);\n } else {\n cell.removeAttribute('fixed');\n }\n });\n });\n });\n }\n\n this.#sheet.recompileAndRefresh?.();\n }\n}","import { NINE_TABLE } from '@/core/constants.js';\nimport { trace } from \"@nopeer\";\n\nexport class NineTableFilterPanel extends HTMLElement {\n\t#sheet;\n\t#host;\n\t#nineTable;\n\t#view;\n\t#button;\n\tcurrentCol = null;\n\n\tconnectedCallback() {\n\t\tthis.#init();\n\t\tdocument.addEventListener(\"mousedown\", this.#closeHandler);\n\t}\n\n\t#init = () => {\n\t\t//setTimeout(() => {\n\t\t\tthis.#renderer();\n\n\t\t\tthis.#sheet = this.closest(\"nine-table-sheet\");\n\t\t\tthis.#host = this.getRootNode().host;\n\n\t\t\tthis.#nineTable = this.querySelector(\"nine-table-simple\");\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.#view = this.#nineTable.shadowRoot.querySelector(\"nine-table-sheet\");\n\t\t\t})\n\n\n\t\t\tthis.querySelector(\".search-box\").addEventListener(\"focusin\", (e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t});\n\t\t\tthis.querySelector(\".search-box\").addEventListener(\"input\", this.#onInput);\n\t\t\tthis.querySelector(\"#chkSelectAll\").addEventListener(\"change\", this.#onSelectAll);\n\t\t\tthis.querySelector(\"#btnOk\").addEventListener(\"click\", this.#onOk);\n\t\t//});\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <input type=\"text\" class=\"search-box\" placeholder=\"Search...\">\n \n <nine-table-simple class=\"filter-list\" theme=\"simple\">\n <table auto-fit-col=\"true\">\n <colgroup>\n <col width=\"32\" fixed=\"left\" />\n <col width=\"180\" />\n <col width=\"0\" fixed=\"right\"/>\n </colgroup>\n <tbody>\n <tr>\n <td cell-type=\"checkbox\" data-bind=\"CHK\"></td>\n <td data-bind=\"DATA2\" html=\"true\"></td>\n <td data-bind=\"DATA\"></td>\n </tr>\n </tbody>\n </table>\n </nine-table-simple>\n\n <div class=\"footer-section\">\n <div class=\"footer-btns\">\n <label><input type=\"checkbox\" id=\"chkSelectAll\" checked> Select All</label>\n <div class=\"btn-group\">\n <button id=\"btnOk\">Apply</button>\n </div>\n </div>\n </div>\n `;\n\t}\n\n\topen(filterBtn) {\n\t\tthis.#button = filterBtn;\n\n\t\tconst cell = filterBtn.closest(\"th, td\");\n\t\tthis.currentCol = cell?.dataset.col;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst sheetRect = this.#sheet.getBoundingClientRect();\n\n\t\tconst panelWidth = this.offsetWidth || 240;\n\t\tlet left = (cellRect.right - sheetRect.left) - panelWidth;\n\t\tlet top = cellRect.bottom - sheetRect.top;\n\n\t\tif (left < 0) {\n\t\t\tleft = Math.max(0, cellRect.left - sheetRect.left);\n\t\t}\n\n\t\tthis.style.left = `${left}px`;\n\t\tthis.style.top = `${top}px`;\n\n\t\tconst searchBox = this.querySelector(\".search-box\");\n\t\tsearchBox.value = \"\";\n\n\n\t\tthis.classList.add(\"active\");\n\t\tthis.classList.add(\"loading\");\n\n\t\tsetTimeout(() => {\n\t\t\ttry {\n\t\t\t\tthis.#loadVirtualFilterItems();\n\t\t\t\tthis.#view.rowManager.scrollToDataRow(0);\n\t\t\t\tsearchBox.focus();\n\t\t\t} finally {\n\t\t\t\tthis.classList.remove(\"loading\");\n\t\t\t}\n\t\t});\n\t}\n\n\t#closeHandler = (e) => {\n\t\tconst path = e.composedPath ? e.composedPath() : [];\n\t\tif (path.includes(this) || (this.#button && path.includes(this.#button))) {\n\t\t\treturn;\n\t\t}\n\t\tthis.close();\n\t};\n\n\tclose() {\n\t\tthis.currentCol = null;\n\t\tthis.classList.remove(\"active\");\n\t\tthis.#button = null;\n\t}\n\n\t#loadVirtualFilterItems() {\n\t\tconst filteredRecords = this.#host.data.getArray();\n\t\tconst targetCols = this.#button?.columns || []; // [{ bind, expr }] ํํ ๋ฐฐ์ด\n\t\tconst fields = this.#host.fields.get() || [];\n\t\tconst activeFilters = this.#sheet.filtering?.filters || {};\n\t\tconst exprEngine = this.#host.exprEngine;\n\n\t\tconst ds = targetCols.flatMap((colInfo) => {\n\t\t\tconst bindKey = colInfo.bind;\n\t\t\tconst exprKey = colInfo.expr;\n\n\t\t\tconst filterKey = bindKey || exprKey; // ์ค์ ํํฐ ํ๋ผ๋ฏธํฐ ํค๋ก ์ฌ์ฉ\n\t\t\tconst fieldIdx = bindKey ? fields.indexOf(bindKey) : -1;\n\t\t\tconst activeSelectedVals = activeFilters[filterKey] || [];\n\n\t\t\tconst uniqueMap = new Map();\n\t\t\tfor (let i = 0; i < filteredRecords.length; i++) {\n\t\t\t\tconst record = filteredRecords[i];\n\t\t\t\tif (!record) continue;\n\n\t\t\t\tlet rawVal = undefined;\n\t\t\t\tif (fieldIdx >= 0 && record.v) {\n\t\t\t\t\trawVal = record.v[fieldIdx];\n\t\t\t\t} else if (bindKey && bindKey.includes(\"data.\")) {\n\t\t\t\t\trawVal = exprEngine ? exprEngine.evaluate(bindKey, record, i) : undefined;\n\t\t\t\t} else if (exprKey && exprEngine) {\n\t\t\t\t\trawVal = exprEngine.evaluate(exprKey, record, i);\n\t\t\t\t}\n\n\t\t\t\tlet displayVal = rawVal;\n\t\t\t\tif (exprKey && exprEngine) {\n\t\t\t\t\tdisplayVal = exprEngine.evaluate(exprKey, record, i);\n\t\t\t\t}\n\n\t\t\t\tif (displayVal !== undefined && displayVal !== null && !uniqueMap.has(displayVal)) {\n\t\t\t\t\tuniqueMap.set(displayVal, {\n\t\t\t\t\t\tv: rawVal, // ๐ก ํํฐ๋ง ๋น๊ต ๊ธฐ์ค (DATA)\n\t\t\t\t\t\tv2: displayVal // ๐ก ํ๋ฉด ์ถ๋ ฅ ๊ธฐ์ค (DATA2)\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst uniqueList = [...uniqueMap.values()];\n\n\t\t\tuniqueList.sort((a, b) => {\n\t\t\t\tconst valA = a.v2;\n\t\t\t\tconst valB = b.v2;\n\n\t\t\t\tif (valA === valB) return 0;\n\t\t\t\tif (valA === undefined || valA === null || valA === '') return 1;\n\t\t\t\tif (valB === undefined || valB === null || valB === '') return -1;\n\n\t\t\t\tconst numA = Number(valA);\n\t\t\t\tconst numB = Number(valB);\n\n\t\t\t\tconst isNumA = !isNaN(numA);\n\t\t\t\tconst isNumB = !isNaN(numB);\n\n\t\t\t\tif (isNumA && isNumB) {\n\t\t\t\t\treturn numA - numB;\n\t\t\t\t}\n\n\t\t\t\treturn String(valA).localeCompare(String(valB));\n\t\t\t});\n\t\t\tactiveSelectedVals.sort((a, b) => { return a > b ? 1 : -1; });\n\n\t\t\treturn uniqueList.map(o => ({\n\t\t\t\tLVL: 2,\n\t\t\t\tDATA: o.v, // ํํฐ๋ง ๋น๊ต์ฉ ๊ฐ\n\t\t\t\tDATA2: (o.v2 === \"\" || o.v2 === null || o.v2 === undefined) ? '<span class=\"empty-value\">(empty)</span>' : o.v2,\n\t\t\t\tCOLNM: filterKey,\n\t\t\t\tCHK: activeSelectedVals.length === 0 || activeSelectedVals.nineBinarySearch(o.v) >= 0 ? \"Y\" : \"N\"\n\t\t\t}));\n\t\t});\n\n\t\tthis.#nineTable.data.set(ds);\n\n\t\tconst selectAllChk = this.querySelector(\"#chkSelectAll\");\n\t\tif (selectAllChk) {\n\t\t\tselectAllChk.checked = ds.length > 0 && ds.every(item => item.CHK === \"Y\");\n\t\t}\n\t}\n\n\t#onOk = () => {\n\t\tthis.#host.loading = true;\n\n\t\tconst filterRecords = this.#view.view.getArray();\n\t\tconst fields = this.#nineTable.data.getHostFields();\n\n\t\tconst checkedRecords = filterRecords.filter(record => {\n\t\t\tconst chk = record.v[fields.indexOf(\"CHK\")];\n\t\t\treturn (chk === \"Y\" || chk === true);\n\t\t});\n\n\t\tconst filterParams = { ...(this.#sheet.filtering?.filters || {}) };\n\n\t\tthis.#button.columns.forEach(colInfo => {\n\t\t\tconst filterKey = colInfo.expr || colInfo.bind;\n\t\t\tconst fieldIdx = colInfo.expr ? fields.indexOf(\"DATA2\") : fields.indexOf(\"DATA\");\n\t\t\tconst selectedVals = checkedRecords.map(r => r.v[fieldIdx]);\n\n\t\t\tif (selectedVals.length > 0) {\n\t\t\t\tfilterParams[filterKey] = selectedVals;\n\t\t\t} else {\n\t\t\t\tdelete filterParams[filterKey];\n\t\t\t}\n\t\t});\n\n\t\tconst totalCount = this.#nineTable.data.count();\n\n\t\tsetTimeout(() => {\n\t\t\ttry {\n\t\t\t\tif (totalCount === checkedRecords.length) {\n\t\t\t\t\tthis.#button.columns.forEach(colInfo => {\n\t\t\t\t\t\tconst filterKey = colInfo.expr || colInfo.bind;\n\t\t\t\t\t\tif (filterKey) this.#sheet.filtering.clear(filterKey);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthis.#sheet.filtering.set(filterParams);\n\t\t\t\t}\n\n\t\t\t\tthis.#sheet.querySelectorAll(\"nine-table-filter-button\").forEach(btn => {\n\t\t\t\t\tbtn.updateFilteredState();\n\t\t\t\t});\n\n\t\t\t\tthis.#sheet.invalidate();\n\t\t\t\tthis.close();\n\t\t\t} finally {\n\t\t\t\tthis.#host.loading = false;\n\t\t\t}\n\t\t});\n\t};\n\n\t#onInput = (e) => {\n\n\t\tconst query = e.target.value.toLowerCase().trim();\n\n\t\tif (!query) {\n\t\t\tthis.#view.filtering.clear();\n\t\t} else {\n\t\t\tconst rawRecords = this.#nineTable.data.getArray();\n\t\t\tconst fields = this.#nineTable.data.getHostFields();\n\t\t\tconst data2Idx = fields.indexOf(\"DATA2\");\n\n\t\t\tconst matchedValues = [];\n\t\t\trawRecords.forEach(record => {\n\t\t\t\tconst val = data2Idx >= 0 && record.v ? record.v[data2Idx] : \"\";\n\t\t\t\tconst textVal = String(val).replace(/<[^>]*>?/gm, '').toLowerCase();\n\n\t\t\t\tif (textVal.includes(query)) {\n\t\t\t\t\tmatchedValues.push(val);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.#view.filtering.set({\n\t\t\t\tDATA2: [...new Set(matchedValues)]\n\t\t\t});\n\t\t}\n\t};\n\n\t#onSelectAll = (e) => {\n\t\tconst isChecked = e.target.checked;\n\t\tconst rawRecords = this.#nineTable?.data?.getArray() || [];\n\t\tconst fields = this.#nineTable.data.getHostFields();\n\t\tconst chkIdx = fields.indexOf(\"CHK\");\n\n\t\tif (chkIdx >= 0) {\n\t\t\trawRecords.forEach(record => {\n\t\t\t\trecord.v[chkIdx] = isChecked ? \"Y\" : \"N\";\n\t\t\t});\n\t\t}\n\n\t\tthis.#nineTable.refresh();\n\t};\n\n\t#onCancel = () => {\n\t\tthis.close();\n\t};\n}\n\nexport class NineTableFilterButton extends HTMLElement {\n\t#sheet;\n\t#columns = null;\n\n\tconnectedCallback() {\n\t\tthis.#sheet = this.closest(\"nine-table-sheet\") || this.getRootNode().host;\n\t\tthis.removeEventListener(\"click\", this.#onClick);\n\t\tthis.addEventListener(\"click\", this.#onClick);\n\t}\n\n\tget columns() {\n\t\tif (this.#columns) return this.#columns;\n\n\t\tconst cell = this.closest(\"th, td\");\n\t\tconst colIndex = cell?.dataset.col;\n\t\tconst sourceTable = this.#sheet.sourceTable;\n\n\t\tconst cols = [];\n\t\tconst seen = new Set();\n\n\t\tif (sourceTable && colIndex !== undefined) {\n\t\t\tsourceTable.querySelectorAll(`tbody [data-col=\"${colIndex}\"]`).forEach($td => {\n\t\t\t\tconst bindKey = $td.dataset.bind;\n\t\t\t\tconst exprKey = $td.dataset.expr;\n\n\t\t\t\tif (bindKey || exprKey) {\n\t\t\t\t\tconst uniqueKey = `${bindKey || ''}_${exprKey || ''}`;\n\t\t\t\t\tif (!seen.has(uniqueKey)) {\n\t\t\t\t\t\tseen.add(uniqueKey);\n\t\t\t\t\t\tcols.push({\n\t\t\t\t\t\t\tbind: bindKey,\n\t\t\t\t\t\t\texpr: exprKey,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.#columns = cols;\n\t\treturn this.#columns;\n\t}\n\n\tupdateFilteredState = () => {\n\t\tconst activeFilters = this.#sheet.filtering?.filters || {};\n\t\tconst isFiltered = this.columns.some(colInfo => {\n\t\t\tconst key = colInfo.expr || colInfo.bind;\n\t\t\treturn key && activeFilters[key] && activeFilters[key].length > 0;\n\t\t});\n\t\tthis.classList.toggle('filtered', isFiltered);\n\t};\n\n\t#onClick = (e) => {\n\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\tconst panel = this.#sheet.querySelector(\"nine-table-filter-panel\");\n\t\tconst cell = this.closest(\"th, td\");\n\t\tconst col = cell.dataset.col;\n\n\t\tif (panel && panel.currentCol === col && panel.classList.contains('active')) {\n\t\t\tpanel.close();\n\t\t} else if (panel) {\n\t\t\tpanel.open(this);\n\t\t}\n\t};\n}\n\nexport class Filtering {\n\t#sheet;\n\t#host;\n\t#isFiltering = false;\n\t#filterPanel = null;\n\t#filters = {};\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = this.#sheet.getRootNode().host;\n\t\tthis.#init();\n\t}\n\n\tget filters() {\n\t\treturn this.#filters;\n\t};\n\n\t#init = () => {\n\t\tthis.#initFilterPanel();\n\t}\n\n\t#initFilterPanel = () => {\n\t\tif (this.#host.tagName.toLowerCase() === \"nine-table-simple\") {\n\t\t\treturn;\n\t\t}\n\n\t\tlet panel = this.#sheet.querySelector(\"nine-table-filter-panel\");\n\t\tif (!panel) {\n\t\t\tpanel = document.createElement(\"nine-table-filter-panel\");\n\t\t\tthis.#sheet.appendChild(panel);\n\t\t}\n\t\tthis.#filterPanel = panel;\n\t}\n\n\tisFiltering() {\n\t\treturn this.#isFiltering;\n\t}\n\n\tclear = (colnm) => {\n\t\tif (colnm) {\n\t\t\tdelete this.#filters[colnm];\n\t\t} else {\n\t\t\tthis.#filters = {};\n\t\t}\n\n\t\tthis.#isFiltering = Object.keys(this.#filters).length > 0;\n\t\tthis.#applyFiltering();\n\n\t\tthis.#sheet.querySelectorAll(\"nine-table-filter-button\").forEach(btn => {\n\t\t\tbtn.updateFilteredState();\n\t\t});\n\t}\n\n\tset = (oFilter) => {\n\n\t\tlet jsonFilter = Array.isArray(oFilter)\n\t\t\t? Object.fromEntries(Object.keys(oFilter[0]).map(k => [k, [...new Set(oFilter.map(item => item[k]))]]))\n\t\t\t: oFilter;\n\n\t\tthis.#filters = jsonFilter;\n\t\tthis.#isFiltering = Object.keys(jsonFilter).length > 0;\n\t\tthis.#sheet.toggleAttribute(\"filtering\", this.#isFiltering);\n\n\t\tthis.#applyFiltering();\n\t}\n\n\t#applyFiltering() {\n\t\tconst hostData = this.#host.data;\n\t\tconst rawRecords = hostData.getArray();\n\t\tconst fields = this.#host.data.getHostFields();\n\t\tconst sheetIndex = this.#sheet.index;\n\t\tconst exprEngine = this.#host.exprEngine;\n\n\t\tconst hasFilters = Object.keys(this.#filters).length > 0;\n\n\t\tif (!hasFilters) {\n\t\t\trawRecords.forEach(record => {\n\t\t\t\tif (record?.m?._?.[NINE_TABLE.META.INDEX.FILTER]) {\n\t\t\t\t\trecord.m._[NINE_TABLE.META.INDEX.FILTER][sheetIndex] = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.#sheet.invalidate();\n\t\t\treturn;\n\t\t}\n\n\t\tconst filterRules = Object.entries(this.#filters).map(([targetKey, allowedValues]) => {\n\t\t\tconst isExpr = targetKey.includes(\"data.\") || targetKey.includes(\"host.\") || targetKey.includes(\"rowItem.v\");\n\t\t\treturn {\n\t\t\t\ttargetKey,\n\t\t\t\tisExpr,\n\t\t\t\tfieldIdx: !isExpr ? fields.indexOf(targetKey) : -1,\n\t\t\t\tallowedSet: new Set(allowedValues)\n\t\t\t};\n\t\t});\n\n\t\trawRecords.forEach((record, recordIdx) => {\n\t\t\tif (!record) return;\n\n\t\t\tif (!record.m._[NINE_TABLE.META.INDEX.FILTER]) {\n\t\t\t\trecord.m._[NINE_TABLE.META.INDEX.FILTER] = [];\n\t\t\t}\n\n\t\t\tlet isPass = true;\n\n\t\t\tfor (let i = 0; i < filterRules.length; i++) {\n\t\t\t\tconst { targetKey, isExpr, fieldIdx, allowedSet } = filterRules[i];\n\t\t\t\tlet val = undefined;\n\n\t\t\t\tif (isExpr && exprEngine) {\n\t\t\t\t\tval = exprEngine.evaluate(targetKey, record, recordIdx);\n\t\t\t\t} else if (fieldIdx >= 0 && record.v) {\n\t\t\t\t\tval = record.v[fieldIdx];\n\t\t\t\t}\n\n\t\t\t\tif (!allowedSet.has(val)) {\n\t\t\t\t\tisPass = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\trecord.m._[NINE_TABLE.META.INDEX.FILTER][sheetIndex] = isPass;\n\t\t});\n\n\t\tthis.#sheet.invalidate();\n\t}\n}\n\nif (!customElements.get('nine-table-filter-panel')) {\n\tcustomElements.define(\"nine-table-filter-panel\", NineTableFilterPanel);\n}\n\nif (!customElements.get('nine-table-filter-button')) {\n\tcustomElements.define(\"nine-table-filter-button\", NineTableFilterButton);\n}","// ui/data/Sorting.js (๋๋ ์ ๋ ฌ ๊ด๋ จ ์์ค)\nimport { trace } from \"@nopeer\";\n\nexport class Sorting {\n\t#sheet;\n\t#host;\n\n\t#columns = [];\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = sheet.getRootNode().host;\n\n\t\tsetTimeout(() => {\n\t\t\tthis.#initEvents();\n\t\t}, 300);\n\t}\n\n\t#initEvents() {\n\n\t\tthis.#sheet.querySelectorAll(\"thead\").forEach($el => {\n\n\t\t\t$el.addEventListener('dblclick', (e) => {\n\n\t\t\t\tconst cell = e.target.closest('th, td');\n\t\t\t\tif (!cell || cell.classList.contains('resizable-edge')) return;\n\n\t\t\t\tif ([\"INPUT\",\"CELL-CHECKBOX\"].includes(e.target.tagName)) return;\n\n\t\t\t\tif (e.offsetX <= 2 || e.offsetX >= cell.offsetWidth - 2) return;\n\n\t\t\t\tconst host = this.#sheet.getRootNode().host;\n\n\t\t\t\thost.loading = true;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.#handleSort(e, cell);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\thost.loading = false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\t#handleSort(e, cell) {\n\t\tconst colIndex = cell.dataset.col;\n\t\tconst tr = cell.closest('tr');\n\t\tconst subRowIndex = tr ? tr.dataset.subrow || String(tr.sectionRowIndex) : '0';\n\n\t\tif (colIndex === undefined) return;\n\n\t\tconst sourceTable = this.#sheet.sourceTable;\n\t\tif (!sourceTable) return;\n\n\t\tlet colName = null;\n\t\tlet exprVal = null;\n\n\t\tsourceTable.querySelectorAll(`tbody [data-col=\"${colIndex}\"]`).forEach($td => {\n\t\t\tif ($td.dataset.bind) {\n\t\t\t\tcolName = $td.dataset.bind;\n\t\t\t}\n\n\t\t\tif ($td.dataset.expr) {\n\t\t\t\texprVal = $td.dataset.expr;\n\t\t\t}\n\t\t});\n\n\t\tif (!colName && !exprVal) return;\n\n\t\tconst isAsc = cell.classList.contains('asc');\n\t\tconst isDesc = cell.classList.contains('desc');\n\n\t\tif (!e.ctrlKey && !e.shiftKey) {\n\t\t\tthis.#columns = [];\n\t\t}\n\n\t\tconst existingColIndex = this.#columns.findIndex(\n\t\t\tm => (m.colIndex === colIndex && m.subRowIndex === subRowIndex) || m.colName === colName\n\t\t);\n\n\t\tconst ruleData = {\n\t\t\tcolIndex,\n\t\t\tsubRowIndex,\n\t\t\tcolname: colName || exprVal,\n\t\t\tcolName: colName || exprVal,\n\t\t\texpr: exprVal, // ๐ก expr ๊ท์น ๋ณด๊ด\n\t\t\tasc: true,\n\t\t\t\"expr-func\": exprVal ? (record, idx) => this.#host.exprEngine(exprVal, record, idx) : null\n\t\t};\n\n\t\tif (!isAsc && !isDesc) {\n\t\t\tif (existingColIndex >= 0) {\n\t\t\t\tthis.#columns[existingColIndex].asc = true;\n\t\t\t} else {\n\t\t\t\tthis.#columns.push({ ...ruleData, asc: true });\n\t\t\t}\n\t\t} else if (isAsc) {\n\t\t\tif (existingColIndex >= 0) {\n\t\t\t\tthis.#columns[existingColIndex].asc = false;\n\t\t\t} else {\n\t\t\t\tthis.#columns.push({ ...ruleData, asc: false });\n\t\t\t}\n\t\t} else {\n\t\t\tthis.#columns = this.#columns.filter(\n\t\t\t\tm => !((m.colIndex === colIndex && m.subRowIndex === subRowIndex) || m.colName === colName)\n\t\t\t);\n\t\t}\n\n\t\tthis.#applySorting(cell);\n\t}\n\n\t#applySorting(cell) {\n\n\t\tthis.#sheet.view.setSorting(this.#columns);\n\t\tthis.#syncHeaderUI();\n\t\tthis.#sheet.invalidate();\n\t\trequestAnimationFrame(() => {\n\t\tconst cells = this.#sheet.querySelectorAll('tbody.body th, tbody.body td');\n\n\t\tcells.forEach($td => {\n\t\t\t$td.classList.remove('sorting-anim-asc', 'sorting-anim-desc', 'sorting-anim-none');\n\n\t\t\tif (cell.classList.contains('asc')) {\n\t\t\t\t$td.classList.add('sorting-anim-asc');\n\t\t\t} else if (cell.classList.contains('desc')) {\n\t\t\t\t$td.classList.add('sorting-anim-desc');\n\t\t\t} else {\n\t\t\t\t$td.classList.add('sorting-anim-none');\n\t\t\t}\n\t\t});\n\n\t\trequestAnimationFrame(() => {\n\t\t\tcells.forEach($td => {\n\t\t\t\t$td.classList.remove('sorting-anim-asc', 'sorting-anim-desc', 'sorting-anim-none');\n\t\t\t});\n\t\t});\n\t\t});\n\t}\n\n\t#syncHeaderUI() {\n\t\tthis.#sheet.querySelectorAll('thead th, thead td').forEach(el => {\n\t\t\tel.classList.remove('asc', 'desc');\n\t\t});\n\n\t\tif (this.#columns.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#columns.forEach(colRule => {\n\t\t\tconst { colIndex, subRowIndex, asc } = colRule;\n\n\t\t\tif (colIndex !== undefined) {\n\t\t\t\tlet selector = `thead [data-col=\"${colIndex}\"]`;\n\t\t\t\tif (subRowIndex !== undefined) {\n\t\t\t\t\tselector = `thead tr[data-subrow=\"${subRowIndex}\"] [data-col=\"${colIndex}\"]`;\n\t\t\t\t}\n\n\t\t\t\tconst targetHeaderCells = this.#sheet.querySelectorAll(selector);\n\t\t\t\ttargetHeaderCells.forEach(cell => {\n\t\t\t\t\tcell.classList.add(asc ? 'asc' : 'desc');\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\trestore() {\n\t\tthis.#columns = [];\n\t\tif (this.#sheet.view) {\n\t\t\tthis.#sheet.view.resetSorting();\n\t\t}\n\n\t\tthis.#syncHeaderUI();\n\t\tthis.#sheet.rowManager?.refresh(true);\n\t}\n}","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\nimport {Grouping} from \"@/data/Grouping.js\";\n\nexport class SheetView {\n\t#sheet;\n\t#host;\n\t#sortingColumns = [];\n\t#filterRules = [];\n\t#viewIndexes = [];\n\n\t#cachedVisibleRecords = null;\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = sheet.getRootNode().host;\n\n\t\tthis.refresh();\n\t}\n\n\tgetArray = (at, colnm) => {\n\n\t\tif (!this.#cachedVisibleRecords) {\n\t\t\tconst records = this.#host.data.getArray();\n\t\t\tthis.#cachedVisibleRecords = this.#viewIndexes.map(idx => records[idx]);\n\t\t}\n\n\t\tconst visibleRecords = this.#cachedVisibleRecords;\n\n\t\tif (at === undefined || at === null) {\n\t\t\treturn visibleRecords;\n\t\t}\n\n\t\tif (at < 0 || at >= visibleRecords.length) return null;\n\n\t\tconst targetRecord = visibleRecords[at];\n\t\tif (colnm != null) {\n\t\t\tconst fields = this.#host.data.getHostFields();\n\t\t\tconst idx = fields.indexOf(colnm);\n\t\t\treturn (idx >= 0 && targetRecord.v) ? targetRecord.v[idx] : null;\n\t\t}\n\n\t\treturn targetRecord;\n\t};\n\n\tcount = () => {\n\t\tif (!this.#cachedVisibleRecords) {\n\t\t\tconst records = this.#host.data.getArray();\n\t\t\tthis.#cachedVisibleRecords = this.#viewIndexes.map(idx => records[idx]);\n\t\t}\n\n\t\treturn this.#cachedVisibleRecords.length;\n\t}\n\n\tget = (at, colnm) => {\n\t\tconst visibleRecords = this.getArray();\n\t\tconst fields = this.#host.data.getHostFields?.() || [];\n\n\t\tif (at === undefined || at === null) {\n\t\t\treturn visibleRecords.map(record => this.#convSingle(record, fields));\n\t\t}\n\n\t\tif (at < 0 || at >= visibleRecords.length) return null;\n\n\t\tconst targetRecord = visibleRecords[at];\n\t\tif (!targetRecord) return null;\n\n\t\tif (colnm != null) {\n\t\t\tconst idx = fields.indexOf(colnm);\n\t\t\treturn (idx >= 0 && targetRecord.v) ? targetRecord.v[idx] : null;\n\t\t}\n\n\t\treturn this.#convSingle(targetRecord, fields);\n\t};\n\n\t#convSingle = (o, fields) => {\n\t\tif (!o) return null;\n\t\tconst t = {};\n\t\tfields.forEach((colnm, i) => {\n\t\t\tt[colnm] = o.v ? o.v[i] : o[colnm];\n\t\t});\n\t\tif (o.m) t.m = o.m;\n\t\tif (o._) t._ = o._;\n\t\treturn t;\n\t};\n\n\trefresh = () => {\n\n\t\tthis.#cachedVisibleRecords = null;\n\n\t\tconst rawRecords = this.#host.data.getArray();\n\t\tlet indices = [];\n\t\trawRecords.forEach((record, i) => {\n\t\t\tif (!record) return;\n\t\t\tconst filterSlot = record.m?._?.[NINE_TABLE.META.INDEX.FILTER];\n\t\t\tif (filterSlot && filterSlot[this.#sheet.index] === false) return;\n\t\t\tindices.push(i);\n\t\t});\n\n\t\tif (this.#sortingColumns.length > 0) {\n\t\t\tindices = this.#applySorting(indices, rawRecords);\n\t\t}\n\n\t\tthis.#viewIndexes = indices;\n\t\tconst validRecords = indices.map(idx => rawRecords[idx]);\n\n\t\tconst groupColumns = this.#sheet.grouping?.columns || [];\n\t\tif (groupColumns.length > 0) {\n\t\t\tconst groupResult = Grouping.apply(validRecords, groupColumns, this.#host.data.getHostFields());\n\n\t\t\tthis.#cachedVisibleRecords = groupResult.renderItems; // ์ต์ข
๋ ๋๋ง ์์ดํ
\n\n\t\t\tthis.#sheet.grouping.setGroupMap(groupResult.groupMap); // ์์ ๋งคํ ๊ณต์ \n\t\t} else {\n\t\t\tthis.#cachedVisibleRecords = validRecords;\n\t\t}\n\n\n\n\t}\n\n\tsetSorting = (columns) => {\n\t\tthis.#sortingColumns = columns || [];\n\t\tthis.refresh();\n\t};\n\n\tgetSorting = () => {\n\t\treturn this.#sortingColumns;\n\t};\n\n\tresetSorting = () => {\n\t\tthis.#sortingColumns = [];\n\t\tthis.refresh();\n\t};\n\n\n\t#applySorting = (indices, validRecords) => {\n\n\t\tconst fields = typeof this.#host.data.getHostFields === 'function' ? this.#host.data.getHostFields() : [];\n\n\t\tconst rulesWithIdx = this.#sortingColumns.map(rule => ({\n\t\t\t...rule,\n\t\t\tcolIndex: fields.indexOf(rule.colname || rule.colName)\n\t\t}));\n\n\t\treturn indices.sort((idxA, idxB) => {\n\t\t\tconst a = validRecords[idxA];\n\t\t\tconst b = validRecords[idxB];\n\n\t\t\tfor (const rule of rulesWithIdx) {\n\t\t\t\tconst isAsc = rule.asc;\n\t\t\t\tconst expr = rule.expr; // ๐ก ๋ฑ๋ก๋ expr ์์\n\t\t\t\tlet valA, valB;\n\n\t\t\t\tif (expr) {\n\t\t\t\t\tvalA = this.#host.exprEngine.evaluate(expr, a, idxA);\n\t\t\t\t\tvalB = this.#host.exprEngine.evaluate(expr, b, idxB);\n\t\t\t\t} else {\n\t\t\t\t\tif (rule.colIndex >= 0 && a.v && b.v) {\n\t\t\t\t\t\tvalA = a.v[rule.colIndex];\n\t\t\t\t\t\tvalB = b.v[rule.colIndex];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst isEmptyA = (valA === null || valA === undefined || valA === '');\n\t\t\t\tconst isEmptyB = (valB === null || valB === undefined || valB === '');\n\n\t\t\t\tif (isEmptyA && isEmptyB) continue;\n\t\t\t\tif (isEmptyA) return 1;\n\t\t\t\tif (isEmptyB) return -1;\n\n\t\t\t\tif (valA !== valB) {\n\t\t\t\t\tlet diff = 0;\n\n\t\t\t\t\tif (typeof valA === 'number' && typeof valB === 'number') {\n\t\t\t\t\t\tdiff = valA - valB;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst strA = String(valA);\n\t\t\t\t\t\tconst strB = String(valB);\n\t\t\t\t\t\tdiff = strA > strB ? 1 : (strA < strB ? -1 : 0);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (diff !== 0) {\n\t\t\t\t\t\treturn isAsc ? diff : -diff;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn idxA - idxB;\n\t\t});\n\t};\n}","import { trace } from \"@nopeer\";\nimport { TableCompiler } from \"@/layout/core/TableCompiler.js\";\n\nexport const COLLAPSED_WIDTH = 16;\n\nexport class PreCompiler {\n\n static initializeTable(host, tbl) {\n\n PreCompiler.#ensureColgroup(tbl);\n PreCompiler.#ensureThead(tbl);\n PreCompiler.#ensureSectionTbodys(tbl);\n\n PreCompiler.#ensureRowIndicator(tbl);\n\n PreCompiler.#normalizeColAttributes(tbl);\n\n TableCompiler.resetColIndex(tbl, tbl.querySelectorAll('thead tr'));\n TableCompiler.resetColIndex(tbl, tbl.querySelectorAll('tbody.body tr[grouping=\"true\"]'));\n TableCompiler.resetColIndex(tbl, tbl.querySelectorAll('tbody.body tr:not([grouping=\"true\"])'));\n TableCompiler.resetColIndex(tbl, tbl.querySelectorAll('tfoot tr'));\n\n PreCompiler.#createColIndicator(tbl);\n\n PreCompiler.#normalizeCollapsibleAttributes(tbl);\n\n PreCompiler.#generateCell(host, tbl);\n\n PreCompiler.#initColExpanders(tbl);\n\n PreCompiler.#initFilterButtons(host, tbl);\n\n PreCompiler.#applyInitialCellWidths(tbl);\n\n return tbl;\n }\n\n static #createColIndicator(tbl) {\n const thead = tbl.querySelector('thead');\n if (!thead || thead.querySelector('.col-indicator-rowgroup')) return;\n\n const tdTmpl = `<th data-col=\"@col\" class=\"col-indicator\" scope=\"col\"></th>`;\n\n const tr = thead.insertRow(0);\n tr.setAttribute('role', 'row');\n tr.classList.add('col-indicator-rowgroup');\n tr.classList.add('collapse');\n\n const firstRow = tbl.querySelector('tbody tr');\n if (!firstRow) return;\n\n let cnt = 0;\n firstRow.querySelectorAll('th, td').forEach(td => {\n if (!td.classList.contains('dummy')) {\n const colSpan = td.colSpan || 1;\n for (let i = 0; i < colSpan; i++) {\n const html = tdTmpl.replace('@col', cnt).replace('@text', PreCompiler.#numToExcelCol(cnt++));\n tr.insertAdjacentHTML('beforeend', html);\n }\n }\n });\n\n const cols = Array.from(tbl.querySelectorAll('colgroup col'));\n tr.querySelectorAll('.col-indicator').forEach((el, i) => {\n const background = cols[i].getAttribute('background');\n if (background) {\n el.style.background = background;\n }\n });\n }\n\n static #numToExcelCol(num) {\n let text = '';\n for (let n = num; n >= 0; n = Math.floor(n / 26) - 1) {\n text = String.fromCharCode(65 + (n % 26)) + text;\n }\n return text;\n }\n\n static #ensureSectionTbodys(tbl) {\n let tbody = tbl.querySelector('tbody:not(.head):not(.foot)');\n\n if (!tbody) return;\n\n tbody.classList.add('body');\n\n if (!tbl.querySelector('tbody.head')) {\n const headTbody = document.createElement('tbody');\n headTbody.classList.add('head');\n tbody.before(headTbody);\n }\n\n if (!tbl.querySelector('tbody.foot')) {\n const footTbody = document.createElement('tbody');\n footTbody.classList.add('foot');\n tbody.after(footTbody);\n }\n }\n\n static #ensureColgroup(tbl) {\n let colgroup = tbl.querySelector('colgroup');\n if (!colgroup) {\n colgroup = document.createElement('colgroup');\n tbl.prepend(colgroup);\n }\n\n if (colgroup.querySelectorAll('col').length === 0) {\n const firstRow = tbl.querySelector('tbody tr');\n let colCount = 1;\n if (firstRow) {\n colCount = Array.from(firstRow.querySelectorAll('th, td')).reduce((sum, cell) => {\n return sum + (parseInt(cell.getAttribute('colspan') || cell.colSpan, 10) || 1);\n }, 0);\n }\n colCount = Math.max(colCount, 1);\n\n for (let i = 0; i < colCount; i++) {\n const col = document.createElement('col');\n colgroup.appendChild(col);\n }\n }\n }\n\n static #normalizeColAttributes(tbl) {\n const cols = Array.from(tbl.querySelectorAll('colgroup col'));\n if (cols.length === 0) return;\n\n const containerWidth = tbl.clientWidth || 0;\n const defaultWidth = Math.max(Math.floor(containerWidth / cols.length), 100);\n\n cols.forEach((col, i) => {\n\n if (!col.hasAttribute('data-col')) {\n col.setAttribute('data-col', i);\n }\n\n const width = col.getAttribute('width') || parseInt(col.style.width, 10) || defaultWidth;\n col.setAttribute('width', width);\n\n const widthVal = String(width).includes('px') ? width : `${width}px`;\n col.style.width = widthVal;\n });\n }\n\n static #ensureThead(tbl) {\n if (tbl.querySelector('thead')) return;\n\n const thead = document.createElement('thead');\n const colgroup = tbl.querySelector('colgroup');\n\n if (colgroup) {\n colgroup.after(thead);\n } else {\n tbl.prepend(thead);\n }\n }\n\n static #normalizeCollapsibleAttributes(tbl) {\n const headers = tbl.querySelectorAll('thead th, thead td');\n headers.forEach(cell => {\n const isCollapsed = cell.getAttribute('collapsed') === 'true';\n if (isCollapsed && cell.getAttribute('collapsible') !== 'true') {\n cell.setAttribute('collapsible', 'true');\n }\n });\n }\n\n static #generateCell(host, $tbl) {\n\n const targetAttributes = ['data-bind', 'data-expr', 'type'];\n let autoIdCounter = 0;\n\n $tbl.querySelectorAll('tbody th, tbody td').forEach($cell => {\n const cellType = $cell.getAttribute('cell-type') || \"renderer\";\n const tagName = `cell-${cellType}`;\n\n const $datalist = $cell.querySelector(\"datalist\");\n\n if ($datalist) {\n let l = [];\n $datalist.querySelectorAll('option').forEach($option => {\n l.push({\n k: $option.getAttribute(\"k\"),\n v: $option.getAttribute(\"v\"),\n value: $option.getAttribute(\"value\"),\n });\n });\n\n const uniqueFuncName = `__ds_${Date.now()}_${++autoIdCounter}`;\n\n if (host) {\n host[uniqueFuncName] = () => l;\n }\n\n $cell.setAttribute(\"data-source\", `host.${uniqueFuncName}()`);\n\n $datalist.remove();\n }\n\n const expr = $cell.dataset.expr;\n if (expr) {\n $cell.setAttribute('data-expr', host.exprEngine.precompile(expr));\n }\n\n Array.from($cell.attributes).forEach(attr => {\n if (['data-bind', 'data-expr', 'cell-type', 'validator'].includes(attr.name)) return;\n if (attr.value.includes(\"data.\") || attr.value.includes(\"host.\")) {\n $cell.setAttribute(attr.name, host.exprEngine.precompile(attr.value));\n }\n });\n\n const innerAttrs = targetAttributes\n .filter(attr => $cell.hasAttribute(attr))\n .map(attr => `${attr}=\"${$cell.getAttribute(attr)}\"`);\n\n $cell.innerHTML = `<${tagName} ${innerAttrs.join(' ')}></${tagName}>`;\n $cell.setAttribute('tabindex', '0');\n });\n\n $tbl.querySelectorAll('thead th, thead td, tfoot th, tfoot td').forEach($cell => {\n const cellType = $cell.getAttribute('cell-type');\n if (cellType) {\n const originalContent = $cell.innerHTML;\n const tagName = `cell-${cellType}`;\n const innerAttrs = targetAttributes\n .filter(attr => $cell.hasAttribute(attr))\n .map(attr => `${attr}=\"${$cell.getAttribute(attr)}\"`);\n\n $cell.innerHTML = `<${tagName} ${innerAttrs.join(' ')} content=\"${originalContent}\"></${tagName}>`;\n }\n });\n }\n\n static #initFilterButtons(host, tbl) {\n const hostFilter = host.getAttribute('filtering') === 'true';\n const tableFilter = tbl.getAttribute('filtering') === 'true';\n\n tbl.querySelectorAll('thead tr:not(.col-indicator-rowgroup) th, thead tr:not(.col-indicator-rowgroup) td').forEach(cell => {\n const finalFiltering = cell.getAttribute('filtering') === 'true' || tableFilter || hostFilter;\n\n cell.setAttribute('filtering', finalFiltering ? 'true' : 'false');\n\n if (finalFiltering) {\n cell.appendChild(document.createElement('nine-table-filter-button'));\n }\n });\n }\n\n static #initColExpanders(tbl) {\n\n tbl.querySelectorAll('thead th, thead td').forEach(cell => {\n const isCollapsible = cell.getAttribute('collapsible') === 'true' || cell.getAttribute('expandable') === 'true';\n if (!isCollapsible) return;\n\n const colIndex = parseInt(cell.dataset.col, 10);\n const colSpan = cell.colSpan || 1;\n const col = tbl.querySelector(`colgroup col[data-col=\"${colIndex}\"]`);\n\n const currentWidth = col ? (parseInt(col.getAttribute('width'), 10) || 100) : 100;\n\n if (!cell.dataset.expandWidth || parseInt(cell.dataset.expandWidth, 10) <= COLLAPSED_WIDTH) {\n cell.dataset.expandWidth = String(currentWidth > COLLAPSED_WIDTH ? currentWidth : 100);\n }\n\n let expandBtn = cell.querySelector('nine-table-col-expand');\n if (!expandBtn) {\n expandBtn = document.createElement('nine-table-col-expand');\n cell.insertBefore(expandBtn, cell.firstChild);\n }\n\n const isCollapsed = cell.getAttribute('collapsed') === 'true';\n\n if (isCollapsed) {\n expandBtn.classList.add('collapsed');\n expandBtn.classList.remove('expand');\n expandBtn.setAttribute('collapsed', 'true');\n cell.style.color = 'transparent';\n\n const targetWidth = Math.max(10, Math.floor(COLLAPSED_WIDTH / colSpan));\n if (!isNaN(colIndex)) {\n for (let i = 0; i < colSpan; i++) {\n const targetCol = tbl.querySelector(`colgroup col[data-col=\"${colIndex + i}\"]`);\n if (targetCol) {\n targetCol.setAttribute('width', targetWidth);\n targetCol.style.width = `${targetWidth}px`;\n }\n }\n }\n } else {\n expandBtn.classList.remove('collapsed');\n expandBtn.classList.add('expand');\n expandBtn.setAttribute('collapsed', 'false');\n cell.style.color = '';\n }\n });\n }\n\n static #ensureRowIndicator(tbl, host) {\n\n const w = tbl.getAttribute(\"row-indicator\") === 'true' ? 48 : 0;\n\n const colgroup = tbl.querySelector('colgroup');\n\n\n const col = document.createElement('col');\n //col.className = 'row-indicator-col';\n col.setAttribute('fixed', 'left');\n col.setAttribute('width', w);\n col.style.width = `${w}px`;\n colgroup.prepend(col);\n\n\n tbl.querySelectorAll('thead, tbody, tfoot').forEach(section => {\n const rows = Array.from(section.querySelectorAll('tr'));\n if (rows.length === 0) return;\n\n const firstTr = rows[0];\n\n const indicatorCell = document.createElement('th');\n indicatorCell.className = 'row-indicator';\n indicatorCell.setAttribute('cell-type', 'row-indicator');\n\n if (rows.length > 1) {\n indicatorCell.rowSpan = rows.length;\n }\n\n firstTr.insertBefore(indicatorCell, firstTr.firstElementChild);\n });\n }\n\n static #applyInitialCellWidths(tbl) {\n\n tbl.querySelectorAll('th[data-col], td[data-col]').forEach(cell => {\n\n const startColIdx = parseInt(cell.getAttribute('data-col'), 10);\n if (isNaN(startColIdx)) return;\n\n\n const colSpan = parseInt(cell.getAttribute('colspan') || cell.colSpan, 10) || 1;\n let totalWidth = 0;\n\n\n for (let i = 0; i < colSpan; i++) {\n const targetIdx = startColIdx + i;\n const col = tbl.querySelector(`colgroup col[data-col=\"${targetIdx}\"]`);\n if (col) {\n totalWidth += parseInt(col.getAttribute('width'), 10) || 100;\n }\n }\n\n if (totalWidth > 0) {\n const widthVal = `${totalWidth}px`;\n cell.style.width = widthVal;\n cell.style.minWidth = widthVal;\n cell.style.maxWidth = widthVal;\n }\n });\n }\n}\n","import { trace } from \"@nopeer\";\nimport './nine-table-hscrollbar.js';\nimport './nine-table-vscrollbar.js';\nimport { RowManager } from './core/RowManager.js';\nimport { TableCompiler } from \"./core/TableCompiler.js\";\nimport { CellSelection } from \"@/cell-manager/CellSelection.js\";\nimport { CellNavigation } from \"@/cell-manager/CellNavigation.js\";\n\nimport { ColResizer } from \"@/col/ColResizer.js\";\nimport { ColMover } from \"@/col/ColMover.js\";\nimport { ColFixManager } from \"@/col/ColFixManager.js\";\n\nimport { Filtering } from \"@/data/Filtering.js\";\nimport { GroupingManager } from \"@/data/Grouping.js\";\nimport { Sorting } from \"@/data/Sorting.js\";\nimport { SheetView } from \"@/data/SheetView.js\";\n\nimport { PreCompiler } from \"@/layout/core/PreCompiler.js\";\n\nexport class NineTableSheet extends HTMLElement {\n #index;\n #host;\n #rowManager;\n #cellSelection;\n #cellNavigation;\n #colResizer;\n #colMover;\n #colFix;\n #sorting;\n #filtering;\n #grouping;\n\n #view;\n\n #source = {\n table: null,\n };\n\n #elements;\n\n static SCROLLBAR_SIZE = 16;\n\n constructor() {\n super();\n\n this.#host = this.getRootNode().host;\n this.#rowManager = new RowManager(this);\n }\n\n connectedCallback() {\n this.#init();\n }\n\n get index() { return this.#index; }\n get colResizer() { return this.#colResizer; }\n get filtering() { return this.#filtering; }\n get grouping() { return this.#grouping; }\n get colMover() { return this.#colMover; }\n get colFix() { return this.#colFix; }\n get rowManager() { return this.#rowManager; }\n get selection() { return this.#cellSelection; }\n get navigation() { return this.#cellNavigation; }\n get templateLength() { return this.#source.tbody.tr.length || 0; }\n\n get elements() { return this.#elements; }\n\n get isAutoFitCol() {\n const attrTrue = this.getAttribute('auto-fit-col') === 'true' || this.#host?.getAttribute('auto-fit-col') === 'true';\n const sourceTableTrue = this.#source.table?.getAttribute('auto-fit-col') === 'true';\n return attrTrue || sourceTableTrue;\n }\n\n get sourceTable() {\n return this.#source.table;\n }\n\n get source() {\n return this.#source;\n }\n\n get #isSimple() {\n return this.#host.hasAttribute('simple') || this.#host.getAttribute('theme') === 'simple';\n }\n\n scrollTo = (dataRow, callback) => {\n this.rowManager.scrollToDataRow(dataRow, 'top', callback);\n }\n\n recompileAndRefresh() {\n if (!this.#source.table) return;\n\n TableCompiler.recompile(this.#source.table);\n\n ['left', 'right', 'body'].forEach(type => {\n ['header', 'body', 'footer'].forEach(section => {\n const container = this.querySelector(`.ng-sheet-${section} .ng-container-${type}`);\n if (!container) return;\n container.querySelectorAll('table').forEach(tbl => tbl.remove());\n });\n });\n\n this.#renderSplitContainers();\n\n this.#updateContainerWidths();\n\n this.#rowManager.initialize();\n\n if (this.isAutoFitCol) {\n this.autoFit(true);\n } else {\n this.querySelector('nine-table-hscrollbar')?.refresh();\n }\n\n requestAnimationFrame(() => {\n this.#updateContainerWidths();\n this.#rowManager?.refresh();\n });\n }\n\n refreshLayout() {\n\n requestAnimationFrame(() => {\n\n if (!this.classList.contains('active') || !this.#source.table) return;\n\n this.#updateContainerWidths();\n\n if (this.isAutoFitCol) {\n this.autoFit(true);\n } else {\n this.querySelector('nine-table-hscrollbar')?.refresh();\n }\n\n this.#adjustOverlay();\n\n this.#colResizer?.refreshLayout();\n\n this.#rowManager?.refresh();\n });\n }\n\n #adjustOverlay = () => {\n const $thead = this.querySelector('.ng-container-body thead');\n const $overlay = this.querySelector('.nodata-overlay');\n $overlay.style.top = `${$thead.offsetHeight}px`;\n }\n\n get view() {\n if (!this.#view && this.#host?.data) {\n this.#view = new SheetView(this);\n }\n return this.#view;\n }\n\n invalidate = () => {\n\n this.view.refresh();\n\n this.#rowManager.refresh(true);\n\n if (this.isAutoFitCol) {\n this.autoFit(true);\n }\n };\n\n autoFit = (enable = true) => {\n requestAnimationFrame(() => {\n this.#autoFit?.(enable);\n });\n };\n\n #autoFit = (enable = true) => {\n\n const container = this.querySelector('.ng-sheet-body .ng-container-body');\n if (!container) return;\n\n const firstColgroup = this.querySelector('.ng-container-body table colgroup');\n if (!firstColgroup) return;\n\n if (enable) {\n this.setAttribute('auto-fit-col', 'true');\n const containerWidth = container.clientWidth;\n if (containerWidth <= 0) return;\n\n let totalOriginalWidth = 0;\n const colList = [];\n\n firstColgroup.querySelectorAll('col').forEach(col => {\n const globalColIndex = col.getAttribute('data-col');\n const headerCell = this.querySelector(`thead th[data-col=\"${globalColIndex}\"]`);\n const isCollapsed = headerCell?.getAttribute('collapsed') === 'true';\n\n if (isCollapsed) {\n colList.unshift({ globalColIndex, width: 16, isCollapsed: true });\n } else {\n const w = parseInt(col.getAttribute('width'), 10) || 100;\n colList.push({ globalColIndex, width: w, isCollapsed: false });\n totalOriginalWidth += w;\n }\n });\n\n const collapsedTotalWidth = colList\n .filter(c => c.isCollapsed)\n .reduce((sum, c) => sum + c.width, 0);\n\n const availableWidth = Math.max(0, containerWidth - collapsedTotalWidth);\n\n if (totalOriginalWidth > 0 && colList.length > 0) {\n let allocatedTotal = 0;\n\n const calculatedCols = colList.map(item => {\n if (item.isCollapsed) {\n return { globalColIndex: item.globalColIndex, remainder: 0, width: 16 };\n }\n\n const exactWidth = (item.width * availableWidth) / totalOriginalWidth;\n const baseWidth = Math.max(30, Math.floor(exactWidth));\n allocatedTotal += baseWidth;\n return {\n globalColIndex: item.globalColIndex,\n remainder: exactWidth - Math.floor(exactWidth),\n width: baseWidth\n };\n });\n\n let remainderPixels = availableWidth - allocatedTotal;\n\n const uncollapsedCols = calculatedCols.filter(c => !colList.find(item => item.globalColIndex === c.globalColIndex)?.isCollapsed);\n\n if (remainderPixels > 0 && uncollapsedCols.length > 0) {\n uncollapsedCols.sort((a, b) => b.remainder - a.remainder);\n for (let i = 0; i < remainderPixels; i++) {\n uncollapsedCols[i % uncollapsedCols.length].width += 1;\n }\n } else if (remainderPixels < 0 && uncollapsedCols.length > 0) {\n uncollapsedCols.sort((a, b) => a.remainder - b.remainder);\n for (let i = 0; i < Math.abs(remainderPixels); i++) {\n const target = uncollapsedCols[i % uncollapsedCols.length];\n if (target.width > 30) target.width -= 1;\n }\n }\n\n calculatedCols.forEach(({ globalColIndex, width }) => {\n this.#colResizer?.setColumnWidth(globalColIndex, width, 'body');\n });\n }\n } else {\n this.removeAttribute('auto-fit-col');\n }\n\n this.querySelector('nine-table-hscrollbar')?.refresh();\n }\n\n generate = ($table, index) => {\n\n $table.style.display = 'none';\n\n this.#index = index;\n\n PreCompiler.initializeTable(this.#host, $table);\n\n $table.style.display = '';\n\n this.#source = {\n table: TableCompiler.compile($table),\n tbody: {\n tr: $table.querySelectorAll(\"tbody tr\"),\n }\n };\n\n this.#renderSplitContainers();\n\n this.#updateContainerWidths();\n\n this.#syncHeaderAndFooterHeights();\n\n this.#initRowHoverEvent();\n\n ['left', 'body', 'right'].forEach(type => {\n const prefix = `.ng-container-${type}`;\n this.#elements[type] = {\n thead: this.querySelector(`${prefix} thead`),\n tbody: {\n head: this.querySelector(`${prefix} tbody.head`),\n body: this.querySelector(`${prefix} tbody.body`),\n foot: this.querySelector(`${prefix} tbody.foot`),\n },\n tfoot: this.querySelector(`${prefix} tfoot`),\n };\n });\n\n this.#rowManager.initialize();\n\n if (this.isAutoFitCol) {\n this.autoFit(true);\n } else {\n this.querySelector('nine-table-hscrollbar').refresh();\n }\n\n this.#grouping.initialize();\n\n this.loaded = true;\n };\n\n\n #updateContainerWidths = () => {\n\n ['left', 'right', 'body'].forEach(type => {\n const containers = this.querySelectorAll(`.ng-container-${type}`);\n if (containers.length === 0) return;\n\n const firstTable = containers[0].querySelector('table');\n if (!firstTable) return;\n\n let width = 0;\n firstTable.querySelectorAll('col').forEach(col => {\n const w = parseInt(col.getAttribute('width'), 10);\n if (!isNaN(w)) width += w;\n });\n\n containers.forEach(container => {\n const tables = container.querySelectorAll('table');\n if (type === 'body') {\n container.style.flex = `1`;\n } else {\n container.style.flex = `0 0 ${width}px`;\n container.style.width = `${width}px`;\n container.style.minWidth = `${width}px`;\n container.style.maxWidth = `${width}px`;\n }\n });\n });\n };\n\n #renderSplitContainers = () => {\n const colTypes = [\n { selector: '.ng-container-left', type: 'left' },\n { selector: '.ng-container-body', type: null },\n { selector: '.ng-container-right', type: 'right' }\n ];\n\n colTypes.forEach(({ selector, type }) => {\n this.querySelector(`.ng-sheet-body ${selector}`).appendChild(this.#createSplitTable(type));\n });\n };\n\n #createSplitTable = (targetFixedType) => {\n\n const $tbl = this.#source.table.cloneNode(true);\n\n if (targetFixedType === 'left') {\n $tbl.querySelectorAll(\"col, th, td\").forEach($el => {\n if ($el.getAttribute(\"fixed\") !== \"left\") $el.remove();\n });\n } else if (targetFixedType === 'right') {\n $tbl.querySelectorAll(\"col, th, td\").forEach($el => {\n if ($el.getAttribute(\"fixed\") !== \"right\") $el.remove();\n });\n } else {\n $tbl.querySelectorAll(\"[fixed=left], [fixed=right]\").forEach($el => {\n $el.remove();\n });\n }\n\n return $tbl;\n };\n\n getRowHeight = () => {\n return this.#rowManager.getRowHeight();\n };\n\n getViewHeight = () => {\n\n const viewHeight = this.#elements.content.offsetHeight || 0;\n\n const fixedHeight = (this.#elements.body.thead?.offsetHeight || 0) +\n (this.#elements.body.tfoot?.offsetHeight || 0) +\n (this.#elements.body.tbody.head.offsetHeight || 0);\n\n return viewHeight - fixedHeight;\n };\n\n isLastRow = () => {\n\n const sheet = this.querySelector('.ng-sheet-body');\n const tbody = this.querySelector(\".ng-container-body tbody.body\");\n\n const offsetHeight = (this.#elements.body.tfoot?.offsetHeight || 0);\n\n const sheetBottom = sheet.getBoundingClientRect().bottom;\n const tbodyBottom = tbody.getBoundingClientRect().bottom;\n\n return (sheetBottom - offsetHeight) >= tbodyBottom;\n };\n\n scrollToX = (scrollLeft) => {\n const bodyContainer = this.querySelector('.ng-sheet-body .ng-container-body');\n if (bodyContainer) bodyContainer.scrollLeft = scrollLeft;\n };\n\n scrollToY = (scrollTop) => {\n const bodyViewport = this.querySelector('.ng-sheet-body');\n if (bodyViewport) bodyViewport.scrollTop = scrollTop;\n };\n\n #init = () => {\n\n this.#render();\n\n this.#cellSelection = new CellSelection(this);\n this.#cellNavigation = new CellNavigation(this);\n this.#colResizer = new ColResizer(this);\n this.#colMover = new ColMover(this);\n this.#colFix = new ColFixManager(this);\n\n this.#view = new SheetView(this);\n this.#filtering = new Filtering(this);\n this.#grouping = new GroupingManager(this);\n\n if (!this.#isSimple) {\n this.#sorting = new Sorting(this);\n }\n\n this.#elements.mainBody.addEventListener('scroll', () => {\n this.querySelector(\"nine-table-hscrollbar\").refresh();\n });\n };\n\n\n\n #render = () => {\n\n this.innerHTML = `\n <div class=\"ng-sheet-body\">\n <div class=\"ng-sheet-body-content\">\n <div class=\"ng-container-left\"></div>\n <div class=\"ng-container-body\"></div>\n <div class=\"ng-container-right\"></div>\n </div>\n <div class=\"ng-virtual-height-holder\"></div>\n </div>\n\n <div class=\"nodata-overlay\">Data Not Found</div>\n\n <nine-table-vscrollbar></nine-table-vscrollbar>\n <nine-table-hscrollbar></nine-table-hscrollbar>\n <div class=\"scroll-edge\"></div>\n \n <nine-table-col-resizer-panel></nine-table-col-resizer-panel>\n \n <div class=\"ng-col-mover-grip\"></div>\n <div class=\"ng-col-mover-indi\"></div>\n `;\n\n this.#elements = {\n mainBody: this.querySelector('.ng-sheet-body .ng-container-body'),\n hscrollbar: this.querySelector('nine-table-hscrollbar'),\n vscrollbar: this.querySelector('nine-table-vscrollbar'),\n content: this.querySelector('.ng-sheet-body .ng-sheet-body-content'),\n scrollHolder: this.querySelector('.ng-sheet-body .ng-virtual-height-holder'),\n }\n };\n\n #syncHeaderAndFooterHeights = () => {\n\n const leftTable = this.querySelector('.ng-container-left table');\n const bodyTable = this.querySelector('.ng-container-body table');\n const rightTable = this.querySelector('.ng-container-right table');\n\n const leftHeaderRows = Array.from(leftTable.querySelectorAll('thead tr:not(.col-indicator-rowgroup)'));\n const bodyHeaderRows = Array.from(bodyTable.querySelectorAll('thead tr:not(.col-indicator-rowgroup)'));\n const rightHeaderRows = Array.from(rightTable.querySelectorAll('thead tr:not(.col-indicator-rowgroup)'));\n\n this.#applyMaxHeights(leftHeaderRows, bodyHeaderRows, rightHeaderRows);\n\n const leftFooterRows = Array.from(leftTable.querySelectorAll('tfoot tr'));\n const bodyFooterRows = Array.from(bodyTable.querySelectorAll('tfoot tr'));\n const rightFooterRows = Array.from(rightTable.querySelectorAll('tfoot tr'));\n\n this.#applyMaxHeights(leftFooterRows, bodyFooterRows, rightFooterRows);\n };\n\n #applyMaxHeights = (leftRows, bodyRows, rightRows) => {\n\n setTimeout(() => {\n const maxRows = Math.max(leftRows.length, bodyRows.length, rightRows.length);\n\n for (let i = 0; i < maxRows; i++) {\n\n const heights = [\n leftRows[i]?.getBoundingClientRect().height || 0,\n bodyRows[i]?.getBoundingClientRect().height || 0,\n rightRows[i]?.getBoundingClientRect().height || 0\n ];\n const maxHeight = Math.max(...heights);\n\n if (maxHeight > 0) {\n if (leftRows[i]) leftRows[i].style.height = `${maxHeight}px`;\n if (bodyRows[i]) bodyRows[i].style.height = `${maxHeight}px`;\n if (rightRows[i]) rightRows[i].style.height = `${maxHeight}px`;\n }\n }\n });\n };\n\n #initRowHoverEvent = () => {\n const bodyViewport = this.querySelector('.ng-sheet-body');\n if (!bodyViewport) return;\n\n let activeRowIndex = null;\n\n bodyViewport.addEventListener('mouseover', (e) => {\n const tr = e.target.closest('tr');\n if (!tr || !tr.dataset.row && tr.dataset.row !== '0') return;\n\n const rowIndex = tr.dataset.row;\n if (activeRowIndex === rowIndex) return;\n activeRowIndex = rowIndex;\n\n bodyViewport.querySelectorAll(`tr[data-row=\"${rowIndex}\"]`).forEach($tr => {\n $tr.classList.add('hover');\n });\n });\n\n bodyViewport.addEventListener('mouseout', (e) => {\n const tr = e.target.closest('tr');\n if (!tr) return;\n\n const relatedTarget = e.relatedTarget;\n if (tr.contains(relatedTarget)) return;\n\n bodyViewport.querySelectorAll('tr.hover').forEach($tr => {\n $tr.classList.remove('hover');\n });\n activeRowIndex = null;\n });\n }\n\n disconnectedCallback() {\n this.#colResizer?.destroy();\n this.#colMover?.destroy();\n this.innerHTML = '';\n }\n}\n\nif (!customElements.get('nine-table-sheet')) {\n customElements.define('nine-table-sheet', NineTableSheet);\n}","import { trace } from \"@nopeer\";\nimport '@/layout/nine-table-sheets.js';\nimport '@/layout/nine-table-sheets-footer.js';\nimport '@/layout/nine-table-toolbar.js';\nimport { NineTableSheet } from \"@/layout/nine-table-sheet.js\";\n\nexport class LayoutManager {\n #host;\n\n constructor(owner) {\n this.#host = owner;\n this.#init();\n }\n\n #init = () => {\n this.#render();\n\n new ResizeObserver((entries) => {\n for (let entry of entries) {\n const isAutoHeight = this.#host.getAttribute('auto-height') === 'true';\n if (isAutoHeight) {\n this.#applyAutoHeight();\n }\n }\n }).observe(this.#host);\n }\n\n set loading(val) {\n if (!!val) {\n this.#host.classList.add(\"loading\");\n } else {\n this.#host.classList.remove(\"loading\");\n }\n }\n\n #applyAutoHeight = () => {\n const activeSheets = Array.from(this.#host.shadowRoot.querySelectorAll('nine-table-sheet.active'));\n if (activeSheets.length === 0) return;\n\n const maxDisplayRows = parseInt(this.#host.getAttribute('max-display-row'), 10) || 10;\n const maxRowHeight = Math.max(...activeSheets.map(sheet => sheet.getRowHeight()));\n\n const toolbarEl = this.#host.shadowRoot.querySelector('nine-table-toolbar');\n const footerEl = this.#host.shadowRoot.querySelector('nine-table-sheets-footer');\n\n const toolbarHeight = toolbarEl ? toolbarEl.getBoundingClientRect().height : 0;\n const footerHeight = footerEl ? footerEl.getBoundingClientRect().height : 0;\n const extraPadding = NineTableSheet.SCROLLBAR_SIZE;\n\n const calculatedHeight = (maxDisplayRows * maxRowHeight) + toolbarHeight + footerHeight + extraPadding;\n\n this.#host.style.height = `${calculatedHeight}px`;\n };\n\n #render = () => {\n\n const rawElements = Array.from(this.#host.children);\n const rawTables = rawElements.filter(el => (el.tagName.toUpperCase() === 'TABLE') );\n const isAutoHeight = this.#host.getAttribute('auto-height') === 'true';\n const sheetCount = rawTables.length;\n\n const sheetsHtml = rawTables.map((tbl, idx) => {\n const className = idx === 0 ? 'active' : '';\n const sheetId = tbl.id || `sheet${idx + 1}`;\n\n const sheetTag = `<nine-table-sheet class=\"${className}\" data-index=\"${idx}\" data-sheet-id=\"${sheetId}\" id=\"${sheetId}\"></nine-table-sheet>`;\n const splitterTag = idx < sheetCount - 1 ? `<nine-splitter class=\"h\" data-split-index=\"${idx}\"></nine-splitter>` : '';\n return sheetTag + splitterTag;\n }).join('');\n\n const cssImports = [\n `@import \"https://cdn.jsdelivr.net/npm/@ninebone/datagrid@${__APP_VERSION__}/dist/css/nine-table.css\";`,\n ];\n\n if (nine[\"nine-table\"] && nine[\"nine-table\"].cssFile) {\n cssImports.push(`@import \"${nine[\"nine-table\"].cssFile}\";`);\n }\n\n this.#host.shadowRoot.innerHTML = `\n <style>\n ${cssImports.join('\\n')}\n ${this.#host.customStyle}\n </style>\n \n <nine-table-toolbar></nine-table-toolbar>\n\n <nine-table-body>\n <nine-table-summary></nine-table-summary>\n <div class=\"ng-loading-bar\"></div>\n <nine-table-sheets>\n <nine-table-sheets-body>\n ${sheetsHtml}\n </nine-table-sheets-body>\n <nine-table-sheets-footer></nine-table-sheets-footer>\n </nine-table-sheets>\n <nine-table-analysis></nine-table-analysis>\n </nine-table-body>\n <nine-table-footer></nine-table-footer>\n `;\n\n this.#host.shadowRoot.querySelectorAll('nine-table-sheet').forEach(($el, idx) => {\n\n if (rawTables[idx]) {\n setTimeout(() => {\n $el.generate(rawTables[idx], idx);\n if (isAutoHeight) {\n this.#applyAutoHeight();\n }\n });\n }\n });\n };\n}","import { trace } from \"@nopeer\";\n\nexport class ExprEngine {\n #host;\n #fields;\n #exprCache = new Map(); // ๐ก ํตํฉ๋ ๋จ์ผ ์บ์๋ก ๋ชจ๋ ์ปดํ์ผ๋ ํจ์ ๊ด๋ฆฌ\n\n constructor(host) {\n this.#host = host;\n this.#fields = host.fields.get();\n }\n\n rewriteExpr(expr) {\n\n if (!expr || !this.#fields.length) return expr;\n\n return expr.replace(/data\\.([a-zA-Z_$][\\w$]*)/g, (match, fieldName) => {\n const idx = this.#fields.indexOf(fieldName);\n return idx >= 0 ? `rowItem.v[${idx}]` : match;\n });\n }\n\n precompile(expr) {\n if (!expr) return expr;\n return this.rewriteExpr(expr);\n }\n\n evaluate(expr, rowItem, row = 0) {\n\n if (expr === undefined || expr === null) return \"\";\n\n try {\n const trimmedExpr = String(expr).trim();\n const compiledExpr = this.rewriteExpr(trimmedExpr);\n\n if (compiledExpr.includes(\"provider.\") || compiledExpr.includes(\"host.\") || compiledExpr.includes(\"data.\") || compiledExpr.includes(\"rowItem.v\") || compiledExpr.includes(\"(\")) {\n\n let evalFn = this.#exprCache.get(compiledExpr);\n\n if (!evalFn) {\n evalFn = new Function('rowItem', 'row', 'host', `\n const data = rowItem;\n const provider = host;\n\n if (!data && !host) return \"\";\n return ${compiledExpr};\n `);\n\n this.#exprCache.set(compiledExpr, evalFn);\n }\n\n return evalFn(rowItem, row, this.#host);\n }\n\n return compiledExpr;\n } catch (e) {\n /**\n if (expr.includes(\"getCommonCode\")) {\n console.trace(\"ExprEngine evaluation error:\", e);\n } */\n return expr;\n }\n }\n}","import { trace } from \"@nopeer\";\nimport { ngDataManager } from '@/data/ngDataManager.js';\nimport { fields } from \"@/data/Fields.js\";\nimport { LayoutManager } from '@/layout/core/LayoutManager.js';\nimport { ExprEngine } from \"@/core/ExprEngine.js\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\n\nexport default class NineTable extends HTMLElement {\n #shadowRoot;\n #dataManager;\n #layoutManager;\n #templateCnt = 0;\n #customStyle = '';\n\n constructor() {\n super();\n\n if ([\"NINE-TABLE\"].includes(this.tagName)) {\n trace.log(\"Welcome nine-table\", __APP_VERSION__);\n }\n\n this.#shadowRoot = this.attachShadow({ mode: 'open' });\n this.#dataManager = new ngDataManager(this);\n }\n\n connectedCallback() {\n setTimeout(() => {\n this.#templateCnt = this.querySelectorAll(\"table\")?.length;\n\n this.fields = new fields(this);\n this.exprEngine = new ExprEngine(this);\n\n this.#bindDynamicSetters();\n\n this.#layoutManager = new LayoutManager(this);\n\n this.#dispatchLoad();\n });\n }\n\n disconnectedCallback() {\n //trace.log('NineTable disconnected.');\n }\n\n #dispatchLoad = () => {\n\n let checkCount = 0;\n const maxChecks = 50; // ์ต๋ 5์ด ๋๊ธฐ (100ms * 50)\n\n const checkTimer = setInterval(() => {\n checkCount++;\n\n const sheets = this.shadow.querySelectorAll('nine-table-sheet');\n\n if (checkCount >= maxChecks) {\n clearInterval(checkTimer);\n }\n\n if (sheets.length >= this.#templateCnt) {\n let loadSheetCnt = 0;\n sheets.forEach($sheet => {\n if ($sheet.loaded) loadSheetCnt++;\n });\n\n if (loadSheetCnt >= this.#templateCnt) {\n clearInterval(checkTimer);\n this.loaded = true;\n this.dispatchEvent(new CustomEvent(NINE_TABLE.EVENT.LOAD, { bubbles: true, detail: { target: this } }));\n }\n }\n }, 100);\n }\n\n // ๐ฏ ๊ณตํต ๋ฐ์ดํฐ & API ์ ๊ทผ์\n get shadow() { return this.#shadowRoot; }\n get dataManager() { return this.#dataManager; }\n get data() { return this.#dataManager.data; }\n get row() { return this.#dataManager.row; }\n get customStyle() {\n return this.#customStyle;\n }\n\n scrollTo = (dataRow, callback) => {\n this.#shadowRoot.querySelectorAll('nine-table-sheet.active').forEach($sheet => {\n $sheet.scrollTo(dataRow, callback);\n });\n }\n\n currentRow = () => {\n let rows = this.currentRows();\n return (rows.length === 0) ? -1 : rows[0];\n }\n currentRows = () => {\n\n let rows = [];\n this.#shadowRoot.querySelectorAll('nine-table-sheet.active').forEach($sheet => {\n\n const arr = $sheet.view.getArray($sheet.selection.minRow);\n const rowid = arr.m._[NINE_TABLE.META.INDEX.ROWID];\n\n //trace.log(this.data.getArray($sheet.selection.minRow));\n\n rows.push(rowid);\n });\n\n return rows;\n }\n\n addRow = (dataSource, updateState = true) => {\n return this.data.add(dataSource, updateState);\n }\n insertRow = (index, dataSource, updateState = true) => {\n\n const activeSheet = this.#shadowRoot.querySelector('nine-table-sheet.active');\n if (!activeSheet) return;\n\n const currentJson = activeSheet.view.get(index);\n const rowid = currentJson.m._[NINE_TABLE.META.INDEX.ROWID];\n\n const toRowid = this.data.insert(rowid, dataSource, updateState);\n const records = activeSheet.view.getArray();\n\n const targetIndex = records.findIndex(record => {\n if (!record || !record.m || !record.m._) return false;\n return record.m._[NINE_TABLE.META.INDEX.ROWID] === toRowid; // ํ์
์ฐจ์ด ๋ฐฉ์ง๋ฅผ ์ํด == ์ฌ์ฉ\n });\n\n return targetIndex;\n };\n removeRow = (index) => {\n\n const activeSheet = this.#shadowRoot.querySelector('nine-table-sheet.active');\n if (!activeSheet) return;\n\n const currentJson = activeSheet.view.get(index);\n const rowid = currentJson.m._[NINE_TABLE.META.INDEX.ROWID];\n\n this.data.remove(rowid);\n };\n\n currentIndex = () => {\n let rows = this.currentIndexs();\n return (rows.length === 0) ? -1 : rows[0];\n }\n currentIndexs = () => {\n\n let rows = [];\n this.#shadowRoot.querySelectorAll('nine-table-sheet.active').forEach($sheet => {\n rows.push($sheet.selection.minRow);\n });\n\n return rows;\n }\n\n addProvider(provider) {\n if (!provider || typeof provider !== 'object') return;\n\n const { style, ...methods } = provider;\n\n if (style && typeof style === 'string') {\n this.#customStyle = style;\n\n const styleEl = this.#shadowRoot.getElementById('nine-table-scoped-custom-style');\n if (styleEl) {\n styleEl.textContent = style;\n }\n }\n\n if (Object.keys(methods).length > 0) {\n setTimeout(() => {\n Object.entries(methods).forEach(([name, fn]) => {\n if (typeof fn === 'function') {\n this[name] = fn;\n }\n });\n\n this.rerenderer();\n });\n }\n }\n\n setData(records) {\n this.#dataManager.data.set(records);\n this.refresh();\n }\n\n refresh() {\n this.activeSheet?.invalidate();\n }\n\n\n set loading(val) {\n if (this.#layoutManager) this.#layoutManager.loading = val;\n }\n\n rerenderer() {\n\n this.activeSheet?.querySelectorAll(\"tbody.body th,tbody.body td\").forEach(($cell) => {\n const customComp = Array.from($cell.children).find($el => {\n return $el.tagName.toLowerCase().startsWith('cell-') && typeof $el.rerenderer === 'function'\n });\n\n customComp?.rerenderer();\n })\n }\n\n sheet = (idOrIndex) => {\n if (idOrIndex === null || idOrIndex < 0) return this.activeSheet;\n const sheets = Array.from(this.shadow.querySelectorAll('nine-table-sheet'));\n\n if (typeof idOrIndex === 'number') return sheets[idOrIndex] || null;\n if (typeof idOrIndex === 'string') {\n return this.shadow.querySelector(`nine-table-sheet#${idOrIndex}, nine-table-sheet[data-sheet-id=\"${idOrIndex}\"]`) || null;\n }\n return sheets[0] || null;\n }\n\n get sheets() {\n return Array.from(this.shadow.querySelectorAll('nine-table-sheet'));\n }\n\n get activeSheet() {\n return this.shadow.querySelector('nine-table-sheet.active') || null;\n }\n\n #bindDynamicSetters() {\n const extractedMethodNames = new Set();\n\n this.querySelectorAll('[data-source]').forEach(el => {\n const dataSource = el.getAttribute('data-source');\n if (!dataSource) return;\n\n const matches = dataSource.matchAll(/(?:host\\.)?([a-zA-Z0-9_$]+)\\s*\\(/g);\n for (const match of matches) {\n const name = match[1];\n if (name && name !== 'host') {\n extractedMethodNames.add(name);\n }\n }\n });\n\n extractedMethodNames.forEach(methodName => {\n let internalValue = null;\n\n Object.defineProperty(this, methodName, {\n set: (newValue) => {\n internalValue = newValue;\n\n this.rerenderer();\n },\n get: () => internalValue,\n configurable: true,\n enumerable: true\n });\n });\n }\n\n execute = (fn) => {\n setTimeout(() => {\n this.loading = true;\n setTimeout(() => {\n try {\n fn.call(this);\n } finally {\n this.loading = false;\n }\n });\n });\n }\n}\n\nif (!customElements.get('nine-table')) {\n customElements.define('nine-table', NineTable);\n}\n\nif (!customElements.get('nine-table-simple')) {\n customElements.define('nine-table-simple', class extends NineTable {\n connectedCallback() {\n this.setAttribute('theme', 'simple');\n\n super.connectedCallback();\n }\n });\n}","export class BasicCellElement extends HTMLElement {\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tapplyBaseStyle() {\n\t}\n\n\tconnectedCallback() {\n\t}\n}","import { trace } from \"@nopeer\";\nimport { BasicCellElement } from './BasicCellElement.js';\n\nconst exprCache = new Map();\n\nexport class CellElement extends BasicCellElement {\n\t#host;\n\t#sheet;\n\t#tr;\n\t#cell;\n\t#attr;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tget host() { return this.#host; }\n\tget sheet() { return this.#sheet; }\n\tget cell() { return this.#cell; }\n\tget tr() { return this.#tr; }\n\tget attr() { return this.#attr; }\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\n\t\tthis.#host = this.getRootNode().host;\n\n\t\tthis.#cell = this.closest(\"th,td\");\n\t\tthis.#tr = this.#cell.closest(\"tr\");\n\t\tthis.#sheet = this.#tr.closest(\"nine-table-sheet\");\n\n\t\tthis.#cell.classList.add(this.tagName);\n\n\t\tthis.#attr = {};\n\t\tfor (let i = 0; i < this.#cell.attributes.length; i++) {\n\t\t\tconst name = this.#cell.attributes[i].name;\n\t\t\tif (![\"text-align\",\"class\",\"cell-type\",\"data-bind\",\"data-expr\",\"data-col\",\"tabindex\"].includes(name)) {\n\t\t\t\tthis.#attr[name] = this.#cell.attributes[i].value;\n\t\t\t\t//this.setAttribute(name, this.#cell.attributes[i].value);\n\t\t\t}\n\t\t}\n\n\t\tif (!this.#cell) return;\n\n\n\t\tconst root = this.shadowRoot || this;\n\n\t\t// ๐ฏ ๋ฒํผ ์ด๋ฒคํธ ์ฐ๊ฒฐ\n\t\troot.querySelectorAll(\"button, ng-expand-button\").forEach(button => {\n\t\t\tbutton.addEventListener(\"click\", () => {\n\t\t\t\tlet fn = this.getAttribute(\"onbuttonclick\") || this.getAttribute(\"onButtonClick\") || this.#cell?.getAttribute(\"onbuttonclick\") || this.#cell?.getAttribute(\"onButtonClick\");\n\n\t\t\t\tconst rowData = this.data; // Proxy Lazy ์ ๊ทผ\n\t\t\t\tconst curRow = parseInt(this.#cell.dataset.row, 10);\n\n\t\t\t\tif (fn && this.#host) {\n\t\t\t\t\tfn = fn.replace(\"()\", \"\");\n\t\t\t\t\tconst match = fn.match(/^(\\w+)\\s*\\(/);\n\t\t\t\t\tconst methodName = match?.[1] || fn;\n\n\t\t\t\t\tif (typeof this.#host[methodName] === 'function') {\n\t\t\t\t\t\tthis.#host[methodName].call(this.#host, rowData, curRow, this.#cell);\n\t\t\t\t\t} else if (typeof this.#host.exprFunction === 'function') {\n\t\t\t\t\t\tthis.#host.exprFunction(fn).call(this, rowData, curRow);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t/**\n\t\t\t\tthis.#host?.dispatchEvent(new CustomEvent(ninegrid.EVENT.BUTTON_CLICK, {\n\t\t\t\t\tdetail: { target: this.#cell, data: rowData, currow: curRow },\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true\n\t\t\t\t})); */\n\t\t\t});\n\t\t});\n\n\t\t// ๐ฏ ๋งํฌ ์ด๋ฒคํธ ์ฐ๊ฒฐ\n\t\tconst renderer = root.querySelector(\".renderer\");\n\t\tif (renderer && this.getAttribute(\"link\") === \"true\") {\n\t\t\trenderer.classList.add(\"link\");\n\n\t\t\trenderer.addEventListener(\"click\", () => {\n\t\t\t\tlet fn = this.getAttribute(\"onlinkclick\") || this.getAttribute(\"onLinkClick\");\n\n\t\t\t\tconst rowData = this.data;\n\t\t\t\tconst curRow = parseInt(this.#cell.dataset.row, 10);\n\n\t\t\t\tif (fn && this.#host) {\n\t\t\t\t\tfn = fn.replace(\"()\", \"\");\n\t\t\t\t\tconst match = fn.match(/^(\\w+)\\s*\\(/);\n\t\t\t\t\tconst methodName = match?.[1] || fn;\n\n\t\t\t\t\tif (typeof this.#host[methodName] === 'function') {\n\t\t\t\t\t\tthis.#host[methodName].call(this.#host, rowData, curRow, this.#cell);\n\t\t\t\t\t} else if (typeof this.#host.exprFunction === 'function') {\n\t\t\t\t\t\tthis.#host.exprFunction(fn).call(this, rowData, curRow);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.#host?.dispatchEvent(new CustomEvent(ninegrid.EVENT.LINK_CLICK, {\n\t\t\t\t\tdetail: { target: this.#cell, data: rowData, currow: curRow },\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true\n\t\t\t\t}));\n\t\t\t});\n\t\t}\n\t}\n\n\tget data() {\n\t\tconst rawRecord = this.#tr?.data;\n\t\tif (!rawRecord) return null;\n\t\tif (!rawRecord.v) return rawRecord;\n\n\t\tconst host = this.#host;\n\n\t\treturn new Proxy(rawRecord, {\n\t\t\tget(target, prop) {\n\t\t\t\tif (prop === '__ng') return target.__ng;\n\t\t\t\tif (prop === 'v') return target.v;\n\n\t\t\t\tconst idx = host?.fields?.indexOf?.(prop) ?? -1;\n\t\t\t\treturn idx >= 0 ? target.v[idx] : target[prop];\n\t\t\t}\n\t\t});\n\t}\n\n\tget value() {\n\t\tif (!this.#cell || !this.#tr?.data) return \"\";\n\n\t\tconst bindKey = this.#cell.dataset?.bind;\n\t\tif (!bindKey) return \"\";\n\n\t\tconst rawRecord = this.#tr.data;\n\n\t\tif (rawRecord.v && Array.isArray(rawRecord.v)) {\n\t\t\tconst colIdx = this.#host.fields.get().indexOf(bindKey) ?? -1;\n\t\t\treturn colIdx >= 0 ? (rawRecord.v[colIdx] ?? \"\") : \"\";\n\t\t}\n\n\t\treturn rawRecord[bindKey] ?? \"\";\n\t}\n\n\tset value(v) {\n\t\tif (!this.#cell || !this.#host?.data) return;\n\n\t\tconst row = parseInt(this.#tr.dataset.row, 10);\n\t\tconst bindKey = this.#cell.dataset.bind;\n\t\tif (isNaN(row) || !bindKey) return;\n\n\t\tthis.#host.data.setValue(row, bindKey, v);\n\t}\n\n\tget row() {\n\t\treturn parseInt(this.#cell?.dataset?.row, 10);\n\t}\n\tget index() {\n\t\treturn parseInt(this.#cell?.dataset?.index, 10);\n\t}\n\n\tisValid() {\n\t\treturn this.#cell.classList.contains(\"invalid\") ? false : true;\n\t}\n\n\tisInvalid() {\n\t\treturn !this.isValid();\n\t}\n\n\tgetDisplayText = (defaultValue = \"\") => {\n\n\t\tif (!this.#cell || !this.#cell.closest(\"tbody\")) return defaultValue;\n\n\t\tconst rawRecord = this.#tr.data;\n\n\t\tif (!rawRecord) return defaultValue;\n\n\t\tconst expr = this.#cell.dataset.expr;\n\t\tconst bindKey = this.#cell.dataset.bind;\n\t\tconst row = parseInt(this.#cell.dataset.row, 10);\n\n\t\tif (expr) {\n\t\t\ttry {\n\t\t\t\tif (this.#tr.getAttribute(\"grouping\") === \"true\") {\n\n\t\t\t\t\treturn this.getGroupExprValue(expr, this.#tr.data, row, this.#cell);\n\t\t\t\t} else {\n\t\t\t\t\treturn this.#host.exprEngine.evaluate(expr, this.#tr.data, row);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\treturn defaultValue;\n\t\t\t}\n\t\t}\n\n\t\tif (bindKey) {\n\t\t\tconst val = this.value;\n\t\t\treturn val !== null && val !== undefined ? val : defaultValue;\n\t\t}\n\n\t\treturn defaultValue;\n\t};\n\n\n\n\trefresh() {\n\n\t\tif (!this.#cell || !this.#tr) return;\n\n\t\tconst val = this.value;\n\n\t\tthis.#cell.classList.remove(\"invalid\");\n\n\t\t[\"color\",\"background\",\"background-color\",\"visible\",\"enable\",\"validator\"].forEach(v => {\n\n\t\t\tconst expr = this.#attr[v];\n\t\t\tif (expr) {\n\t\t\t\tconst result = this.#host.exprEngine.evaluate(expr, this.#tr.data, parseInt(this.#cell.dataset.row, 10));\n\n\t\t\t\tif (v === \"validator\") {\n\t\t\t\t\tif (!result) {\n\t\t\t\t\t\tthis.#cell.classList.add(\"invalid\");\n\t\t\t\t\t}\n\t\t\t\t} else if (v === \"visible\") {\n\t\t\t\t\tthis.style[\"display\"] = result ? \"\" : \"none\";\n\t\t\t\t} else if (v === \"enable\") {\n\t\t\t\t\tthis.querySelectorAll(\"input, button, textarea, select\").forEach($el => {\n\t\t\t\t\t\t$el.disabled = !result;\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!!result) {\n\t\t\t\t\t\tthis.#cell.removeAttribute(\"disabled\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.#cell.setAttribute(\"disabled\", \"true\");\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.#cell.style[v] = result;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn val;\n\t}\n\n\tgetExprValue(expr, data, row) {\n\t\tif (!this.#host || !this.#host.exprEngine || expr === undefined || expr === null || expr === \"\") return expr;\n\n\t\treturn this.#host.exprEngine.evaluate(expr, data, row);\n\t}\n\n\tgetGroupExprValue = (expr, groupRecord, row, cell) => {\n\t\tif (!expr) return \"\";\n\n\t\ttry {\n\t\t\trow = parseInt(row, 10);\n\t\t\tconst cleanExpr = expr.replace(\"()\", \"\").trim();\n\n\t\t\tif (this.#host && typeof this.#host[cleanExpr] === 'function') {\n\t\t\t\treturn this.#host[cleanExpr].call(this, groupRecord, row, cell);\n\t\t\t}\n\n\t\t\tconst match = cleanExpr.match(/^(\\w+)\\s*\\(\\s*([\\w\\-]*)\\s*\\)/);\n\t\t\tif (match) {\n\t\t\t\tconst indices = groupRecord[GROUP_IDX.CHILDREN];\n\t\t\t\tconst allRecords = this.#host?.data?.getArray ? this.#host.data.getArray() : [];\n\t\t\t\tconst childRecords = indices ? indices.map(idx => allRecords[idx]).filter(Boolean) : [];\n\n\t\t\t\tconst [, funcName, field] = match;\n\t\t\t\tconst host = this.#host;\n\n\t\t\t\tswitch (funcName.toLowerCase()) {\n\t\t\t\t\tcase 'count':\n\t\t\t\t\t\treturn childRecords.length;\n\n\t\t\t\t\tcase 'sum': {\n\t\t\t\t\t\tconst colIdx = host?.fields?.indexOf?.(field) ?? -1;\n\t\t\t\t\t\treturn childRecords.reduce((acc, record) => {\n\t\t\t\t\t\t\tconst val = colIdx >= 0 ? record.v?.[colIdx] : record[field];\n\t\t\t\t\t\t\treturn acc + (Number(val) || 0);\n\t\t\t\t\t\t}, 0);\n\t\t\t\t\t}\n\n\t\t\t\t\tcase 'avg': {\n\t\t\t\t\t\tif (childRecords.length === 0) return 0;\n\t\t\t\t\t\tconst colIdx = host?.fields?.indexOf?.(field) ?? -1;\n\t\t\t\t\t\tconst sum = childRecords.reduce((acc, record) => {\n\t\t\t\t\t\t\tconst val = colIdx >= 0 ? record.v?.[colIdx] : record[field];\n\t\t\t\t\t\t\treturn acc + (Number(val) || 0);\n\t\t\t\t\t\t}, 0);\n\t\t\t\t\t\treturn sum / childRecords.length;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// 3. ํธ์คํธ์ exprFunction ํ์ฉ\n\t\t\tif (this.#host && typeof this.#host.exprFunction === 'function') {\n\t\t\t\treturn this.#host.exprFunction(expr).call(this, groupRecord, row, this.#host.data);\n\t\t\t}\n\n\t\t\tif (expr.includes(\"data.\") || expr.includes(\"childRecords\") || expr.includes(\"groupRecord\")) {\n\t\t\t\tlet evalFn = exprCache.get(\"grp_\" + expr);\n\t\t\t\tif (!evalFn) {\n\t\t\t\t\tevalFn = new Function('groupRecord', 'row', 'cell', 'host', `\n const indices = groupRecord[3]; // GROUP_IDX.CHILDREN = 3\n const allRecords = host?.data?.getArray ? host.data.getArray() : [];\n \n let childRecords = [];\n if (Array.isArray(indices)) {\n // indices๊ฐ ์ซ์ ์ธ๋ฑ์ค ๋ฐฐ์ด์ธ์ง, rowid ๋ฌธ์์ด ๋ฐฐ์ด์ธ์ง ํ๋ณํ์ฌ ์์ ํ๊ฒ ์ถ์ถ\n childRecords = indices.map(idx => {\n if (typeof idx === 'number') {\n return allRecords[idx];\n } else {\n // rowid ๋ฑ ๋ฌธ์์ด ์๋ณ์์ธ ๊ฒฝ์ฐ ์ ์ฒด ๋ฐฐ์ด์์ ์ฐพ๊ฑฐ๋ dataManager ํ์ฉ\n return allRecords.find(r => r?.__ng?.rowid === idx || r?.m?._?.[0] === idx);\n }\n }).filter(Boolean);\n }\n \n // ๋ง์ฝ ์์์ ๋ชป ์ฐพ์๋๋ฐ host.grouping์ ์ธ ์ ์๋ค๋ฉด ๋งค๋์ ์์ ์๋\n if (childRecords.length === 0 && host?.grouping?.getChildrenRecords && groupRecord[0]) {\n childRecords = host.grouping.getChildrenRecords(groupRecord[0]);\n }\n\n const data = childRecords; // data.length ๋ฑ์ ์ธ ์ ์๋๋ก ํธํ\n return ${expr};\n `);\n\t\t\t\t\texprCache.set(\"grp_\" + expr, evalFn);\n\t\t\t\t}\n\t\t\t\treturn evalFn(groupRecord, row, cell, this.#host);\n\t\t\t}\n\n\t\t\treturn expr;\n\t\t} catch (e) {\n\t\t\tconsole.error(\"Group expr evaluation error:\", expr, e);\n\t\t\treturn expr;\n\t\t}\n\t};\n}\n\nexport class EditableCellElement extends CellElement {\n\n\tget host() { return super.host; }\n\tget sheet() { return super.sheet; }\n\tget cell() { return super.cell; }\n\tget tr() { return super.tr; }\n\tget attr() { return super.attr; }\n\n\tgetExprValue(expr, data, row, cell) {\n\t\treturn super.getExprValue(expr, data, row, cell);\n\t}\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\t}\n\n\trefresh() {\n\t\treturn super.refresh();\n\t}\n\n\tgetExprValue = (expr, data, row, cell) => {\n\t\treturn super.getExprValue(expr, data, row, cell);\n\t}\n\n\tisValid = () => {\n\t\treturn super.isValid();\n\t}\n\n\tisInvalid = () => {\n\t\treturn super.isInvalid();\n\t}\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellInputText extends EditableCellElement\n{\n\t#target;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\t\n\tconnectedCallback() {\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"input\");\n\n\t\tthis.#initEvent();\n\t};\n\n\trefresh = () => {\n\t\tconst v = super.refresh();\n\t\tthis.#target.value = v;\n\t};\n\n\t#initEvent = () => {\n\t\tthis.#target.addEventListener(\"input\", e => {\n\t\t\tif (this.#maxbyte) {\n\t\t\t\tconst maxByteNum = Number(this.#maxbyte);\n\t\t\t\tconst currentBytes = nine.getByteLength(e.target.value);\n\n\t\t\t\tif (currentBytes > maxByteNum) {\n\t\t\t\t\te.target.value = nine.cut(e.target.value, maxByteNum);\n\t\t\t\t\tthis.value = e.target.value;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tthis.#target.addEventListener(\"change\", (event) => {\n\t\t\tthis.value = event.target.value;\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\t};\n\n\t#renderer = () => {\n\n\t\tthis.innerHTML = `\n\t\t\t<input type=\"text\" ondragstart=\"return false;\">\n\t\t`;\n\t};\n\n\tget #maxbyte() {\n\t\treturn this.cell.getAttribute(\"maxbyte\") || this.cell.getAttribute(\"max-byte\");\n\t}\n}\n\nif (!customElements.get('cell-input')) {\n\tcustomElements.define(\"cell-input\", CellInputText);\n}\n","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellInputNumber extends EditableCellElement\n{\n\t#target;\n\n\tconstructor () {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"input\");\n\n\t\tthis.#initEvent();\n\n\n\t};\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <input type=\"text\" ondragstart=\"return false;\">\n `;\n\t};\n\n\t#initEvent = () => {\n\t\tthis.#target.addEventListener(\"keydown\", this.#onKeyDown);\n\n\t\tthis.#target.addEventListener(\"input\", (event) => {\n\t\t\tthis.value = event.target.value;\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\n\t\tthis.#target.addEventListener(\"change\", (event) => {\n\t\t\tthis.value = event.target.value;\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\t};\n\n\trefresh = () => {\n\t\tconst v = super.refresh();\n\n\t\tthis.#target.value = v;//v !== undefined && v !== null ? v : \"\";\n\n\t\tif (this.isValid()) {\n\t\t\tthis.#validate();\n\t\t}\n\t};\n\n\t#validate = () => {\n\n\t\tconst v = this.#target.value;\n\n\t\tif (v !== \"\" && v !== null && v !== undefined) {\n\t\t\tconst num = Number(v);\n\n\t\t\tif (isNaN(num) || (this.#max && num > Number(this.#max)) || (this.#min && num < Number(this.#min))) {\n\t\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t\t}\n\t\t\telse if (this.#scale) {\n\t\t\t\tconst str = String(v);\n\t\t\t\tconst idx = str.indexOf('.');\n\t\t\t\tif (idx >= 0 && str.substring(idx + 1).length > Number(this.#scale)) {\n\t\t\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t#onKeyDown = e => {\n\n\t\tif ([\"Escape\", \"Enter\", \"Tab\", \"Home\", \"End\", \"ArrowLeft\", \"ArrowRight\", \"PageUp\", \"PageDown\", \"Backspace\", \"Delete\"].includes(e.code)) return;\n\n\t\tconst target = e.target;\n\t\tconst value = target.value;\n\t\tconst selectionStart = target.selectionStart;\n\t\tconst key = e.key;\n\n\t\tif (key === \"-\") {\n\t\t\tif (value.includes(\"-\") || selectionStart !== 0) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (key === \".\") {\n\t\t\tconst scale = Number(this.#scale);\n\n\t\t\tif (isNaN(scale) || scale <= 0 || value.includes(\".\")) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tlet validKey = [];\n\t\tif (this.#scale && Number(this.#scale) > 0) validKey.push(\".\");\n\t\tif (this.#min || Number(this.#min) > 0) validKey.push(\"-\");\n\n\t\tconst isNumKey = (e.keyCode >= 48 && e.keyCode <= 57) || (e.keyCode >= 96 && e.keyCode <= 105);\n\n\t\tif (!isNumKey && !validKey.includes(e.key)) {\n\t\t\te.preventDefault();\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.#scale && isNumKey && e.target.selectionStart == e.target.selectionEnd) {\n\t\t\tconst s = e.target.value;\n\t\t\tconst idx = s.indexOf(\".\");\n\t\t\tif (idx >= 0 && e.target.selectionStart > idx) {\n\t\t\t\tconst decimalPart = s.substr(idx + 1);\n\t\t\t\tif (decimalPart.length >= Number(this.#scale)) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this.#maxbyte && nine.getByteLength(e.target.value) >= Number(this.#maxbyte) && e.target.selectionStart == e.target.selectionEnd) {\n\t\t\te.preventDefault();\n\t\t}\n\t}\n\n\tget #min() {\n\t\treturn this.cell.getAttribute(\"min\") || \"\";\n\t}\n\n\tget #max() {\n\t\treturn this.cell.getAttribute(\"max\") || \"\";\n\t}\n\n\tget #scale() {\n\t\treturn this.cell.getAttribute(\"scale\") || \"\";\n\t}\n\n\tget #maxbyte() {\n\t\treturn this.cell.getAttribute(\"maxbyte\") || this.cell.getAttribute(\"max-byte\");\n\t}\n}\n\nif (!customElements.get('cell-input-number')) {\n\tcustomElements.define(\"cell-input-number\", CellInputNumber);\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellInputColor extends EditableCellElement\n{\n\t#target;\n\t#btn;\n\t#dataSource;\n\n\tconstructor () {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"input[type=color]\");\n\t\tthis.#btn = this.querySelector(\"button\");\n\n\t\t//this.#rendererColor();\n\n\t\tthis.#initEvent();\n\t};\n\n\t#initEvent = () => {\n\t\tthis.#btn.addEventListener(\"click\", () => {\n\t\t\tthis.#target.click();\n\t\t});\n\n\t\tthis.#target.addEventListener(\"input\", (event) => {\n\t\t\tconst val = event.target.value;\n\t\t\tthis.value = val;\n\t\t\tthis.#validate(val);\n\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\n\t\tthis.#target.addEventListener(\"change\", (event) => {\n\t\t\tconst val = event.target.value;\n\t\t\tthis.value = val;\n\t\t\tthis.#validate(val);\n\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <input type=\"color\" ondragstart=\"return false;\">\n <button tabindex=\"-1\" type=\"button\"></button>\n `;\n\t};\n\n\trerenderer = () => {\n\t\tthis.refresh();\n\t};\n\n\t#rendererColor = () => {\n\n\t\tconst dataSource = this.cell.getAttribute(\"data-source\");\n\t\tif (!dataSource) return;\n\n\t\tthis.#dataSource = super.getExprValue(dataSource, this.tr.data, this.tr.dataset.row);\n\n\t\tthis.querySelector(\"datalist\")?.remove();\n\n\t\tif (this.#dataSource && Array.isArray(this.#dataSource)) {\n\t\t\tconst datalistId = `color-list-${Math.random().toString(36).substr(2, 9)}`;\n\n\t\t\tconst datalist = document.createElement('datalist');\n\t\t\tdatalist.id = datalistId;\n\n\t\t\tconst fragment = document.createDocumentFragment();\n\n\t\t\tthis.#dataSource.forEach(v => {\n\t\t\t\tif (v.value) {\n\t\t\t\t\tconst option = document.createElement('option');\n\t\t\t\t\toption.value = v.value;\n\t\t\t\t\tfragment.appendChild(option);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tdatalist.appendChild(fragment);\n\t\t\tthis.appendChild(datalist);\n\n\t\t\tthis.#target.setAttribute(\"list\", datalistId);\n\t\t}\n\t};\n\n\trefresh = () => {\n\t\tif (!this.tr.data) return;\n\n\t\tconst v = super.refresh();\n\n\t\tthis.#rendererColor();\n\n\t\tthis.#target.value = v !== undefined && v !== null && v !== \"\" ? v : \"#ffffff\";\n\n\t\tif (this.isValid()) {\n\t\t\tthis.#validate();\n\t\t}\n\t};\n\n\t#validate = () => {\n\n\t\tconst v = this.#target.value;\n\n\t\tif (v !== \"\" && v !== null && v !== undefined) {\n\t\t\tif (!this.#isValidColor(v)) {\n\t\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t\t}\n\t\t\telse if (this.#dataSource && Array.isArray(this.#dataSource) && this.#dataSource.length > 0) {\n\t\t\t\tconst exists = this.#dataSource.some(item => {\n\t\t\t\t\tconst itemCode = item.value !== undefined ? item.value : (item.code !== undefined ? item.code : '');\n\t\t\t\t\treturn itemCode.toLowerCase() === v.toLowerCase();\n\t\t\t\t});\n\n\t\t\t\tif (!exists) {\n\t\t\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t#isValidColor = (v) => {\n\t\tif (typeof v !== \"string\" || v.length != 7 || !v.startsWith(\"#\")) return false;\n\n\t\tvar r = parseInt(v.substr(1, 2), 16);\n\t\tvar g = parseInt(v.substr(3, 2), 16);\n\t\tvar b = parseInt(v.substr(5, 2), 16);\n\n\t\tif (isNaN(r) || isNaN(g) || isNaN(b)) return false;\n\t\tif (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) return false;\n\n\t\treturn true;\n\t}\n}\n\nif (!customElements.get('cell-input-color')) {\n\tcustomElements.define(\"cell-input-color\", CellInputColor);\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellInputDate extends EditableCellElement\n{\n\t#target;\n\t#type;\n\n\tconstructor () {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"input\");\n\n\t\tthis.#target.addEventListener(\"input\", (event) => {\n\t\t\tconst val = event.target.value;\n\t\t\tthis.value = val;\n\t\t\tthis.#target.classList.toggle(\"has-value\", !!val); // ๐ก ์ค์๊ฐ ๋ฐ์\n\t\t\tthis.#validate(val);\n\n\t\t\tsuper.sheet.rowManager.refresh(true);\n\t\t});\n\n\t\tthis.#target.addEventListener(\"change\", (event) => {\n\t\t\tconst val = event.target.value;\n\t\t\tthis.value = val;\n\t\t\tthis.#validate(val);\n\n\t\t\tsuper.sheet.rowManager.refresh(true);\n\t\t});\n\t};\n\n\t#renderer = () => {\n\n\t\tthis.#type = this.cell.getAttribute(\"date-type\") || \"date\";\n\t\tif (![\"date\",\"datetime-local\",\"time\",\"week\",\"month\"].includes(this.#type)) {\n\t\t\tthrow `invalid type : ${this.#type}`;\n\t\t}\n\n\t\tlet attr = [];\n\t\tfor (let i = 0; i < this.cell.attributes.length; i++) {\n\t\t\tif ([\"value\", \"max\", \"min\", \"step\"].includes(this.cell.attributes[i].name)) {\n\t\t\t\tattr.push(`${this.cell.attributes[i].name}=\"${this.cell.attributes[i].value}\"`);\n\t\t\t}\n\t\t}\n\n\t\tthis.innerHTML = `\n <input\n type=\"${this.#type}\"\n data-placeholder=\"${this.cell.getAttribute('placeholder') || 'Select'}\"\n ${attr.join(\" \")}\n required\n />\n `;\n\t};\n\n\trefresh = () => {\n\n\t\tconst v = super.refresh();\n\n\t\tlet formattedVal = v;\n\t\tif (formattedVal) {\n\n\t\t\tswitch (this.#type) {\n\t\t\t\tcase \"date\":\n\t\t\t\t\tformattedVal = formattedVal.substr(0, 10);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"datetime-local\":\n\t\t\t\t\tformattedVal = formattedVal.substr(0, 16);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"time\":\n\t\t\t\t\tvar d = new Date(v);\n\t\t\t\t\tif (d != \"Invalid Date\" && !isNaN(d)) {\n\t\t\t\t\t\tformattedVal = (\"00\" + d.getHours()).slice(-2) + \":\" + (\"00\" + d.getMinutes()).slice(-2);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"month\":\n\t\t\t\t\tvar d = new Date(v);\n\t\t\t\t\tif (d != \"Invalid Date\" && !isNaN(d)) {\n\t\t\t\t\t\tformattedVal = (\"0000\" + d.getFullYear()).slice(-4) + \"-\" + (\"00\" + (d.getMonth() + 1)).slice(-2);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tthis.#target.value = formattedVal || \"\";\n\t\tthis.#target.classList.toggle(\"has-value\", !!formattedVal); // ๐ก ๊ฐ์ด ์์ผ๋ฉด ํด๋์ค ์ถ๊ฐ\n\n\t\tif (this.isValid()) {\n\t\t\tthis.#validate(formattedVal);\n\t\t}\n\t};\n\n\t#validate = (val) => {\n\n\t\tif (val !== \"\" && val !== null && val !== undefined) {\n\t\t\tlet isValid = this.#isValidDate(val);\n\n\t\t\tif (isValid) {\n\t\t\t\tif (this.#min && val < this.#min) isValid = false;\n\t\t\t\tif (this.#max && val > this.#max) isValid = false;\n\t\t\t}\n\n\t\t\tif (!isValid) {\n\t\t\t\tsuper.cell.classList.add(\"invalid\");\n\t\t\t}\n\t\t}\n\t};\n\n\t#isValidDate = (v) => {\n\n\t\tif (typeof v !== \"string\") return false;\n\n\t\tlet isValid = true;\n\n\t\tswitch (this.#type) {\n\t\t\tcase \"date\":\n\t\t\tcase \"datetime-local\":\n\t\t\t\tconst year = Number(v.substr(0, 4));\n\t\t\t\tconst month = Number(v.substr(5, 2));\n\t\t\t\tconst day = Number(v.substr(8, 2));\n\n\t\t\t\tif (isNaN(year) || isNaN(month) || isNaN(day)) {\n\t\t\t\t\tisValid = false;\n\t\t\t\t} else if (month < 1 || month > 12 || day < 1 || day > 31) {\n\t\t\t\t\tisValid = false;\n\t\t\t\t} else if ([4, 6, 9, 11].includes(month) && day == 31) {\n\t\t\t\t\tisValid = false;\n\t\t\t\t} else if (month == 2) {\n\t\t\t\t\tlet isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));\n\t\t\t\t\tif (day > 29 || (day == 29 && !isleap)) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (isValid) {\n\t\t\tswitch (this.#type) {\n\t\t\t\tcase \"datetime-local\":\n\t\t\t\t\tvar t = v.substr(10, 1);\n\t\t\t\t\tvar hour = Number(v.substr(11, 2));\n\t\t\t\t\tvar min = Number(v.substr(14, 2));\n\n\t\t\t\t\tif (t != \"T\") {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (isNaN(hour) || isNaN(min)) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (hour < 0 || hour > 23 || min < 0 || min > 59) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"month\":\n\t\t\t\t\tvar year = Number(v.substr(0, 4));\n\t\t\t\t\tvar month = Number(v.substr(5, 2));\n\n\t\t\t\t\tif (isNaN(year) || isNaN(month)) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (month < 1 || month > 12) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"week\":\n\t\t\t\t\tvar year = Number(v.substr(0, 4));\n\t\t\t\t\tvar w = v.substr(5, 1);\n\t\t\t\t\tvar week = Number(v.substr(6, 2));\n\n\t\t\t\t\tif (w != \"W\") {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (isNaN(year) || isNaN(week)) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (week <= 0 || week > 53) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn isValid;\n\t}\n\n\tget #min() {\n\t\treturn this.cell.getAttribute(\"min\");\n\t}\n\n\tget #max() {\n\t\treturn this.cell.getAttribute(\"max\");\n\t}\n\n\tget #step() {\n\t\treturn this.cell.getAttribute(\"step\");\n\t}\n}\n\nif (!customElements.get('cell-input-date')) {\n\tcustomElements.define(\"cell-input-date\", CellInputDate);\n}","import { EditableCellElement } from \"./core/CellElement.js\";\nimport {trace} from \"@nopeer\";\n\nclass CellCheckbox extends EditableCellElement {\n #target;\n #label;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n super.connectedCallback();\n\n this.#renderer();\n\n this.#target = this.querySelector(\"input\");\n this.#label = this.querySelector(\"span\");\n\n this.#initEvent();\n }\n\n get dataSource() {\n return [\n { value: this.trueValue, text: this.#trueText },\n { value: this.falseValue, text: this.#falseText }\n ];\n }\n\n #initEvent = () => {\n if (this.closest(\"thead\")) {\n this.#target.addEventListener(\"change\", (e) => {\n super.sheet.querySelector(`tbody.body [data-col=\"${super.cell.dataset.col}\"] cell-checkbox`)?.selectAll(e.target.checked);\n });\n }\n\n this.#target.addEventListener(\"change\", (event) => {\n if (!this.closest(\"tbody\")) return;\n\n if (this.#isRadio) {\n this.selectAll(false);\n this.value = this.trueValue;\n }\n else {\n this.value = event.target.checked ? this.trueValue : this.falseValue;\n }\n\n this.sheet.rowManager.refresh(true);\n });\n };\n\n #renderer = () => {\n\n const trueValue = this.trueValue;//this.cell.getAttribute(\"true-value\") || false;\n //const selectedBorderColor = this.getAttribute(\"selected-border-color\") || \"dimgray\";\n\n const originalContent = this.cell.getAttribute(\"content\") || \"\";\n const childHtml = this.#isRadio ? `<input type=\"radio\" value=\"${trueValue}\" />` : `<label><input type=\"checkbox\" /><span>${originalContent}</span></label>`;\n\n this.innerHTML = `\n ${childHtml}\n `;\n }\n\n refresh = () => {\n const val = super.refresh();\n\n this.#target.checked = (val === this.trueValue);\n\n if (this.isValid()) {\n this.#validate(val);\n }\n\n const displayText = (val === this.trueValue) ? this.#trueText : ((val === this.falseValue) ? this.#falseText : val);\n\n if (this.#label) {\n this.#label.textContent = displayText;\n }\n };\n\n #validate = (val) => {\n\n this.cell.classList.remove(\"invalid\");\n\n if (val !== \"\" && val !== null && val !== undefined) {\n if (val !== this.trueValue && val !== this.falseValue) {\n this.cell.classList.add(\"invalid\");\n }\n }\n };\n\n selectAll = (v) => {\n if (this.closest(\"thead\")) return; // ํค๋ ์์ ์ ์ ์ธ\n\n const data = this.host.data.getArray();\n const colIndex = this.host.fields.indexOf(this.cell.dataset.bind);\n\n if (colIndex < 0) return;\n\n for (let i = 0; i < data.length; i++) {\n if (this.#enable && super.getExprValue(this.#enable, data[i], i, this.cell) === false) continue;\n if (this.#readonly && super.getExprValue(this.#readonly, data[i], i, this.cell) === true) continue;\n if (this.#visible && super.getExprValue(this.#visible, data[i], i, this.cell) === false) continue;\n\n data[i].v[colIndex] = v ? this.trueValue : this.falseValue;\n }\n\n super.sheet.invalidate();\n };\n\n get trueValue() {\n return this.cell.getAttribute(\"true-value\") || \"Y\";\n }\n get falseValue() {\n return this.cell.getAttribute(\"false-value\")|| \"N\";\n }\n get #trueText() {\n return this.cell.getAttribute(\"true-text\") || \"\";\n }\n get #falseText() {\n return this.cell.getAttribute(\"false-text\") || \"\";\n }\n get #isRadio() {\n return this.cell.getAttribute(\"is-radio\") || false;\n }\n get #enable() {\n return this.cell.getAttribute(\"enable\") || false;\n }\n get #readonly() {\n return this.cell.getAttribute(\"readonly\") || false;\n }\n get #visible() {\n return this.cell.getAttribute(\"visible\") || false;\n }\n}\n\nif (!customElements.get('cell-checkbox')) {\n customElements.define(\"cell-checkbox\", CellCheckbox);\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellRadio extends EditableCellElement {\n\t#target;\n\t#radioList = [];\n\t#dataSource = [];\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#rendererRadio();\n\n\t\tthis.#initEvent();\n\t}\n\n\t#initEvent = () => {\n\n\t\tthis.cell.addEventListener(\"keydown\", e => {\n\n\t\t\tif (this.cell.hasAttribute(\"readonly\") || this.cell.classList.contains(\"readonly\")) return;\n\t\t\tif (this.cell.getAttribute(\"disabled\") === \"true\") return;\n\n\t\t\tif (e.code === \"Space\") {\n\t\t\t\te.preventDefault();\n\n\t\t\t\tlet matchIndex = -1;\n\n\t\t\t\tthis.#radioList.forEach(($el,index) => {\n\t\t\t\t\tif (this.value === $el.getAttribute(\"value\")) {\n\t\t\t\t\t\tmatchIndex = index;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tmatchIndex = (matchIndex === this.#radioList.length - 1) ? 0 : (matchIndex >= 0 ? matchIndex + 1 : 0);\n\t\t\t\tthis.value = this.#radioList[matchIndex].getAttribute(\"value\");\n\n\t\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t\t}\n\t\t});\n\t};\n\n\t#rendererRadio = () => {\n\n\t\tif (!this.host) return;\n\n\t\tconst dataSource = this.cell.getAttribute(\"data-source\");\n\t\tif (!dataSource) return;\n\n\t\tthis.#dataSource = super.getExprValue(dataSource, this.tr.data, this.tr.dataset.row);\n\n\t\tthis.#target.replaceChildren();\n\n\t\tif (this.#dataSource && Array.isArray(this.#dataSource)) {\n\n\t\t\tconst fragment = document.createDocumentFragment();\n\n\t\t\tthis.#dataSource.forEach(v => {\n\t\t\t\tconst codeVal = v[this.#keyName] !== undefined ? v[this.#keyName] : '';\n\t\t\t\tconst nameVal = v[this.#valueName] !== undefined ? v[this.#valueName] : '';\n\n\t\t\t\tconst label = document.createElement('label');\n\n\t\t\t\tconst input = document.createElement('input');\n\t\t\t\tinput.type = 'radio';\n\t\t\t\tinput.value = codeVal;\n\n\t\t\t\tconst span = document.createElement('span');\n\t\t\t\tspan.textContent = nameVal;\n\n\t\t\t\tlabel.appendChild(input);\n\t\t\t\tlabel.appendChild(span);\n\t\t\t\tfragment.appendChild(label);\n\t\t\t});\n\n\t\t\tthis.#target.appendChild(fragment);\n\n\n\t\t\tthis.#radioList = Array.from(this.querySelectorAll(\"input\"));\n\n\n\n\t\t\tthis.#radioList.forEach($el => {\n\t\t\t\t$el.addEventListener(\"change\", (e) => {\n\t\t\t\t\tthis.value = e.target.value;\n\t\t\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t};\n\n\t#renderer = () => {\n\n\t\tthis.innerHTML = `\n\t\t\t<div></div>\n `;\n\n\t\tthis.#target = this.querySelector(\"div\");\n\t};\n\n\trerenderer = () => {\n\t\tthis.#rendererRadio();\n\t\tthis.refresh();\n\t};\n\n\trefresh = () => {\n\n\t\tconst v = super.refresh();\n\n\t\tthis.#radioList.forEach($el => {\n\t\t\t$el.checked = (v === $el.value);\n\t\t});\n\n\t\tif (this.isValid()) {\n\t\t\tthis.#validate();\n\t\t}\n\t};\n\n\t#validate = () => {\n\n\t\tif (this.value === null || this.value === undefined || this.value === \"\" || !Array.isArray(this.#dataSource)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst idx = this.#dataSource.findIndex(m => this.value === m[this.#keyName]);\n\t\tif (idx < 0) {\n\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t}\n\t};\n\n\tget dataSource() {\n\t\treturn this.#dataSource;\n\t}\n\n\tget #keyName() {\n\t\treturn this.cell.getAttribute(\"key-name\") || \"k\";\n\t}\n\n\tget #valueName() {\n\t\treturn this.cell.getAttribute(\"value-name\") || \"v\";\n\t}\n}\n\nif (!customElements.get('cell-radio')) {\n\tcustomElements.define(\"cell-radio\", CellRadio);\n}","import { trace } from \"@nopeer\";\n\nexport class CellComboPanel extends HTMLElement {\n\t#parent;\n\t#keyName;\n\t#valueName;\n\t#isOpen = false;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tthis.#renderer();\n\t\tthis.#initEvents();\n\t}\n\n\t#initData = (dataSource, keyName, valueName, multi, separator) => {\n\t\tconst grd = this.querySelector(\"nine-table-simple\");\n\t\tif (!grd || !dataSource || dataSource.length === 0) return;\n\n\t\tconst itemsAttr = this.#parent.getAttribute(\"items\");\n\t\tlet fieldKeys = [];\n\n\t\tif (itemsAttr) {\n\t\t\tfieldKeys = itemsAttr.split(\",\").map(s => s.trim());\n\t\t} else {\n\t\t\tfieldKeys = [valueName].filter(Boolean);\n\t\t}\n\n\t\tconst activeColumnCount = fieldKeys.length;\n\n\t\tgrd.shadowRoot.querySelector(\".ng-container-left\").style.display = multi ? '' : 'none';\n\n\t\tgrd.shadowRoot.querySelectorAll('table colgroup col, tbody td').forEach(($el, idx) => {\n\n\t\t\tconst col = parseInt($el.dataset.col, 10);\n\t\t\tif (col >= 2) {\n\t\t\t\t$el.style.display = (col - 2 >= activeColumnCount) ? 'none' : '';\n\t\t\t}\n\t\t});\n\n\t\tconst formattedData = dataSource.map(item => {\n\t\t\tconst row = {\n\t\t\t\tCHK: \"N\",\n\t\t\t\tk: keyName && item[keyName] !== undefined ? item[keyName] : (item[0] !== undefined ? item[0] : \"\")\n\t\t\t};\n\n\t\t\tfieldKeys.forEach((key, idx) => {\n\t\t\t\trow[`tmp${idx + 1}`] = item[key] !== undefined ? item[key] : (item[idx] !== undefined ? item[idx] : \"\");\n\t\t\t});\n\t\t\treturn row;\n\t\t});\n\n\t\tgrd.data.set(formattedData);\n\n\t\tif (multi && this.#parent.value) {\n\t\t\tconst selectedKeys = String(this.#parent.value).split(separator || \",\");\n\t\t\tgrd.data.getValidData().forEach(m => {\n\t\t\t\tif (selectedKeys.includes(String(m.v[1]))) {\n\t\t\t\t\tm.v[0] = \"Y\";\n\t\t\t\t}\n\t\t\t});\n\t\t\tgrd.refreshData();\n\t\t}\n\t};\n\n\topen = (parent, dataSource, keyName, valueName, multi, separator) => {\n\t\tthis.#parent = parent;\n\t\tthis.#keyName = keyName;\n\t\tthis.#valueName = valueName;\n\t\tthis.#isOpen = true;\n\n\t\tthis.classList.add(\"active\");\n\n\t\tconst grd = this.querySelector(\"nine-table-simple\");\n\t\tif (!grd || !dataSource) return;\n\n\t\tthis.querySelector(\".search-input\").value = \"\";\n\t\tthis.querySelector(\"#chkAll\").checked = true;\n\n\t\tif (dataSource.length > 10) {\n\t\t\tthis.classList.add(\"expand\");\n\t\t} else {\n\t\t\tthis.classList.remove(\"expand\");\n\t\t}\n\n\t\tif (multi) {\n\t\t\tthis.classList.add(\"multi\");\n\t\t} else {\n\t\t\tthis.classList.remove(\"multi\");\n\t\t}\n\n\t\tconst sheet = parent.closest(\"nine-table-sheet\");\n\t\tconst btnEl = parent.querySelector(\".btn1\");\n\t\tif (!btnEl || !sheet) return;\n\n\t\tconst btnRect = btnEl.getBoundingClientRect();\n\t\tconst sheetRect = sheet.getBoundingClientRect();\n\n\t\tlet left = btnRect.left - sheetRect.left;\n\t\tlet top = btnRect.bottom - sheetRect.top + 2;\n\n\t\tconst panelWidth = this.offsetWidth || 250;\n\t\tconst panelHeight = this.offsetHeight || 250;\n\t\tif (left + panelWidth > sheetRect.width) {\n\t\t\tleft = Math.max(0, sheetRect.width - panelWidth - 5);\n\t\t}\n\n\t\tif (left < 0) {\n\t\t\tleft = 5;\n\t\t}\n\n\t\tif (top + panelHeight > sheetRect.height) {\n\t\t\tconst upwardTop = (btnRect.top - sheetRect.top) - panelHeight - 2;\n\t\t\tif (upwardTop >= 0) {\n\t\t\t\ttop = upwardTop;\n\t\t\t} else {\n\t\t\t\ttop = Math.max(0, sheetRect.height - panelHeight - 5);\n\t\t\t}\n\t\t}\n\n\t\tthis.style.left = `${left}px`;\n\t\tthis.style.top = `${top}px`;\n\n\t\tsetTimeout(() => {\n\n\t\t\tthis.#initData(dataSource, keyName, valueName, multi, separator);\n\n\t\t\tconst viewContainer = grd.shadowRoot.querySelector(\".ng-container-body table tbody.body\");\n\n\t\t\tif (!viewContainer.__hasClickEvent) {\n\n\t\t\t\tviewContainer.addEventListener(\"mousedown\", (e) => {\n\n\t\t\t\t\tconst tr = e.target.closest(\"tr\");\n\t\t\t\t\tif (!tr) return;\n\n\t\t\t\t\tif (!multi) {\n\t\t\t\t\t\tthis.#onClickRow(e);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tviewContainer.__hasClickEvent = true;\n\t\t\t}\n\t\t}, 100);\n\t}\n\n\tclose = () => {\n\t\tthis.classList.remove(\"active\");\n\t\tthis.#isOpen = false;\n\t\tif (this.#parent && this.#parent.cell) {\n\t\t\tthis.#parent.cell.focus();\n\t\t}\n\t}\n\n\t#onClickRow = (e) => {\n\n\t\tconst sheet = e.target.closest(\"nine-table-sheet\");\n\t\tconst tr = e.target.closest(\"tr\");\n\n\t\tconst rowIndex = parseInt(tr.dataset.row, 10);\n\t\tconst record = sheet.view.get(rowIndex);\n\n\t\tthis.#parent.value = record.k;\n\n\t\tthis.#parent.sheet.rowManager.refresh(true);\n\n\t\tthis.close();\n\t}\n\n\t#onOk = () => {\n\t\tconst grd = this.querySelector(\"nine-table-simple\");\n\t\tconst data = grd.data.getValidData();\n\n\t\tconst selectedKeys = [];\n\t\tdata.forEach(o => {\n\t\t\tif (o.v[0] === \"Y\") {\n\t\t\t\tselectedKeys.push(o.v[1]);\n\t\t\t}\n\t\t});\n\n\t\tthis.#parent.value = selectedKeys.join(this.#parent.getAttribute(\"multi-separator\") || \",\");\n\t\tthis.#parent.sheet.rowManager.refresh(true);\n\n\t\tthis.close();\n\t}\n\n\t#onSelectAll = (e) => {\n\t\tconst grd = this.querySelector(\"nine-table-simple\");\n\t\tconst isChecked = e.target.checked ? \"Y\" : \"N\";\n\t\tgrd.data.getValidData().forEach(m => { m.v[0] = isChecked; });\n\t\tgrd.refreshData();\n\t}\n\n\t#onInput = (e) => {\n\t\tconst keyword = e.target.value.toLowerCase();\n\t\tconst grd = this.querySelector(\"nine-table-simple\");\n\n\t\tgrd.data.getValidDataNF().forEach(m => {\n\t\t\tconst match = Object.values(m.v).some(val =>\n\t\t\t\tval !== null && val !== undefined && String(val).toLowerCase().includes(keyword)\n\t\t\t);\n\t\t\tm.__ng.filtered = !match;\n\t\t});\n\n\t\tgrd.data.resetRecords();\n\t\tgrd.dataManager.viewRecords.reset();\n\t}\n\n\tget isOpen() {\n\t\treturn this.#isOpen;\n\t}\n\n\tget targetCell() {\n\t\treturn this.#parent;\n\t}\n\n\t#initEvents = () => {\n\t\tthis.querySelector(\".search-input\").addEventListener(\"input\", this.#onInput);\n\t\tthis.querySelector(\"#btnOk\").addEventListener(\"click\", this.#onOk);\n\t\tthis.querySelector(\"#chkAll\").addEventListener(\"change\", this.#onSelectAll);\n\n\t\tdocument.addEventListener(\"mousedown\", (e) => {\n\t\t\tconst path = e.composedPath ? e.composedPath() : [];\n\n\t\t\tif (path.includes(this)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.close();\n\t\t});\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <div class=\"head\">\n <input type=\"text\" class=\"search-input\" placeholder=\"Search...\" />\n </div>\n \n <nine-table-simple class=\"combo-list\" theme=\"simple\">\n <table auto-fit-col=\"true\">\n <colgroup>\n <col width=\"30\" fixed=\"left\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"0\" />\n </colgroup>\n <tbody>\n <tr>\n <td cell-type=\"checkbox\" data-bind=\"CHK\"></td>\n <td data-bind=\"tmp1\" />\n <td data-bind=\"tmp2\" />\n <td data-bind=\"tmp3\" />\n <td data-bind=\"tmp4\" />\n <td data-bind=\"tmp5\" />\n <td data-bind=\"tmp6\" />\n <td data-bind=\"tmp7\" />\n <td data-bind=\"tmp8\" />\n <td data-bind=\"tmp9\" />\n <td data-bind=\"tmp10\" />\n <td data-bind=\"k\" />\n </tr>\n </tbody>\n </table>\n </nine-table-simple>\n \n <div class=\"footer\">\n <div>\n <input id=\"chkAll\" type=\"checkbox\" checked>\n <label for=\"chkAll\">Select All</label>\n </div>\n <button id=\"btnOk\">OK</button>\n </div>\n `;\n\t};\n}\n\nif (!customElements.get('cell-combo-panel')) {\n\tcustomElements.define(\"cell-combo-panel\", CellComboPanel);\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\nimport \"./cell-combo-panel.js\";\n\nexport class CellCombo extends EditableCellElement {\n\t#targetBtn;\n\t#dataSource = [];\n\t#keyName;\n\t#valueName;\n\t#multi;\n\t#multiSeparator;\n\t#panel;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tthis.#renderer();\n\t\tsuper.connectedCallback();\n\n\t\tthis.#keyName = super.cell.getAttribute(\"key-name\") || \"k\";\n\t\tthis.#valueName = super.cell.getAttribute(\"value-name\") || \"v\";\n\t\tthis.#multi = super.cell.getAttribute('multi') === \"true\";\n\t\tthis.#multiSeparator = super.cell.getAttribute(\"multi-separator\") || \",\";\n\n\t\tthis.#initData();\n\t\tthis.#initEvent();\n\t}\n\n\trerenderer = () => {\n\t\tthis.#initData();\n\t\tthis.refresh();\n\t};\n\n\t#initData = () => {\n\t\tif (!super.sheet || !super.cell) return;\n\n\t\tconst dataSource = super.cell?.getAttribute(\"data-source\");\n\t\tif (!dataSource) return;\n\n\t\tthis.#dataSource = super.getExprValue(dataSource, super.tr.data, super.tr.dataset.row);\n\t}\n\n\t#initEvent = () => {\n\t\tthis.querySelectorAll(\"button\").forEach(btn => {\n\t\t\tbtn.addEventListener(\"click\", (e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t\tthis.#togglePanel();\n\t\t\t});\n\t\t});\n\t}\n\n\t#togglePanel = () => {\n\n\t\tif (!this.#panel) {\n\t\t\tthis.#panel = super.sheet.querySelector(\"cell-combo-panel\");\n\t\t\tif (!this.#panel) {\n\t\t\t\tthis.#panel = document.createElement(\"cell-combo-panel\");\n\t\t\t\tsuper.sheet.appendChild(this.#panel);\n\t\t\t}\n\t\t}\n\n\t\tif (this.#panel.isOpen && this.#panel.targetCell === this) {\n\t\t\tthis.#panel.close();\n\t\t} else {\n\t\t\tthis.#panel.open(this, this.#dataSource, this.#keyName, this.#valueName, this.#multi, this.#multiSeparator);\n\t\t}\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <button class=\"btn1\" type=\"button\" tabindex=\"-1\">Select</button>\n <button class=\"btn2\" type=\"button\" tabindex=\"-1\"></button>\n `;\n\n\t\tthis.#targetBtn = this.querySelector(\".btn1\");\n\t};\n\n\trefresh = () => {\n\t\tconst v = super.refresh();\n\t\tif (!this.#targetBtn) return v;\n\n\t\tthis.#targetBtn.textContent = this.#getDisplayText() || \"Select\";\n\t\tthis.#validateInput();\n\n\t\treturn v;\n\t};\n\n\t#getDisplayText = () => {\n\t\tif (!this.value || !Array.isArray(this.#dataSource)) return \"\";\n\n\t\tif (this.#multi) {\n\t\t\tconst keys = String(this.value).split(this.#multiSeparator);\n\t\t\treturn this.#dataSource\n\t\t\t\t.filter(m => keys.includes(String(m[this.#keyName])))\n\t\t\t\t.map(m => m[this.#valueName])\n\t\t\t\t.join(this.#multiSeparator);\n\t\t} else {\n\t\t\tconst found = this.#dataSource.find(m => String(m[this.#keyName]) === String(this.value));\n\t\t\treturn found ? found[this.#valueName] : this.value;\n\t\t}\n\t}\n\n\t#validateInput = () => {\n\t\tif (!super.cell) return;\n\t\tsuper.cell.classList.remove(\"invalid\");\n\n\t\tif (this.value === null || this.value === undefined || this.value === \"\" || !Array.isArray(this.#dataSource)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst list = this.#multi ? String(this.value).split(this.#multiSeparator) : [this.value];\n\t\tfor (const v of list) {\n\t\t\tconst idx = this.#dataSource.findIndex(m => String(v) === String(m[this.#keyName]));\n\t\t\tif (idx < 0) {\n\t\t\t\tsuper.cell.classList.add(\"invalid\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t};\n\n\tget dataSource() {\n\t\treturn this.#dataSource;\n\t}\n}\n\nif (!customElements.get('cell-combo')) {\n\tcustomElements.define(\"cell-combo\", CellCombo);\n}","import { trace } from \"@nopeer\";\nimport { CellElement } from \"./core/CellElement.js\";\n\nclass CellRenderer extends CellElement {\n\t#target;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"span\");\n\t}\n\n\trefresh = () => {\n\n\t\tsuper.refresh();\n\n\t\tif (this.cell.getAttribute(\"html\") === \"true\") {\n\t\t\tthis.#target.innerHTML = this.getDisplayText();\n\t\t} else {\n\t\t\tthis.#target.textContent = this.getDisplayText();\n\t\t}\n\t};\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <span class=\"wrapper\"></span>\n `;\n\t};\n}\n\nif (!customElements.get(\"cell-renderer\")) {\n\tcustomElements.define(\"cell-renderer\", CellRenderer);\n}","import { CellElement } from \"./core/CellElement.js\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\nimport { trace } from \"@nopeer\";\n\nexport class CellButton extends CellElement {\n\t#target;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tthis.#renderer();\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#target = this.querySelector(\"button\");\n\n\t\tthis.#target.removeEventListener(\"click\", this.#cellButtonClick);\n\t\tthis.#target.addEventListener(\"click\", this.#cellButtonClick);\n\t}\n\n\t#cellButtonClick = e => {\n\t\te.stopPropagation();\n\n\t\tconst rowid = parseInt(this.cell.dataset.row, 10);\n\n\t\tconst customEvent = new CustomEvent(NINE_TABLE.EVENT.CELL_BUTTON_CLICK, {\n\t\t\tbubbles: true,\n\t\t\tcomposed: true,\n\t\t\tdetail: {\n\t\t\t\toriginalEvent: e,\n\t\t\t\tcell: this.cell,\n\t\t\t\trow: rowid,\n\t\t\t\tcol: parseInt(this.cell.dataset.col, 10),\n\t\t\t\tbind: this.dataset.bind,\n\t\t\t\tdata: this.host.data.get(rowid),\n\t\t\t\tvalue: this.value,\n\t\t\t}\n\t\t});\n\n\t\tthis.dispatchEvent(customEvent);\n\t};\n\n\trefresh = () => {\n\t\tconst rawValue = super.refresh ? super.refresh() : this.value;\n\t\t//let displayValue = this.getDisplayText(rawValue);\n\t\tthis.#target.innerHTML = this.getDisplayText(rawValue);\n\t};\n\n\t#renderer = () => {\n\n\t\tconst buttonText = \"...\";//this.getAttribute(\"text\") || super.attr[\"text\"] || \"\";\n\n\t\tthis.innerHTML = `\n <button class=\"button\">${buttonText}</button>\n `;\n\t};\n}\n\nif (!customElements.get('cell-button')) {\n\tcustomElements.define(\"cell-button\", CellButton);\n}","import { trace } from \"@nopeer\";\nimport { CellElement } from \"./core/CellElement.js\";\nimport {NINE_TABLE} from \"@\";\n\nclass CellRowIndicator extends CellElement {\n\t#mainTarget;\n\t#subTarget;\n\t#statusTarget;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tthis.#renderer();\n\t\tsuper.connectedCallback();\n\n\t\tif (this.cell) {\n\t\t\tthis.cell.removeAttribute(\"tabindex\");\n\t\t\tthis.cell.dataset.bind = \"rowState\";\n\t\t}\n\n\t\tthis.#mainTarget = this.querySelector(\".ng-row-main\");\n\t\tthis.#subTarget = this.querySelector(\".ng-row-sub\");\n\t\tthis.#statusTarget = this.querySelector(\".row-status\");\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n\t\t\t<span class=\"ng-row-main\"></span>\n <span class=\"ng-row-sub\"></span>\n <span class=\"row-status\"></span>\n `;\n\t}\n\n\trefresh = () => {\n\t\tif (!this.cell || !this.tr) return;\n\n\t\tthis.classList.remove(\"is-insert\", \"is-update\", \"is-delete\");\n\n\t\tconst row = this.row;\n\t\tif (isNaN(row)) return;\n\n\t\tconst rawRecord = this.tr.data;\n\n\t\tif (rawRecord) {\n\t\t\tswitch (rawRecord.m._[NINE_TABLE.META.INDEX.ROW_STATE]) {\n\t\t\t\tcase NINE_TABLE.ROW_STATE.INSERT:\n\t\t\t\t\tthis.classList.add(\"is-insert\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase NINE_TABLE.ROW_STATE.UPDATE:\n\t\t\t\t\tthis.classList.add(\"is-update\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase NINE_TABLE.ROW_STATE.DELETE:\n\t\t\t\t\tthis.classList.add(\"is-delete\");\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tconst displayNum = this.index + 1;\n\t\tconst formattedNum = displayNum.toLocaleString();\n\n\t\tif (displayNum >= 10000) {\n\n\t\t\tconst splitIndex = formattedNum.length - 4;\n\t\t\tconst prefixPart = formattedNum.substring(0, splitIndex + 1);\n\t\t\tconst suffixPart = formattedNum.substring(splitIndex + 1);\n\n\t\t\tthis.#mainTarget.innerHTML = `\n \t<span class=\"ng-row-prefix\">${prefixPart}</span>\n \t<span class=\"ng-row-suffix\">${suffixPart}</span>\n \t<div class=\"row-status\"></div>\n \t`;\n\t\t} else {\n\t\t\tthis.#mainTarget.innerHTML = `${formattedNum}`;\n\t\t}\n\n\t\tconst isSorted = this.sheet.querySelector(\"thead .asc,thead .desc\") ? true : false;\n\t\tconst isFitered = this.sheet.querySelector(\"thead nine-table-filter-button.filtered\") ? true : false;\n\n\t\tthis.#subTarget.innerHTML = row;\n\t\tthis.#subTarget.style.display = (isSorted || isFitered) ? \"\" : \"none\";\n\t};\n}\n\nif (!customElements.get('cell-row-indicator')) {\n\tcustomElements.define(\"cell-row-indicator\", CellRowIndicator);\n}","// ui/col/col-expand.js\nimport { COLLAPSED_WIDTH } from \"@/layout/core/TableCompiler.js\";\n\nexport class ColExpand extends HTMLElement {\n #sheet;\n #cell;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#cell = this.closest('th, td');\n this.#sheet = this.closest('nine-table-sheet');\n\n if (this.#cell) {\n this.#cell.style.position = 'relative';\n }\n\n const isCollapsed =\n this.getAttribute('collapsed') === 'true' ||\n this.#cell?.getAttribute('collapsed') === 'true';\n\n if (isCollapsed) {\n requestAnimationFrame(() => {\n this.collapse(true);\n });\n } else {\n this.classList.remove('collapsed');\n this.classList.add('expand');\n }\n\n this.removeEventListener('click', this.#onClick);\n this.addEventListener('click', this.#onClick);\n }\n\n #onClick = (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (this.classList.contains('expand')) {\n this.collapse();\n } else {\n this.expand();\n }\n };\n\n expand = () => {\n if (!this.#sheet?.colResizer || !this.#cell) return;\n const colIndex = parseInt(this.#cell.dataset.col, 10);\n const colSpan = this.#cell.colSpan || 1;\n\n this.classList.remove('collapsed');\n this.classList.add('expand');\n this.#cell.setAttribute('collapsed', 'false');\n this.#cell.style.color = '';\n\n const targetWidth = parseInt(this.#cell.dataset.expandWidth, 10) || 100;\n\n if (colSpan === 1) {\n this.#sheet.colResizer.setColumnWidth(colIndex, targetWidth);\n } else {\n const singleWidth = Math.max(30, Math.floor(targetWidth / colSpan));\n for (let i = 0; i < colSpan; i++) {\n this.#sheet.colResizer.setColumnWidth(colIndex + i, singleWidth);\n }\n }\n\n requestAnimationFrame(() => {\n if (typeof this.#sheet.refreshLayout === 'function') {\n this.#sheet.refreshLayout();\n }\n });\n };\n\n collapse = (isInitialInit = false) => {\n if (!this.#sheet?.colResizer || !this.#cell) return;\n const colIndex = parseInt(this.#cell.dataset.col, 10);\n const colSpan = this.#cell.colSpan || 1;\n\n if (this.classList.contains('expand')) {\n const col = this.#sheet.querySelector(`colgroup col[data-col=\"${colIndex}\"]`);\n const currentW = col ? parseInt(col.getAttribute('width'), 10) : 0;\n if (currentW > COLLAPSED_WIDTH) {\n this.#cell.dataset.expandWidth = String(currentW * colSpan);\n }\n }\n\n this.classList.remove('expand');\n this.classList.add('collapsed');\n this.#cell.setAttribute('collapsed', 'true');\n this.#cell.style.color = 'transparent';\n\n if (colSpan === 1) {\n this.#sheet.colResizer.setColumnWidth(colIndex, COLLAPSED_WIDTH);\n } else {\n const splitWidth = Math.max(10, Math.floor(COLLAPSED_WIDTH / colSpan));\n for (let i = 0; i < colSpan; i++) {\n this.#sheet.colResizer.setColumnWidth(colIndex + i, splitWidth);\n }\n }\n\n requestAnimationFrame(() => {\n if (typeof this.#sheet.refreshLayout === 'function') {\n this.#sheet.refreshLayout();\n }\n });\n };\n\n disconnectedCallback() {\n this.removeEventListener('click', this.#onClick);\n }\n}\n\nif (!customElements.get('nine-table-col-expand')) {\n customElements.define('nine-table-col-expand', ColExpand);\n}","import { trace } from \"@nopeer\";\nimport { ColFixManager } from \"@/col/ColFixManager.js\";\n\nexport class ContextMenu extends HTMLElement {\n #tableHost;\n #panel;\n\n connectedCallback() {\n const root = this.getRootNode();\n this.#tableHost = root instanceof ShadowRoot ? root.host : (this.closest('nine-table') || root.host);\n\n if (!this.#tableHost) {\n this.#tableHost = this.parentElement?.closest('nine-table') || this.assignedSlot?.closest('nine-table');\n }\n\n if (!this.#tableHost) return;\n }\n\n #onContextMenu = (e) => {\n const path = e.composedPath ? e.composedPath() : [];\n const targetCell = path.find(el => el.tagName === 'TH' || el.tagName === 'TD');\n\n if (!targetCell) return;\n\n const targetTable = path.find(el => el.tagName === 'TABLE') || targetCell.closest('table');\n\n e.preventDefault();\n e.stopPropagation();\n\n this.openMenu(e.clientX, e.clientY, targetCell, targetTable);\n };\n\n #getTargetSheet(targetCell) {\n return targetCell?.closest('nine-table-sheet') || this.#tableHost.activeSheet || this.#tableHost;\n }\n\n #getFixManager(targetCell) {\n const sheet = this.#getTargetSheet(targetCell);\n if (!sheet) return null;\n\n if (!sheet.colFix) {\n sheet.colFix = new ColFixManager(sheet);\n }\n return sheet.colFix;\n }\n\n #parseCustomMenuItems(containerElement, activeTable) {\n const items = [];\n const activeTableId = activeTable?.id;\n const allUls = Array.from(containerElement.querySelectorAll(':scope > ul'));\n\n allUls.forEach(rootUl => {\n const targetTableAttr = rootUl.getAttribute('target-table');\n\n if (!targetTableAttr || (activeTableId && targetTableAttr === activeTableId)) {\n const parsedList = this.#traverseUl(rootUl);\n items.push(...parsedList);\n }\n });\n\n return items;\n }\n\n #traverseUl(ulEl) {\n const list = [];\n Array.from(ulEl.children).forEach(child => {\n const tagName = child.tagName.toLowerCase();\n\n if (tagName === 'hr' || child.classList.contains('separator')) {\n list.push({ type: 'separator' });\n return;\n }\n\n if (tagName === 'li') {\n let name = '';\n const spanEl = child.querySelector(':scope > span');\n if (spanEl) {\n name = spanEl.textContent.trim();\n } else {\n name = Array.from(child.childNodes)\n .filter(n => n.nodeType === Node.TEXT_NODE)\n .map(n => n.textContent.trim())\n .join('');\n }\n\n const subUl = child.querySelector(':scope > ul');\n const item = {\n menuId: child.id || name,\n name: name,\n className: child.className || '',\n disabled: child.hasAttribute('disabled') || child.getAttribute('disabled') === 'true',\n isCustom: true\n };\n\n if (subUl) {\n item.items = this.#traverseUl(subUl);\n }\n\n list.push(item);\n }\n });\n return list;\n }\n\n #buildMenuItems(activeTable, isHeaderCell, targetCell) {\n const useDefault = this.getAttribute('use-default-menu') !== 'false';\n let rawItems = [];\n\n const customItems = this.#parseCustomMenuItems(this, activeTable);\n if (customItems.length > 0) {\n rawItems.push(...customItems);\n }\n\n const fixManager = this.#getFixManager(targetCell);\n const currentFixState = fixManager?.getFixState(targetCell, activeTable) ?? 'none';\n const isFixable = isHeaderCell && (fixManager?.canFixColumn(targetCell, activeTable) ?? false);\n\n let fixMenuItem = null;\n if (currentFixState === 'left' || currentFixState === 'right') {\n fixMenuItem = {\n menuId: 'unfix-column',\n name: 'Unfix Column',\n className: 'ng-menu-unfix-col',\n disabled: !isHeaderCell\n };\n } else {\n fixMenuItem = {\n menuId: 'fix-column',\n name: 'Fix Column',\n className: 'ng-menu-fix-col',\n disabled: !isFixable\n };\n }\n\n if (useDefault) {\n rawItems.push(\n { type: 'separator' },\n {\n menuId: 'sort',\n name: 'Sort',\n className: 'ng-menu-sort',\n disabled: !isHeaderCell\n },\n fixMenuItem,\n { type: 'separator' },\n { menuId: 'filtering', name: 'Filtering', className: 'ng-menu-filtering' },\n { menuId: 'maximize', name: 'Maximize', className: 'maximize' },\n {\n menuId: 'export',\n name: 'Export',\n className: 'export',\n items: [\n { menuId: 'export-excel', name: 'Excel', className: 'export-excel' },\n { menuId: 'export-pdf', name: 'PDF', className: 'export-pdf', disabled: true }\n ]\n },\n {\n menuId: 'properties',\n name: 'Options',\n className: 'options',\n items: [\n { menuId: 'show-title-bar', name: 'Title Bar Show/Hide', className: 'show-title-bar' },\n { menuId: 'show-status-bar', name: 'Status Bar Show/Hide', className: 'show-status-bar' },\n { menuId: 'auto-fit-col', name: 'Auto Fit Columns', className: 'auto-fit-col' }\n ]\n }\n );\n }\n\n const cleanedItems = [];\n rawItems.forEach((item) => {\n if (item.type === 'separator') {\n if (cleanedItems.length === 0 || cleanedItems[cleanedItems.length - 1].type === 'separator') {\n return;\n }\n }\n cleanedItems.push(item);\n });\n\n if (cleanedItems.length > 0 && cleanedItems[cleanedItems.length - 1].type === 'separator') {\n cleanedItems.pop();\n }\n\n return cleanedItems;\n }\n\n openMenu(x, y, targetCell, targetTable) {\n const targetParent = this.#tableHost.shadowRoot || this.#tableHost;\n\n if (!this.#panel) {\n this.#panel = document.createElement('nine-table-menu-panel');\n targetParent.appendChild(this.#panel);\n }\n\n const isHeaderCell = !!targetCell.closest('thead');\n const menuItems = this.#buildMenuItems(targetTable, isHeaderCell, targetCell);\n\n this.#panel.render(menuItems, (e) => this.#handleMenuClick(e, targetCell, targetTable));\n\n const targetSheet = this.#getTargetSheet(targetCell);\n this.#syncMenuStates(targetSheet);\n\n this.#panel.openAt(x, y);\n }\n\n #syncMenuStates(targetSheet) {\n if (!this.#panel || !targetSheet) return;\n\n const isFiltering = targetSheet.filtering?.isFiltering?.() || false;\n this.#panel.toggleItemState('filtering', 'on', isFiltering);\n\n const autoFit = this.#tableHost.getAttribute('auto-fit-col') === 'true';\n this.#panel.toggleItemState('auto-fit-col', 'on', autoFit);\n\n const showTitle = this.#tableHost.getAttribute('show-title-bar') === 'true';\n this.#panel.toggleItemState('show-title-bar', 'on', showTitle);\n }\n\n #handleMenuClick(e, targetCell, targetTable) {\n const menuId = e.menuId;\n\n const customEvent = new CustomEvent('menu-click', {\n detail: { menuId, targetCell, targetTable, originalEvent: e },\n bubbles: true,\n composed: true\n });\n this.dispatchEvent(customEvent);\n\n const baseCol = parseInt(targetCell.dataset.col, 10);\n const targetSheet = this.#getTargetSheet(targetCell);\n\n switch (menuId) {\n case 'fix-column':\n case 'unfix-column':\n const fixManager = this.#getFixManager(targetCell);\n fixManager?.executeFixToggle(menuId, targetCell);\n break;\n\n case 'sort':\n if (!isNaN(baseCol)) {\n targetSheet.sorting?.handleSortFromMenu?.(baseCol, targetCell);\n }\n break;\n\n case 'filtering':\n targetSheet?.filtering?.toggle();\n break;\n\n case 'auto-fit-col':\n this.#tableHost.setAttribute('auto-fit-col', this.#tableHost.getAttribute('auto-fit-col') === 'true' ? 'false' : 'true');\n break;\n\n case 'show-title-bar':\n this.#tableHost.setAttribute('show-title-bar', this.#tableHost.getAttribute('show-title-bar') === 'true' ? 'false' : 'true');\n break;\n }\n\n this.#panel.close();\n }\n\n disconnectedCallback() {\n this.#tableHost?.removeEventListener('contextmenu', this.#onContextMenu);\n }\n}\n\nif (!customElements.get('nine-table-menu')) {\n customElements.define('nine-table-menu', ContextMenu);\n}","// ui/menu/nine-table-menu-panel.js\n\nexport class MenuPanel extends HTMLElement {\n #onCallback;\n #closeHandler = null;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n\n this.style.position = 'fixed';\n this.style.display = 'none';\n this.style.zIndex = '99999';\n\n this.innerHTML = `\n <div class=\"menu-wrapper\">\n <ul class=\"menu-container\"></ul>\n </div>\n `;\n }\n\n render(items, callback) {\n this.#onCallback = callback;\n const container = this.querySelector('.menu-container');\n if (!container) return;\n\n container.innerHTML = '';\n\n this.#appendItems(container, items);\n this.#bindClickEvents();\n }\n\n openAt(x, y, targetCell = null) {\n this.style.display = 'block';\n\n if (targetCell) {\n const cellRect = targetCell.getBoundingClientRect();\n const cellRightX = cellRect.right;\n\n requestAnimationFrame(() => {\n const wrapper = this.querySelector('.menu-wrapper');\n if (!wrapper) return;\n const panelWidth = wrapper.getBoundingClientRect().width;\n\n let calculatedLeft = cellRightX - panelWidth;\n\n if (calculatedLeft < 0) {\n calculatedLeft = cellRect.left;\n }\n\n const panelHeight = wrapper.getBoundingClientRect().height;\n let calculatedTop = y;\n if (y + panelHeight > window.innerHeight) {\n calculatedTop = y - panelHeight;\n }\n\n this.style.left = `${calculatedLeft}px`;\n this.style.top = `${calculatedTop}px`;\n });\n } else {\n this.style.left = `${x}px`;\n this.style.top = `${y}px`;\n\n requestAnimationFrame(() => {\n const wrapper = this.querySelector('.menu-wrapper');\n if (!wrapper) return;\n const rect = wrapper.getBoundingClientRect();\n\n if (x + rect.width > window.innerWidth) {\n this.style.left = `${x - rect.width}px`;\n }\n if (y + rect.height > window.innerHeight) {\n this.style.top = `${y - rect.height}px`;\n }\n });\n }\n\n if (this.#closeHandler) {\n window.removeEventListener('pointerdown', this.#closeHandler);\n }\n\n this.#closeHandler = (e) => {\n const path = e.composedPath ? e.composedPath() : [];\n if (!path.includes(this) && !this.contains(e.target)) {\n this.close();\n }\n };\n\n setTimeout(() => {\n window.addEventListener('pointerdown', this.#closeHandler);\n }, 0);\n }\n\n close() {\n this.style.display = 'none';\n if (this.#closeHandler) {\n window.removeEventListener('pointerdown', this.#closeHandler);\n this.#closeHandler = null;\n }\n }\n\n toggleItemState(menuId, className, condition) {\n const li = this.querySelector(`li[menu-id=\"${menuId}\"]`);\n if (li) {\n condition ? li.classList.add(className) : li.classList.remove(className);\n }\n }\n\n #appendItems(parentUl, items) {\n items.forEach(item => {\n if (item.type === 'separator') {\n const sep = document.createElement('li');\n sep.className = 'ng-menu-separator';\n parentUl.appendChild(sep);\n return;\n }\n\n const li = document.createElement('li');\n li.setAttribute('menu-id', item.menuId);\n li.className = `${item.className || ''} ${item.items ? 'submenu' : ''} ${item.disabled ? 'disabled' : ''}`.trim();\n\n const span = document.createElement('span');\n span.textContent = item.name;\n li.appendChild(span);\n\n if (item.items && item.items.length > 0) {\n const subUl = document.createElement('ul');\n subUl.className = 'ng-menu-sublist';\n this.#appendItems(subUl, item.items);\n li.appendChild(subUl);\n }\n\n parentUl.appendChild(li);\n });\n }\n\n #bindClickEvents() {\n this.querySelectorAll('li[menu-id]').forEach(li => {\n li.addEventListener('click', (e) => {\n e.stopPropagation();\n if (li.classList.contains('disabled')) return;\n\n const menuId = li.getAttribute('menu-id');\n this.#onCallback?.({ menuId, target: li });\n this.close();\n });\n });\n }\n\n disconnectedCallback() {\n this.close();\n }\n}\n\nif (!customElements.get('nine-table-menu-panel')) {\n customElements.define('nine-table-menu-panel', MenuPanel);\n}"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"nine-table.js","names":["traceOrigin","trace","GROUP_IDX","GROUP_IDX","start","end","mid","target","elementDebounceState","el","state","pointerEvent","pointerFn","debounceTime","dblClickEvent","dblClickFn","_text","stripHtml","tmp","html","canvas","context","_font","w","h","v","cleanText","metrics","ascent","descent","trace$1","trace","NINE_TABLE","ngRow","#parent","parent","#newrow","ngData","#host","host","#initialize","item","validRecords","#getValidRecords","at","targetRecord","colnm","idx","rowData","rowIndex","colIndex","value","#conv","fields","#defaultHeight","templateElements","#getDefaultMeta","loadData","dataSource","#invalidate","#nextId","rowid","jsonArray","arr","o","json","record","#json2Array","processedArr","#defaultInsert","row","updateState","targetIndex","#getIndexFromRow","arrIndex","records","b","a","targetId","index","COL_IDX","rowState","isSingle","targetArr","result","i","ngDataManager","ds","rowIdx","nRow","rowidx","#init","#fields","f","found","fieldName","fName","#adjust","map","name","type","rawTables","tbl","fieldType","attr","expr","lastIndex","targetField","NineTableSheets","NineTableSheetsFooter","#render","isMultiSelect","tabItem","#switchSheet","updateSplitters","sheets","s","activeSheets","sheet","currentIdx","targetSplitter","tabBar","body","tabItems","sheetElements","isActive","clickedTab","activeTabs","targetSheet","tabsHtml","table","SheetTabItem","Toolbar","#bindEvents","#customContainer","#syncStateFromHost","isSimple","showToolbar","showMenu","caption","titleEl","link","currentCaption","menuBtn","element","text","NineTableHScrollBar","#owner","initWhenReady","#elements","#observeResize","#resizeObserver","#dragging","track","thumb","bodyWidth","tableWidth","needsHScroll","trackWidth","thumbWidth","currentLeft","maxScrollLeft","l","maxThumbLeft","trackBound","targetX","x","delayScroll","#interval1","#interval2","thumbLeft","#thumbMoveTo","pos","currentThumbLeft","clearTimer","evt","e","trackRect","onMouseMove","moveEvent","onMouseUp","NineTableVScrollBar","#sheet","viewRecords","totalCount","scrollHolder","rawContentHeight","MAX_BROWSER_HEIGHT","useScaling","scaleFactor","contentHeight","#getScaleInfo","fixedHeight","bodyHeight","viewHeight","needsVScroll","trackHeight","thumbHeight","currentScrollTop","maxScrollTop","thumbTop","maxThumbTop","#startY","#startThumbTop","deltaY","targetThumbTop","ratio","rowHeight","visibleRowCount","targetRow","clickY","scrollInterval","startContinuousScroll","scrollStep","$firstTr","direction","currentRow","stopContinuousScroll","GROUP_IDX$1","GroupingManager","#groupColumns","#groupMap","groupColumns","sourceTable","$cell","$tr","#isApplying","groupId","rowIds","dataManager","Grouping","validRaw","rawRecords","groupMap","nestedTree","#buildNestedMap","flatResult","renderItems","#flattenTree","counter","isLastLevel","depth","groupKey","subMapOrRecords","mapOrArray","parentId","#collectLeafRowIds","groupRecord","resultArr","#collectLeafRecords","remainingCols","key","subRecords","subVal","r","RowManager","#initResizeObserver","bodyViewport","#measureAndCacheHeight","#renderAllContainers","#handleScroll","force","#isGrouped","#handleGroupedScroll","scrollTop","rawTotalVirtualHeight","totalVirtualHeight","actualScrollTop","maxStartIndex","clampedScrollTop","startIndex","firstTr","#element","currentStartIndex","$tbody","dataIndex","#bindRowData","allRenderItems","totalVirtualCount","bodyContent","templateLength","getItemHeight","dataRowsHeight","groupHeightsTotal","itemHeights","viewportClientHeight","accumulatedHeight","offsetY","visibleRowsCount","dynamicBuffer","targetStart","targetEnd","renderedItems","container","selector","trs","itemIndex","chunkTrs","virtualIndex","isTrGroup","tr","subIdx","#bindGroupRowData","subRowIndex","matrixRow","indices","allRecords","childrenRecords","customComp","$el","#containerTemplates","tableEl","tbody","templateTrs","#sheetHeight","#isProgrammaticScroll","dataRow","targetScrollTop","rawTargetScrollTop","onRendered","visibleRows","#BUFFER_ROW_COUNT","groupDepth","#cachedRowCount","#renderRows","#syncRowHeights","targetFixedType","clonedTr","targetTbody","fragment","tmpl","leftTable","bodyTable","rightTable","leftRows","bodyRows","rightRows","maxRows","heights","maxHeight","entry","entries","height","#updateRowCount","TableCompiler","$table","$srcTable","#syncColAttributes","fixed","$col","cols","grid","rowSpan","colSpan","c","CellSelection","#initEvents","sameGroupTrs","t","$td","col","r1","startRow","endRow","r2","c1","startCol","endCol","c2","containers","expanded","loopCount","#getMatrixRow","cell","cellEndRow","cellEndCol","nsR","neR","nsC","neC","#range","mainZone","lastMatrixRow","lastCol","targetCell","allCells","rect","targetTr","CellNavigation","#currentCell","#currentTr","#isCellLeftVisible","#isCellRightVisible","isVisible","#isCellBelowVisible","#isCellAboveVisible","scrollTopIndex","#getVisibleRowCount","currentCell","#findCell","nextCell","#getPreviousCell","#getNextCell","#getUpCell","#getDownCell","#moveCellH","#moveCellV","nextCol","cellCol","cellRect","viewportRect","theadHeight","bodyViewport2","viewportHeight","RESIZE_OFFSET","ColResizer","#panel","#tooltip","#onPointerMove","#onPointerDown","#onDblClick","containerType","firstColgroup","totalWidth","colWidths","colIdx","tables","targetCols","globalColIndex","firstContainer","resolvedContainerType","width","sourceCol","headerPart","offsetX","isLeftEdge","isRightEdge","prevCell","#targetCell","#targetContainerType","#getContainerType","baseColIndex","#targetColIndex","#checkIsAutoFit","#nextColIndex","nextColEl","#nextColStartWidth","targetRect","sheetRect","#startCellWidth","#startLeft","attrW","#startColWidth","#startX","#updatePositions","#onDragMove","#onDragEnd","diff","clientX","isAutoFit","maxDiff","minDiff","currentColWidth","realCellWidth","maxCellWidth","currentCellWidth","sizeBadge","finalWidth","newColWidth","newNextWidth","tbodyCell","extraPadding","fieldIdx","font","headerText","maxTextWidth","val","size","calculatedWidth","ColResizerPanel","#renderer","ColMover","#grip","#indi","root","y","nested","headerCells","hasStrictChildren","isValidGroup","parentGroupRange","subCell","subStart","subSpan","subEnd","isRealGroup","groupRange","#getColGroupRange","origTable","minLeft","maxRight","minTop","maxBottom","targetCells","cCol","cEnd","isGroup","computedStyle","groupWidth","groupHeight","headerContent","clonedCell","style","#checkIsMovable","startX","startY","cancelTimer","#timer","onPointerMovePending","#startDrag","#isDragging","preview","#createGroupHeaderPreview","#sourceCell","#sourceColIndex","#shiftX","bounds","relativeTop","fullHeight","#updateGripPosition","#onPointerUp","#getDeepElementFromPoint","targetColIndex","colMinLeft","colMaxRight","cRect","midX","calculatedTargetCol","indicatorLeft","sourceGroup","movingSpan","sourceRowStart","sourceRowEnd","targetRowStart","targetRowEnd","isRowSpanCompatible","isOutOfBoundsOfParent","pStart","pEnd","isDroppingInsideOtherGroup","spannedCells","sCell","sRowStart","sRowEnd","sStart","sEnd","moveEndCol","isSelfGroup","left","colgroup","targetCol","toColIndex","spanCount","isInRange","fromColIndex","targetViewportCol","fixedType","group","cells","targetRowCell","ColFixManager","baseCol","fixedAttr","targetBoundaryCol","theadTrs","cellBoundaryFound","cEndCol","action","fixType","cIdx","minBaseCol","maxEndCol","rSpan","rIdx","isBroken","isColFixed","NineTableFilterPanel","#closeHandler","#nineTable","#view","#onInput","#onSelectAll","#onOk","#button","filterBtn","panelWidth","top","searchBox","#loadVirtualFilterItems","path","filteredRecords","activeFilters","exprEngine","bindKey","colInfo","exprKey","filterKey","activeSelectedVals","uniqueMap","rawVal","displayVal","uniqueList","valA","valB","numA","numB","selectAllChk","filterRecords","checkedRecords","chk","filterParams","selectedVals","query","data2Idx","matchedValues","isChecked","chkIdx","NineTableFilterButton","#onClick","#columns","seen","uniqueKey","isFiltered","panel","Filtering","#filters","#initFilterPanel","#filterPanel","#isFiltering","#applyFiltering","jsonFilter","oFilter","k","sheetIndex","filterRules","targetKey","allowedValues","isExpr","isPass","recordIdx","allowedSet","Sorting","#handleSort","colName","exprVal","isAsc","isDesc","existingColIndex","m","ruleData","#applySorting","#syncHeaderUI","colRule","asc","SheetView","#cachedVisibleRecords","#viewIndexes","visibleRecords","#convSingle","filterSlot","#sortingColumns","groupResult","columns","rulesWithIdx","rule","idxA","idxB","isEmptyA","isEmptyB","strA","strB","PreCompiler","#ensureColgroup","#ensureThead","#ensureSectionTbodys","#ensureRowIndicator","#normalizeColAttributes","#createColIndicator","#normalizeCollapsibleAttributes","#generateCell","#initColExpanders","#initFilterButtons","#applyInitialCellWidths","thead","firstRow","cnt","td","#numToExcelCol","background","num","headTbody","footTbody","colCount","sum","containerWidth","defaultWidth","widthVal","targetAttributes","autoIdCounter","$tbl","tagName","$datalist","$option","uniqueFuncName","cellType","originalContent","hostFilter","tableFilter","finalFiltering","currentWidth","expandBtn","targetWidth","rows","section","indicatorCell","startColIdx","targetIdx","SheetAPI","$trs","matrixRows","n","$sheetBody","tfootHeight","viewportTop","viewportBottom","trRect","isAbove","isBelow","callback","toRowid","NineTableSheet","#rowManager","#api","#bindApiMethods","#template","#index","#colResizer","#filtering","#grouping","#colMover","#colFix","#cellSelection","#cellNavigation","#source","attrTrue","sourceTableTrue","#isSimple","#renderSplitContainers","#updateContainerWidths","#adjustOverlay","$thead","$overlay","#autoFit","enable","totalOriginalWidth","colList","collapsedTotalWidth","availableWidth","allocatedTotal","calculatedCols","exactWidth","baseWidth","remainderPixels","uncollapsedCols","minRows","#syncHeaderAndFooterHeights","#initRowHoverEvent","prefix","firstTable","#createSplitTable","offsetHeight","sheetBottom","tbodyBottom","bodyContainer","scrollLeft","#sorting","leftHeaderRows","bodyHeaderRows","rightHeaderRows","#applyMaxHeights","leftFooterRows","bodyFooterRows","rightFooterRows","activeRowIndex","relatedTarget","api","args","LayoutManager","owner","#initEvent","sheetCount","sheetsHtml","className","sheetId","cssImports","$sheet","#isAutoHeight","#applyAutoHeight","lastHeight","currentHeight","basicHeight","ExprEngine","match","trimmedExpr","compiledExpr","evalFn","#exprCache","rowItem","DataAPI","providerObj","methods","fn","NineTableAPI","ns","#getActiveSheet","targetMethod","prop","NineTable","#shadowRoot","#dataManager","#dataApi","#sheetApi","#templateCnt","#bindDynamicSetters","#layoutManager","#dispatchLoad","checkCount","checkTimer","loadSheetCnt","idOrIndex","extractedMethodNames","matches","internalValue","methodName","newValue","BasicCellElement","exprCache","CellElement","#cell","#tr","#attr","curRow","renderer","rawRecord","defaultValue","\"display\"","data","cleanExpr","childRecords","funcName","field","acc","EditableCellElement","CellInputText","#target","#maxbyte","maxByteNum","event","CellInputNumber","#onKeyDown","#validate","#max","#min","#scale","str","selectionStart","scale","validKey","isNumKey","CellInputColor","#btn","#dataSource","datalistId","datalist","option","#rendererColor","#isValidColor","g","CellInputDate","#type","formattedVal","d","isValid","#isValidDate","year","month","day","isleap","hour","min","week","CellCheckbox","#label","#trueText","#falseText","#isRadio","trueValue","childHtml","displayText","#enable","#readonly","#visible","CellRadio","#rendererRadio","matchIndex","#radioList","codeVal","#keyName","nameVal","#valueName","label","input","span","CellComboPanel","grd","itemsAttr","fieldKeys","valueName","activeColumnCount","multi","formattedData","keyName","selectedKeys","separator","#isOpen","btnEl","btnRect","panelHeight","upwardTop","#initData","viewContainer","#onClickRow","keyword","CellCombo","#multi","#multiSeparator","#togglePanel","#targetBtn","#getDisplayText","#validateInput","keys","list","CellRenderer","CellButton","#cellButtonClick","customEvent","rawValue","CellRowIndicator","#mainTarget","#subTarget","#statusTarget","displayNum","formattedNum","splitIndex","prefixPart","suffixPart","isSorted","isFitered","ColExpand","singleWidth","currentW","splitWidth","ContextMenu","#tableHost","targetTable","#getTargetSheet","items","activeTableId","activeTable","containerElement","targetTableAttr","rootUl","parsedList","#traverseUl","ulEl","child","spanEl","subUl","useDefault","rawItems","customItems","#parseCustomMenuItems","fixManager","#getFixManager","currentFixState","isFixable","isHeaderCell","fixMenuItem","cleanedItems","targetParent","menuItems","#buildMenuItems","#handleMenuClick","#syncMenuStates","isFiltering","autoFit","showTitle","menuId","#onContextMenu","MenuPanel","#onCallback","#appendItems","#bindClickEvents","cellRightX","wrapper","calculatedLeft","calculatedTop","li","condition","sep","parentUl"],"sources":["../src/core/protype.js","../src/external/NoPeer.js","../src/core/constants.js","../src/data/ngData.js","../src/data/ngDataManager.js","../src/data/Fields.js","../src/layout/nine-table-sheets.js","../src/layout/nine-table-sheets-footer.js","../src/layout/nine-table-toolbar.js","../src/layout/nine-table-hscrollbar.js","../src/layout/nine-table-vscrollbar.js","../src/data/Grouping.js","../src/layout/core/RowManager.js","../src/layout/core/TableCompiler.js","../src/cell-manager/CellSelection.js","../src/cell-manager/CellNavigation.js","../src/col/ColResizer.js","../src/col/ColMover.js","../src/col/ColFixManager.js","../src/data/Filtering.js","../src/data/Sorting.js","../src/data/SheetView.js","../src/layout/core/PreCompiler.js","../src/api/SheetAPI.js","../src/layout/nine-table-sheet.js","../src/layout/core/LayoutManager.js","../src/core/ExprEngine.js","../src/api/DataAPI.js","../src/api/NineTableAPI.js","../src/core/nine-table.js","../src/cell/core/BasicCellElement.js","../src/cell/core/CellElement.js","../src/cell/cell-input-text.js","../src/cell/cell-input-number.js","../src/cell/cell-input-color.js","../src/cell/cell-input-date.js","../src/cell/cell-checkbox.js","../src/cell/cell-radio.js","../src/cell/cell-combo-panel.js","../src/cell/cell-combo.js","../src/cell/cell-renderer.js","../src/cell/cell-button.js","../src/cell/cell-row-indicator.js","../src/col/col-expand.js","../src/menu/nine-table-menu.js","../src/menu/nine-table-menu-panel.js"],"sourcesContent":["Array.prototype.nineBinarySearch = function(target) {\n //this.sort((a, b) => { return a > b ? 1 : -1; });\n\n let start = 0;\n let end = this.length - 1;\n let mid;\n\n while (start <= end) {\n mid = parseInt((start + end) / 2);\n\n if (target === this[mid]) {\n return mid;\n } else {\n if (target < this[mid]) {\n end = mid - 1;\n } else {\n start = mid + 1;\n }\n }\n }\n\n return -1;\n};\n\nconst elementDebounceState = new WeakMap();\n\nHTMLElement.prototype.addDebounseEventListener = function(\n dblClickEvent,\n dblClickFn,\n pointerEvent,\n pointerFn,\n debounceTime = 500\n) {\n const el = this;\n\n if (!elementDebounceState.has(el)) {\n elementDebounceState.set(el, { timer: null, cancelFn: null });\n }\n const state = elementDebounceState.get(el);\n\n el.addEventListener(pointerEvent, (e) => {\n e.actualTarget = e.target;\n\n if (state.timer) {\n clearTimeout(state.timer);\n state.timer = null;\n }\n\n // ๐ก 500ms ๋์ ๋๊ธฐํ ๋ค์์ผ ์ค์ pointerFn์ด ์คํ๋จ\n state.timer = setTimeout(() => {\n state.timer = null;\n state.cancelFn = pointerFn.call(el, e);\n }, debounceTime);\n });\n\n el.addEventListener(dblClickEvent, (e) => {\n if (state.timer) {\n clearTimeout(state.timer);\n state.timer = null;\n }\n\n if (state.cancelFn) {\n state.cancelFn();\n state.cancelFn = null;\n }\n\n dblClickFn.call(el, e);\n });\n};\n\n\nnine.measureTextSize = (_text, _font = '12px sans-serif') => {\n if (typeof _text === 'number') _text = _text + \"\";\n if (!_text) return { width: null, height: null };\n\n const stripHtml = (html) => {\n const tmp = document.createElement(\"DIV\");\n tmp.innerHTML = html;\n return tmp.textContent || tmp.innerText || \"\";\n };\n\n _text = _text.replaceAll(\"\\n\", \"<br>\");\n\n let canvas = document.body.querySelector('canvas#_nine_measure_canvas_');\n if (!canvas) {\n canvas = document.createElement('canvas');\n canvas.id = '_nine_measure_canvas_';\n canvas.style.cssText = 'position: absolute; visibility: hidden; pointer-events: none; left: -9999px;';\n document.body.appendChild(canvas);\n }\n\n const context = canvas.getContext('2d');\n context.font = _font;\n\n let w = 0;\n let h = 0;\n\n for (let v of _text.split(\"<br>\")) {\n const cleanText = stripHtml(v);\n const metrics = context.measureText(cleanText);\n\n w = Math.max(w, metrics.width);\n\n const ascent = metrics.fontBoundingBoxAscent || 10;\n const descent = metrics.fontBoundingBoxDescent || 3;\n h += ascent + descent;\n }\n\n return {\n width: w,\n height: h\n };\n};","import { trace as traceOrigin } from '@ninebone/util';\n\nexport class Trace extends traceOrigin.constructor {\n constructor() {\n super();\n this.init(\"nine-table\", \"green\");\n }\n}\n\nexport const trace = new Trace();\n","export const NINE_TABLE = {\n META: {\n INDEX: {\n ROWID: 0,\n ROW_STATE: 1,\n FILTER: 2,\n GROUP: 3,\n // SELECT: 2,\n // EXPAND: 3\n }\n },\n ROW_STATE: {\n EMPTY: 0,\n NORMAL: 1,\n INSERT: 2,\n UPDATE: 3,\n DELETE: 9\n },\n EVENT: {\n LOAD: \"load\",\n ROW_ADDED: \"row-added\",\n ROW_REMOVED: \"row-removed\",\n CELL_BUTTON_CLICK: \"cell-button-click\",\n },\n};","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\n\nexport class ngRow {\n\t#parent;\n\t#newrow = -1;\n\n\tconstructor(parent) {\n\t\tthis.#parent = parent;\n\t}\n\n\tget at() {\n\t\treturn this.#newrow;\n\t}\n\tset at(v) {\n\t\tthis.#newrow = parseInt(v, 10);\n\t}\n\n\tcount = () => this.#parent.rawRecords.length;\n}\n\nexport class ngData {\n\t#host;\n\t#parent;\n\t#nextId = 0;\n\t#defaultHeight = [];\n\n\tstatic META_INDEX = {\n\t\tFILTER: 0,\n\t\t// GROUP: 1,\n\t\t// SELECT: 2,\n\t\t// EXPAND: 3\n\t};\n\n\tstatic ROW_STATE = {\n\t\tEMPTY: 'EMPTY',\n\t\tNORMAL: 'NORMAL',\n\t\tINSERT: 'INSERT',\n\t\tUPDATE: 'UPDATE',\n\t\tDELETE: 'DELETE'\n\t};\n\n\tconstructor(host, parent) {\n\t\tthis.#host = host;\n\t\tthis.#parent = parent;\n\t\tthis.#initialize();\n\t}\n\n\n\t#getValidRecords = () => {\n\t\tconst rawRecords = this.#parent.rawRecords || [];\n\t\treturn rawRecords.filter(item => item.m._[NINE_TABLE.META.INDEX.ROW_STATE] !== NINE_TABLE.ROW_STATE.DELETE);\n\t};\n\n\tget count() {\n\t\treturn this.length;\n\t}\n\n\tcount = () => {\n\t\treturn this.length;\n\t};\n\n\tgetArray = (at, colnm) => {\n\t\tconst validRecords = this.#getValidRecords();\n\n\t\tif (at === undefined || at === null) {\n\t\t\treturn validRecords; // ๋ณํ ์์ด ๋ฐฐ์ด ๊ทธ๋๋ก ๋ฐํ (๋ ๋๋ง ์ต์ ํ)\n\t\t}\n\n\t\tif (at < 0 || at >= validRecords.length) return null;\n\n\t\tconst targetRecord = validRecords[at];\n\n\t\tif (colnm != null) {\n\t\t\tconst fields = this.getHostFields();\n\t\t\tconst idx = fields.indexOf(colnm);\n\t\t\treturn (idx >= 0) ? targetRecord.v[idx] : null;\n\t\t}\n\n\t\treturn targetRecord;\n\t};\n\n\tsetArray = (rowIndex, colIndex, value) => {\n\t\tconst validRecords = this.#getValidRecords();\n\t\tconst rowData = validRecords[rowIndex];\n\n\t\tconst oldValue = rowData.v[colIndex];\n\t\tif (oldValue !== value && rowData.__ng.rowState !== ngData.ROW_STATE.INSERT) {\n\t\t\trowData.__ng.rowState = ngData.ROW_STATE.UPDATE;\n\t\t}\n\n\t\trowData.v[colIndex] = value;\n\t};\n\n\n\tget = (at, colnm) => {\n\t\tconst validRecords = this.#getValidRecords();\n\n\t\tif (at === undefined || at === null) {\n\t\t\treturn this.#conv(validRecords);\n\t\t}\n\n\t\tif (at < 0 || at >= validRecords.length) return null;\n\n\t\tconst targetRecord = validRecords[at];\n\t\tconst fields = this.getHostFields();\n\n\t\tif (colnm != null) {\n\t\t\tconst idx = fields.indexOf(colnm);\n\t\t\treturn (idx >= 0) ? targetRecord.v[idx] : null;\n\t\t}\n\n\t\treturn this.#conv(targetRecord);\n\t};\n\n\tgetAll = () => {\n\t\treturn this.#parent.rawRecords || [];\n\t};\n\n\tgetHostFields = () => {\n\t\treturn typeof this.#host.fields?.get === 'function' ? this.#host.fields.get() : [];\n\t};\n\n\t#initialize = () => {\n\t\tthis.#defaultHeight = [];\n\t\tconst templateElements = this.#host.template || [];\n\t\tArray.from(templateElements).forEach(el => {\n\t\t\tthis.#defaultHeight.push(el.getBoundingClientRect?.().height || 24);\n\t\t});\n\n\t\t(this.#parent.rawRecords || []).forEach(v => {\n\t\t\tif (!v.__ng) v.__ng = this.#getDefaultMeta();\n\t\t\tv.__ng.height = this.#defaultHeight.slice();\n\t\t});\n\t};\n\n\tget source() {\n\t\treturn this.#conv(this.#parent.rawRecords);\n\t}\n\tset source(v) {\n\t\tthis.set(v);\n\t}\n\n\t#invalidate = () => {\n\t\tthis.#host.shadowRoot.querySelectorAll(\"nine-table-sheet\").forEach($el => {\n\t\t\t$el.invalidate();\n\t\t});\n\n\t\tthis.#host.shadowRoot.querySelector(\"nine-table-sheets-footer\")?.refresh();\n\t};\n\n\tset = (dataSource) => {\n\n\t\tconst loadData = () => {\n\t\t\tthis.#host.loading = true;\n\t\t\tsetTimeout(() => {\n\t\t\t\ttry {\n\t\t\t\t\tthis.clear();\n\t\t\t\t\tthis.add(dataSource, false);\n\t\t\t\t\tthis.#invalidate();\n\t\t\t\t} finally {\n\t\t\t\t\tthis.#host.loading = false;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif (this.#host.loaded) {\n\t\t\tloadData();\n\t\t}\n\t\telse {\n\t\t\tthis.#host.addEventListener(NINE_TABLE.EVENT.LOAD, e => {\n\t\t\t\tloadData();\n\t\t\t}, { once: true });\n\t\t}\n\n\n\t};\n\n\tget nextId() {\n\t\treturn this.#nextId++;\n\t}\n\n\tget length() {\n\t\treturn this.#getValidRecords().length;\n\t}\n\n\tget count() {\n\t\treturn this.length;\n\t}\n\n\tgetRowCount() {\n\t\treturn this.length;\n\t}\n\n\t#getDefaultMeta = (rowid = 0) => {\n\t\treturn {\n\t\t\trowState: ngData.ROW_STATE.EMPTY,\n\t\t\tdeleted: false,\n\t\t\tfiltered: false,\n\t\t\theight: this.#defaultHeight.slice(),\n\t\t\to: {},\n\t\t\tc: {},\n\t\t\t__: [0, 0, 0, 0, ngData.ROW_STATE.EMPTY, false, false, true, false, true, true, false, this.#defaultHeight.slice(), -1, {}, {}],\n\t\t\t_: [rowid, NINE_TABLE.ROW_STATE.EMPTY, [], []],\n\t\t};\n\t};\n\n\treset = () => {\n\t\tthis.#parent.rawRecords = [];\n\t\tthis.#invalidate();\n\t};\n\n\tclear = () => {\n\t\tthis.#parent.rawRecords = [];\n\t\tif (this.#parent.viewRecords?.reset) {\n\t\t\tthis.#parent.viewRecords.reset();\n\t\t}\n\n\t\tthis.#nextId = 0;\n\n\t\tthis.#invalidate();\n\t};\n\n\t#json2Array = (jsonArray) => {\n\t\tif (!Array.isArray(jsonArray)) jsonArray = [jsonArray];\n\n\t\tconst fields = this.getHostFields().length > 0 ? this.getHostFields() : Object.keys(jsonArray[0] || {});\n\t\tconst arr = [];\n\n\t\tjsonArray.forEach(json => {\n\t\t\tconst o = { v: [] };\n\t\t\tfields.forEach(colnm => {\n\t\t\t\to.v.push(json[colnm] !== undefined && json[colnm] !== null ? json[colnm] : \"\");\n\t\t\t});\n\t\t\tarr.push(o);\n\t\t});\n\n\t\treturn arr;\n\t};\n\n\t#defaultInsert = (arr) => {\n\t\tif (!Array.isArray(arr)) arr = [arr];\n\t\tarr.forEach(o => {\n\t\t\tconst rowid = this.nextId;\n\n\t\t\to.m = this.#getDefaultMeta(rowid);\n\t\t\to.__ng = o.m;\n\t\t\to.__ng.rowid = rowid;\n\t\t\t//o.__ng.rowState = ngData.ROW_STATE.INSERT;\n\n\t\t\to.m._[NINE_TABLE.META.INDEX.ROWID] = rowid;\n\t\t\to.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.EMPTY;\n\t\t});\n\t\treturn arr;\n\t};\n\n\t#getIndexFromRow = (rowid) => {\n\t\tconst index = this.#parent.rawRecords.findIndex(record => {\n\t\t\tif (!record || !record.m || !record.m._) return false;\n\t\t\treturn record.m._[NINE_TABLE.META.INDEX.ROWID] === rowid;\n\t\t});\n\n\t\treturn index;\n\t}\n\n\tadd = (dataSource, updateState = true) => {\n\t\tif (dataSource === undefined) dataSource = {};\n\t\tconst arr = this.#json2Array(dataSource);\n\n\t\tconst processedArr = this.#defaultInsert(arr);\n\n\t\tthis.#parent.rawRecords = this.#parent.rawRecords.concat(processedArr);\n\n\t\tconst row = this.count() - 1;\n\t\tif (updateState) {\n\t\t\tarr.forEach((_, idx) => {\n\t\t\t\tconst target = this.#parent.rawRecords[this.#parent.rawRecords.length - 1 - idx];\n\t\t\t\tif (target) target.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.INSERT;\n\t\t\t});\n\t\t}\n\n\t\tthis.#invalidate();\n\n\t\tthis.#host.dispatchEvent(new CustomEvent(NINE_TABLE.EVENT.ROW_ADDED, {\n\t\t\tbubbles: true,\n\t\t\tdetail: { target: this.#host, rowid: processedArr.length > 0 ? processedArr[0].m._[NINE_TABLE.META.INDEX.ROWID] : null }\n\t\t}));\n\n\t\treturn row;\n\t};\n\n\n\tinsert = (rowid, dataSource, updateState = true) => {\n\t\t//trace.log(\"์ฐพ์ rowid:\", rowid);\n\n\t\tif (dataSource === undefined) dataSource = {};\n\t\tconst arr = this.#json2Array(dataSource);\n\t\tif (arr.length === 0) return -1;\n\n\t\tlet targetIndex = this.#getIndexFromRow(rowid);\n\t\t/**\n\t\tif (rowid !== undefined && rowid !== null) {\n\t\t\ttargetIndex = this.#parent.rawRecords.findIndex(record => {\n\t\t\t\tif (!record || !record.m || !record.m._) return false;\n\t\t\t\treturn record.m._[NINE_TABLE.META.INDEX.ROWID] === rowid;\n\t\t\t});\n\t\t} */\n\n\t\tconst processedArr = this.#defaultInsert(arr);\n\n\t\t//if (targetIndex === -1) {\n\t\t//\ttargetIndex = this.#parent.rawRecords.length;\n\t\t//}\n\n\t\tthis.#parent.rawRecords.splice(targetIndex, 0, ...processedArr);\n\n\t\tif (updateState) {\n\t\t\tprocessedArr.forEach((_, idx) => {\n\t\t\t\tconst target = this.#parent.rawRecords[targetIndex + idx];\n\n\t\t\t\tif (target && target.m && target.m._) {\n\t\t\t\t\ttarget.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.INSERT;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.#invalidate();\n\n\t\tthis.#host.dispatchEvent(new CustomEvent(NINE_TABLE.EVENT.ROW_ADDED, {\n\t\t\tbubbles: true,\n\t\t\tdetail: { target: this.#host, rowid: processedArr.length > 0 ? processedArr[0].m._[NINE_TABLE.META.INDEX.ROWID] : null }\n\t\t}));\n\n\t\treturn processedArr[0].m._[NINE_TABLE.META.INDEX.ROWID]; // ์ฝ์
๋ ์ค์ ๋ฐฐ์ด ์ธ๋ฑ์ค ๋ฐํ\n\t};\n\n\tremove = (v) => {\n\t\tlet arr = [];\n\t\tif (Array.isArray(v)) {\n\t\t\tarr = at;\n\t\t//} else if (typeof at === \"undefined\") {\n\t\t//\tarr = [this.#parent.host.row.at];\n\t\t} else {\n\t\t\tarr = [parseInt(v, 10)];\n\t\t}\n\n\t\tlet arrIndex = [];\n\t\tarr.forEach(rowid => {\n\t\t\tarrIndex.push(this.#getIndexFromRow(rowid));\n\t\t});\n\n\t\tconst records = this.#parent.rawRecords;//this.#getValidRecords();\n\n\t\tarrIndex.sort((a, b) => b - a).forEach(index => {\n\t\t\t//if (validRecords[index]) {\n\t\t\t\tconst targetId = records[index].m._[NINE_TABLE.META.INDEX.ROWID];\n\n\t\t\t\tif (records[index].m._[NINE_TABLE.META.INDEX.ROW_STATE] === NINE_TABLE.ROW_STATE.INSERT) {\n\t\t\t\t\tthis.#parent.rawRecords = this.#parent.rawRecords.filter(item => item.m._[NINE_TABLE.META.INDEX.ROWID] !== targetId);\n\t\t\t\t} else {\n\t\t\t\t\tthis.#parent.rawRecords.forEach(item => {\n\t\t\t\t\t\tif (item.m._[NINE_TABLE.META.INDEX.ROWID] === targetId) {\n\t\t\t\t\t\t\titem.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.DELETE;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t//}\n\t\t});\n\n\t\tthis.#invalidate();\n\n\t\tthis.#host.dispatchEvent(new CustomEvent(NINE_TABLE.EVENT.ROW_REMOVED, {\n\t\t\tbubbles: true,\n\t\t\tdetail: { target: this.#host, rowid: arr.length > 0 ? arr[0] : null }\n\t\t}));\n\t};\n\n\tsetValue = (rowid, colnm, value) => {\n\n\t\trowid = parseInt(rowid, 10);\n\t\tconst fields = this.getHostFields();\n\t\tconst COL_IDX = fields.indexOf(colnm);\n\t\tif (COL_IDX < 0) return;\n\n\t\tconst index = this.#getIndexFromRow(rowid);\n\n\t\tconst records = this.#parent.rawRecords;\n\t\tconst rowData = records[index];\n\t\tif (!rowData) return;\n\n\t\tconst oldValue = rowData.v[COL_IDX];\n\t\tif (oldValue !== value && rowData.m._[NINE_TABLE.META.INDEX.ROW_STATE] !== NINE_TABLE.ROW_STATE.INSERT) {\n\t\t\trowData.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.UPDATE;\n\t\t}\n\n\t\trowData.v[COL_IDX] = value;\n\t};\n\n\tgetChangedData = (rowState) => {\n\n\t\tconst records = this.#parent.rawRecords;\n\n\t\tif (rowState) {\n\t\t\treturn this.#conv( records.filter(item => { return item.m._[NINE_TABLE.META.INDEX.ROW_STATE] === rowState; } ) );\n\t\t}\n\t\telse {\n\t\t\treturn {\n\t\t\t\tC: this.#conv( records.filter(item => { return item.m._[NINE_TABLE.META.INDEX.ROW_STATE] === NINE_TABLE.ROW_STATE.INSERT; } ) ),\n\t\t\t\tU: this.#conv( records.filter(item => { return item.m._[NINE_TABLE.META.INDEX.ROW_STATE] === NINE_TABLE.ROW_STATE.UPDATE; } ) ),\n\t\t\t\tD: this.#conv( records.filter(item => { return item.m._[NINE_TABLE.META.INDEX.ROW_STATE] === NINE_TABLE.ROW_STATE.DELETE; } ) ),\n\t\t\t};\n\t\t}\n\t};\n\n\t#conv = (arr) => {\n\t\tif (!arr) return arr;\n\n\t\tconst isSingle = !Array.isArray(arr);\n\t\tconst targetArr = isSingle ? [arr] : arr;\n\t\tconst fields = this.getHostFields();\n\n\t\tconst result = targetArr.filter(o => !o.__ng?.deleted).map(o => {\n\t\t\tconst t = {};\n\t\t\tfields.forEach((colnm, i) => {\n\t\t\t\tt[colnm] = o.v ? o.v[i] : o[colnm];\n\t\t\t});\n\t\t\tt.__ng = o.__ng;\n\t\t\treturn t;\n\t\t});\n\n\t\treturn isSingle ? result[0] : result;\n\t};\n}\n","import { ngRow, ngData } from \"./ngData.js\";\n\nexport class ngDataManager {\n\t#host;\n\n\tconstructor(host) {\n\t\tthis.#host = host;\n\n\t\tthis.row = new ngRow(this);\n\t\tthis.data = new ngData(this.#host, this);\n\n\t\tthis.rawRecords = [];\n\t\tthis.viewRecords = [];\n\t\tthis.delRecords = [];\n\t\tthis.pageCnt = 25;\n\n\t\tthis.viewRecords.reset = () => {\n\t\t\tif (this.#host.view?.redraw) this.#host.view.redraw();\n\t\t};\n\n\t\tthis.setDataSource = (ds) => {\n\t\t\tif (this.data) this.data.reset();\n\n\t\t\tthis.rawRecords = [];\n\t\t\tthis.viewRecords = [];\n\t\t\tthis.delRecords = [];\n\n\t\t\tthis.data.set(ds || []);\n\t\t};\n\n\t\tthis.getRowState = (nRow) => {\n\t\t\tconst rowIdx = parseInt(nRow, 10);\n\t\t\tif (rowIdx >= this.data.count()) return;\n\t\t\treturn this.data.getValidData()[rowIdx]?.__ng?.rowState;\n\t\t};\n\n\t\tthis.getRowPosition = () => this.row.at;\n\t\tthis.setRowPosition = (nRow) => { this.row.at = nRow; };\n\n\t\tthis.getColumn = (rowidx, colnm) => this.data.get(rowidx, colnm);\n\n\t\tthis.setColumn = (rowidx, colnm, v) => {\n\t\t\trowidx = parseInt(rowidx, 10);\n\t\t\tthis.data.setValue(rowidx, colnm, v);\n\t\t};\n\n\t\t// ์ด๊ธฐ ๋น ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ\n\t\tthis.setDataSource([]);\n\t}\n}","import { trace } from \"@nopeer\";\n\nexport class fields {\n\t#host;\n\t#fields = [];\n\n\tconstructor(host) {\n\t\tthis.#host = host;\n\t\tthis.#init();\n\t};\n\n\tget() {\n\t\treturn this.#fields.map(f => f.name);\n\t};\n\n\tgetFields() {\n\t\treturn this.#fields;\n\t}\n\n\tgetType(fieldName) {\n\t\tconst found = this.#fields.find(f => f.name === fieldName);\n\t\treturn found ? found.type : 'string';\n\t}\n\n\tadd = (arr, type = 'string') => {\n\t\tarr.forEach(fName => {\n\t\t\tif (!this.#fields.some(f => f.name === fName)) {\n\t\t\t\tthis.#fields.push({ name: fName, type: type });\n\t\t\t}\n\t\t});\n\t\tthis.#adjust();\n\t};\n\n\tindexOf(v) {\n\t\treturn this.#fields.findIndex(f => f.name === v);\n\t};\n\n\tincludes(v) {\n\t\treturn this.#fields.some(f => f.name === v);\n\t};\n\n\t#adjust = () => {\n\t\tconst map = new Map();\n\t\tthis.#fields.forEach(f => {\n\t\t\tmap.set(f.name, f.type);\n\t\t});\n\n\t\tthis.#fields = Array.from(map, ([name, type]) => ({ name, type }));\n\n\t\tthis.#fields = this.#fields.filter(f => f.name !== \"\" && f.name !== \"__ng\");\n\n\t\tthis.#fields.sort((a, b) => { return (a.name.length < b.name.length) ? 1 : -1; });\n\t};\n\n\t#init = () => {\n\t\tthis.#fields = [];\n\n\t\tconst rawTables = Array.from(this.#host.querySelectorAll(\"table\"));\n\n\t\tif (!rawTables || rawTables.length === 0) return;\n\n\t\tfor (const tbl of rawTables) {\n\n\t\t\ttbl.querySelectorAll('[data-bind]').forEach((el) => {\n\t\t\t\tconst fieldName = el.dataset.bind;\n\t\t\t\tconst fieldType = el.getAttribute(\"data-type\") || 'string';\n\n\t\t\t\tif (fieldName) {\n\t\t\t\t\tthis.#fields.push({ name: fieldName, type: fieldType });\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst exprAttrs = [\n\t\t\t\t\"data-expr\", \"background-color\", \"color\", \"tooltip\",\n\t\t\t\t\"visible\", \"readonly\", \"enable-button\", \"enable-check\",\n\t\t\t\t\"class-expr\", \"icon-color\", \"icon-src\"\n\t\t\t];\n\n\t\t\texprAttrs.forEach(attr => {\n\t\t\t\ttbl.querySelectorAll(`[${attr}]`).forEach((el) => {\n\t\t\t\t\tlet expr = el.getAttribute(attr);\n\t\t\t\t\tif (!expr) return;\n\n\t\t\t\t\tif (expr.indexOf(\"data.\") < 0) {\n\t\t\t\t\t\tconst lastIndex = expr.search(/[(]/g);\n\n\t\t\t\t\t\tif (lastIndex > 0) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\texpr = String(window[expr.substring(0, lastIndex).trim()]);\n\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\texpr = \"\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\texpr.split(\"data.\").forEach(v => {\n\t\t\t\t\t\tif (v.trim() != \"\") {\n\t\t\t\t\t\t\tconst lastIndex = v.search(/[^_A-Za-z0-9]/g);\n\t\t\t\t\t\t\tlet targetField = '';\n\n\t\t\t\t\t\t\tif (lastIndex >= 0) {\n\t\t\t\t\t\t\t\ttargetField = v.substring(0, lastIndex);\n\t\t\t\t\t\t\t} else if (expr.startsWith(\"data.\")) {\n\t\t\t\t\t\t\t\ttargetField = v.replace(\"data.\", \"\");\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (targetField) {\n\t\t\t\t\t\t\t\tthis.#fields.push({ name: targetField, type: 'string' });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tthis.#adjust();\n\t};\n};","export class NineTableSheets extends HTMLElement {\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#init();\n }\n\n #init = () => {\n\n };\n\n}\n\nif (!customElements.get('nine-table-sheets')) {\n customElements.define('nine-table-sheets', NineTableSheets);\n}","export class NineTableSheetsFooter extends HTMLElement {\n #host;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#init();\n }\n\n refresh = () => {\n this.querySelector(\"#row-count\").innerHTML = this.#host.data.count().toLocaleString();\n };\n\n #init = () => {\n this.#host = this.getRootNode().host;\n\n this.#render();\n\n this.querySelector('.nine-tab-bar')?.addEventListener('click', (e) => {\n const isMultiSelect = e.ctrlKey || e.metaKey || e.shiftKey;\n const tabItem = e.target.closest('nt-sheets-tab-item');\n\n if (!tabItem) return;\n\n const index = parseInt(tabItem.dataset.index, 10);\n this.#switchSheet(index, isMultiSelect);\n });\n\n setTimeout(() => {\n this.#switchSheet(0, false);\n })\n };\n\n #switchSheet = (index, isMultiSelect = false) => {\n\n const updateSplitters = () => {\n const sheets = Array.from(this.#host.shadowRoot.querySelectorAll('nine-table-sheet'));\n const splitters = Array.from(this.#host.shadowRoot.querySelectorAll('nine-splitter'));\n\n splitters.forEach(s => s.style.setProperty('display', 'none'));\n\n const activeSheets = sheets\n .map((sheet, idx) => ({ sheet, idx }))\n .filter(({ sheet }) => sheet.classList.contains('active'));\n\n if (activeSheets.length < 2) return;\n\n for (let i = 0; i < activeSheets.length - 1; i++) {\n const currentIdx = activeSheets[i].idx;\n\n const targetSplitter = this.#host.shadowRoot.querySelector(`nine-splitter[data-split-index=\"${currentIdx}\"]`);\n if (targetSplitter) {\n targetSplitter.style.setProperty('display', '');\n }\n }\n };\n\n const tabBar = this.querySelector('.nine-tab-bar');\n const body = this.#host.shadowRoot.querySelector('nine-table-sheets-body');\n const tabItems = tabBar.querySelectorAll('nt-sheets-tab-item');\n const sheetElements = body.querySelectorAll('nine-table-sheet');\n\n if (!tabItems[index]) return;\n\n if (!isMultiSelect) {\n tabItems.forEach((tab, idx) => {\n tab.setActive(idx === index);\n });\n\n sheetElements.forEach((sheet, idx) => {\n const isActive = idx === index;\n sheet.classList.toggle('active', isActive);\n sheet.style.flex = isActive ? '1 1 100%' : '';\n });\n } else {\n const clickedTab = tabItems[index];\n const activeTabs = tabBar.querySelectorAll('nt-sheets-tab-item.active');\n\n if (clickedTab.classList.contains('active') && activeTabs.length <= 1) {\n return;\n }\n\n clickedTab.classList.toggle('active');\n const targetSheet = body.querySelector(`nine-table-sheet[data-index=\"${index}\"]`);\n if (targetSheet) {\n targetSheet.classList.toggle('active');\n if (!targetSheet.classList.contains('active')) {\n targetSheet.style.flex = '';\n }\n }\n }\n\n const activeSheets = body.querySelectorAll('nine-table-sheet.active');\n\n activeSheets?.forEach(sheet => {\n sheet.style.flex = (activeSheets.length > 1) ? '1 1 0%' : '1 1 100%';\n\n if (typeof sheet.refreshLayout === 'function') {\n sheet.refreshLayout();\n } else {\n sheet.invalidate?.();\n }\n });\n\n updateSplitters();\n };\n\n #render() {\n const rawElements = Array.from(this.#host.children);\n const rawTables = rawElements.filter(el => (el.tagName.toUpperCase() === 'TABLE'));\n\n const tabsHtml = rawTables.map((table, idx) => {\n const className = idx === 0 ? 'active' : '';\n const tabName = table.getAttribute('caption') || `Sheet ${idx + 1}`;\n\n return `<nt-sheets-tab-item class=\"${className}\" data-index=\"${idx}\">${tabName}</nt-sheets-tab-item>`;\n }).join('');\n\n this.innerHTML = `\n <div class=\"nine-tab-bar\">${tabsHtml}</div>\n <div class=\"sheets-counter\">Total : <span id=\"row-count\">0</span></div>\n `;\n };\n}\n\nexport class SheetTabItem extends HTMLElement {\n constructor() {\n super();\n }\n\n connectedCallback() {\n\n }\n\n setActive(isActive) {\n this.classList.toggle('active', isActive);\n }\n}\n\nif (!customElements.get('nt-sheets-tab-item')) {\n customElements.define('nt-sheets-tab-item', SheetTabItem);\n}\n\nif (!customElements.get('nine-table-sheets-footer')) {\n customElements.define('nine-table-sheets-footer', NineTableSheetsFooter);\n}","import { trace } from \"@nopeer\";\n\nexport class Toolbar extends HTMLElement {\n #host;\n #customContainer;\n\n connectedCallback() {\n this.#host = this.getRootNode().host;\n this.#render();\n this.#bindEvents();\n }\n\n #render() {\n this.innerHTML = `\n <div class=\"ng-toolbar-left\">\n <button type=\"button\" class=\"ng-toolbar-menu-btn\" title=\"Menu\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#374151\" stroke-width=\"2\">\n <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\"></line>\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"></line>\n <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\"></line>\n </svg>\n </button>\n <span class=\"ng-toolbar-title\"></span>\n </div>\n\n <div class=\"ng-toolbar-custom\" id=\"custom-container\"></div>\n `;\n\n this.#customContainer = this.querySelector('#custom-container');\n this.#syncStateFromHost();\n }\n\n #syncStateFromHost() {\n const isSimple = this.#host.getAttribute('theme') === 'simple' || this.#host.classList.contains('simple');\n const showToolbar = this.#host.getAttribute('show-toolbar') !== 'false';\n const showMenu = this.#host.getAttribute('show-menu') !== 'false';\n const caption = this.#host.getAttribute('caption') || '';\n\n if (isSimple || !showToolbar) {\n this.setAttribute('hidden', '');\n } else {\n this.removeAttribute('hidden');\n }\n\n this.setAttribute('show-menu', showMenu ? 'true' : 'false');\n this.updateCaption(caption);\n }\n\n #bindEvents() {\n const titleEl = this.querySelector('.ng-toolbar-title');\n if (titleEl) {\n titleEl.addEventListener('dblclick', () => {\n const link = '<font color=\"green\">https://www.ninegrid.net</font>';\n const currentCaption = this.#host.getAttribute('caption') || '';\n titleEl.innerHTML = titleEl.innerHTML === link ? currentCaption : link;\n });\n }\n\n const menuBtn = this.querySelector('.ng-toolbar-menu-btn');\n if (menuBtn) {\n menuBtn.addEventListener('click', () => {\n this.#host.dispatchEvent(new CustomEvent('toolbar-menu-click', {\n bubbles: true,\n composed: true,\n detail: { targetTable: this.#host }\n }));\n });\n }\n }\n\n addCustomElement(element) {\n if (this.#customContainer) {\n this.#customContainer.append(element);\n }\n }\n\n updateCaption(text) {\n const titleEl = this.querySelector('.ng-toolbar-title');\n if (titleEl) titleEl.textContent = text;\n }\n}\n\nif (!customElements.get('nine-table-toolbar')) {\n customElements.define('nine-table-toolbar', Toolbar);\n}","// ui/nine-table-hscrollbar.js\nimport { trace } from \"@nopeer\";\n\nexport class NineTableHScrollBar extends HTMLElement {\n #owner;\n #dragging = false;\n #elements;\n #interval1;\n #interval2;\n #resizeObserver;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#owner = this.closest(\"nine-table-sheet\") || this.getRootNode().host;\n if (!this.#owner) return;\n\n this.innerHTML = `\n <button class='scroll-left' disabled><div class='scroll-icon'></div></button>\n <div class='scroll-track'><div class='scroll-thumb'></div></div>\n <button class='scroll-right' disabled><div class='scroll-icon'></div></button>\n `;\n\n const initWhenReady = () => {\n const body = this.#owner.querySelector(\".ng-sheet-body .ng-container-body\");\n if (!body) {\n setTimeout(initWhenReady, 10);\n return;\n }\n\n this.#elements = {\n container : body,\n track : this.querySelector(\".scroll-track\"),\n thumb : this.querySelector(\".scroll-thumb\"),\n left : this.querySelector(\".scroll-left\"),\n right : this.querySelector(\".scroll-right\"),\n };\n\n this.#init();\n this.#observeResize();\n this.refresh();\n };\n\n initWhenReady();\n }\n\n disconnectedCallback() {\n if (this.#resizeObserver) {\n this.#resizeObserver.disconnect();\n }\n }\n\n #observeResize = () => {\n if (!this.#owner) return;\n const body = this.#owner.querySelector(\".ng-sheet-body .ng-container-body\");\n if (!body) return;\n\n this.#resizeObserver = new ResizeObserver(() => {\n this.refresh();\n });\n this.#resizeObserver.observe(body);\n };\n\n refresh = () => {\n\n if (!this.#owner || !this.#elements || this.#dragging) return;\n\n const body = this.#elements.container;\n const table = body.querySelector(\"table\");\n if (!table) return;\n\n const track = this.#elements.track;\n const thumb = this.#elements.thumb;\n\n const bodyWidth = body.clientWidth;\n const tableWidth = table.scrollWidth;\n\n const needsHScroll = (bodyWidth !== 0 && tableWidth > bodyWidth);\n this.#owner.classList.toggle('hscroll-visible', needsHScroll);\n\n if (!needsHScroll) {\n return;\n }\n\n const trackWidth = track.clientWidth;\n if (trackWidth <= 0) return;\n\n const thumbWidth = Math.max(Math.min(trackWidth * (bodyWidth / tableWidth), trackWidth), 20);\n thumb.style.width = `${thumbWidth}px`;\n\n const currentLeft = body.scrollLeft;\n const maxScrollLeft = tableWidth - bodyWidth;\n\n let l = 0;\n if (maxScrollLeft > 0) {\n l = parseInt((currentLeft / maxScrollLeft) * (trackWidth - thumbWidth), 10);\n }\n if (l < 0) l = 0;\n\n const maxThumbLeft = trackWidth - thumbWidth;\n if (l > maxThumbLeft) l = maxThumbLeft;\n\n thumb.style.left = `${l}px`;\n\n this.#elements.left.disabled = (l === 0);\n this.#elements.right.disabled = (l >= maxThumbLeft - 1);\n };\n\n #thumbMoveTo = (x) => {\n if (!this.#elements) return false;\n\n const body = this.#elements.container;\n const table = body.querySelector(\"table\");\n if (!table) return false;\n\n const trackBound = this.#elements.track.getBoundingClientRect();\n const thumbWidth = this.#elements.thumb.clientWidth;\n\n let targetX = x;\n if (targetX < 0) targetX = 0;\n const maxThumbLeft = trackBound.width - thumbWidth;\n if (targetX > maxThumbLeft) targetX = maxThumbLeft;\n targetX = parseInt(targetX, 10);\n\n this.#elements.thumb.style.left = `${targetX}px`;\n\n this.#elements.left.disabled = (targetX === 0);\n this.#elements.right.disabled = (targetX >= maxThumbLeft - 1);\n\n const bodyWidth = body.clientWidth;\n const tableWidth = table.scrollWidth;\n const maxScrollLeft = tableWidth - bodyWidth;\n\n if (maxThumbLeft > 0 && maxScrollLeft > 0) {\n const newScrollLeft = (targetX / maxThumbLeft) * maxScrollLeft;\n body.scrollLeft = newScrollLeft;\n }\n\n return (targetX > 0 && targetX < maxThumbLeft - 1);\n };\n\n #init = () => {\n const delayScroll = (pos) => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n\n const thumbLeft = parseInt(this.#elements.thumb.style.left || 0, 10);\n this.#thumbMoveTo(thumbLeft + pos);\n\n this.#interval1 = setInterval(() => {\n clearInterval(this.#interval1);\n\n this.#interval2 = setInterval(() => {\n const currentThumbLeft = parseInt(this.#elements.thumb.style.left || 0, 10);\n if (!this.#thumbMoveTo(currentThumbLeft + pos)) {\n clearInterval(this.#interval2);\n }\n }, 50);\n }, 500);\n };\n\n const clearTimer = () => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n };\n\n //['mouseup', 'mouseleave', 'touchend'].forEach(evt => {\n ['mouseup', 'mouseleave'].forEach(evt => {\n this.#elements.left.addEventListener(evt, clearTimer);\n this.#elements.right.addEventListener(evt, clearTimer);\n this.#elements.track.addEventListener(evt, clearTimer);\n });\n\n this.#elements.left.addEventListener(\"mousedown\", e => { if (e.button !== 0) return; delayScroll(-20); });\n this.#elements.right.addEventListener(\"mousedown\", e => { if (e.button !== 0) return; delayScroll(20); });\n //this.#elements.left.addEventListener(\"touchstart\", () => delayScroll(-20));\n //this.#elements.right.addEventListener(\"touchstart\", () => delayScroll(20));\n\n this.#elements.track.addEventListener(\"mousedown\", e => {\n if (e.button !== 0) return;\n e.preventDefault();\n const trackRect = this.#elements.track.getBoundingClientRect();\n const thumbWidth = this.#elements.thumb.clientWidth;\n this.#thumbMoveTo(e.clientX - trackRect.left - (thumbWidth / 2));\n });\n\n this.#elements.thumb.addEventListener(\"mousedown\", e => {\n if (e.button !== 0) return;\n e.stopPropagation();\n e.preventDefault();\n this.#dragging = true;\n this.shiftX = e.clientX - this.#elements.thumb.getBoundingClientRect().left;\n\n const onMouseMove = (moveEvent) => {\n if (!this.#dragging) return;\n const trackRect = this.#elements.track.getBoundingClientRect();\n this.#thumbMoveTo(moveEvent.clientX - trackRect.left - this.shiftX);\n };\n\n const onMouseUp = () => {\n this.#dragging = false;\n clearTimer();\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n this.refresh();\n };\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n });\n };\n}\n\nif (!customElements.get('nine-table-hscrollbar')) {\n customElements.define(\"nine-table-hscrollbar\", NineTableHScrollBar);\n}","// ui/nine-table-vscrollbar.js\nimport { trace } from \"@nopeer\";\n\nexport class NineTableVScrollBar extends HTMLElement {\n #host;\n #sheet;\n #dragging = false;\n #elements;\n #startY = 0;\n #startScrollTop = 0;\n #startThumbTop = 0;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#host = this.getRootNode().host;\n this.#sheet = this.closest(\"nine-table-sheet\");\n\n this.innerHTML = `\n <button class='scroll-top' disabled><div class='scroll-icon'></div></button>\n <div class='scroll-track'><div class='scroll-thumb'></div></div>\n <button class='scroll-bottom' disabled><div class='scroll-icon'></div></button>\n `;\n\n const initWhenReady = () => {\n const body = this.#sheet.querySelector(\".ng-sheet-body\");\n if (!body) {\n setTimeout(initWhenReady, 10);\n return;\n }\n\n this.#elements = {\n container: body,\n track: this.querySelector(\".scroll-track\"),\n thumb: this.querySelector(\".scroll-thumb\"),\n top: this.querySelector(\".scroll-top\"),\n bottom: this.querySelector(\".scroll-bottom\"),\n };\n\n this.#init();\n this.refresh();\n };\n\n initWhenReady();\n }\n\n #getScaleInfo = () => {\n const viewRecords = this.#sheet.view.getArray();\n const totalCount = viewRecords ? viewRecords.length : 0;\n\n const scrollHolder = this.#sheet.elements?.scrollHolder;\n let rawContentHeight = scrollHolder ? parseFloat(scrollHolder.style.height) || 0 : 0;\n\n if (!rawContentHeight || rawContentHeight <= 0) {\n const isGrouped = this.#sheet.sourceTable?.querySelector(\"tbody tr[grouping='true']\") ? true : false;\n if (isGrouped && this.#sheet.rowManager) {\n rawContentHeight = (body.scrollHeight > body.clientHeight) ? body.scrollHeight : (totalCount * 30);\n } else {\n const rowHeight = this.#sheet.getRowHeight() || 1;\n rawContentHeight = totalCount * rowHeight;\n }\n }\n\n const MAX_BROWSER_HEIGHT = 15000000;\n const useScaling = rawContentHeight > MAX_BROWSER_HEIGHT;\n\n let scaleFactor = 1;\n let contentHeight = rawContentHeight;\n\n if (useScaling) {\n scaleFactor = MAX_BROWSER_HEIGHT / rawContentHeight;\n contentHeight = MAX_BROWSER_HEIGHT;\n }\n\n return { rawContentHeight, contentHeight, scaleFactor, useScaling, totalCount };\n };\n\n\n refresh = () => {\n if (this.#dragging) return;\n\n if (!this.#sheet || !this.#sheet.elements || !this.#elements) return;\n\n const body = this.#elements.container;\n const track = this.#elements.track;\n const thumb = this.#elements.thumb;\n const { contentHeight } = this.#getScaleInfo();\n\n const fixedHeight = (this.#sheet.querySelector('thead')?.offsetHeight || 0) +\n (this.#sheet.querySelector('tfoot')?.offsetHeight || 0) +\n (this.#sheet.querySelector('tbody.head')?.offsetHeight || 0);\n\n const bodyHeight = (this.#sheet.querySelector('.ng-sheet-body').offsetHeight || 0);\n const viewHeight = bodyHeight - fixedHeight;\n\n const viewRecords = this.#sheet.view.getArray();\n const totalCount = viewRecords.length;\n\n const rawContentHeight = this.#sheet.getRowHeight() * totalCount;\n\n const needsVScroll = (rawContentHeight > viewHeight);\n\n this.#sheet.classList.toggle('vscroll-visible', needsVScroll);\n\n if (!needsVScroll) {\n return;\n }\n\n const trackHeight = track.clientHeight;\n if (trackHeight <= 0) return;\n\n const thumbHeight = Math.max(Math.min(trackHeight * (bodyHeight / rawContentHeight), trackHeight), 20);\n thumb.style.height = `${thumbHeight}px`;\n\n const currentScrollTop = body.scrollTop;\n const maxScrollTop = Math.max(contentHeight - this.#sheet.rowManager.getRowHeight(), 1);\n\n let thumbTop = 0;\n if (maxScrollTop > 0) {\n thumbTop = (currentScrollTop / maxScrollTop) * (trackHeight - thumbHeight);\n }\n\n const maxThumbTop = trackHeight - thumbHeight;\n if (thumbTop < 0) thumbTop = 0;\n if (thumbTop > maxThumbTop) thumbTop = maxThumbTop;\n\n thumb.style.top = `${thumbTop}px`;\n\n this.#elements.top.disabled = (currentScrollTop <= 0);\n this.#elements.bottom.disabled = (currentScrollTop >= maxScrollTop - 1);\n };\n\n #init = () => {\n\n this.#elements.thumb.addEventListener(\"mousedown\", (e) => {\n if (e.button !== 0) return;\n e.stopPropagation();\n e.preventDefault();\n this.#dragging = true;\n\n this.#startY = e.clientY;\n this.#startThumbTop = parseFloat(this.#elements.thumb.style.top) || 0;\n const trackRect = this.#elements.track.getBoundingClientRect();\n const trackHeight = trackRect.height;\n const thumbHeight = this.#elements.thumb.clientHeight;\n const maxThumbTop = trackHeight - thumbHeight;\n\n const onMouseMove = (moveEvent) => {\n if (!this.#dragging) return;\n if (maxThumbTop <= 0) return;\n\n\n const deltaY = moveEvent.clientY - this.#startY;\n let targetThumbTop = this.#startThumbTop + deltaY;\n\n if (targetThumbTop < 0) targetThumbTop = 0;\n if (targetThumbTop > maxThumbTop) targetThumbTop = maxThumbTop;\n\n this.#elements.thumb.style.top = `${targetThumbTop}px`;\n\n const ratio = targetThumbTop / maxThumbTop;\n\n const rowHeight =this.#sheet.getRowHeight();\n const viewHeight = (this.#sheet.querySelector('.ng-sheet-body').offsetHeight || 0) -\n (this.#sheet.elements.body.thead?.offsetHeight || 0) -\n (this.#sheet.elements.body.tfoot?.offsetHeight || 0) -\n (this.#sheet.elements.body.tbody.head.offsetHeight || 0);\n\n const visibleRowCount = Math.floor(viewHeight / rowHeight);\n\n const { totalCount } = this.#getScaleInfo();\n const targetRow = Math.floor(ratio * (totalCount - visibleRowCount + 1));\n\n this.#sheet.rowManager.scrollToDataRow(targetRow);\n\n const { rawContentHeight, contentHeight } = this.#getScaleInfo();\n const currentScrollTop = this.#elements.container.scrollTop;\n const maxScrollTop = Math.max(contentHeight - this.#sheet.rowManager.getRowHeight(), 0);\n\n this.#elements.top.disabled = (currentScrollTop <= 0);\n this.#elements.bottom.disabled = (currentScrollTop >= maxScrollTop - 1);\n };\n\n const onMouseUp = () => {\n this.#dragging = false;\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n };\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n });\n\n this.#elements.track.addEventListener(\"mousedown\", (e) => {\n if (e.button !== 0 || e.target === this.#elements.thumb) return;\n const trackRect = this.#elements.track.getBoundingClientRect();\n const thumbHeight = this.#elements.thumb.clientHeight;\n const trackHeight = this.#elements.track.clientHeight;\n const maxThumbTop = trackHeight - thumbHeight;\n\n if (maxThumbTop > 0) {\n const clickY = e.clientY - trackRect.top - (thumbHeight / 2);\n const ratio = Math.max(0, Math.min(1, clickY / maxThumbTop));\n\n const { totalCount } = this.#getScaleInfo();\n const targetRow = Math.max(0, Math.min(Math.floor(ratio * (totalCount - 1)), totalCount - 1));\n\n\n if (targetRow >= 0 && this.#sheet.rowManager && typeof this.#sheet.rowManager.scrollToDataRow === 'function') {\n this.#sheet.rowManager.scrollToDataRow(targetRow, 'top');\n }\n }\n this.refresh();\n });\n\n let scrollInterval = null;\n\n const startContinuousScroll = (direction) => {\n if (scrollInterval) return;\n\n const scrollStep = () => {\n const $firstTr = this.#sheet.querySelector(\"tbody.body tr\");\n\n if (!$firstTr || $firstTr.dataset.row === undefined) {\n return;\n }\n\n if (direction === 'down' && this.#sheet.isLastRow()) {\n return;\n }\n\n const currentRow = parseInt($firstTr.dataset.row, 10);\n const targetRow = direction === 'down' ? currentRow+1 : Math.max(0, currentRow-1);\n\n this.#sheet.rowManager.scrollToDataRow(targetRow, null, () => {\n this.refresh();\n });\n };\n\n scrollStep();\n scrollInterval = setInterval(scrollStep, 200); // 100ms ๊ฐ๊ฒฉ ๋ฐ๋ณต\n };\n\n const stopContinuousScroll = () => {\n if (scrollInterval) {\n clearInterval(scrollInterval);\n scrollInterval = null;\n }\n };\n\n this.#elements.top.addEventListener(\"mousedown\", (e) => {\n if (e.button !== 0) return;\n startContinuousScroll('up');\n });\n\n this.#elements.bottom.addEventListener(\"mousedown\", (e) => {\n if (e.button !== 0) return;\n startContinuousScroll('down');\n });\n\n document.addEventListener(\"mouseup\", stopContinuousScroll);\n this.#elements.top.addEventListener(\"mouseleave\", stopContinuousScroll);\n this.#elements.bottom.addEventListener(\"mouseleave\", stopContinuousScroll);\n };\n}\n\nif (!customElements.get('nine-table-vscrollbar')) {\n customElements.define(\"nine-table-vscrollbar\", NineTableVScrollBar);\n}\n\n","import { trace } from \"@nopeer\";\n\nexport const GROUP_IDX = {\n\tID: 0,\n\tDEPTH: 1,\n\tNAME: 2,\n\tCHILDREN: 3,\n};\n\nexport class GroupingManager {\n\t#sheet;\n\t#host;\n\t#groupColumns = [];\n\t#groupMap = new Map(); // ๊ทธ๋ฃน๋ณ ์์ ID ๋งคํ ๊ด๋ฆฌ์ฉ\n\t#isApplying = false;\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = this.#sheet.getRootNode().host;\n\t}\n\n\tget columns() {\n\t\treturn this.#groupColumns;\n\t}\n\n\tget groupMap() {\n\t\treturn this.#groupMap;\n\t}\n\n\tinitialize = () => {\n\t\tlet groupColumns = [];\n\t\tconst sourceTable = this.#sheet.sourceTable;\n\t\tif (sourceTable) {\n\t\t\tsourceTable.querySelectorAll('tbody tr[grouping=\"true\"]').forEach(($tr) => {\n\t\t\t\tconst $cell =$tr.querySelector(`[cell-type=\"tree\"]`);\n\t\t\t\tif ($cell &&$cell.dataset.bind) {\n\t\t\t\t\tgroupColumns.push($cell.dataset.bind);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.#groupColumns = groupColumns;\n\t};\n\n\tapply() {\n\n\t\tif (this.#isApplying) return;\n\t\tthis.#isApplying = true;\n\n\t\tlet groupColumns = [];\n\t\tconst sourceTable = this.#sheet.sourceTable;\n\t\tif (sourceTable) {\n\t\t\tsourceTable.querySelectorAll('tbody tr[grouping=\"true\"]').forEach(($tr) => {\n\t\t\t\tconst $cell =$tr.querySelector(`[cell-type=\"tree\"]`);\n\t\t\t\tif ($cell &&$cell.dataset.bind) {\n\t\t\t\t\tgroupColumns.push($cell.dataset.bind);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.#groupColumns = groupColumns;\n\n\t\tthis.#isApplying = false;\n\t\tthis.#sheet.scrollToY(0);\n\t\tthis.#sheet.view.refresh();\n\t}\n\n\tclear() {\n\t\tthis.#groupColumns = [];\n\t\tthis.#groupMap.clear();\n\t\tthis.#isApplying = false;\n\t\tthis.#sheet.scrollToY(0);\n\t\tthis.#sheet.view.refresh();\n\t}\n\n\tsetGroupMap(map) {\n\t\tthis.#groupMap = map;\n\t}\n\n\tgetChildrenRowIds(groupId) {\n\t\treturn this.#groupMap.get(groupId) || [];\n\t}\n\n\tgetChildrenRecords(groupId) {\n\t\tconst rowIds = this.getChildrenRowIds(groupId);\n\t\tconst dataManager = this.#host.data;\n\t\treturn rowIds.map(rowid => dataManager.getArray(rowid)).filter(Boolean);\n\t}\n}\n\nexport class Grouping {\n\n\tstatic apply(rawRecords, groupColumns = [], fields = []) {\n\t\tif (!groupColumns || groupColumns.length === 0) {\n\t\t\treturn { headers: [], renderItems: [], groupMap: new Map() };\n\t\t}\n\n\t\tconst validRaw = rawRecords.filter(o => !o.__ng?.deleted);\n\t\tconst groupMap = new Map();\n\n\t\tconst nestedTree = Grouping.#buildNestedMap(validRaw, groupColumns, fields);\n\t\tconst flatResult = [];\n\t\tconst renderItems = [];\n\n\t\tGrouping.#flattenTree(nestedTree, 0, groupColumns, flatResult, renderItems, groupMap, \"\");\n\n\t\treturn { headers: flatResult, renderItems, groupMap };\n\t}\n\n\tstatic #flattenTree(mapOrArray, depth, groupColumns, resultArr, renderItems, groupMap, parentId) {\n\t\tlet counter = 0;\n\t\tconst isLastLevel = (depth === groupColumns.length - 1); // ๐ก ์ฐ์ฐ์ ์์ ๋ฐ์\n\n\t\tfor (let [groupKey, subMapOrRecords] of mapOrArray.entries()) {\n\t\t\tconst groupId = parentId ? `${parentId}_${counter++}` : `g_${counter++}`;\n\n\t\t\tconst rowIds = Grouping.#collectLeafRowIds(subMapOrRecords);\n\t\t\tgroupMap.set(groupId, rowIds);\n\n\t\t\tconst groupRecord = [];\n\t\t\tgroupRecord[GROUP_IDX.ID] = groupId;\n\t\t\tgroupRecord[GROUP_IDX.DEPTH] = depth;\n\t\t\tgroupRecord[GROUP_IDX.NAME] = groupKey;\n\t\t\tgroupRecord[GROUP_IDX.CHILDREN] = rowIds;\n\n\t\t\tgroupRecord.__isGroupHeader = true;\n\t\t\tgroupRecord.__groupId = groupId;\n\n\t\t\tresultArr.push(groupRecord);\n\n\t\t\trenderItems.push({\n\t\t\t\ttype: 'group',\n\t\t\t\trecord: groupRecord,\n\t\t\t\tgroupId: groupId\n\t\t\t});\n\n\t\t\tif (!isLastLevel && subMapOrRecords instanceof Map) {\n\t\t\t\tGrouping.#flattenTree(subMapOrRecords, depth + 1, groupColumns, resultArr, renderItems, groupMap, groupId);\n\t\t\t} else {\n\t\t\t\tconst leafRecords = Grouping.#collectLeafRecords(subMapOrRecords);\n\t\t\t\tleafRecords.forEach(record => {\n\t\t\t\t\trecord.__isGroupHeader = false;\n\t\t\t\t\trecord.__groupId = groupId;\n\t\t\t\t\tresultArr.push(record);\n\n\t\t\t\t\trenderItems.push({\n\t\t\t\t\t\ttype: 'data',\n\t\t\t\t\t\trecord: record,\n\t\t\t\t\t\tgroupId: groupId\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic #buildNestedMap(records, groupColumns, fields) {\n\t\tconst colIndex = fields.indexOf(groupColumns[0]);\n\t\tconst remainingCols = groupColumns.slice(1);\n\t\tconst map = new Map();\n\n\t\trecords.forEach(record => {\n\t\t\tconst key = colIndex >= 0 ? record.v[colIndex] : '(Unknown)';\n\t\t\tif (!map.has(key)) map.set(key, []);\n\t\t\tmap.get(key).push(record);\n\t\t});\n\n\t\tif (remainingCols.length > 0) {\n\t\t\tconst result = new Map();\n\t\t\tfor (let [key, subRecords] of map.entries()) {\n\t\t\t\tresult.set(key, Grouping.#buildNestedMap(subRecords, remainingCols, fields));\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t\treturn map;\n\t}\n\n\tstatic #collectLeafRowIds(subMapOrRecords) {\n\t\tlet rowIds = [];\n\t\tif (subMapOrRecords instanceof Map) {\n\t\t\tfor (let subVal of subMapOrRecords.values()) {\n\t\t\t\trowIds = rowIds.concat(Grouping.#collectLeafRowIds(subVal));\n\t\t\t}\n\t\t} else if (Array.isArray(subMapOrRecords)) {\n\t\t\trowIds = rowIds.concat(subMapOrRecords.map(r => r.__ng?.rowid ?? r.m?._?.[0]));\n\t\t}\n\t\treturn rowIds;\n\t}\n\n\tstatic #collectLeafRecords(subMapOrRecords) {\n\t\tlet records = [];\n\t\tif (subMapOrRecords instanceof Map) {\n\t\t\tfor (let subVal of subMapOrRecords.values()) {\n\t\t\t\trecords = records.concat(Grouping.#collectLeafRecords(subVal));\n\t\t\t}\n\t\t} else if (Array.isArray(subMapOrRecords)) {\n\t\t\trecords = records.concat(subMapOrRecords);\n\t\t}\n\t\treturn records;\n\t}\n}","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\nimport { GROUP_IDX } from \"@/data/Grouping.js\";\n\nexport class RowManager {\n #BUFFER_ROW_COUNT = 3;\n\n #host;\n #sheet;\n #element;\n\n #containerTemplates = new Map();\n\n #resizeObserver = null;\n #sheetHeight = 0;\n #cachedRowCount;\n\n #isProgrammaticScroll = false;\n #isGrouped = false;\n\n constructor(sheet) {\n this.#host = sheet.getRootNode().host;\n this.#sheet = sheet;\n\n this.#initResizeObserver();\n }\n\n getRowHeight() {\n return this.#sheet.template.height;\n }\n\n refresh = (force = false) => {\n\n if (!this.#sheet.classList.contains('active')) return;\n\n const bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n if (!bodyViewport) return;\n\n const wasInvalidHeight = !this.#sheet.template.height || this.#sheet.template.height <= 0;\n\n if (wasInvalidHeight) {\n this.#measureAndCacheHeight();\n if (this.#sheet.template.height && this.#sheet.template.height > 0) {\n this.#renderAllContainers();\n }\n }\n\n\n this.#handleScroll(bodyViewport.scrollTop, force);\n\n this.#sheet.querySelector('nine-table-vscrollbar')?.refresh();\n };\n\n #handleScroll = (scrollTop, force = false) => {\n\n if (this.#isGrouped) {\n this.#handleGroupedScroll(scrollTop, force);\n return;\n }\n\n const rowHeight = this.#sheet.template.height;\n if (!rowHeight || rowHeight <= 0) return;\n\n const viewRecords = this.#sheet.view.getArray();\n const totalCount = viewRecords.length;\n\n if (totalCount === 0) {\n this.#sheet.elements.scrollHolder.style.height = '0px';\n return;\n }\n\n const fixedHeight = (this.#sheet.elements.body.thead?.offsetHeight || 0) +\n (this.#sheet.elements.body.tfoot?.offsetHeight || 0) +\n this.#sheet.elements.body.tbody.head.offsetHeight;\n\n const viewHeight = this.#sheet.querySelector('.ng-sheet-body').offsetHeight || 0;\n const rawTotalVirtualHeight = Math.max(totalCount * rowHeight - (viewHeight - fixedHeight - rowHeight) - rowHeight, 0);\n\n const MAX_BROWSER_HEIGHT = 15000000;\n const useScaling = rawTotalVirtualHeight > MAX_BROWSER_HEIGHT;\n\n let scaleFactor = 1;\n let totalVirtualHeight = rawTotalVirtualHeight;\n\n if (useScaling) {\n scaleFactor = MAX_BROWSER_HEIGHT / rawTotalVirtualHeight;\n totalVirtualHeight = MAX_BROWSER_HEIGHT;\n }\n\n\n this.#sheet.elements.scrollHolder.style.height = `${totalVirtualHeight}px`;\n\n const actualScrollTop = useScaling ? (scrollTop / scaleFactor) : scrollTop;\n\n const maxStartIndex = Math.max(0, totalCount - 1);\n const clampedScrollTop = Math.min(actualScrollTop, rawTotalVirtualHeight);\n const startIndex = Math.max(0, Math.min(Math.floor(clampedScrollTop / rowHeight), maxStartIndex));\n\n //trace.log(clampedScrollTop % rowHeight, rowHeight);\n\n /*\n * FIX: Use GPU-accelerated transform3d instead of 'top' positioning.\n * On mobile devices (iOS Safari), direct 'top' updates trigger expensive\n * layout reflows and cause severe scrolling lag during inertia touch scrolls.\n * translate3d forces hardware compositing for buttery-smooth performance.\n */\n this.#sheet.elements.left.tbody.body.style.transform =\n this.#sheet.elements.body.tbody.body.style.transform =\n this.#sheet.elements.right.tbody.body.style.transform = `translate3d(0px, -${clampedScrollTop % rowHeight}px, 0px)`;\n\n\n const firstTr = this.#element.firstTr;\n const currentStartIndex = firstTr && firstTr.dataset.row !== undefined ? parseInt(firstTr.dataset.row, 10) : -1;\n\n if (!force && currentStartIndex === startIndex) {\n return;\n }\n\n [\n this.#sheet.elements.left.tbody.body,\n this.#sheet.elements.body.tbody.body,\n this.#sheet.elements.right.tbody.body\n ].forEach(($tbody, tbodyIdx) => {\n if (!$tbody) return;\n\n const rows = $tbody.querySelectorAll('tbody.body tr');\n\n rows.forEach(($tr, index) => {\n const dataIndex = startIndex + Math.floor(index / this.#sheet.template.length);\n\n if (dataIndex >= totalCount) {\n $tr.style.display = 'none';\n $tr.dataset.matrixRow = null;\n $tr.dataset.row = null;\n $tr.dataset.index = null;\n return;\n }\n\n const record = viewRecords[dataIndex];//this.#sheet.view.getArray(dataIndex);\n\n if (!record) {\n $tr.style.display = 'none';\n return;\n }\n\n const rowid = record.m._[NINE_TABLE.META.INDEX.ROWID];\n\n $tr.style.display = '';\n\n this.#bindRowData($tr, record, rowid, dataIndex);\n });\n });\n\n this.#sheet.selection.refresh();\n };\n\n\n #handleGroupedScroll = (scrollTop, force = false) => {\n\n const allRenderItems = this.#sheet.view.getArray() || [];\n const totalVirtualCount = allRenderItems.length;\n\n if (totalVirtualCount === 0) {\n this.#sheet.elements.scrollHolder.style.height = '0px';\n return;\n }\n\n\n const bodyContent = this.#sheet.querySelector('.ng-sheet-body .ng-sheet-body-content');\n const templateLength = this.#sheet.templateLength || 1;\n\n const getItemHeight = (item) => {\n if (item.type === 'group') {\n const depth = item.record[GROUP_IDX.DEPTH] || 0;\n const groupHeight = this.#sheet.template.height[depth] || this.#sheet.template.height / templateLength;\n return groupHeight;\n } else {\n let dataRowsHeight = 0;\n const templateLength = this.#sheet.templateLength || 1;\n\n let groupHeightsTotal = 0;\n for(let i = 0; i < templateLength - 1; i++) {\n groupHeightsTotal += this.#sheet.template.heights[i] || 0;\n }\n dataRowsHeight = this.#sheet.template.height - groupHeightsTotal;\n\n return dataRowsHeight > 0 ? dataRowsHeight : this.#sheet.template.height;\n }\n };\n\n\n let totalVirtualHeight = 0;\n const itemHeights = new Array(totalVirtualCount);\n for (let i = 0; i < totalVirtualCount; i++) {\n const h = getItemHeight(allRenderItems[i]);\n itemHeights[i] = h;\n totalVirtualHeight += h;\n }\n\n this.#sheet.elements.scrollHolder.style.height = `${totalVirtualHeight}px`;\n\n const viewportClientHeight = this.#sheet.clientHeight;\n\n let accumulatedHeight = 0;\n let startIndex = 0;\n\n for (let i = 0; i < totalVirtualCount; i++) {\n const h = itemHeights[i];\n if (accumulatedHeight + h > scrollTop) {\n startIndex = i;\n break;\n }\n accumulatedHeight += h;\n startIndex = i;\n }\n\n const offsetY = scrollTop - accumulatedHeight;\n if (bodyContent) {\n bodyContent.querySelectorAll(\"tbody\").forEach(($tbody) => {\n $tbody.style.top = `-${Math.max(0, offsetY)}px`;\n });\n }\n\n const firstTr = this.#element.firstTr;\n const currentStartIndex = firstTr && firstTr.dataset.virtualIndex !== undefined\n ? parseInt(firstTr.dataset.virtualIndex, 10)\n : -1;\n\n if (!force && currentStartIndex === startIndex) {\n return;\n }\n\n const visibleRowsCount = Math.ceil(viewportClientHeight / (this.#sheet.template.height / templateLength));\n const dynamicBuffer = (this.#sheet.grouping.columns?.length || 1) * 15;\n const targetStart = startIndex;\n const targetEnd = Math.min(totalVirtualCount, startIndex + visibleRowsCount + dynamicBuffer);\n const renderedItems = allRenderItems.slice(targetStart, targetEnd);\n\n ['.ng-container-body', '.ng-container-left', '.ng-container-right'].forEach(selector => {\n const container = this.#sheet.querySelector(`.ng-sheet-body ${selector}`);\n if (!container) return;\n\n const trs = Array.from(container.querySelectorAll('tbody.body tr'));\n\n for (let i = 0; i < trs.length; i += templateLength) {\n const itemIndex = Math.floor(i / templateLength);\n const item = renderedItems[itemIndex];\n const chunkTrs = trs.slice(i, i + templateLength);\n\n if (!item || itemIndex >= renderedItems.length) {\n chunkTrs.forEach(tr => {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n });\n continue;\n }\n\n const dataIndex = startIndex + itemIndex;\n\n chunkTrs.forEach((tr, subIdx) => {\n const virtualIndex = startIndex + itemIndex;\n tr.dataset.virtualIndex = virtualIndex;\n tr.dataset.row = (item.type === 'data') ? dataIndex : '';\n\n const isTrGroup = tr.getAttribute('grouping') === 'true';\n\n if (item.type === 'group') {\n if (isTrGroup) {\n const depth = item.record[GROUP_IDX.DEPTH];\n if (subIdx === depth) {\n tr.style.display = '';\n this.#bindGroupRowData(tr, allRenderItems, item.record, virtualIndex);\n } else {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n }\n } else {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n }\n } else {\n if (isTrGroup) {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n } else {\n tr.style.display = '';\n\n const rowid = item.record.m?.rowid ?? 0;\n this.#bindRowData(tr, item.record, rowid, virtualIndex);\n }\n }\n });\n }\n });\n\n this.#sheet.selection.refresh();\n };\n\n #bindGroupRowData = ($tr, allRenderItems, groupRecord, virtualIndex) => {\n const templateLength = this.#sheet.templateLength || 1;\n const subRowIndex = parseInt($tr.dataset.subrow, 10) || 0;\n const matrixRow = (virtualIndex * templateLength) + subRowIndex;\n\n const indices = groupRecord[GROUP_IDX.CHILDREN];\n const allRecords = this.#host.data.getArray();\n const childrenRecords = indices ? indices.map(idx => allRecords[idx]).filter(Boolean) : [];\n\n\n $tr.dataset.virtualIndex = virtualIndex;\n $tr.dataset.row = '';\n $tr.dataset.matrixRow = matrixRow;\n $tr.data = childrenRecords;//groupRecord;\n $tr.dataset.groupId = groupRecord[GROUP_IDX.ID];\n\n\n Array.from($tr.cells).forEach(($cell) => {\n\n $cell.dataset.row = virtualIndex;\n\n const customComp = Array.from($cell.children).find($el =>\n $el.tagName.toLowerCase().startsWith('cell-') || typeof $el.refresh === 'function'\n );\n\n\n if (customComp !== undefined && typeof customComp.refresh === 'function') {\n customComp?.refresh();\n }\n });\n };\n\n #bindRowData = ($tr, record, rowid, dataIndex) => {\n const templateLength = this.#sheet.templateLength || 1;\n const subRowIndex = parseInt($tr.dataset.subrow, 10) || 0;\n const matrixRow = (dataIndex * templateLength) + subRowIndex;\n\n $tr.dataset.index = dataIndex;\n $tr.dataset.row = rowid;\n $tr.dataset.matrixRow = matrixRow;\n $tr.data = record;\n\n Array.from($tr.cells).forEach(($cell) => {\n $cell.dataset.index = dataIndex;\n $cell.dataset.row = rowid;\n\n const customComp = Array.from($cell.children).find($el =>\n $el.tagName.toLowerCase().startsWith('cell-') && typeof $el.refresh === 'function'\n );\n\n customComp?.refresh();\n });\n };\n\n initialize = () => {\n\n this.#isGrouped = this.#sheet.sourceTable.querySelector(\"tbody tr[grouping='true']\") ? true : false;\n\n //this.#cachedTemplateHeight = null;\n this.#containerTemplates.clear();\n\n this.#element = {\n scrollTables: this.#sheet.querySelectorAll('.ng-sheet-body table'),\n firstTr: this.#sheet.querySelector('.ng-sheet-body .ng-container-body tbody.body tr'),\n };\n\n ['.ng-container-body', '.ng-container-left', '.ng-container-right'].forEach(selector => {\n const container = this.#sheet.querySelector(`.ng-sheet-body ${selector}`);\n if (!container) return;\n\n const tableEl = container.querySelector('table');\n if (!tableEl) return;\n\n const tbody = tableEl.querySelector('tbody.body');\n if (!tbody) return;\n\n const trs = Array.from(tbody.querySelectorAll('tr'));\n const templateTrs = trs.map(tr => tr.cloneNode(true));\n this.#containerTemplates.set(selector, templateTrs);\n });\n\n const bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\n if (bodyViewport) {\n this.#sheetHeight = bodyViewport.clientHeight;\n //trace.log(\"this.#sheetHeight\", this.#sheetHeight, this.#sheet);\n\n this.#measureAndCacheHeight();\n this.#renderAllContainers();\n this.#handleScroll(bodyViewport.scrollTop, true);\n\n bodyViewport.addEventListener('scroll', (e) => {\n\n if (this.#isProgrammaticScroll) return;\n\n const rowHeight = this.#sheet.template.height || 0;\n const totalCount = this.#sheet.view.getArray()?.length || 0;\n const rawTotalVirtualHeight = totalCount * rowHeight;\n\n if (rawTotalVirtualHeight <= bodyViewport.clientHeight) {\n return;\n }\n\n this.#handleScroll(bodyViewport.scrollTop);\n\n this.#sheet.querySelector('nine-table-vscrollbar').refresh();\n\n }, { passive: true });\n }\n };\n\n scrollToDataRow(dataRow, align = 'top', onRendered) {\n\n const bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\n const viewRecords = this.#sheet.view.getArray();\n const totalCount = viewRecords?.length || 0;\n\n const targetRow = Math.max(0, Math.min(dataRow, totalCount - 1));\n let targetScrollTop = 0;\n\n if (this.#isGrouped) {\n const maxScrollTop = Math.max(bodyViewport.scrollHeight - bodyViewport.clientHeight, 1);\n // targetRow๊ฐ ์ ์ฒด totalCount์์ ์ฐจ์งํ๋ ๋น์จ(ratio)๋งํผ ์ค์ ์คํฌ๋กค ์ต๋ ๋์ด์ ๊ณฑํด์ค\n const ratio = targetRow / Math.max(totalCount - 1, 1);\n targetScrollTop = ratio * maxScrollTop;\n } else {\n\n const rowHeight = this.#sheet.template.height;\n const rawTargetScrollTop = targetRow * rowHeight;\n\n const fixedHeight = (this.#sheet.elements.body.thead?.offsetHeight || 0) +\n (this.#sheet.elements.body.tfoot?.offsetHeight || 0) +\n this.#sheet.elements.body.tbody.head.offsetHeight;\n\n const viewHeight = bodyViewport.offsetHeight || 0;\n const rawTotalVirtualHeight = Math.max(totalCount * rowHeight + fixedHeight - viewHeight, 0);\n\n const MAX_BROWSER_HEIGHT = 15000000;\n const useScaling = rawTotalVirtualHeight > MAX_BROWSER_HEIGHT;\n\n let scaleFactor = 1;\n if (useScaling) {\n scaleFactor = MAX_BROWSER_HEIGHT / rawTotalVirtualHeight;\n }\n\n targetScrollTop = rawTargetScrollTop * scaleFactor;\n }\n\n this.#isProgrammaticScroll = true;\n bodyViewport.scrollTop = targetScrollTop;\n this.#handleScroll(targetScrollTop);\n\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n this.#isProgrammaticScroll = false;\n if (typeof onRendered === 'function') onRendered();\n });\n });\n }\n\n\n\n destroy = () => {\n if (this.#resizeObserver) {\n this.#resizeObserver.disconnect();\n this.#resizeObserver = null;\n }\n };\n\n #measureAndCacheHeight = () => {\n return;\n if (!this.#sheet.classList.contains('active')) return;\n\n if (!this.#sheet.sourceTable) return;\n\n const trTemplates = this.#sheet.sourceTable?.querySelectorAll('tbody.body tr');\n\n const $tbody = this.#sheet.querySelector('.ng-container-body tbody.body');\n if (!$tbody) return;\n\n $tbody?.querySelectorAll('tr')?.forEach(tr => tr.remove());\n\n const fragment = document.createDocumentFragment();\n trTemplates.forEach($tr => fragment.appendChild($tr.cloneNode(true)));\n $tbody?.appendChild(fragment);\n\n const renderedTrs = $tbody.querySelectorAll('tr');\n\n\n renderedTrs.forEach(tr => tr.remove());\n\n\n this.#updateRowCount();\n };\n\n #updateRowCount = () => {\n\n if (this.#sheetHeight > 0 && this.#sheet.template.height > 0) {\n const visibleRows = Math.ceil(this.#sheetHeight / this.#sheet.template.height);\n\n let dynamicBuffer = this.#BUFFER_ROW_COUNT;\n if (this.#isGrouped && this.#sheet.grouping) {\n const groupDepth = this.#sheet.grouping.columns?.length || 1;\n dynamicBuffer += (groupDepth * 15);\n }\n\n this.#cachedRowCount = visibleRows + dynamicBuffer;\n }\n };\n\n #renderAllContainers = () => {\n\n ['.ng-container-body', '.ng-container-left', '.ng-container-right'].forEach(selector => {\n const container = this.#sheet.querySelector(`.ng-sheet-body ${selector}`);\n if (container && container.querySelector('tbody')) {\n this.#renderRows(container);\n }\n });\n\n this.#syncRowHeights();\n };\n\n #renderRows = (container) => {\n let targetFixedType = null;\n if (container.classList.contains('ng-container-left')) targetFixedType = 'left';\n else if (container.classList.contains('ng-container-right')) targetFixedType = 'right';\n\n const templateTrs = Array.from(this.#sheet.sourceTable.querySelectorAll('tbody.body tr')).map(tr => {\n const clonedTr = tr.cloneNode(true);\n\n if (targetFixedType === 'left') {\n clonedTr.querySelectorAll('th,td').forEach($cell => {\n if ($cell.getAttribute('fixed') !== 'left') $cell.remove();\n });\n } else if (targetFixedType === 'right') {\n clonedTr.querySelectorAll('th,td').forEach($cell => {\n if ($cell.getAttribute('fixed') !== 'right') $cell.remove();\n });\n } else {\n clonedTr.querySelectorAll('[fixed=left], [fixed=right]').forEach($cell => {\n $cell.remove();\n });\n }\n\n return clonedTr;\n });\n\n if (templateTrs.length === 0) return;\n\n const targetTbody = container.querySelector('tbody.body');\n if (!targetTbody) return;\n\n targetTbody.querySelectorAll(\"tr\").forEach(tr => tr.remove());\n\n const fragment = document.createDocumentFragment();\n for (let i = 0; i < this.#cachedRowCount; i++) {\n templateTrs.forEach(tmpl => fragment.appendChild(tmpl.cloneNode(true)));\n }\n\n\n targetTbody.appendChild(fragment);\n\n if (container.classList.contains('ng-container-body')) {\n this.#element.firstTr = targetTbody.querySelector('tr');\n }\n };\n\n\n\n #syncRowHeights = () => {\n const leftTable = this.#sheet.querySelector('.ng-sheet-body .ng-container-left table');\n const bodyTable = this.#sheet.querySelector('.ng-sheet-body .ng-container-body table');\n const rightTable = this.#sheet.querySelector('.ng-sheet-body .ng-container-right table');\n\n if (bodyTable) {\n const leftRows = leftTable ? Array.from(leftTable.querySelectorAll('tbody tr')) : [];\n const bodyRows = Array.from(bodyTable.querySelectorAll('tbody tr'));\n const rightRows = rightTable ? Array.from(rightTable.querySelectorAll('tbody tr')) : [];\n\n const maxRows = Math.max(leftRows.length, bodyRows.length, rightRows.length);\n\n for (let i = 0; i < maxRows; i++) {\n const heights = [\n leftRows[i]?.getBoundingClientRect().height || 0,\n bodyRows[i]?.getBoundingClientRect().height || 0,\n rightRows[i]?.getBoundingClientRect().height || 0\n ];\n const maxHeight = Math.max(...heights);\n\n if (maxHeight > 0) {\n if (leftRows[i]) leftRows[i].style.height = `${maxHeight}px`;\n if (bodyRows[i]) bodyRows[i].style.height = `${maxHeight}px`;\n if (rightRows[i]) rightRows[i].style.height = `${maxHeight}px`;\n }\n }\n }\n };\n\n #initResizeObserver = () => {\n\n if (!this.#sheet || !(this.#sheet instanceof HTMLElement)) return;\n\n this.#resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n\n const sheetEl = entry.target;\n if (!sheetEl.classList.contains('active')) continue;\n\n const height = entry.contentRect.height;\n const width = entry.contentRect.width;\n\n if (width > 0 && this.#sheet.isAutoFitCol) {\n this.#sheet.autoFit(true);\n }\n\n if (height > 0 && this.#sheetHeight !== height) {\n this.#sheetHeight = height;\n //trace.log(\"this.#sheetHeight\", this.#sheetHeight);\n this.#updateRowCount();\n\n if (this.#sheet.template.height !== null) {\n this.#renderAllContainers();\n this.refresh();\n }\n }\n }\n });\n\n this.#resizeObserver.observe(this.#sheet);\n };\n}","import { trace } from \"@nopeer\";\n\nexport const COLLAPSED_WIDTH = 16;\n\nexport class TableCompiler {\n\n static compile($srcTable) {\n\n const $table = $srcTable.cloneNode(true);\n\n TableCompiler.resetColIndex($table, $table.querySelectorAll('thead tr'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tbody.body tr[grouping=\"true\"]'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tbody.body tr:not([grouping=\"true\"])'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tfoot tr'));\n\n TableCompiler.#syncColAttributes($table);\n\n return $table;\n }\n\n static recompile($table) {\n\n\n TableCompiler.resetColIndex($table, $table.querySelectorAll('thead tr'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tbody.body tr[grouping=\"true\"]'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tbody.body tr:not([grouping=\"true\"])'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tfoot tr'));\n\n TableCompiler.#syncColAttributes($table);\n\n return $table;\n }\n\n static #syncColAttributes($table) {\n\n $table.querySelectorAll('colgroup col').forEach(($col, i) => {\n $col.setAttribute('data-col', i);\n const fixed = $col.getAttribute('fixed');\n\n $table.querySelectorAll(`[data-col=\"${i}\"]`).forEach($el => {\n fixed ? $el.setAttribute('fixed', fixed) : $el.removeAttribute('fixed');\n });\n });\n }\n\n static resetColIndex($table, trs) {\n\n const cols = $table.querySelectorAll('colgroup col');\n const grid = Array.from({ length: trs.length }, () => Array(cols.length).fill(null));\n\n trs.forEach(($tr, index) => {\n\n $tr.dataset.subrow = index;\n\n let colIndex = 0;\n\n $tr.querySelectorAll('th, td').forEach($cell => {\n\n while (colIndex < cols.length && grid[index][colIndex] !== null) {\n colIndex++;\n }\n\n $cell.dataset.col = colIndex;\n\n const rowSpan = $cell.rowSpan || 1;\n const colSpan = $cell.colSpan || 1;\n\n for (let r = 0; r < rowSpan; r++) {\n for (let c = 0; c < colSpan; c++) {\n if (index + r < trs.length && colIndex + c < cols.length) {\n grid[index + r][colIndex + c] = $cell;\n }\n }\n }\n\n colIndex += colSpan;\n });\n });\n }\n\n}","import { trace } from \"@nopeer\";\n\nexport class CellSelection {\n\t#sheet;\n\t#range = { startRow: -1, startCol: -1, endRow: -1, endCol: -1 };\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#initEvents();\n\t}\n\n\t#getMatrixRow(tr) {\n\t\tif (!tr) return { dataRow: -1, subRowIndex: -1, matrixRow: -1 };\n\n\t\tconst dataRow = parseInt(tr.dataset.index, 10);\n\t\tif (isNaN(dataRow)) return { dataRow: -1, subRowIndex: -1, matrixRow: -1 };\n\n\t\tconst tbody = tr.closest('tbody');\n\t\tconst trs = Array.from(tbody.querySelectorAll('tr'));\n\n\t\tconst sameGroupTrs = trs.filter(t => parseInt(t.dataset.index, 10) === dataRow);\n\t\tconst subRowIndex = sameGroupTrs.indexOf(tr);\n\t\tconst templateLength = sameGroupTrs.length > 0 ? sameGroupTrs.length : 1;\n\n\t\tconst matrixRow = (dataRow * templateLength) + (subRowIndex >= 0 ? subRowIndex : (tr.sectionRowIndex % templateLength));\n\n\t\treturn { dataRow, subRowIndex, matrixRow };\n\t}\n\n\tsetFocus(matrixRow, col) {\n\t\tthis.#sheet.querySelectorAll(`tr.selected-start`).forEach($tr => {\n\t\t\t$tr.classList.remove(\"selected-start\");\n\t\t\t$tr.querySelectorAll(`td.selected-start`).forEach($td => {\n\t\t\t\t$td.classList.remove(\"selected-start\");\n\t\t\t});\n\t\t});\n\n\t\tconst $td = this.#sheet.querySelector(`.ng-sheet-body-content tr[data-matrix-row=\"${matrixRow}\"] td[data-col=\"${col}\"]`);\n\t\tif (!$td) return;\n\n\t\t$td.classList.add(\"selected-start\");\n\t\t$td.closest('tr')?.classList.add(\"selected-start\");\n\t}\n\n\tsetRange(startRow, startCol, endRow, endCol) {\n\t\tlet r1 = Math.min(startRow, endRow);\n\t\tlet r2 = Math.max(startRow, endRow);\n\t\tlet c1 = Math.min(startCol, endCol);\n\t\tlet c2 = Math.max(startCol, endCol);\n\n\t\tconst containers = this.#sheet.querySelectorAll('.ng-container-left, .ng-container-body, .ng-container-right');\n\n\t\tlet expanded = true;\n\t\tlet loopCount = 0;\n\n\t\twhile (expanded && loopCount < 5) {\n\t\t\texpanded = false;\n\t\t\tloopCount++;\n\n\t\t\tcontainers.forEach(container => {\n\n\t\t\t\tconst visibleTrs = Array.from(container.querySelectorAll('tbody tr')).filter(tr => {\n\t\t\t\t\treturn tr.style.display !== 'none'; // ํน์ tr.offsetHeight > 0 ์ฒดํฌ\n\t\t\t\t});\n\n\t\t\t\tvisibleTrs.forEach(tr => {\n\t\t\t\t\tconst { matrixRow } = this.#getMatrixRow(tr);\n\t\t\t\t\tif (matrixRow < 0) return;\n\n\t\t\t\t\ttr.querySelectorAll('td, th').forEach(cell => {\n\t\t\t\t\t\tconst col = parseInt(cell.dataset.col, 10);\n\t\t\t\t\t\tif (isNaN(col)) return;\n\n\t\t\t\t\t\tconst rowSpan = parseInt(cell.rowSpan || 1, 10);\n\t\t\t\t\t\tconst colSpan = parseInt(cell.colSpan || 1, 10);\n\n\t\t\t\t\t\tconst cellEndRow = matrixRow + rowSpan - 1;\n\t\t\t\t\t\tconst cellEndCol = col + colSpan - 1;\n\n\t\t\t\t\t\tconst isIntersecting = cellEndRow >= r1 && matrixRow <= r2 && cellEndCol >= c1 && col <= c2;\n\n\t\t\t\t\t\tif (isIntersecting) {\n\t\t\t\t\t\t\tconst nsR = Math.min(r1, matrixRow);\n\t\t\t\t\t\t\tconst neR = Math.max(r2, cellEndRow);\n\t\t\t\t\t\t\tconst nsC = Math.min(c1, col);\n\t\t\t\t\t\t\tconst neC = Math.max(c2, cellEndCol);\n\n\t\t\t\t\t\t\tif (nsR !== r1 || neR !== r2 || nsC !== c1 || neC !== c2) {\n\t\t\t\t\t\t\t\tr1 = nsR; r2 = neR; c1 = nsC; c2 = neC;\n\t\t\t\t\t\t\t\texpanded = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tthis.#range = { startRow: r1, startCol: c1, endRow: r2, endCol: c2 };\n\n\t\t//this.#sheet.view.clearSelectedRange();\n\t\t//this.#sheet.view.setSelectedRange(r1, r2, c1, c2);\n\n\t\tthis.render();\n\t}\n\n\tget minRow() {\n\t\treturn this.#range.startRow;\n\t};\n\tget maxRow() {\n\t\treturn this.#range.endRow;\n\t};\n\tget minCol() {\n\t\treturn this.#range.startCol;\n\t};\n\tget maxCol() {\n\t\treturn this.#range.endCol;\n\t};\n\n\trefresh = () => {\n\t\tthis.render();\n\t}\n\n\trender = () => {\n\t\tconst { startRow, startCol, endRow, endCol } = this.#range;\n\n\t\tconst containers = this.#sheet.querySelectorAll(\n\t\t\t'.ng-container-left, .ng-container-body, .ng-container-right'\n\t\t);\n\n\t\tcontainers.forEach(container => {\n\t\t\tcontainer.querySelectorAll('.selected, .selected-top, .selected-bottom, .selected-left, .selected-right, .selected-start').forEach(el => {\n\t\t\t\tel.classList.remove('selected', 'selected-top', 'selected-bottom', 'selected-left', 'selected-right', 'selected-start');\n\t\t\t});\n\n\t\t\tcontainer.querySelectorAll('tr.selected-start').forEach(tr => {\n\t\t\t\ttr.classList.remove('selected-start');\n\t\t\t});\n\t\t});\n\n\t\tif (startRow < 0 || startCol < 0) return;\n\n\t\tcontainers.forEach((container) => {\n\t\t\tconst visibleTrs = Array.from(container.querySelectorAll('tbody tr')).filter(tr => {\n\t\t\t\treturn tr.style.display !== 'none';\n\t\t\t});\n\n\t\t\tvisibleTrs.forEach(tr => {\n\t\t\t\tconst { matrixRow } = this.#getMatrixRow(tr);\n\t\t\t\tif (matrixRow < 0) return;\n\n\n\t\t\t\tif (matrixRow >= startRow && matrixRow <= endRow) {\n\t\t\t\t\tcontainer.querySelectorAll(`tbody tr[data-index=\"${tr.dataset.index}\"]`).forEach(tr => {\n\t\t\t\t\t\ttr.classList.add('selected');\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t//trace.log(this.#sheet.view);\n\n\n\t\t\t\ttr.querySelectorAll('td, th').forEach(cell => {\n\t\t\t\t\tconst col = parseInt(cell.dataset.col, 10);\n\t\t\t\t\tif (isNaN(col)) return;\n\n\t\t\t\t\tconst rowSpan = parseInt(cell.rowSpan || 1, 10);\n\t\t\t\t\tconst colSpan = parseInt(cell.colSpan || 1, 10);\n\n\t\t\t\t\tconst cellEndRow = matrixRow + rowSpan - 1;\n\t\t\t\t\tconst cellEndCol = col + colSpan - 1;\n\n\t\t\t\t\tconst isSelected = cellEndRow >= startRow && matrixRow <= endRow && cellEndCol >= startCol && col <= endCol;\n\t\t\t\t\tif (!isSelected) return;\n\n\t\t\t\t\tcell.classList.add('selected');\n\n\t\t\t\t\tif (matrixRow <= startRow) cell.classList.add('selected-top');\n\t\t\t\t\tif (cellEndRow >= endRow) cell.classList.add('selected-bottom');\n\t\t\t\t\tif (col <= startCol) cell.classList.add('selected-left');\n\t\t\t\t\tif (cellEndCol >= endCol) cell.classList.add('selected-right');\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\t#initEvents() {\n\t\tconst mainZone = this.#sheet.querySelector('.ng-sheet-body');\n\t\tif (!mainZone) {\n\t\t\treturn;\n\t\t}\n\n\t\tmainZone.addEventListener('mousedown', (e) => {\n\t\t\tif (e.button !== 0) return;\n\n\t\t\tconst cell = e.target.closest('td, th');\n\t\t\tif (!cell) return;\n\t\t\tif (cell.dataset.row === undefined || cell.dataset.col === undefined) return;\n\n\t\t\tthis.#sheet.style.userSelect = 'none';\n\t\t\tthis.#sheet.style.webkitUserSelect = 'none';\n\n\t\t\tconst tr = cell.closest('tr');\n\t\t\tconst { matrixRow: startRow } = this.#getMatrixRow(tr);\n\t\t\tconst startCol = parseInt(cell.dataset.col, 10);\n\n\t\t\tif (startRow < 0) {\n\t\t\t\tthis.#sheet.style.userSelect = '';\n\t\t\t\tthis.#sheet.style.webkitUserSelect = '';\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.setFocus(startRow, startCol);\n\t\t\tthis.setRange(startRow, startCol, startRow, startCol);\n\n\t\t\tlet lastMatrixRow = startRow;\n\t\t\tlet lastCol = startCol;\n\n\t\t\tconst onMouseMove = (moveEvent) => {\n\t\t\t\tconst targetEl = document.elementFromPoint(moveEvent.clientX, moveEvent.clientY);\n\t\t\t\tlet targetCell = targetEl?.closest('td, th');\n\n\t\t\t\tif (!targetCell || !this.#sheet.contains(targetCell)) {\n\t\t\t\t\tconst allCells = this.#sheet.querySelectorAll('.ng-sheet-body-content tbody tr td, .ng-sheet-body-content tbody tr:not(.nodata) th');\n\t\t\t\t\tfor (const c of allCells) {\n\t\t\t\t\t\tconst rect = c.getBoundingClientRect();\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tmoveEvent.clientX >= rect.left &&\n\t\t\t\t\t\t\tmoveEvent.clientX <= rect.right &&\n\t\t\t\t\t\t\tmoveEvent.clientY >= rect.top &&\n\t\t\t\t\t\t\tmoveEvent.clientY <= rect.bottom\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\ttargetCell = c;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!targetCell) return;\n\t\t\t\tif (targetCell.dataset.row === undefined || targetCell.dataset.col === undefined) return;\n\n\t\t\t\tconst targetTr = targetCell.closest('tr');\n\t\t\t\tconst { matrixRow: endRow } = this.#getMatrixRow(targetTr);\n\t\t\t\tconst endCol = parseInt(targetCell.dataset.col, 10);\n\n\t\t\t\tif (endRow < 0) return;\n\t\t\t\tif (lastMatrixRow === endRow && lastCol === endCol) return;\n\n\t\t\t\tlastMatrixRow = endRow;\n\t\t\t\tlastCol = endCol;\n\n\t\t\t\tthis.setRange(startRow, startCol, endRow, endCol);\n\t\t\t};\n\n\t\t\tconst onMouseUp = () => {\n\t\t\t\tthis.#sheet.style.userSelect = '';\n\t\t\t\tthis.#sheet.style.webkitUserSelect = '';\n\n\t\t\t\tdocument.removeEventListener('mousemove', onMouseMove);\n\t\t\t\tdocument.removeEventListener('mouseup', onMouseUp);\n\t\t\t};\n\n\t\t\tdocument.addEventListener('mousemove', onMouseMove);\n\t\t\tdocument.addEventListener('mouseup', onMouseUp);\n\t\t});\n\t}\n}","import { trace } from \"@nopeer\";\n\nexport class CellNavigation {\n\t#sheet;\n\t#host;\n\n\t#currentCell = null;\n\t#currentTr = null;\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = sheet.getRootNode().host;\n\n\t\tthis.#initEvents();\n\t}\n\n\tget currentCell() {\n\t\treturn this.#currentCell;\n\t}\n\n\tset currentCell(cell) {\n\t\tif (!cell) return;\n\n\t\tthis.#currentCell = cell;\n\t\tcell.focus({ preventScroll: true });\n\n\t\tthis.#currentTr = cell.closest(\"tr\");\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\n\t\tthis.#sheet.selection.setFocus(matrixRow, this.#currentCell.dataset.col);\n\t}\n\n\n\t#moveCellH = (e, cell) => {\n\n\t\tif (!cell) return;\n\n\t\tswitch (e.code) {\n\t\t\tcase \"Tab\":\n\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\tif (!this.#isCellLeftVisible(cell)) {\n\t\t\t\t\t\tcell.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (!this.#isCellRightVisible(cell)) {\n\t\t\t\t\t\tcell.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowRight\":\n\t\t\t\tif (!this.#isCellRightVisible(cell)) {\n\t\t\t\t\tcell.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowLeft\":\n\t\t\t\tif (!this.#isCellLeftVisible(cell)) {\n\t\t\t\t\tcell.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis.currentCell = cell;\n\t\tthis.#sheet.selection.setRange(this.#currentTr.dataset.matrixRow, cell.dataset.col, this.#currentTr.dataset.matrixRow, cell.dataset.col);\n\t};\n\n\t#moveCellV = (e, cell) => {\n\t\tif (cell) {\n\t\t\tlet isVisible = false;\n\t\t\tswitch (e.code) {\n\t\t\t\tcase \"Enter\":\n\t\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\t\tif (this.#isCellBelowVisible(cell)) {\n\t\t\t\t\t\t\tisVisible = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (this.#isCellBelowVisible(cell)) {\n\t\t\t\t\t\t\tisVisible = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"ArrowDown\":\n\t\t\t\t\tif (this.#isCellBelowVisible(cell)) {\n\t\t\t\t\t\tisVisible = true;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"ArrowUp\":\n\t\t\t\t\tif (this.#isCellAboveVisible(cell)) {\n\t\t\t\t\t\tisVisible = true;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (isVisible) {\n\t\t\t\tthis.currentCell = cell;\n\t\t\t\tthis.#sheet.selection.setRange(this.#currentTr.dataset.matrixRow, cell.dataset.col, this.#currentTr.dataset.matrixRow, cell.dataset.col);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tconst dataIndex = parseInt(this.#currentTr.dataset.index, 10);\n\t\tlet scrollTopIndex = -1;\n\t\tswitch (e.code) {\n\t\t\tcase \"Enter\":\n\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\tconst visibleRowCount = this.#getVisibleRowCount();\n\t\t\t\t\tscrollTopIndex = Math.max(dataIndex - visibleRowCount + 0, 0);\n\t\t\t\t} else {\n\t\t\t\t\tscrollTopIndex = Math.min(dataIndex, this.#sheet.view.count());\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tscrollTopIndex = Math.min(dataIndex, this.#sheet.view.count());\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowUp\":\n\t\t\t\tconst visibleRowCount = this.#getVisibleRowCount();\n\t\t\t\tscrollTopIndex = Math.max(dataIndex - visibleRowCount + 0, 0);\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (scrollTopIndex < 0) return;\n\n\t\tlet matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst rowSpan = parseInt(this.#currentCell.rowSpan, 10) || 1;\n\n\t\tswitch (e.code) {\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tmatrixRow += rowSpan;\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowUp\":\n\t\t\t\tmatrixRow --;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis.#sheet.rowManager.scrollToDataRow(scrollTopIndex, null, () => {\n\t\t\tconst currentCell = this.#findCell(matrixRow, col);\n\n\t\t\tif (currentCell) {\n\t\t\t\tthis.currentCell = currentCell;\n\t\t\t\tthis.#sheet.selection.setRange(this.#currentTr.dataset.matrixRow, currentCell.dataset.col, this.#currentTr.dataset.matrixRow, currentCell.dataset.col);\n\t\t\t}\n\t\t});\n\t}\n\n\tmoveCell = (e) => {\n\n\t\tif (e.target.tagName === \"INPUT\") {\n\t\t\tif ([\"text\"].includes(e.target.type)) {\n\t\t\t\tif ([\"ArrowLeft\",\"ArrowRight\",\"Home\",\"End\"].includes(e.code)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ([\"date\",\"datetime-local\",\"time\",\"week\",\"month\"].includes(e.target.type)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (!this.#currentCell || !this.#currentTr) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet nextCell;\n\t\tswitch (e.code) {\n\t\t\tcase \"Tab\":\n\t\t\t\tnextCell = e.shiftKey ? this.#getPreviousCell() : this.#getNextCell();\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowRight\":\n\t\t\t\tnextCell = this.#getNextCell();\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowLeft\":\n\t\t\t\tnextCell = this.#getPreviousCell();\n\t\t\t\tbreak;\n\t\t\tcase \"Enter\":\n\t\t\t\tnextCell = e.shiftKey ? this.#getUpCell() : this.#getDownCell();\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tnextCell = this.#getDownCell();\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowUp\":\n\t\t\t\tnextCell = this.#getUpCell();\n\t\t\t\tbreak;\n\t\t}\n\n\t\te.preventDefault();\n\n\t\tif ([\"ArrowLeft\",\"ArrowRight\",\"Tab\"].includes(e.code)) {\n\t\t\tthis.#moveCellH(e, nextCell);\n\t\t}\n\t\telse if ([\"Enter\",\"ArrowUp\",\"ArrowDown\"].includes(e.code)) {\n\t\t\tthis.#moveCellV(e, nextCell);\n\t\t}\n\t}\n\n\t#getNextCell = () => {\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst colSpan = parseInt(this.#currentCell.colSpan, 10) || 1;\n\t\tconst dataIndex = parseInt(this.#currentTr.dataset.index, 10);\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\n\t\tconst nextCol = col + colSpan;\n\n\t\tlet nextCell = this.#sheet.querySelector(`tbody tr[data-matrix-row=\"${matrixRow}\"] td[data-col=\"${nextCol}\"]`);\n\t\tif (!nextCell) {\n\t\t\tnextCell = this.#sheet.querySelector(`tbody tr[data-index=\"${dataIndex}\"] td[data-col=\"${nextCol}\"]`);\n\t\t}\n\n\t\treturn nextCell;\n\t}\n\n\t#getPreviousCell = () => {\n\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst dataIndex = parseInt(this.#currentTr.dataset.index, 10);\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\n\t\tlet nextCell;\n\t\tfor (let i = col - 1; i >= 0; i--) {\n\t\t\tnextCell = this.#sheet.querySelector(`tbody tr[data-matrix-row=\"${matrixRow}\"] td[data-col=\"${i}\"]`);\n\t\t\tif (!nextCell) {\n\t\t\t\tnextCell = this.#sheet.querySelector(`tbody tr[data-index=\"${dataIndex}\"] td[data-col=\"${i}\"]`);\n\t\t\t}\n\n\t\t\tif (nextCell) break;\n\t\t}\n\n\t\treturn nextCell;\n\t}\n\n\n\n\t#findCell = (matrixRow, col) => {\n\n\t\tconst $tr = this.#sheet.querySelector(`tbody tr[data-matrix-row=\"${matrixRow}\"]`);\n\t\tif (!$tr) return;\n\n\t\tconst dataIndex = parseInt($tr.dataset.index, 10);\n\n\t\tlet targetCell = this.#sheet.querySelector(`tbody tr[data-matrix-row=\"${matrixRow}\"] td[data-col=\"${col}\"]`);\n\t\tif (!targetCell) {\n\t\t\tthis.#sheet.querySelectorAll(`tbody tr[data-matrix-row=\"${matrixRow}\"] td`).forEach($cell => {\n\t\t\t\tconst cellCol = parseInt($cell.dataset.col, 10);\n\t\t\t\tconst colSpan = parseInt($cell.colSpan, 10) || 1;\n\n\t\t\t\tif (col >= cellCol && col < cellCol + colSpan) {\n\t\t\t\t\ttargetCell = $cell;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (!targetCell) {\n\t\t\t\ttargetCell = this.#sheet.querySelector(`tbody tr[data-index=\"${dataIndex}\"] td[data-col=\"${col}\"]`);\n\n\t\t\t\tif (!targetCell) {\n\t\t\t\t\tthis.#sheet.querySelectorAll(`tbody tr[data-index=\"${dataIndex}\"] td`).forEach($cell => {\n\t\t\t\t\t\tconst cellCol = parseInt($cell.dataset.col, 10);\n\t\t\t\t\t\tconst colSpan = parseInt($cell.colSpan, 10) || 1;\n\n\t\t\t\t\t\tif (col >= cellCol && col < cellCol + colSpan) {\n\t\t\t\t\t\t\ttargetCell = $cell;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn targetCell;\n\t}\n\n\t#getUpCell = () => {\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\n\t\treturn this.#findCell(matrixRow - 1, col);\n\t}\n\n\t#getDownCell = () => {\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\t\tconst rowSpan = parseInt(this.#currentCell.rowSpan, 10) || 1;\n\n\t\treturn this.#findCell(matrixRow + rowSpan, col);\n\t}\n\n\t// 1. ์์ชฝ ์๋ฆผ ์ฒดํฌ (๊ธฐ์ค: bodyViewport)\n\t#isCellAboveVisible = (cell) => {\n\t\tconst bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\t\tif (!bodyViewport || !cell) return true;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst viewportRect = bodyViewport.getBoundingClientRect();\n\t\tconst theadHeight = bodyViewport.querySelector('thead')?.offsetHeight || 0;\n\n\t\t// ์
์ ์๋จ์ด ํค๋ ์๋์ชฝ๋ณด๋ค ์์ ์์ผ๋ฉด ์๋ฆฐ(์ ๋ณด์ด๋) ์ํ\n\t\treturn cellRect.top >= (viewportRect.top + theadHeight);\n\t}\n\n\t// 2. ์๋์ชฝ ์๋ฆผ ์ฒดํฌ (๊ธฐ์ค: bodyViewport)\n\t#isCellBelowVisible = (cell) => {\n\t\tconst bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\t\tif (!bodyViewport || !cell) return true;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst viewportRect = bodyViewport.getBoundingClientRect();\n\n\t\t// ์
์ ํ๋จ์ด ๋ทฐํฌํธ ํ๋จ๋ณด๋ค ์๋์ ์์ผ๋ฉด ์๋ฆฐ ์ํ\n\t\treturn cellRect.bottom <= viewportRect.bottom;\n\t}\n\n\t// 3. ์ผ์ชฝ ์๋ฆผ ์ฒดํฌ (๊ธฐ์ค: bodyViewport2)\n\t#isCellLeftVisible = (cell) => {\n\t\tconst bodyViewport2 = this.#sheet.querySelector('.ng-container-body'); // ๋๋ ์ข์ฐ ์คํฌ๋กค์ ๋ด๋นํ๋ ๋ทฐํฌํธ\n\t\tif (!bodyViewport2 || !cell) return true;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst viewportRect = bodyViewport2.getBoundingClientRect();\n\n\t\t// ์
์ ์ข์ธก์ด ๋ทฐํฌํธ ์ข์ธก๋ณด๋ค ์ผ์ชฝ์ ์์ผ๋ฉด ์๋ฆฐ ์ํ\n\t\treturn cellRect.left >= viewportRect.left;\n\t}\n\n\t// 4. ์ค๋ฅธ์ชฝ ์๋ฆผ ์ฒดํฌ (๊ธฐ์ค: bodyViewport2)\n\t#isCellRightVisible = (cell) => {\n\t\tconst bodyViewport2 = this.#sheet.querySelector('.ng-container-body');\n\t\tif (!bodyViewport2 || !cell) return true;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst viewportRect = bodyViewport2.getBoundingClientRect();\n\n\t\t// ์
์ ์ฐ์ธก์ด ๋ทฐํฌํธ ์ฐ์ธก๋ณด๋ค ์ค๋ฅธ์ชฝ์ ์์ผ๋ฉด ์๋ฆฐ ์ํ\n\t\treturn cellRect.right <= viewportRect.right;\n\t}\n\n\t// ๐ก ํ์ํ๋ค๋ฉด ์ด 4๊ฐ๋ฅผ ์กฐํฉํด์ ์ ์ฒด ๊ฐ์์ฑ์ ํ๋จํ๋ ํตํฉ ํจ์๋ ์ฝ๊ฒ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.\n\t#isCellVisible = (cell) => {\n\t\treturn this.#isCellAboveVisible(cell) &&\n\t\t\tthis.#isCellBelowVisible(cell) &&\n\t\t\tthis.#isCellLeftVisible(cell) &&\n\t\t\tthis.#isCellRightVisible(cell);\n\t}\n\n\t#getVisibleRowCount = () => {\n\t\tconst bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\t\tconst viewportHeight = bodyViewport.clientHeight - (bodyViewport.querySelector('thead')?.offsetHeight || 0);\n\t\tconst rowHeight = this.#sheet.rowManager.getRowHeight();\n\n\t\t// ๋ทฐํฌํธ ๋์ด์ ๋ค์ด์ค๋ ํ ๊ฐ์ ๊ณ์ฐ (์์์ ๋ฒ๋ฆผ)\n\t\treturn Math.max(1, Math.floor(viewportHeight / rowHeight));\n\t}\n\n\t#initEvents() {\n\t\tthis.#sheet.addEventListener('mousedown', (e) => {\n\t\t\tif (e.button !== 0) return;\n\t\t\tconst cell = e.target.closest('td, th');\n\t\t\tif (!cell) return;\n\t\t\tif (cell.dataset.index === undefined || cell.dataset.col === undefined) return;\n\n\t\t\tif (cell.querySelector(\"cell-row-indicator\")) {\n\t\t\t\tthis.#sheet.row.focus(cell.dataset.index);\n\t\t\t} else {\n\t\t\t\tthis.currentCell = cell;\n\t\t\t}\n\t\t});\n\n\t\tthis.#sheet.addEventListener('keydown', (e) => {\n\t\t\tif ([\"Enter\", \"Tab\", \"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"].includes(e.code)) {\n\t\t\t\tthis.moveCell(e);\n\t\t\t}\n\t\t});\n\t}\n}","// ui/col/ColResizer.js\nimport { trace } from \"@nopeer\";\nimport { COLLAPSED_WIDTH } from \"@/layout/core/TableCompiler.js\";\n\nconst RESIZE_OFFSET = 2; // ๐ฏ ๋ฆฌ์ฌ์ด์ฆ ๊ฐ์ง ์์ญ ์คํ์
์ ์๋จ์ผ๋ก ์ถ์ถ\n\nexport class ColResizer {\n #sheet;\n #host;\n #panel;\n #tooltip;\n\n #targetColIndex = null;\n #nextColIndex = null;\n #targetContainerType = null;\n #targetCell = null;\n #startX = 0;\n #startColWidth = 0;\n #nextColStartWidth = 0;\n #startCellWidth = 0;\n #startLeft = 0;\n\n constructor(sheet) {\n this.#sheet = sheet;\n this.#host = sheet.getRootNode().host;\n this.#panel = this.#sheet.querySelector('nine-table-col-resizer-panel');\n\n this.#tooltip = this.#panel.querySelector('.resizer-overlay');\n this.bindEvents();\n }\n\n destroy() {\n this.#sheet.removeEventListener('pointermove', this.#onPointerMove);\n this.#sheet.removeEventListener('pointerdown', this.#onPointerDown);\n this.#sheet.removeEventListener('dblclick', this.#onDblClick);\n }\n\n refreshLayout(containerType = 'body') {\n const containers = Array.from(this.#sheet.querySelectorAll(`.ng-container-${containerType}`));\n if (containers.length === 0) return;\n\n const isFixedContainer = containerType === 'left' || containerType === 'right';\n const isAutoFit = !isFixedContainer && (\n this.#sheet.isAutoFitCol ||\n containers[0].querySelector('table')?.getAttribute('auto-fit-col') === 'true'\n );\n\n if (!isAutoFit) {\n\n const firstColgroup = containers[0].querySelector('table colgroup');\n if (!firstColgroup) return;\n\n let totalWidth = 0;\n const colWidths = {};\n\n Array.from(firstColgroup.querySelectorAll('col')).forEach(col => {\n const colIdx = col.getAttribute('data-col');\n const w = parseInt(col.getAttribute('width'), 10);\n if (!isNaN(w)) {\n colWidths[colIdx] = w;\n totalWidth += w;\n }\n });\n\n containers.forEach(container => {\n const tables = container.querySelectorAll('table');\n\n if (containerType === 'body') {\n tables.forEach(tbl => {\n tbl.style.width = `${totalWidth}px`;\n //tbl.style.minWidth = `${totalWidth}px`;\n });\n } else {\n container.style.flex = `0 0 ${totalWidth}px`;\n container.style.width = `${totalWidth}px`;\n container.style.minWidth = `${totalWidth}px`;\n container.style.maxWidth = `${totalWidth}px`;\n\n tables.forEach(tbl => {\n tbl.style.width = `${totalWidth}px`;\n tbl.style.minWidth = `${totalWidth}px`;\n tbl.style.maxWidth = `${totalWidth}px`;\n\n Object.entries(colWidths).forEach(([colIdx, w]) => {\n tbl.querySelectorAll(`th[data-col=\"${colIdx}\"], td[data-col=\"${colIdx}\"]`).forEach(cell => {\n cell.style.width = `${w}px`;\n cell.style.minWidth = `${w}px`;\n cell.style.maxWidth = `${w}px`;\n });\n });\n });\n }\n });\n } else {\n containers.forEach(container => {\n const tables = container.querySelectorAll('table');\n tables.forEach(tbl => {\n //tbl.style.width = '100%';\n //tbl.style.minWidth = '100%';\n //tbl.style.maxWidth = '';\n });\n });\n }\n\n this.#sheet.querySelector('nine-table-hscrollbar')?.refresh();\n }\n\n setColumnWidth(globalColIndex, width, containerType = null) {\n\n let targetCols = [];\n\n targetCols = Array.from(this.#sheet.querySelectorAll(`table colgroup col[data-col=\"${globalColIndex}\"]`));\n\n if (targetCols.length === 0) return;\n\n const firstContainer = targetCols[0].closest('.ng-container-left, .ng-container-body, .ng-container-right');\n const resolvedContainerType = containerType || (\n firstContainer?.classList.contains('ng-container-left') ? 'left' :\n firstContainer?.classList.contains('ng-container-right') ? 'right' : 'body'\n );\n\n targetCols.forEach(col => {\n col.setAttribute('width', width);\n col.style.width = `${width}px`;\n });\n\n const sourceCol = this.#sheet.sourceTable?.querySelector(`colgroup col[data-col=\"${globalColIndex}\"]`);\n if (sourceCol) {\n sourceCol.setAttribute('width', width);\n sourceCol.style.width = `${width}px`;\n }\n\n this.refreshLayout(resolvedContainerType);\n\n if (resolvedContainerType === 'left' || resolvedContainerType === 'right') {\n this.refreshLayout('body');\n }\n\n this.#sheet.rowManager?.refresh();\n }\n\n #checkIsAutoFit(targetCell) {\n if (this.#sheet.isAutoFitCol) return true;\n const table = targetCell?.closest('table');\n if (table && table.getAttribute('auto-fit-col') === 'true') return true;\n return false;\n }\n\n bindEvents() {\n this.#sheet.addEventListener('pointermove', this.#onPointerMove);\n //this.#sheet.addEventListener('pointerdown', this.#onPointerDown);\n //this.#sheet.addEventListener('dblclick', this.#onDblClick);\n\n this.#sheet.addDebounseEventListener('dblclick', this.#onDblClick, 'pointerdown', this.#onPointerDown);\n }\n\n #getContainerType(cell) {\n const container = cell.closest('.ng-container-left, .ng-container-body, .ng-container-right');\n if (!container) return null;\n if (container.classList.contains('ng-container-left')) return 'left';\n if (container.classList.contains('ng-container-right')) return 'right';\n return 'body';\n }\n\n #onPointerMove = (e) => {\n\n\n const headerPart = e.target.closest('thead');\n if (!headerPart) return;\n\n const cell = e.target.closest('th, td');\n\n headerPart.querySelectorAll('.resizable-edge').forEach(el => {\n if (el !== cell) el.classList.remove('resizable-edge');\n });\n\n if (!cell || cell.dataset.col === undefined) return;\n if (cell.getAttribute('collapsed') === 'true') return;\n\n const rect = cell.getBoundingClientRect();\n const offsetX = e.clientX - rect.left;\n const isLeftEdge = offsetX <= RESIZE_OFFSET;\n const isRightEdge = (rect.width - offsetX) <= RESIZE_OFFSET;\n\n if (isLeftEdge) {\n const prevCell = cell.previousElementSibling;\n if (!prevCell || prevCell.getAttribute('collapsed') === 'true') {\n cell.classList.remove('resizable-edge');\n return;\n }\n }\n\n if (isLeftEdge || isRightEdge) {\n cell.classList.add('resizable-edge');\n } else {\n cell.classList.remove('resizable-edge');\n }\n };\n\n #onPointerDown = (e) => {\n\n const headerPart = e.actualTarget.closest('thead');\n if (!headerPart) return;\n\n const cell = e.actualTarget.closest('th, td');\n\n if (!cell || !cell.classList.contains('resizable-edge')) return;\n\n\n\n e.preventDefault();\n const rect = cell.getBoundingClientRect();\n const offsetX = e.clientX - rect.left;\n\n let targetCell = cell;\n\n if (offsetX <= RESIZE_OFFSET) {\n const prevCell = cell.previousElementSibling;\n if (prevCell && prevCell.dataset.col !== undefined && prevCell.getAttribute('collapsed') !== 'true') {\n targetCell = prevCell;\n } else if (!cell.previousElementSibling) {\n return;\n }\n }\n\n this.#targetCell = targetCell;\n this.#targetContainerType = this.#getContainerType(targetCell);\n\n const container = this.#sheet.querySelector(`.ng-container-${this.#targetContainerType}`);\n if (!container) return;\n\n const baseColIndex = parseInt(targetCell.dataset.col, 10);\n const colSpan = targetCell.colSpan || 1;\n this.#targetColIndex = baseColIndex + colSpan - 1;\n\n const isAutoFit = this.#checkIsAutoFit(targetCell);\n if (isAutoFit) {\n this.#nextColIndex = this.#targetColIndex + 1;\n const nextColEl = container.querySelector(`col[data-col=\"${this.#nextColIndex}\"]`);\n if (nextColEl) {\n this.#nextColStartWidth = parseInt(nextColEl.getAttribute('width'), 10) || 100;\n } else {\n this.#nextColIndex = null;\n }\n } else {\n this.#nextColIndex = null;\n }\n\n const targetRect = targetCell.getBoundingClientRect();\n const sheetRect = this.#sheet.getBoundingClientRect();\n\n this.#startCellWidth = targetRect.width;\n this.#startLeft = targetRect.left - sheetRect.left;\n\n const targetColEl = container.querySelector(`col[data-col=\"${this.#targetColIndex}\"]`);\n const attrW = targetColEl?.getAttribute('width');\n this.#startColWidth = (attrW && !isNaN(parseInt(attrW, 10))) ? parseInt(attrW, 10) : targetRect.width / colSpan;\n\n this.#startX = e.clientX;\n\n if (this.#panel) {\n this.#panel.classList.add('active');\n this.#updatePositions(e.clientX);\n }\n\n window.addEventListener('pointermove', this.#onDragMove);\n window.addEventListener('pointerup', this.#onDragEnd, { once: true });\n };\n\n #updatePositions(clientX) {\n let diff = clientX - this.#startX;\n const isAutoFit = this.#checkIsAutoFit(this.#targetCell);\n\n if (isAutoFit && this.#nextColIndex !== null) {\n const maxDiff = this.#nextColStartWidth - COLLAPSED_WIDTH;\n const minDiff = -(this.#startColWidth - COLLAPSED_WIDTH);\n diff = Math.max(minDiff, Math.min(diff, maxDiff));\n }\n\n const currentColWidth = Math.max(COLLAPSED_WIDTH, this.#startColWidth + diff);\n\n const targetRect = this.#targetCell.getBoundingClientRect();\n let realCellWidth = clientX - targetRect.left;\n\n if (isAutoFit && this.#nextColIndex !== null) {\n const maxCellWidth = this.#startCellWidth + (this.#nextColStartWidth - COLLAPSED_WIDTH);\n realCellWidth = Math.min(realCellWidth, maxCellWidth);\n }\n\n const currentCellWidth = Math.max(COLLAPSED_WIDTH, realCellWidth);\n\n if (this.#panel) {\n this.#panel.style.setProperty('--col-resizer-tooltip-left', `${this.#startLeft}px`);\n this.#panel.style.setProperty('--col-resizer-tooltip-width', `${currentCellWidth}px`);\n }\n\n const sizeBadge = this.#tooltip?.querySelector('.size-badge');\n if (sizeBadge) {\n sizeBadge.textContent = `${Math.round(currentColWidth)}px`;\n }\n }\n\n #onDragMove = (e) => {\n this.#updatePositions(e.clientX);\n };\n\n #onDragEnd = (e) => {\n window.removeEventListener('pointermove', this.#onDragMove);\n\n const diff = e.clientX - this.#startX;\n const isAutoFit = this.#checkIsAutoFit(this.#targetCell);\n let finalWidth = 0;\n\n if (isAutoFit && this.#nextColIndex !== null) {\n let newColWidth = Math.max(COLLAPSED_WIDTH, this.#startColWidth + diff);\n let newNextWidth = this.#startColWidth + this.#nextColStartWidth - newColWidth;\n\n if (newNextWidth < COLLAPSED_WIDTH) {\n newNextWidth = COLLAPSED_WIDTH;\n newColWidth = this.#startColWidth + this.#nextColStartWidth - COLLAPSED_WIDTH;\n }\n\n this.setColumnWidth(this.#targetColIndex, newColWidth, this.#targetContainerType);\n this.setColumnWidth(this.#nextColIndex, newNextWidth, this.#targetContainerType);\n finalWidth = newColWidth;\n } else {\n const newColWidth = Math.max(COLLAPSED_WIDTH, this.#startColWidth + diff);\n if (this.#targetColIndex !== null && this.#targetContainerType) {\n this.setColumnWidth(this.#targetColIndex, newColWidth, this.#targetContainerType);\n finalWidth = newColWidth;\n }\n }\n\n if (this.#targetCell) {\n const targetCell = this.#targetCell;\n if (targetCell.getAttribute('collapsed') !== 'true' && finalWidth > 20) {\n targetCell.dataset.expandWidth = String(finalWidth);\n }\n }\n\n if (this.#panel) {\n this.#tooltip?.classList.add('fade-out');\n setTimeout(() => {\n this.#panel.classList.remove('active');\n this.#tooltip?.classList.remove('fade-out');\n }, 150);\n }\n\n this.#targetColIndex = null;\n this.#nextColIndex = null;\n this.#targetContainerType = null;\n this.#targetCell = null;\n };\n\n #onDblClick = (e) => {\n\n const targetEl = e.target;\n let cell = targetEl.closest('th, td');\n if (!cell || !cell.classList.contains('resizable-edge')) return;\n\n const rect = cell.getBoundingClientRect();\n const offsetX = e.clientX - rect.left;\n\n if (offsetX <= RESIZE_OFFSET) {\n cell = cell.previousElementSibling;\n }\n\n const baseColIndex = parseInt(cell.dataset.col, 10);\n const tbodyCell = this.#sheet.querySelector(`tbody.body [data-col=\"${baseColIndex}\"]`);\n if (!tbodyCell || !tbodyCell.dataset.bind || tbodyCell.classList.contains(\"CELL-RADIO\")) return;\n\n let extraPadding = 0;\n Array.from(tbodyCell.firstElementChild.children).forEach(($el) => {\n switch ($el.tagName) {\n case 'SPAN': extraPadding += 8; break;\n case 'DIV': extraPadding += 8; break;\n case 'BUTTON': extraPadding += 32; break;\n case 'SELECT': extraPadding += 32; break;\n case 'INPUT':\n switch (($el.type || 'text').toLowerCase()) {\n // 1. ์ฒดํฌ๋ฐ์ค / ๋ผ๋์ค (๋น๊ต์ ์ข์ ์์ญ)\n case 'checkbox':\n case 'radio':\n extraPadding += 12;\n break;\n\n // 2. ๋ฒํผ ๊ณ์ด input\n case 'button':\n case 'submit':\n case 'reset':\n case 'image':\n extraPadding += 16;\n break;\n\n // 3. ํน์ ์์ ฏ (์ปฌ๋ฌ, ํ์ผ, ์ฌ๋ผ์ด๋)\n case 'color':\n case 'file':\n case 'range':\n extraPadding += 24;\n break;\n\n // 4. ํ๋ฉด์ ์ ๋ณด์ด๋ hidden ํ๋\n case 'hidden':\n extraPadding += 0;\n break;\n\n // 5. ํ
์คํธ ๋ฐ ์ซ์, ๋ ์ง ๋ฑ ์ผ๋ฐ ์
๋ ฅ ํ๋ (๊ธฐ๋ณธ๊ฐ)\n case 'text':\n case 'search':\n case 'tel':\n case 'url':\n case 'email':\n case 'password':\n case 'number':\n case 'date':\n case 'time':\n case 'datetime-local':\n case 'month':\n case 'week':\n default:\n extraPadding += 16;\n break;\n }\n break;\n }\n });\n\n const fieldIdx = this.#host.fields.get().indexOf(tbodyCell.dataset.bind);\n\n const computedStyle = window.getComputedStyle(tbodyCell);\n const font = computedStyle.font || '12px sans-serif';\n\n const headerText = cell.innerText || \"\";\n const headerSize = nine.measureTextSize(headerText, font);\n let maxTextWidth = (headerSize.width || 0) + 16;\n\n this.#host.execute(() => {\n\n this.#sheet.view.getArray().forEach((record, idx) => {\n const val = String(tbodyCell.dataset.expr ? this.#host.exprEngine.evaluate(tbodyCell.dataset.expr, record, idx) : record.v[fieldIdx] ?? \"\").trim();\n const size = nine.measureTextSize(val, font);\n if (size.width && size.width > maxTextWidth) {\n maxTextWidth = size.width;\n }\n });\n\n const calculatedWidth = Math.max(32, Math.min(400, Math.ceil(maxTextWidth) + extraPadding));\n\n this.setColumnWidth(tbodyCell.dataset.col, calculatedWidth, this.#getContainerType(cell));\n })\n };\n}\n\n\nexport class ColResizerPanel extends HTMLElement {\n #target;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n\n this.#renderer();\n }\n\n #renderer = () => {\n this.innerHTML = `\n <div class=\"resizer-overlay\">\n <span class=\"size-badge\">0px</span>\n </div>\n `;\n };\n}\n\nif (!customElements.get('nine-table-col-resizer-panel')) {\n customElements.define(\"nine-table-col-resizer-panel\", ColResizerPanel);\n}\n","// ui/col/ColMover.js\nimport { trace } from \"@nopeer\";\n\nexport class ColMover {\n #sheet;\n #grip;\n #indi;\n\n #isDragging = false;\n #sourceCell = null;\n #sourceColIndex = null;\n #targetColIndex = null;\n #shiftX = 0;\n #timer = null;\n\n constructor(sheet) {\n this.#sheet = sheet;\n this.#grip = this.#sheet.querySelector('.ng-col-mover-grip');\n this.#indi = this.#sheet.querySelector('.ng-col-mover-indi');\n this.bindEvents();\n }\n\n bindEvents() {\n this.#sheet.addEventListener('pointerdown', this.#onPointerDown);\n }\n\n #checkIsMovable() {\n const host = this.#sheet.getRootNode()?.host;\n return this.#sheet.getAttribute('col-movable') === 'true' || host?.getAttribute('col-movable') === 'true';\n }\n\n #getDeepElementFromPoint(x, y) {\n const root = this.#sheet.getRootNode();\n let el = root.elementFromPoint ? root.elementFromPoint(x, y) : document.elementFromPoint(x, y);\n\n while (el && el.shadowRoot && el.shadowRoot.elementFromPoint) {\n const nested = el.shadowRoot.elementFromPoint(x, y);\n if (!nested || nested === el) break;\n el = nested;\n }\n\n return el;\n }\n\n #getColGroupRange(cell) {\n if (!cell || cell.dataset.col === undefined) return null;\n\n const startCol = parseInt(cell.dataset.col, 10);\n const colSpan = cell.colSpan || 1;\n const endCol = startCol + colSpan - 1;\n const rowIndex = cell.closest('tr')?.sectionRowIndex ?? 0;\n\n const table = cell.closest('table');\n if (!table) return { startCol, colSpan, endCol, rowIndex, isGroup: false, parentGroupRange: null, isValidGroup: true };\n\n const headerCells = table.querySelectorAll('thead th, thead td');\n let hasStrictChildren = false;\n let isValidGroup = true;\n let parentGroupRange = null;\n\n for (const subCell of headerCells) {\n if (subCell === cell || subCell.dataset.col === undefined) continue;\n\n const subStart = parseInt(subCell.dataset.col, 10);\n const subSpan = subCell.colSpan || 1;\n const subEnd = subStart + subSpan - 1;\n const subRowIndex = subCell.closest('tr')?.sectionRowIndex ?? 0;\n\n if (subRowIndex < rowIndex && subStart <= startCol && subEnd >= endCol && subSpan > colSpan) {\n if (!parentGroupRange) {\n parentGroupRange = { startCol: subStart, endCol: subEnd };\n } else {\n parentGroupRange.startCol = Math.max(parentGroupRange.startCol, subStart);\n parentGroupRange.endCol = Math.min(parentGroupRange.endCol, subEnd);\n }\n }\n\n const isOverlap = !(subEnd < startCol || subStart > endCol);\n if (isOverlap) {\n const isFullyContained = (subStart >= startCol && subEnd <= endCol);\n\n if (isFullyContained) {\n if (subSpan < colSpan) {\n hasStrictChildren = true;\n }\n } else if (subStart < startCol || subEnd > endCol) {\n if (!(subStart <= startCol && subEnd >= endCol)) {\n isValidGroup = false;\n }\n }\n }\n }\n\n const isRealGroup = hasStrictChildren && isValidGroup;\n\n return {\n startCol,\n colSpan: isRealGroup ? colSpan : 1,\n endCol: isRealGroup ? endCol : startCol,\n rowIndex,\n isGroup: isRealGroup,\n parentGroupRange,\n isValidGroup\n };\n }\n\n #createGroupHeaderPreview(cell) {\n const groupRange = this.#getColGroupRange(cell);\n if (!groupRange) return null;\n\n const { startCol, endCol, isGroup } = groupRange;\n\n // ํต์ฌ: ํ
์ด๋ธ์ด ์ฌ๋ฌ ๊ฐ์ธ ๊ตฌ์กฐ์ด๋ฏ๋ก cell์ด ์ํ ๋ฐ๋ก ๊ทธ ํ
์ด๋ธ์ ์ง์ ๊ฐ์ ธ์ต๋๋ค.\n const origTable = cell.closest('table');\n if (!origTable) return null;\n\n let minLeft = Infinity, maxRight = -Infinity, minTop = Infinity, maxBottom = -Infinity;\n const targetCells = [];\n\n origTable.querySelectorAll('thead th, thead td').forEach(c => {\n if (c.dataset.col === undefined) return;\n const cCol = parseInt(c.dataset.col, 10);\n const cSpan = c.colSpan || 1;\n const cEnd = cCol + cSpan - 1;\n\n const isTarget = isGroup\n ? (cCol >= startCol && cEnd <= endCol)\n : (c === cell);\n\n if (isTarget) {\n const rect = c.getBoundingClientRect();\n minLeft = Math.min(minLeft, rect.left);\n maxRight = Math.max(maxRight, rect.right);\n minTop = Math.min(minTop, rect.top);\n maxBottom = Math.max(maxBottom, rect.bottom);\n\n const computedStyle = window.getComputedStyle(c);\n targetCells.push({ el: c, rect, style: computedStyle });\n }\n });\n\n if (targetCells.length === 0) return null;\n\n const groupWidth = maxRight - minLeft;\n const groupHeight = maxBottom - minTop;\n\n const headerContent = document.createElement('div');\n headerContent.className = 'grip-header-content';\n headerContent.style.position = 'relative';\n headerContent.style.width = `${groupWidth}px`;\n headerContent.style.height = `${groupHeight}px`;\n\n targetCells.forEach(({ el, rect, style }) => {\n const clonedCell = el.cloneNode(true);\n\n clonedCell.style.position = 'absolute';\n clonedCell.style.left = `${rect.left - minLeft}px`;\n clonedCell.style.top = `${rect.top - minTop}px`;\n\n clonedCell.style.width = `${rect.width}px`;\n clonedCell.style.minWidth = `${rect.width}px`;\n clonedCell.style.maxWidth = 'none';\n\n clonedCell.style.height = `${rect.height}px`;\n clonedCell.style.boxSizing = 'border-box';\n clonedCell.style.margin = '0';\n\n clonedCell.style.backgroundColor = style.backgroundColor !== 'transparent' && style.backgroundColor !== 'rgba(0, 0, 0, 0)'\n ? style.backgroundColor\n : '#f9fafb';\n clonedCell.style.color = style.color;\n clonedCell.style.font = style.font;\n clonedCell.style.fontWeight = style.fontWeight;\n clonedCell.style.fontSize = style.fontSize;\n clonedCell.style.textAlign = style.textAlign;\n clonedCell.style.padding = style.padding;\n clonedCell.style.border = style.border;\n clonedCell.style.borderRight = style.borderRight;\n clonedCell.style.borderBottom = style.borderBottom;\n clonedCell.style.display = 'flex';\n clonedCell.style.alignItems = 'center';\n clonedCell.style.justifyContent = style.textAlign === 'center' ? 'center' : (style.textAlign === 'right' ? 'flex-end' : 'flex-start');\n\n headerContent.appendChild(clonedCell);\n });\n\n return {\n element: headerContent,\n bounds: {\n left: minLeft,\n right: maxRight,\n top: minTop,\n bottom: maxBottom,\n width: groupWidth,\n height: groupHeight\n }\n };\n }\n\n #onPointerDown = (e) => {\n if (!this.#checkIsMovable()) return;\n\n const headerPart = e.target.closest('.ng-sheet-header');\n if (!headerPart) return;\n\n const cell = e.target.closest('th, td');\n if (!cell || cell.classList.contains('resizable-edge') || ['INPUT', 'BUTTON'].includes(e.target.tagName)) return;\n if (cell.dataset.col === undefined) return;\n\n e.preventDefault();\n\n const startX = e.clientX;\n const startY = e.clientY;\n\n const cancelTimer = () => {\n if (this.#timer) {\n clearTimeout(this.#timer);\n this.#timer = null;\n }\n window.removeEventListener('pointermove', onPointerMovePending);\n window.removeEventListener('pointerup', cancelTimer);\n window.removeEventListener('pointercancel', cancelTimer);\n };\n\n const onPointerMovePending = (moveEvent) => {\n const dist = Math.hypot(moveEvent.clientX - startX, moveEvent.clientY - startY);\n if (dist > 5) {\n cancelTimer();\n }\n };\n\n this.#timer = setTimeout(() => {\n cancelTimer();\n this.#startDrag(e, cell);\n }, 500);\n\n window.addEventListener('pointermove', onPointerMovePending);\n window.addEventListener('pointerup', cancelTimer, { once: true });\n window.addEventListener('pointercancel', cancelTimer, { once: true });\n };\n\n #startDrag(e, cell) {\n if (this.#isDragging) return;\n\n const preview = this.#createGroupHeaderPreview(cell);\n if (!preview) return;\n\n this.#isDragging = true;\n this.#sourceCell = cell;\n this.#sourceColIndex = parseInt(cell.dataset.col, 10);\n\n const sheetRect = this.#sheet.getBoundingClientRect();\n const { bounds, element } = preview;\n\n this.#shiftX = e.clientX - bounds.left;\n\n if (this.#grip) {\n this.#grip.replaceChildren(element);\n\n const relativeTop = bounds.top - sheetRect.top;\n const fullHeight = sheetRect.height - relativeTop;\n\n this.#grip.style.width = `${bounds.width}px`;\n this.#grip.style.height = `${fullHeight}px`;\n this.#grip.style.top = `${relativeTop}px`;\n this.#grip.style.display = 'block';\n\n this.#updateGripPosition(e.clientX);\n }\n\n document.body.style.cursor = 'move';\n\n window.addEventListener('pointermove', this.#onPointerMove);\n window.addEventListener('pointerup', this.#onPointerUp, { once: true });\n }\n\n #onPointerMove = (e) => {\n if (!this.#isDragging) return;\n\n this.#updateGripPosition(e.clientX);\n\n if (this.#grip) this.#grip.style.pointerEvents = 'none';\n if (this.#indi) this.#indi.style.pointerEvents = 'none';\n\n const targetElement = this.#getDeepElementFromPoint(e.clientX, e.clientY);\n const targetCell = targetElement?.closest('.ng-sheet-header th, .ng-sheet-header td');\n\n if (targetCell && targetCell.dataset.col !== undefined) {\n const targetColIndex = parseInt(targetCell.dataset.col, 10);\n const sheetRect = this.#sheet.getBoundingClientRect();\n const table = targetCell.closest('table');\n\n let colMinLeft = Infinity;\n let colMaxRight = -Infinity;\n\n if (table) {\n table.querySelectorAll('thead th, thead td').forEach(c => {\n if (c.dataset.col === undefined) return;\n const cCol = parseInt(c.dataset.col, 10);\n const cSpan = c.colSpan || 1;\n const cEnd = cCol + cSpan - 1;\n\n if (cCol <= targetColIndex && cEnd >= targetColIndex) {\n const cRect = c.getBoundingClientRect();\n colMinLeft = Math.min(colMinLeft, cRect.left);\n colMaxRight = Math.max(colMaxRight, cRect.right);\n }\n });\n }\n\n if (colMinLeft === Infinity) {\n const rect = targetCell.getBoundingClientRect();\n colMinLeft = rect.left;\n colMaxRight = rect.right;\n }\n\n const midX = colMinLeft + ((colMaxRight - colMinLeft) / 2);\n let calculatedTargetCol = 0;\n let indicatorLeft = 0;\n\n if (e.clientX < midX) {\n calculatedTargetCol = targetColIndex;\n indicatorLeft = colMinLeft - sheetRect.left;\n } else {\n const colSpan = targetCell.colSpan || 1;\n calculatedTargetCol = targetColIndex + colSpan;\n indicatorLeft = colMaxRight - sheetRect.left;\n }\n\n const sourceGroup = this.#getColGroupRange(this.#sourceCell);\n const movingSpan = sourceGroup.colSpan;\n\n const sourceRowStart = sourceGroup.rowIndex;\n const sourceRowSpan = this.#sourceCell.rowSpan || 1;\n const sourceRowEnd = sourceRowStart + sourceRowSpan - 1;\n\n const targetRowStart = targetCell.closest('tr')?.sectionRowIndex ?? 0;\n const targetRowSpan = targetCell.rowSpan || 1;\n const targetRowEnd = targetRowStart + targetRowSpan - 1;\n\n const isRowSpanCompatible = !(sourceRowEnd < targetRowStart || sourceRowStart > targetRowEnd);\n\n let isOutOfBoundsOfParent = false;\n if (sourceGroup.parentGroupRange) {\n const { startCol: pStart, endCol: pEnd } = sourceGroup.parentGroupRange;\n if (calculatedTargetCol < pStart || (calculatedTargetCol + movingSpan - 1) > pEnd) {\n isOutOfBoundsOfParent = true;\n }\n }\n\n let isDroppingInsideOtherGroup = false;\n if (table) {\n const spannedCells = table.querySelectorAll('thead th[colspan], thead td[colspan]');\n\n for (const sCell of spannedCells) {\n if (sCell === this.#sourceCell) continue;\n\n const sRowStart = sCell.closest('tr')?.sectionRowIndex ?? 0;\n const sRowSpan = sCell.rowSpan || 1;\n const sRowEnd = sRowStart + sRowSpan - 1;\n\n const isVerticalOverlap = !(sourceRowEnd < sRowStart || sourceRowStart > sRowEnd);\n if (!isVerticalOverlap) continue;\n\n const sStart = parseInt(sCell.dataset.col, 10);\n const sSpan = sCell.colSpan || 1;\n const sEnd = sStart + sSpan - 1;\n\n if (calculatedTargetCol > sStart && calculatedTargetCol < sEnd + 1) {\n isDroppingInsideOtherGroup = true;\n break;\n }\n\n const moveEndCol = calculatedTargetCol + movingSpan - 1;\n const isCrossIntersecting = (\n (calculatedTargetCol > sStart && calculatedTargetCol <= sEnd && moveEndCol > sEnd) ||\n (calculatedTargetCol < sStart && moveEndCol >= sStart && moveEndCol < sEnd)\n );\n\n if (isCrossIntersecting) {\n isDroppingInsideOtherGroup = true;\n break;\n }\n }\n }\n\n const isSelfGroup = (\n calculatedTargetCol >= sourceGroup.startCol &&\n calculatedTargetCol <= sourceGroup.endCol + 1\n );\n\n const isInvalidMove = !isRowSpanCompatible || isSelfGroup || isOutOfBoundsOfParent || isDroppingInsideOtherGroup || !sourceGroup.isValidGroup;\n\n if (isInvalidMove) {\n this.#targetColIndex = null;\n if (this.#indi) this.#indi.style.display = 'none';\n if (this.#grip) this.#grip.classList.add('invalid');\n } else {\n this.#targetColIndex = calculatedTargetCol;\n if (this.#grip) this.#grip.classList.remove('invalid');\n\n if (this.#indi) {\n const headerPart = targetCell.closest('.ng-sheet-header');\n const headerRect = headerPart.getBoundingClientRect();\n const relativeTop = headerRect.top - sheetRect.top;\n const fullHeight = sheetRect.height - relativeTop;\n\n this.#indi.style.top = `${relativeTop}px`;\n this.#indi.style.height = `${fullHeight}px`;\n this.#indi.style.left = `${indicatorLeft - 1}px`;\n this.#indi.style.display = 'block';\n }\n }\n } else {\n if (this.#indi) this.#indi.style.display = 'none';\n if (this.#grip) this.#grip.classList.add('invalid');\n this.#targetColIndex = null;\n }\n };\n\n #updateGripPosition(clientX) {\n if (!this.#grip) return;\n const sheetRect = this.#sheet.getBoundingClientRect();\n const left = clientX - sheetRect.left - this.#shiftX;\n this.#grip.style.left = `${left}px`;\n }\n\n #onPointerUp = (e) => {\n if (!this.#isDragging) return;\n\n window.removeEventListener('pointermove', this.#onPointerMove);\n document.body.style.cursor = '';\n\n if (this.#grip) {\n this.#grip.style.display = 'none';\n this.#grip.replaceChildren();\n }\n if (this.#indi) this.#indi.style.display = 'none';\n\n if (\n this.#targetColIndex !== null &&\n this.#sourceColIndex !== null &&\n this.#targetColIndex !== this.#sourceColIndex &&\n this.#targetColIndex !== this.#sourceColIndex + 1\n ) {\n this.moveColumn(this.#sourceColIndex, this.#targetColIndex);\n }\n\n this.#isDragging = false;\n this.#sourceCell = null;\n this.#sourceColIndex = null;\n this.#targetColIndex = null;\n };\n\n moveColumn(fromColIndex, toColIndex) {\n\n const colgroup = this.#sheet.sourceTable.querySelector('colgroup');\n const targetCol = colgroup.querySelector(`col[data-col=\"${toColIndex}\"]`);\n\n const sourceGroup = this.#getColGroupRange(this.#sourceCell);\n if (!sourceGroup || !sourceGroup.isValidGroup) return;\n\n const spanCount = sourceGroup.colSpan;\n const isInRange = (idx) => idx >= fromColIndex && idx < fromColIndex + spanCount;\n\n // 1. colgroup ๋ด <col> ์ด๋ ๋ฐ fixed ์ค์ \n const targetViewportCol = this.#sheet.querySelector(`.ng-sheet-body-content col[data-col=\"${toColIndex}\"]`);\n const fixedType = targetViewportCol?.closest('.ng-container-left') ? 'left' : targetViewportCol?.closest('.ng-container-right') ? 'right' : null;\n\n colgroup.querySelectorAll('col').forEach(col => {\n if (isInRange(parseInt(col.getAttribute('data-col'), 10))) {\n fixedType ? col.setAttribute('fixed', fixedType) : col.removeAttribute('fixed');\n colgroup.insertBefore(col, targetCol);\n }\n });\n\n ['thead', 'tbody', 'tfoot'].forEach(group => {\n this.#sheet.sourceTable.querySelectorAll(`${group} tr`).forEach(tr => {\n const cells = Array.from(tr.children);\n const targetRowCell = cells.find(c => parseInt(c.dataset.col, 10) >= toColIndex);\n\n cells.forEach(cell => {\n if (isInRange(parseInt(cell.dataset.col, 10))) {\n tr.insertBefore(cell, targetRowCell || null);\n }\n });\n });\n });\n\n this.#sheet.recompileAndRefresh();\n }\n\n destroy() {\n this.#sheet.removeEventListener('pointerdown', this.#onPointerDown);\n }\n}","// ui/col/ColFixManager.js\nimport { trace } from \"@nopeer\";\n\nexport class ColFixManager {\n #sheet;\n\n constructor(sheet) {\n this.#sheet = sheet;\n }\n\n getFixState(targetCell, table) {\n if (!targetCell || !table) return 'none';\n\n const container = targetCell.closest('.ng-container-left, .ng-container-right, .ng-container-body');\n if (container?.classList.contains('ng-container-left')) return 'left';\n if (container?.classList.contains('ng-container-right')) return 'right';\n\n const baseCol = parseInt(targetCell.dataset.col, 10);\n if (!isNaN(baseCol)) {\n const colEl = table.querySelector(`colgroup col[data-col=\"${baseCol}\"]`);\n const fixedAttr = colEl?.getAttribute('fixed');\n if (fixedAttr) return fixedAttr;\n }\n\n return 'none';\n }\n\n canFixColumn(targetCell, table) {\n if (!targetCell || targetCell.tagName !== 'TH' || !table) return false;\n\n const baseCol = parseInt(targetCell.dataset.col, 10);\n const colSpan = targetCell.colSpan || 1;\n if (isNaN(baseCol)) return false;\n\n const targetBoundaryCol = baseCol + colSpan - 1;\n const theadTrs = Array.from(table.querySelectorAll('thead tr'));\n\n if (theadTrs.length <= 1) return true;\n\n for (const tr of theadTrs) {\n const cells = Array.from(tr.querySelectorAll('th, td'));\n let cellBoundaryFound = false;\n\n for (const cell of cells) {\n const cCol = parseInt(cell.dataset.col, 10);\n const cSpan = cell.colSpan || 1;\n const cEndCol = cCol + cSpan - 1;\n\n if (cCol <= targetBoundaryCol && targetBoundaryCol < cEndCol) {\n return false;\n }\n\n if (cEndCol === targetBoundaryCol) {\n cellBoundaryFound = true;\n break;\n }\n }\n\n if (!cellBoundaryFound) return false;\n }\n\n return true;\n }\n\n executeFixToggle(action, targetCell, fixType = 'left') {\n if (!this.#sheet || !targetCell) return;\n\n const sourceTable = this.#sheet.sourceTable;\n if (!sourceTable) return;\n\n const baseCol = parseInt(targetCell.dataset.col, 10);\n const colSpan = targetCell.colSpan || 1;\n const targetColIndex = baseCol + colSpan - 1;\n\n if (isNaN(targetColIndex)) return;\n\n const colgroup = sourceTable.querySelector('colgroup');\n if (!colgroup) return;\n\n const cols = Array.from(colgroup.querySelectorAll('col'));\n\n if (action === 'fix-column') {\n cols.forEach(col => {\n const idx = parseInt(col.getAttribute('data-col'), 10);\n if (idx <= targetColIndex) {\n col.setAttribute('fixed', fixType);\n }\n });\n\n ['thead', 'tbody', 'tfoot'].forEach(group => {\n sourceTable.querySelectorAll(`${group} tr`).forEach(tr => {\n Array.from(tr.children).forEach(cell => {\n const cIdx = parseInt(cell.dataset.col, 10);\n if (!isNaN(cIdx) && cIdx <= targetColIndex) {\n cell.setAttribute('fixed', fixType);\n }\n });\n });\n });\n\n } else if (action === 'unfix-column') {\n let minBaseCol = baseCol;\n let maxEndCol = baseCol + colSpan - 1;\n\n ['thead', 'tbody', 'tfoot'].forEach(group => {\n sourceTable.querySelectorAll(`${group} tr`).forEach((tr, rIdx) => {\n Array.from(tr.children).forEach(cell => {\n const cCol = parseInt(cell.dataset.col, 10);\n const cSpan = cell.colSpan || 1;\n const cEnd = cCol + cSpan - 1;\n const rSpan = cell.rowSpan || 1;\n const trIndex = tr.sectionRowIndex ?? rIdx;\n\n const isVerticalOverlap = !(trIndex + rSpan - 1 < cell.closest('tr').sectionRowIndex || trIndex > (cell.closest('tr').sectionRowIndex + rSpan - 1));\n\n const isHorizontalOverlap = !(cEnd < baseCol || cCol > targetColIndex);\n\n if (isHorizontalOverlap) {\n minBaseCol = Math.min(minBaseCol, cCol);\n maxEndCol = Math.max(maxEndCol, cEnd);\n }\n });\n });\n });\n\n cols.forEach(col => {\n const idx = parseInt(col.getAttribute('data-col'), 10);\n if (idx >= minBaseCol) {\n col.removeAttribute('fixed');\n }\n });\n\n let isBroken = false;\n cols.forEach(col => {\n if (isBroken) {\n col.removeAttribute('fixed');\n } else if (!col.getAttribute('fixed')) {\n isBroken = true;\n }\n });\n\n ['thead', 'tbody', 'tfoot'].forEach(group => {\n sourceTable.querySelectorAll(`${group} tr`).forEach(tr => {\n Array.from(tr.children).forEach(cell => {\n const cIdx = parseInt(cell.dataset.col, 10);\n if (isNaN(cIdx)) return;\n\n const correspondingCol = cols.find(c => parseInt(c.getAttribute('data-col'), 10) === cIdx);\n const isColFixed = correspondingCol?.getAttribute('fixed');\n\n if (isColFixed) {\n cell.setAttribute('fixed', isColFixed);\n } else {\n cell.removeAttribute('fixed');\n }\n });\n });\n });\n }\n\n this.#sheet.recompileAndRefresh?.();\n }\n}","import { NINE_TABLE } from '@/core/constants.js';\nimport { trace } from \"@nopeer\";\n\nexport class NineTableFilterPanel extends HTMLElement {\n\t#sheet;\n\t#host;\n\t#nineTable;\n\t#view;\n\t#button;\n\tcurrentCol = null;\n\n\tconnectedCallback() {\n\t\tthis.#init();\n\t\tdocument.addEventListener(\"mousedown\", this.#closeHandler);\n\t}\n\n\t#init = () => {\n\t\t//setTimeout(() => {\n\t\t\tthis.#renderer();\n\n\t\t\tthis.#sheet = this.closest(\"nine-table-sheet\");\n\t\t\tthis.#host = this.getRootNode().host;\n\n\t\t\tthis.#nineTable = this.querySelector(\"nine-table-simple\");\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.#view = this.#nineTable.shadowRoot.querySelector(\"nine-table-sheet\");\n\t\t\t})\n\n\n\t\t\tthis.querySelector(\".search-box\").addEventListener(\"focusin\", (e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t});\n\t\t\tthis.querySelector(\".search-box\").addEventListener(\"input\", this.#onInput);\n\t\t\tthis.querySelector(\"#chkSelectAll\").addEventListener(\"change\", this.#onSelectAll);\n\t\t\tthis.querySelector(\"#btnOk\").addEventListener(\"click\", this.#onOk);\n\t\t//});\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <input type=\"text\" class=\"search-box\" placeholder=\"Search...\">\n \n <nine-table-simple class=\"filter-list\" theme=\"simple\">\n <table auto-fit-col=\"true\">\n <colgroup>\n <col width=\"32\" fixed=\"left\" />\n <col width=\"180\" />\n <col width=\"0\" fixed=\"right\"/>\n </colgroup>\n <tbody>\n <tr>\n <td cell-type=\"checkbox\" data-bind=\"CHK\"></td>\n <td data-bind=\"DATA2\" html=\"true\"></td>\n <td data-bind=\"DATA\"></td>\n </tr>\n </tbody>\n </table>\n </nine-table-simple>\n\n <div class=\"footer-section\">\n <div class=\"footer-btns\">\n <label><input type=\"checkbox\" id=\"chkSelectAll\" checked> Select All</label>\n <div class=\"btn-group\">\n <button id=\"btnOk\">Apply</button>\n </div>\n </div>\n </div>\n `;\n\t}\n\n\topen(filterBtn) {\n\t\tthis.#button = filterBtn;\n\n\t\tconst cell = filterBtn.closest(\"th, td\");\n\t\tthis.currentCol = cell?.dataset.col;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst sheetRect = this.#sheet.getBoundingClientRect();\n\n\t\tconst panelWidth = this.offsetWidth || 240;\n\t\tlet left = (cellRect.right - sheetRect.left) - panelWidth;\n\t\tlet top = cellRect.bottom - sheetRect.top;\n\n\t\tif (left < 0) {\n\t\t\tleft = Math.max(0, cellRect.left - sheetRect.left);\n\t\t}\n\n\t\tthis.style.left = `${left}px`;\n\t\tthis.style.top = `${top}px`;\n\n\t\tconst searchBox = this.querySelector(\".search-box\");\n\t\tsearchBox.value = \"\";\n\n\n\t\tthis.classList.add(\"active\");\n\t\tthis.classList.add(\"loading\");\n\n\t\tsetTimeout(() => {\n\t\t\ttry {\n\t\t\t\tthis.#loadVirtualFilterItems();\n\t\t\t\tthis.#view.rowManager.scrollToDataRow(0);\n\t\t\t\tsearchBox.focus();\n\t\t\t} finally {\n\t\t\t\tthis.classList.remove(\"loading\");\n\t\t\t}\n\t\t});\n\t}\n\n\t#closeHandler = (e) => {\n\t\tconst path = e.composedPath ? e.composedPath() : [];\n\t\tif (path.includes(this) || (this.#button && path.includes(this.#button))) {\n\t\t\treturn;\n\t\t}\n\t\tthis.close();\n\t};\n\n\tclose() {\n\t\tthis.currentCol = null;\n\t\tthis.classList.remove(\"active\");\n\t\tthis.#button = null;\n\t}\n\n\t#loadVirtualFilterItems() {\n\t\tconst filteredRecords = this.#host.data.getArray();\n\t\tconst targetCols = this.#button?.columns || []; // [{ bind, expr }] ํํ ๋ฐฐ์ด\n\t\tconst fields = this.#host.fields.get() || [];\n\t\tconst activeFilters = this.#sheet.filtering?.filters || {};\n\t\tconst exprEngine = this.#host.exprEngine;\n\n\t\tconst ds = targetCols.flatMap((colInfo) => {\n\t\t\tconst bindKey = colInfo.bind;\n\t\t\tconst exprKey = colInfo.expr;\n\n\t\t\tconst filterKey = bindKey || exprKey; // ์ค์ ํํฐ ํ๋ผ๋ฏธํฐ ํค๋ก ์ฌ์ฉ\n\t\t\tconst fieldIdx = bindKey ? fields.indexOf(bindKey) : -1;\n\t\t\tconst activeSelectedVals = activeFilters[filterKey] || [];\n\n\t\t\tconst uniqueMap = new Map();\n\t\t\tfor (let i = 0; i < filteredRecords.length; i++) {\n\t\t\t\tconst record = filteredRecords[i];\n\t\t\t\tif (!record) continue;\n\n\t\t\t\tlet rawVal = undefined;\n\t\t\t\tif (fieldIdx >= 0 && record.v) {\n\t\t\t\t\trawVal = record.v[fieldIdx];\n\t\t\t\t} else if (bindKey && bindKey.includes(\"data.\")) {\n\t\t\t\t\trawVal = exprEngine ? exprEngine.evaluate(bindKey, record, i) : undefined;\n\t\t\t\t} else if (exprKey && exprEngine) {\n\t\t\t\t\trawVal = exprEngine.evaluate(exprKey, record, i);\n\t\t\t\t}\n\n\t\t\t\tlet displayVal = rawVal;\n\t\t\t\tif (exprKey && exprEngine) {\n\t\t\t\t\tdisplayVal = exprEngine.evaluate(exprKey, record, i);\n\t\t\t\t}\n\n\t\t\t\tif (displayVal !== undefined && displayVal !== null && !uniqueMap.has(displayVal)) {\n\t\t\t\t\tuniqueMap.set(displayVal, {\n\t\t\t\t\t\tv: rawVal, // ๐ก ํํฐ๋ง ๋น๊ต ๊ธฐ์ค (DATA)\n\t\t\t\t\t\tv2: displayVal // ๐ก ํ๋ฉด ์ถ๋ ฅ ๊ธฐ์ค (DATA2)\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst uniqueList = [...uniqueMap.values()];\n\n\t\t\tuniqueList.sort((a, b) => {\n\t\t\t\tconst valA = a.v2;\n\t\t\t\tconst valB = b.v2;\n\n\t\t\t\tif (valA === valB) return 0;\n\t\t\t\tif (valA === undefined || valA === null || valA === '') return 1;\n\t\t\t\tif (valB === undefined || valB === null || valB === '') return -1;\n\n\t\t\t\tconst numA = Number(valA);\n\t\t\t\tconst numB = Number(valB);\n\n\t\t\t\tconst isNumA = !isNaN(numA);\n\t\t\t\tconst isNumB = !isNaN(numB);\n\n\t\t\t\tif (isNumA && isNumB) {\n\t\t\t\t\treturn numA - numB;\n\t\t\t\t}\n\n\t\t\t\treturn String(valA).localeCompare(String(valB));\n\t\t\t});\n\t\t\tactiveSelectedVals.sort((a, b) => { return a > b ? 1 : -1; });\n\n\t\t\treturn uniqueList.map(o => ({\n\t\t\t\tLVL: 2,\n\t\t\t\tDATA: o.v, // ํํฐ๋ง ๋น๊ต์ฉ ๊ฐ\n\t\t\t\tDATA2: (o.v2 === \"\" || o.v2 === null || o.v2 === undefined) ? '<span class=\"empty-value\">(empty)</span>' : o.v2,\n\t\t\t\tCOLNM: filterKey,\n\t\t\t\tCHK: activeSelectedVals.length === 0 || activeSelectedVals.nineBinarySearch(o.v) >= 0 ? \"Y\" : \"N\"\n\t\t\t}));\n\t\t});\n\n\t\tthis.#nineTable.data.set(ds);\n\n\t\tconst selectAllChk = this.querySelector(\"#chkSelectAll\");\n\t\tif (selectAllChk) {\n\t\t\tselectAllChk.checked = ds.length > 0 && ds.every(item => item.CHK === \"Y\");\n\t\t}\n\t}\n\n\t#onOk = () => {\n\t\tthis.#host.loading = true;\n\n\t\tconst filterRecords = this.#view.view.getArray();\n\t\tconst fields = this.#nineTable.data.getHostFields();\n\n\t\tconst checkedRecords = filterRecords.filter(record => {\n\t\t\tconst chk = record.v[fields.indexOf(\"CHK\")];\n\t\t\treturn (chk === \"Y\" || chk === true);\n\t\t});\n\n\t\tconst filterParams = { ...(this.#sheet.filtering?.filters || {}) };\n\n\t\tthis.#button.columns.forEach(colInfo => {\n\t\t\tconst filterKey = colInfo.expr || colInfo.bind;\n\t\t\tconst fieldIdx = colInfo.expr ? fields.indexOf(\"DATA2\") : fields.indexOf(\"DATA\");\n\t\t\tconst selectedVals = checkedRecords.map(r => r.v[fieldIdx]);\n\n\t\t\tif (selectedVals.length > 0) {\n\t\t\t\tfilterParams[filterKey] = selectedVals;\n\t\t\t} else {\n\t\t\t\tdelete filterParams[filterKey];\n\t\t\t}\n\t\t});\n\n\t\tconst totalCount = this.#nineTable.data.count();\n\n\t\tsetTimeout(() => {\n\t\t\ttry {\n\t\t\t\tif (totalCount === checkedRecords.length) {\n\t\t\t\t\tthis.#button.columns.forEach(colInfo => {\n\t\t\t\t\t\tconst filterKey = colInfo.expr || colInfo.bind;\n\t\t\t\t\t\tif (filterKey) this.#sheet.filtering.clear(filterKey);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthis.#sheet.filtering.set(filterParams);\n\t\t\t\t}\n\n\t\t\t\tthis.#sheet.querySelectorAll(\"nine-table-filter-button\").forEach(btn => {\n\t\t\t\t\tbtn.updateFilteredState();\n\t\t\t\t});\n\n\t\t\t\tthis.#sheet.invalidate();\n\t\t\t\tthis.close();\n\t\t\t} finally {\n\t\t\t\tthis.#host.loading = false;\n\t\t\t}\n\t\t});\n\t};\n\n\t#onInput = (e) => {\n\n\t\tconst query = e.target.value.toLowerCase().trim();\n\n\t\tif (!query) {\n\t\t\tthis.#view.filtering.clear();\n\t\t} else {\n\t\t\tconst rawRecords = this.#nineTable.data.getArray();\n\t\t\tconst fields = this.#nineTable.data.getHostFields();\n\t\t\tconst data2Idx = fields.indexOf(\"DATA2\");\n\n\t\t\tconst matchedValues = [];\n\t\t\trawRecords.forEach(record => {\n\t\t\t\tconst val = data2Idx >= 0 && record.v ? record.v[data2Idx] : \"\";\n\t\t\t\tconst textVal = String(val).replace(/<[^>]*>?/gm, '').toLowerCase();\n\n\t\t\t\tif (textVal.includes(query)) {\n\t\t\t\t\tmatchedValues.push(val);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.#view.filtering.set({\n\t\t\t\tDATA2: [...new Set(matchedValues)]\n\t\t\t});\n\t\t}\n\t};\n\n\t#onSelectAll = (e) => {\n\t\tconst isChecked = e.target.checked;\n\t\tconst rawRecords = this.#nineTable?.data?.getArray() || [];\n\t\tconst fields = this.#nineTable.data.getHostFields();\n\t\tconst chkIdx = fields.indexOf(\"CHK\");\n\n\t\tif (chkIdx >= 0) {\n\t\t\trawRecords.forEach(record => {\n\t\t\t\trecord.v[chkIdx] = isChecked ? \"Y\" : \"N\";\n\t\t\t});\n\t\t}\n\n\t\tthis.#nineTable.refresh();\n\t};\n\n\t#onCancel = () => {\n\t\tthis.close();\n\t};\n}\n\nexport class NineTableFilterButton extends HTMLElement {\n\t#sheet;\n\t#columns = null;\n\n\tconnectedCallback() {\n\t\tthis.#sheet = this.closest(\"nine-table-sheet\") || this.getRootNode().host;\n\t\tthis.removeEventListener(\"click\", this.#onClick);\n\t\tthis.addEventListener(\"click\", this.#onClick);\n\t}\n\n\tget columns() {\n\t\tif (this.#columns) return this.#columns;\n\n\t\tconst cell = this.closest(\"th, td\");\n\t\tconst colIndex = cell?.dataset.col;\n\t\tconst sourceTable = this.#sheet.sourceTable;\n\n\t\tconst cols = [];\n\t\tconst seen = new Set();\n\n\t\tif (sourceTable && colIndex !== undefined) {\n\t\t\tsourceTable.querySelectorAll(`tbody [data-col=\"${colIndex}\"]`).forEach($td => {\n\t\t\t\tconst bindKey = $td.dataset.bind;\n\t\t\t\tconst exprKey = $td.dataset.expr;\n\n\t\t\t\tif (bindKey || exprKey) {\n\t\t\t\t\tconst uniqueKey = `${bindKey || ''}_${exprKey || ''}`;\n\t\t\t\t\tif (!seen.has(uniqueKey)) {\n\t\t\t\t\t\tseen.add(uniqueKey);\n\t\t\t\t\t\tcols.push({\n\t\t\t\t\t\t\tbind: bindKey,\n\t\t\t\t\t\t\texpr: exprKey,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.#columns = cols;\n\t\treturn this.#columns;\n\t}\n\n\tupdateFilteredState = () => {\n\t\tconst activeFilters = this.#sheet.filtering?.filters || {};\n\t\tconst isFiltered = this.columns.some(colInfo => {\n\t\t\tconst key = colInfo.expr || colInfo.bind;\n\t\t\treturn key && activeFilters[key] && activeFilters[key].length > 0;\n\t\t});\n\t\tthis.classList.toggle('filtered', isFiltered);\n\t};\n\n\t#onClick = (e) => {\n\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\tconst panel = this.#sheet.querySelector(\"nine-table-filter-panel\");\n\t\tconst cell = this.closest(\"th, td\");\n\t\tconst col = cell.dataset.col;\n\n\t\tif (panel && panel.currentCol === col && panel.classList.contains('active')) {\n\t\t\tpanel.close();\n\t\t} else if (panel) {\n\t\t\tpanel.open(this);\n\t\t}\n\t};\n}\n\nexport class Filtering {\n\t#sheet;\n\t#host;\n\t#isFiltering = false;\n\t#filterPanel = null;\n\t#filters = {};\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = this.#sheet.getRootNode().host;\n\t\tthis.#init();\n\t}\n\n\tget filters() {\n\t\treturn this.#filters;\n\t};\n\n\t#init = () => {\n\t\tthis.#initFilterPanel();\n\t}\n\n\t#initFilterPanel = () => {\n\t\tif (this.#host.tagName.toLowerCase() === \"nine-table-simple\") {\n\t\t\treturn;\n\t\t}\n\n\t\tlet panel = this.#sheet.querySelector(\"nine-table-filter-panel\");\n\t\tif (!panel) {\n\t\t\tpanel = document.createElement(\"nine-table-filter-panel\");\n\t\t\tthis.#sheet.appendChild(panel);\n\t\t}\n\t\tthis.#filterPanel = panel;\n\t}\n\n\tisFiltering() {\n\t\treturn this.#isFiltering;\n\t}\n\n\tclear = (colnm) => {\n\t\tif (colnm) {\n\t\t\tdelete this.#filters[colnm];\n\t\t} else {\n\t\t\tthis.#filters = {};\n\t\t}\n\n\t\tthis.#isFiltering = Object.keys(this.#filters).length > 0;\n\t\tthis.#applyFiltering();\n\n\t\tthis.#sheet.querySelectorAll(\"nine-table-filter-button\").forEach(btn => {\n\t\t\tbtn.updateFilteredState();\n\t\t});\n\t}\n\n\tset = (oFilter) => {\n\n\t\tlet jsonFilter = Array.isArray(oFilter)\n\t\t\t? Object.fromEntries(Object.keys(oFilter[0]).map(k => [k, [...new Set(oFilter.map(item => item[k]))]]))\n\t\t\t: oFilter;\n\n\t\tthis.#filters = jsonFilter;\n\t\tthis.#isFiltering = Object.keys(jsonFilter).length > 0;\n\t\tthis.#sheet.toggleAttribute(\"filtering\", this.#isFiltering);\n\n\t\tthis.#applyFiltering();\n\t}\n\n\t#applyFiltering() {\n\t\tconst hostData = this.#host.data;\n\t\tconst rawRecords = hostData.getArray();\n\t\tconst fields = this.#host.data.getHostFields();\n\t\tconst sheetIndex = this.#sheet.index;\n\t\tconst exprEngine = this.#host.exprEngine;\n\n\t\tconst hasFilters = Object.keys(this.#filters).length > 0;\n\n\t\tif (!hasFilters) {\n\t\t\trawRecords.forEach(record => {\n\t\t\t\tif (record?.m?._?.[NINE_TABLE.META.INDEX.FILTER]) {\n\t\t\t\t\trecord.m._[NINE_TABLE.META.INDEX.FILTER][sheetIndex] = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.#sheet.invalidate();\n\t\t\treturn;\n\t\t}\n\n\t\tconst filterRules = Object.entries(this.#filters).map(([targetKey, allowedValues]) => {\n\t\t\tconst isExpr = targetKey.includes(\"data.\") || targetKey.includes(\"host.\") || targetKey.includes(\"rowItem.v\");\n\t\t\treturn {\n\t\t\t\ttargetKey,\n\t\t\t\tisExpr,\n\t\t\t\tfieldIdx: !isExpr ? fields.indexOf(targetKey) : -1,\n\t\t\t\tallowedSet: new Set(allowedValues)\n\t\t\t};\n\t\t});\n\n\t\trawRecords.forEach((record, recordIdx) => {\n\t\t\tif (!record) return;\n\n\t\t\tif (!record.m._[NINE_TABLE.META.INDEX.FILTER]) {\n\t\t\t\trecord.m._[NINE_TABLE.META.INDEX.FILTER] = [];\n\t\t\t}\n\n\t\t\tlet isPass = true;\n\n\t\t\tfor (let i = 0; i < filterRules.length; i++) {\n\t\t\t\tconst { targetKey, isExpr, fieldIdx, allowedSet } = filterRules[i];\n\t\t\t\tlet val = undefined;\n\n\t\t\t\tif (isExpr && exprEngine) {\n\t\t\t\t\tval = exprEngine.evaluate(targetKey, record, recordIdx);\n\t\t\t\t} else if (fieldIdx >= 0 && record.v) {\n\t\t\t\t\tval = record.v[fieldIdx];\n\t\t\t\t}\n\n\t\t\t\tif (!allowedSet.has(val)) {\n\t\t\t\t\tisPass = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\trecord.m._[NINE_TABLE.META.INDEX.FILTER][sheetIndex] = isPass;\n\t\t});\n\n\t\tthis.#sheet.invalidate();\n\t}\n}\n\nif (!customElements.get('nine-table-filter-panel')) {\n\tcustomElements.define(\"nine-table-filter-panel\", NineTableFilterPanel);\n}\n\nif (!customElements.get('nine-table-filter-button')) {\n\tcustomElements.define(\"nine-table-filter-button\", NineTableFilterButton);\n}","// ui/data/Sorting.js (๋๋ ์ ๋ ฌ ๊ด๋ จ ์์ค)\nimport { trace } from \"@nopeer\";\n\nexport class Sorting {\n\t#sheet;\n\t#host;\n\n\t#columns = [];\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = sheet.getRootNode().host;\n\n\t\tsetTimeout(() => {\n\t\t\tthis.#initEvents();\n\t\t}, 300);\n\t}\n\n\t#initEvents() {\n\n\t\tthis.#sheet.querySelectorAll(\"thead\").forEach($el => {\n\n\t\t\t$el.addEventListener('dblclick', (e) => {\n\n\t\t\t\tconst cell = e.target.closest('th, td');\n\t\t\t\tif (!cell || cell.classList.contains('resizable-edge')) return;\n\n\t\t\t\tif ([\"INPUT\",\"CELL-CHECKBOX\"].includes(e.target.tagName)) return;\n\n\t\t\t\tif (e.offsetX <= 2 || e.offsetX >= cell.offsetWidth - 2) return;\n\n\t\t\t\tconst host = this.#sheet.getRootNode().host;\n\n\t\t\t\thost.loading = true;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.#handleSort(e, cell);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\thost.loading = false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\t#handleSort(e, cell) {\n\t\tconst colIndex = cell.dataset.col;\n\t\tconst tr = cell.closest('tr');\n\t\tconst subRowIndex = tr ? tr.dataset.subrow || String(tr.sectionRowIndex) : '0';\n\n\t\tif (colIndex === undefined) return;\n\n\t\tconst sourceTable = this.#sheet.sourceTable;\n\t\tif (!sourceTable) return;\n\n\t\tlet colName = null;\n\t\tlet exprVal = null;\n\n\t\tsourceTable.querySelectorAll(`tbody [data-col=\"${colIndex}\"]`).forEach($td => {\n\t\t\tif ($td.dataset.bind) {\n\t\t\t\tcolName = $td.dataset.bind;\n\t\t\t}\n\n\t\t\tif ($td.dataset.expr) {\n\t\t\t\texprVal = $td.dataset.expr;\n\t\t\t}\n\t\t});\n\n\t\tif (!colName && !exprVal) return;\n\n\t\tconst isAsc = cell.classList.contains('asc');\n\t\tconst isDesc = cell.classList.contains('desc');\n\n\t\tif (!e.ctrlKey && !e.shiftKey) {\n\t\t\tthis.#columns = [];\n\t\t}\n\n\t\tconst existingColIndex = this.#columns.findIndex(\n\t\t\tm => (m.colIndex === colIndex && m.subRowIndex === subRowIndex) || m.colName === colName\n\t\t);\n\n\t\tconst ruleData = {\n\t\t\tcolIndex,\n\t\t\tsubRowIndex,\n\t\t\tcolname: colName || exprVal,\n\t\t\tcolName: colName || exprVal,\n\t\t\texpr: exprVal, // ๐ก expr ๊ท์น ๋ณด๊ด\n\t\t\tasc: true,\n\t\t\t\"expr-func\": exprVal ? (record, idx) => this.#host.exprEngine(exprVal, record, idx) : null\n\t\t};\n\n\t\tif (!isAsc && !isDesc) {\n\t\t\tif (existingColIndex >= 0) {\n\t\t\t\tthis.#columns[existingColIndex].asc = true;\n\t\t\t} else {\n\t\t\t\tthis.#columns.push({ ...ruleData, asc: true });\n\t\t\t}\n\t\t} else if (isAsc) {\n\t\t\tif (existingColIndex >= 0) {\n\t\t\t\tthis.#columns[existingColIndex].asc = false;\n\t\t\t} else {\n\t\t\t\tthis.#columns.push({ ...ruleData, asc: false });\n\t\t\t}\n\t\t} else {\n\t\t\tthis.#columns = this.#columns.filter(\n\t\t\t\tm => !((m.colIndex === colIndex && m.subRowIndex === subRowIndex) || m.colName === colName)\n\t\t\t);\n\t\t}\n\n\t\tthis.#applySorting(cell);\n\t}\n\n\t#applySorting(cell) {\n\n\t\tthis.#sheet.view.setSorting(this.#columns);\n\t\tthis.#syncHeaderUI();\n\t\tthis.#sheet.invalidate();\n\t\trequestAnimationFrame(() => {\n\t\tconst cells = this.#sheet.querySelectorAll('tbody.body th, tbody.body td');\n\n\t\tcells.forEach($td => {\n\t\t\t$td.classList.remove('sorting-anim-asc', 'sorting-anim-desc', 'sorting-anim-none');\n\n\t\t\tif (cell.classList.contains('asc')) {\n\t\t\t\t$td.classList.add('sorting-anim-asc');\n\t\t\t} else if (cell.classList.contains('desc')) {\n\t\t\t\t$td.classList.add('sorting-anim-desc');\n\t\t\t} else {\n\t\t\t\t$td.classList.add('sorting-anim-none');\n\t\t\t}\n\t\t});\n\n\t\trequestAnimationFrame(() => {\n\t\t\tcells.forEach($td => {\n\t\t\t\t$td.classList.remove('sorting-anim-asc', 'sorting-anim-desc', 'sorting-anim-none');\n\t\t\t});\n\t\t});\n\t\t});\n\t}\n\n\t#syncHeaderUI() {\n\t\tthis.#sheet.querySelectorAll('thead th, thead td').forEach(el => {\n\t\t\tel.classList.remove('asc', 'desc');\n\t\t});\n\n\t\tif (this.#columns.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#columns.forEach(colRule => {\n\t\t\tconst { colIndex, subRowIndex, asc } = colRule;\n\n\t\t\tif (colIndex !== undefined) {\n\t\t\t\tlet selector = `thead [data-col=\"${colIndex}\"]`;\n\t\t\t\tif (subRowIndex !== undefined) {\n\t\t\t\t\tselector = `thead tr[data-subrow=\"${subRowIndex}\"] [data-col=\"${colIndex}\"]`;\n\t\t\t\t}\n\n\t\t\t\tconst targetHeaderCells = this.#sheet.querySelectorAll(selector);\n\t\t\t\ttargetHeaderCells.forEach(cell => {\n\t\t\t\t\tcell.classList.add(asc ? 'asc' : 'desc');\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\trestore() {\n\t\tthis.#columns = [];\n\t\tif (this.#sheet.view) {\n\t\t\tthis.#sheet.view.resetSorting();\n\t\t}\n\n\t\tthis.#syncHeaderUI();\n\t\tthis.#sheet.rowManager?.refresh(true);\n\t}\n}","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\nimport {Grouping} from \"@/data/Grouping.js\";\n\nexport class SheetView {\n\t#sheet;\n\t#host;\n\t#sortingColumns = [];\n\t#filterRules = [];\n\t#viewIndexes = [];\n\n\t#cachedVisibleRecords = null;\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = sheet.getRootNode().host;\n\n\t\tthis.refresh();\n\t}\n\n\tgetArray = (at, colnm) => {\n\n\t\tif (!this.#cachedVisibleRecords) {\n\t\t\tconst records = this.#host.data.getArray();\n\t\t\tthis.#cachedVisibleRecords = this.#viewIndexes.map(idx => records[idx]);\n\t\t}\n\n\t\tconst visibleRecords = this.#cachedVisibleRecords;\n\n\t\tif (at === undefined || at === null) {\n\t\t\treturn visibleRecords;\n\t\t}\n\n\t\tif (at < 0 || at >= visibleRecords.length) return null;\n\n\t\tconst targetRecord = visibleRecords[at];\n\t\tif (colnm != null) {\n\t\t\tconst fields = this.#host.data.getHostFields();\n\t\t\tconst idx = fields.indexOf(colnm);\n\t\t\treturn (idx >= 0 && targetRecord.v) ? targetRecord.v[idx] : null;\n\t\t}\n\n\t\treturn targetRecord;\n\t};\n\n\tcount = () => {\n\t\tif (!this.#cachedVisibleRecords) {\n\t\t\tconst records = this.#host.data.getArray();\n\t\t\tthis.#cachedVisibleRecords = this.#viewIndexes.map(idx => records[idx]);\n\t\t}\n\n\t\treturn this.#cachedVisibleRecords.length;\n\t}\n\n\tget = (at, colnm) => {\n\t\tconst visibleRecords = this.getArray();\n\t\tconst fields = this.#host.data.getHostFields?.() || [];\n\n\t\tif (at === undefined || at === null) {\n\t\t\treturn visibleRecords.map(record => this.#convSingle(record, fields));\n\t\t}\n\n\t\tif (at < 0 || at >= visibleRecords.length) return null;\n\n\t\tconst targetRecord = visibleRecords[at];\n\t\tif (!targetRecord) return null;\n\n\t\tif (colnm != null) {\n\t\t\tconst idx = fields.indexOf(colnm);\n\t\t\treturn (idx >= 0 && targetRecord.v) ? targetRecord.v[idx] : null;\n\t\t}\n\n\t\treturn this.#convSingle(targetRecord, fields);\n\t};\n\n\t#convSingle = (o, fields) => {\n\t\tif (!o) return null;\n\t\tconst t = {};\n\t\tfields.forEach((colnm, i) => {\n\t\t\tt[colnm] = o.v ? o.v[i] : o[colnm];\n\t\t});\n\t\tif (o.m) t.m = o.m;\n\t\tif (o._) t._ = o._;\n\t\treturn t;\n\t};\n\n\trefresh = () => {\n\n\t\tthis.#cachedVisibleRecords = null;\n\n\t\tconst rawRecords = this.#host.data.getArray();\n\t\tlet indices = [];\n\t\trawRecords.forEach((record, i) => {\n\t\t\tif (!record) return;\n\t\t\tconst filterSlot = record.m?._?.[NINE_TABLE.META.INDEX.FILTER];\n\t\t\tif (filterSlot && filterSlot[this.#sheet.index] === false) return;\n\t\t\tindices.push(i);\n\t\t});\n\n\t\tif (this.#sortingColumns.length > 0) {\n\t\t\tindices = this.#applySorting(indices, rawRecords);\n\t\t}\n\n\t\tthis.#viewIndexes = indices;\n\t\tconst validRecords = indices.map(idx => rawRecords[idx]);\n\n\t\tconst groupColumns = this.#sheet.grouping?.columns || [];\n\t\tif (groupColumns.length > 0) {\n\t\t\tconst groupResult = Grouping.apply(validRecords, groupColumns, this.#host.data.getHostFields());\n\n\t\t\tthis.#cachedVisibleRecords = groupResult.renderItems; // ์ต์ข
๋ ๋๋ง ์์ดํ
\n\n\t\t\tthis.#sheet.grouping.setGroupMap(groupResult.groupMap); // ์์ ๋งคํ ๊ณต์ \n\t\t} else {\n\t\t\tthis.#cachedVisibleRecords = validRecords;\n\t\t}\n\n\n\n\t}\n\n\tsetSorting = (columns) => {\n\t\tthis.#sortingColumns = columns || [];\n\t\tthis.refresh();\n\t};\n\n\tgetSorting = () => {\n\t\treturn this.#sortingColumns;\n\t};\n\n\tresetSorting = () => {\n\t\tthis.#sortingColumns = [];\n\t\tthis.refresh();\n\t};\n\n\n\t#applySorting = (indices, validRecords) => {\n\n\t\tconst fields = typeof this.#host.data.getHostFields === 'function' ? this.#host.data.getHostFields() : [];\n\n\t\tconst rulesWithIdx = this.#sortingColumns.map(rule => ({\n\t\t\t...rule,\n\t\t\tcolIndex: fields.indexOf(rule.colname || rule.colName)\n\t\t}));\n\n\t\treturn indices.sort((idxA, idxB) => {\n\t\t\tconst a = validRecords[idxA];\n\t\t\tconst b = validRecords[idxB];\n\n\t\t\tfor (const rule of rulesWithIdx) {\n\t\t\t\tconst isAsc = rule.asc;\n\t\t\t\tconst expr = rule.expr; // ๐ก ๋ฑ๋ก๋ expr ์์\n\t\t\t\tlet valA, valB;\n\n\t\t\t\tif (expr) {\n\t\t\t\t\tvalA = this.#host.exprEngine.evaluate(expr, a, idxA);\n\t\t\t\t\tvalB = this.#host.exprEngine.evaluate(expr, b, idxB);\n\t\t\t\t} else {\n\t\t\t\t\tif (rule.colIndex >= 0 && a.v && b.v) {\n\t\t\t\t\t\tvalA = a.v[rule.colIndex];\n\t\t\t\t\t\tvalB = b.v[rule.colIndex];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst isEmptyA = (valA === null || valA === undefined || valA === '');\n\t\t\t\tconst isEmptyB = (valB === null || valB === undefined || valB === '');\n\n\t\t\t\tif (isEmptyA && isEmptyB) continue;\n\t\t\t\tif (isEmptyA) return 1;\n\t\t\t\tif (isEmptyB) return -1;\n\n\t\t\t\tif (valA !== valB) {\n\t\t\t\t\tlet diff = 0;\n\n\t\t\t\t\tif (typeof valA === 'number' && typeof valB === 'number') {\n\t\t\t\t\t\tdiff = valA - valB;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst strA = String(valA);\n\t\t\t\t\t\tconst strB = String(valB);\n\t\t\t\t\t\tdiff = strA > strB ? 1 : (strA < strB ? -1 : 0);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (diff !== 0) {\n\t\t\t\t\t\treturn isAsc ? diff : -diff;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn idxA - idxB;\n\t\t});\n\t};\n}","import { trace } from \"@nopeer\";\nimport { TableCompiler } from \"@/layout/core/TableCompiler.js\";\n\nexport const COLLAPSED_WIDTH = 16;\n\nexport class PreCompiler {\n\n static initializeTable(host, tbl) {\n\n PreCompiler.#ensureColgroup(tbl);\n PreCompiler.#ensureThead(tbl);\n PreCompiler.#ensureSectionTbodys(tbl);\n\n PreCompiler.#ensureRowIndicator(tbl);\n\n PreCompiler.#normalizeColAttributes(tbl);\n\n TableCompiler.resetColIndex(tbl, tbl.querySelectorAll('thead tr'));\n TableCompiler.resetColIndex(tbl, tbl.querySelectorAll('tbody.body tr[grouping=\"true\"]'));\n TableCompiler.resetColIndex(tbl, tbl.querySelectorAll('tbody.body tr:not([grouping=\"true\"])'));\n TableCompiler.resetColIndex(tbl, tbl.querySelectorAll('tfoot tr'));\n\n PreCompiler.#createColIndicator(tbl);\n\n PreCompiler.#normalizeCollapsibleAttributes(tbl);\n\n PreCompiler.#generateCell(host, tbl);\n\n PreCompiler.#initColExpanders(tbl);\n\n PreCompiler.#initFilterButtons(host, tbl);\n\n PreCompiler.#applyInitialCellWidths(tbl);\n\n return tbl;\n }\n\n static #createColIndicator(tbl) {\n const thead = tbl.querySelector('thead');\n if (!thead || thead.querySelector('.col-indicator-rowgroup')) return;\n\n const tdTmpl = `<th data-col=\"@col\" class=\"col-indicator\" scope=\"col\"></th>`;\n\n const tr = thead.insertRow(0);\n tr.setAttribute('role', 'row');\n tr.classList.add('col-indicator-rowgroup');\n tr.classList.add('collapse');\n\n const firstRow = tbl.querySelector('tbody tr');\n if (!firstRow) return;\n\n let cnt = 0;\n firstRow.querySelectorAll('th, td').forEach(td => {\n if (!td.classList.contains('dummy')) {\n const colSpan = td.colSpan || 1;\n for (let i = 0; i < colSpan; i++) {\n const html = tdTmpl.replace('@col', cnt).replace('@text', PreCompiler.#numToExcelCol(cnt++));\n tr.insertAdjacentHTML('beforeend', html);\n }\n }\n });\n\n const cols = Array.from(tbl.querySelectorAll('colgroup col'));\n tr.querySelectorAll('.col-indicator').forEach((el, i) => {\n const background = cols[i].getAttribute('background');\n if (background) {\n el.style.background = background;\n }\n });\n }\n\n static #numToExcelCol(num) {\n let text = '';\n for (let n = num; n >= 0; n = Math.floor(n / 26) - 1) {\n text = String.fromCharCode(65 + (n % 26)) + text;\n }\n return text;\n }\n\n static #ensureSectionTbodys(tbl) {\n let tbody = tbl.querySelector('tbody:not(.head):not(.foot)');\n\n if (!tbody) return;\n\n tbody.classList.add('body');\n\n if (!tbl.querySelector('tbody.head')) {\n const headTbody = document.createElement('tbody');\n headTbody.classList.add('head');\n tbody.before(headTbody);\n }\n\n if (!tbl.querySelector('tbody.foot')) {\n const footTbody = document.createElement('tbody');\n footTbody.classList.add('foot');\n tbody.after(footTbody);\n }\n }\n\n static #ensureColgroup(tbl) {\n let colgroup = tbl.querySelector('colgroup');\n if (!colgroup) {\n colgroup = document.createElement('colgroup');\n tbl.prepend(colgroup);\n }\n\n if (colgroup.querySelectorAll('col').length === 0) {\n const firstRow = tbl.querySelector('tbody tr');\n let colCount = 1;\n if (firstRow) {\n colCount = Array.from(firstRow.querySelectorAll('th, td')).reduce((sum, cell) => {\n return sum + (parseInt(cell.getAttribute('colspan') || cell.colSpan, 10) || 1);\n }, 0);\n }\n colCount = Math.max(colCount, 1);\n\n for (let i = 0; i < colCount; i++) {\n const col = document.createElement('col');\n colgroup.appendChild(col);\n }\n }\n }\n\n static #normalizeColAttributes(tbl) {\n const cols = Array.from(tbl.querySelectorAll('colgroup col'));\n if (cols.length === 0) return;\n\n const containerWidth = tbl.clientWidth || 0;\n const defaultWidth = Math.max(Math.floor(containerWidth / cols.length), 100);\n\n cols.forEach((col, i) => {\n\n if (!col.hasAttribute('data-col')) {\n col.setAttribute('data-col', i);\n }\n\n const width = col.getAttribute('width') || parseInt(col.style.width, 10) || defaultWidth;\n col.setAttribute('width', width);\n\n const widthVal = String(width).includes('px') ? width : `${width}px`;\n col.style.width = widthVal;\n });\n }\n\n static #ensureThead(tbl) {\n if (tbl.querySelector('thead')) return;\n\n const thead = document.createElement('thead');\n const colgroup = tbl.querySelector('colgroup');\n\n if (colgroup) {\n colgroup.after(thead);\n } else {\n tbl.prepend(thead);\n }\n }\n\n static #normalizeCollapsibleAttributes(tbl) {\n const headers = tbl.querySelectorAll('thead th, thead td');\n headers.forEach(cell => {\n const isCollapsed = cell.getAttribute('collapsed') === 'true';\n if (isCollapsed && cell.getAttribute('collapsible') !== 'true') {\n cell.setAttribute('collapsible', 'true');\n }\n });\n }\n\n static #generateCell(host, $tbl) {\n\n const targetAttributes = ['data-bind', 'data-expr', 'type'];\n let autoIdCounter = 0;\n\n $tbl.querySelectorAll('tbody th, tbody td').forEach($cell => {\n const cellType = $cell.getAttribute('cell-type') || \"renderer\";\n const tagName = `cell-${cellType}`;\n\n const $datalist = $cell.querySelector(\"datalist\");\n\n if ($datalist) {\n let l = [];\n $datalist.querySelectorAll('option').forEach($option => {\n l.push({\n k: $option.getAttribute(\"k\"),\n v: $option.getAttribute(\"v\"),\n value: $option.getAttribute(\"value\"),\n });\n });\n\n const uniqueFuncName = `__ds_${Date.now()}_${++autoIdCounter}`;\n\n if (host) {\n host[uniqueFuncName] = () => l;\n }\n\n $cell.setAttribute(\"data-source\", `host.${uniqueFuncName}()`);\n\n $datalist.remove();\n }\n\n const expr = $cell.dataset.expr;\n if (expr) {\n $cell.setAttribute('data-expr', host.exprEngine.precompile(expr));\n }\n\n Array.from($cell.attributes).forEach(attr => {\n if (['data-bind', 'data-expr', 'cell-type', 'validator'].includes(attr.name)) return;\n if (attr.value.includes(\"data.\") || attr.value.includes(\"host.\")) {\n $cell.setAttribute(attr.name, host.exprEngine.precompile(attr.value));\n }\n });\n\n const innerAttrs = targetAttributes\n .filter(attr => $cell.hasAttribute(attr))\n .map(attr => `${attr}=\"${$cell.getAttribute(attr)}\"`);\n\n $cell.innerHTML = `<${tagName} ${innerAttrs.join(' ')}></${tagName}>`;\n $cell.setAttribute('tabindex', '0');\n });\n\n $tbl.querySelectorAll('thead th, thead td, tfoot th, tfoot td').forEach($cell => {\n const cellType = $cell.getAttribute('cell-type');\n if (cellType) {\n const originalContent = $cell.innerHTML;\n const tagName = `cell-${cellType}`;\n const innerAttrs = targetAttributes\n .filter(attr => $cell.hasAttribute(attr))\n .map(attr => `${attr}=\"${$cell.getAttribute(attr)}\"`);\n\n $cell.innerHTML = `<${tagName} ${innerAttrs.join(' ')} content=\"${originalContent}\"></${tagName}>`;\n }\n });\n }\n\n static #initFilterButtons(host, tbl) {\n const hostFilter = host.getAttribute('filtering') === 'true';\n const tableFilter = tbl.getAttribute('filtering') === 'true';\n\n tbl.querySelectorAll('thead tr:not(.col-indicator-rowgroup) th, thead tr:not(.col-indicator-rowgroup) td').forEach(cell => {\n const finalFiltering = cell.getAttribute('filtering') === 'true' || tableFilter || hostFilter;\n\n cell.setAttribute('filtering', finalFiltering ? 'true' : 'false');\n\n if (finalFiltering) {\n cell.appendChild(document.createElement('nine-table-filter-button'));\n }\n });\n }\n\n static #initColExpanders(tbl) {\n\n tbl.querySelectorAll('thead th, thead td').forEach(cell => {\n const isCollapsible = cell.getAttribute('collapsible') === 'true' || cell.getAttribute('expandable') === 'true';\n if (!isCollapsible) return;\n\n const colIndex = parseInt(cell.dataset.col, 10);\n const colSpan = cell.colSpan || 1;\n const col = tbl.querySelector(`colgroup col[data-col=\"${colIndex}\"]`);\n\n const currentWidth = col ? (parseInt(col.getAttribute('width'), 10) || 100) : 100;\n\n if (!cell.dataset.expandWidth || parseInt(cell.dataset.expandWidth, 10) <= COLLAPSED_WIDTH) {\n cell.dataset.expandWidth = String(currentWidth > COLLAPSED_WIDTH ? currentWidth : 100);\n }\n\n let expandBtn = cell.querySelector('nine-table-col-expand');\n if (!expandBtn) {\n expandBtn = document.createElement('nine-table-col-expand');\n cell.insertBefore(expandBtn, cell.firstChild);\n }\n\n const isCollapsed = cell.getAttribute('collapsed') === 'true';\n\n if (isCollapsed) {\n expandBtn.classList.add('collapsed');\n expandBtn.classList.remove('expand');\n expandBtn.setAttribute('collapsed', 'true');\n cell.style.color = 'transparent';\n\n const targetWidth = Math.max(10, Math.floor(COLLAPSED_WIDTH / colSpan));\n if (!isNaN(colIndex)) {\n for (let i = 0; i < colSpan; i++) {\n const targetCol = tbl.querySelector(`colgroup col[data-col=\"${colIndex + i}\"]`);\n if (targetCol) {\n targetCol.setAttribute('width', targetWidth);\n targetCol.style.width = `${targetWidth}px`;\n }\n }\n }\n } else {\n expandBtn.classList.remove('collapsed');\n expandBtn.classList.add('expand');\n expandBtn.setAttribute('collapsed', 'false');\n cell.style.color = '';\n }\n });\n }\n\n static #ensureRowIndicator(tbl, host) {\n\n const w = tbl.getAttribute(\"row-indicator\") === 'true' ? 48 : 0;\n\n const colgroup = tbl.querySelector('colgroup');\n\n\n const col = document.createElement('col');\n //col.className = 'row-indicator-col';\n col.setAttribute('fixed', 'left');\n col.setAttribute('width', w);\n col.style.width = `${w}px`;\n colgroup.prepend(col);\n\n\n tbl.querySelectorAll('thead, tbody, tfoot').forEach(section => {\n const rows = Array.from(section.querySelectorAll('tr'));\n if (rows.length === 0) return;\n\n const firstTr = rows[0];\n\n const indicatorCell = document.createElement('th');\n indicatorCell.className = 'row-indicator';\n indicatorCell.setAttribute('cell-type', 'row-indicator');\n\n if (rows.length > 1) {\n indicatorCell.rowSpan = rows.length;\n }\n\n firstTr.insertBefore(indicatorCell, firstTr.firstElementChild);\n });\n }\n\n static #applyInitialCellWidths(tbl) {\n\n tbl.querySelectorAll('th[data-col], td[data-col]').forEach(cell => {\n\n const startColIdx = parseInt(cell.getAttribute('data-col'), 10);\n if (isNaN(startColIdx)) return;\n\n\n const colSpan = parseInt(cell.getAttribute('colspan') || cell.colSpan, 10) || 1;\n let totalWidth = 0;\n\n\n for (let i = 0; i < colSpan; i++) {\n const targetIdx = startColIdx + i;\n const col = tbl.querySelector(`colgroup col[data-col=\"${targetIdx}\"]`);\n if (col) {\n totalWidth += parseInt(col.getAttribute('width'), 10) || 100;\n }\n }\n\n if (totalWidth > 0) {\n const widthVal = `${totalWidth}px`;\n cell.style.width = widthVal;\n cell.style.minWidth = widthVal;\n cell.style.maxWidth = widthVal;\n }\n });\n }\n}\n","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\n\nexport class SheetAPI {\n #sheet;\n #host;\n\n constructor(sheet) {\n this.#sheet = sheet;\n this.#host = sheet.getRootNode().host;\n }\n\n /**\n currentRow = () => {\n let rows = this.currentRows();\n return (rows.length === 0) ? -1 : rows[0];\n }\n currentRows = () => {\n\n let rows = [];\n this.#shadowRoot.querySelectorAll('nine-table-sheet.active').forEach($sheet => {\n\n const arr = $sheet.view.getArray($sheet.selection.minRow);\n const rowid = arr.m._[NINE_TABLE.META.INDEX.ROWID];\n\n //trace.log(this.data.getArray($sheet.selection.minRow));\n\n rows.push(rowid);\n });\n\n return rows;\n } */\n\n\n row = {\n at: () => {\n return Math.floor(this.#sheet.selection.minRow / this.#sheet.template.length)\n },\n focus: (index) => {\n if (!this.#sheet.row.isVisible(index)) {\n this.#sheet.row.moveTo(index);\n }\n const $trs = this.#sheet.querySelectorAll(`tbody.body tr[data-index=\"${index}\"]`);\n const matrixRows = Array.from($trs, $tr => parseInt($tr.dataset.matrixRow, 10)).filter(n => !isNaN(n));\n\n // 2. col๋ค๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฐฐ์ด๋ก ์์ง (colSpan ๊ณ ๋ ค)\n const cols = [];\n $trs.forEach($tr => {\n $tr.querySelectorAll('td, th').forEach($cell => {\n const col = parseInt($cell.dataset.col, 10);\n if (col != 0) cols.push(parseInt($cell.dataset.col, 10));\n });\n });\n\n return this.#sheet.selection.setRange(Math.min(...matrixRows), Math.min(...cols), Math.max(...matrixRows), Math.max(...cols));\n },\n isVisible: (index) => {\n\n const $sheetBody = this.#sheet.querySelector('.ng-sheet-body');\n\n const $trs = $sheetBody.querySelectorAll(`.ng-container-body tbody.body tr[data-index=\"${index}\"]`);\n if (!$trs || $trs.length === 0) return false;\n\n const viewportRect = $sheetBody.getBoundingClientRect();\n const theadHeight = $sheetBody.querySelector('thead')?.offsetHeight || 0;\n const tfootHeight = $sheetBody.querySelector('tfoot')?.offsetHeight || 0;\n\n const viewportTop = viewportRect.top + theadHeight;\n const viewportBottom = viewportRect.bottom - tfootHeight;\n\n let isVisible = true;\n\n for (const $tr of $trs) {\n const trRect = $tr.getBoundingClientRect();\n\n const isAbove = trRect.top < viewportTop;\n const isBelow = trRect.bottom > viewportBottom;\n\n if (isAbove || isBelow) {\n isVisible = false;\n break;\n }\n }\n\n return isVisible;\n },\n add: (dataSource, updateState) => {\n return this.#host.data.add(dataSource, updateState);\n },\n moveTo: (index, callback) => {\n if (this.#sheet.row.isVisible(index)) {\n\n } else {\n this.#sheet.scrollTo(index, callback);\n }\n },\n insert: (index, dataSource, updateState = true) => {\n\n const currentJson = this.#sheet.view.get(index);\n const rowid = currentJson.m._[NINE_TABLE.META.INDEX.ROWID];\n\n const toRowid = this.#host.data.insert(rowid, dataSource, updateState);\n const records = this.#sheet.view.getArray();\n\n const targetIndex = records.findIndex(record => {\n if (!record || !record.m || !record.m._) return false;\n return record.m._[NINE_TABLE.META.INDEX.ROWID] === toRowid; // ํ์
์ฐจ์ด ๋ฐฉ์ง๋ฅผ ์ํด == ์ฌ์ฉ\n });\n\n return targetIndex;\n },\n remove: (index) => {\n\n const currentJson = this.#sheet.view.get(index);\n const rowid = currentJson.m._[NINE_TABLE.META.INDEX.ROWID];\n\n this.#host.data.remove(rowid);\n },\n };\n}","import { trace } from \"@nopeer\";\nimport './nine-table-hscrollbar.js';\nimport './nine-table-vscrollbar.js';\nimport { RowManager } from './core/RowManager.js';\nimport { TableCompiler } from \"./core/TableCompiler.js\";\nimport { CellSelection } from \"@/cell-manager/CellSelection.js\";\nimport { CellNavigation } from \"@/cell-manager/CellNavigation.js\";\n\nimport { ColResizer } from \"@/col/ColResizer.js\";\nimport { ColMover } from \"@/col/ColMover.js\";\nimport { ColFixManager } from \"@/col/ColFixManager.js\";\n\nimport { Filtering } from \"@/data/Filtering.js\";\nimport { GroupingManager } from \"@/data/Grouping.js\";\nimport { Sorting } from \"@/data/Sorting.js\";\nimport { SheetView } from \"@/data/SheetView.js\";\n\nimport { PreCompiler } from \"@/layout/core/PreCompiler.js\";\nimport { SheetAPI } from \"@/api/SheetAPI.js\";\n\nexport class NineTableSheet extends HTMLElement {\n #index;\n #host;\n #rowManager;\n #cellSelection;\n #cellNavigation;\n #colResizer;\n #colMover;\n #colFix;\n #sorting;\n #filtering;\n #grouping;\n #api;\n\n #view;\n\n #source = {\n table: null,\n };\n\n #elements;\n #trTemplateHeight;\n #template = {\n length: 0,\n height: 0,\n heights: [],\n };\n\n static SCROLLBAR_SIZE = 16;\n\n constructor() {\n super();\n\n this.#host = this.getRootNode().host;\n this.#rowManager = new RowManager(this);\n\n this.#api = new SheetAPI(this);\n\n this.#bindApiMethods();\n }\n\n connectedCallback() {\n this.#init();\n }\n\n get template() { return this.#template; }\n get index() { return this.#index; }\n get colResizer() { return this.#colResizer; }\n get filtering() { return this.#filtering; }\n get grouping() { return this.#grouping; }\n get colMover() { return this.#colMover; }\n get colFix() { return this.#colFix; }\n get rowManager() { return this.#rowManager; }\n get selection() { return this.#cellSelection; }\n get navigation() { return this.#cellNavigation; }\n get templateLength() { return this.#source.tbody.tr.length || 0; }\n\n get elements() { return this.#elements; }\n\n /**\n get template() {\n return {\n length: this.#source?.tbody?.tr?.length || 0,\n trs: this.#source?.tbody?.tr || []\n };\n } */\n\n get isAutoFitCol() {\n const attrTrue = this.getAttribute('auto-fit-col') === 'true' || this.#host?.getAttribute('auto-fit-col') === 'true';\n const sourceTableTrue = this.#source.table?.getAttribute('auto-fit-col') === 'true';\n return attrTrue || sourceTableTrue;\n }\n\n get sourceTable() {\n return this.#source.table;\n }\n\n get source() {\n return this.#source;\n }\n\n get #isSimple() {\n return this.#host.hasAttribute('simple') || this.#host.getAttribute('theme') === 'simple';\n }\n\n scrollTo = (dataRow, callback) => {\n this.rowManager.scrollToDataRow(dataRow, 'top', callback);\n }\n\n recompileAndRefresh() {\n if (!this.#source.table) return;\n\n TableCompiler.recompile(this.#source.table);\n\n ['left', 'right', 'body'].forEach(type => {\n ['header', 'body', 'footer'].forEach(section => {\n const container = this.querySelector(`.ng-sheet-${section} .ng-container-${type}`);\n if (!container) return;\n container.querySelectorAll('table').forEach(tbl => tbl.remove());\n });\n });\n\n this.#renderSplitContainers();\n\n this.#updateContainerWidths();\n\n this.#rowManager.initialize();\n\n if (this.isAutoFitCol) {\n this.autoFit(true);\n } else {\n this.querySelector('nine-table-hscrollbar')?.refresh();\n }\n\n requestAnimationFrame(() => {\n this.#updateContainerWidths();\n this.#rowManager?.refresh();\n });\n }\n\n refreshLayout() {\n\n requestAnimationFrame(() => {\n\n if (!this.classList.contains('active') || !this.#source.table) return;\n\n this.#updateContainerWidths();\n\n if (this.isAutoFitCol) {\n this.autoFit(true);\n } else {\n this.querySelector('nine-table-hscrollbar')?.refresh();\n }\n\n this.#adjustOverlay();\n\n this.#colResizer?.refreshLayout();\n\n this.#rowManager?.refresh();\n });\n }\n\n #adjustOverlay = () => {\n const $thead = this.querySelector('.ng-container-body thead');\n const $overlay = this.querySelector('.nodata-overlay');\n $overlay.style.top = `${$thead?.offsetHeight}px`;\n }\n\n get view() {\n if (!this.#view && this.#host?.data) {\n this.#view = new SheetView(this);\n }\n return this.#view;\n }\n\n invalidate = () => {\n\n this.view.refresh();\n\n this.#rowManager.refresh(true);\n\n if (this.isAutoFitCol) {\n this.autoFit(true);\n }\n };\n\n autoFit = (enable = true) => {\n requestAnimationFrame(() => {\n this.#autoFit?.(enable);\n });\n };\n\n #autoFit = (enable = true) => {\n\n const container = this.querySelector('.ng-sheet-body .ng-container-body');\n if (!container) return;\n\n const firstColgroup = this.querySelector('.ng-container-body table colgroup');\n if (!firstColgroup) return;\n\n if (enable) {\n this.setAttribute('auto-fit-col', 'true');\n const containerWidth = container.clientWidth;\n if (containerWidth <= 0) return;\n\n let totalOriginalWidth = 0;\n const colList = [];\n\n firstColgroup.querySelectorAll('col').forEach(col => {\n const globalColIndex = col.getAttribute('data-col');\n const headerCell = this.querySelector(`thead th[data-col=\"${globalColIndex}\"]`);\n const isCollapsed = headerCell?.getAttribute('collapsed') === 'true';\n\n if (isCollapsed) {\n colList.unshift({ globalColIndex, width: 16, isCollapsed: true });\n } else {\n const w = parseInt(col.getAttribute('width'), 10) || 100;\n colList.push({ globalColIndex, width: w, isCollapsed: false });\n totalOriginalWidth += w;\n }\n });\n\n const collapsedTotalWidth = colList\n .filter(c => c.isCollapsed)\n .reduce((sum, c) => sum + c.width, 0);\n\n const availableWidth = Math.max(0, containerWidth - collapsedTotalWidth);\n\n if (totalOriginalWidth > 0 && colList.length > 0) {\n let allocatedTotal = 0;\n\n const calculatedCols = colList.map(item => {\n if (item.isCollapsed) {\n return { globalColIndex: item.globalColIndex, remainder: 0, width: 16 };\n }\n\n const exactWidth = (item.width * availableWidth) / totalOriginalWidth;\n const baseWidth = Math.max(30, Math.floor(exactWidth));\n allocatedTotal += baseWidth;\n return {\n globalColIndex: item.globalColIndex,\n remainder: exactWidth - Math.floor(exactWidth),\n width: baseWidth\n };\n });\n\n let remainderPixels = availableWidth - allocatedTotal;\n\n const uncollapsedCols = calculatedCols.filter(c => !colList.find(item => item.globalColIndex === c.globalColIndex)?.isCollapsed);\n\n if (remainderPixels > 0 && uncollapsedCols.length > 0) {\n uncollapsedCols.sort((a, b) => b.remainder - a.remainder);\n for (let i = 0; i < remainderPixels; i++) {\n uncollapsedCols[i % uncollapsedCols.length].width += 1;\n }\n } else if (remainderPixels < 0 && uncollapsedCols.length > 0) {\n uncollapsedCols.sort((a, b) => a.remainder - b.remainder);\n for (let i = 0; i < Math.abs(remainderPixels); i++) {\n const target = uncollapsedCols[i % uncollapsedCols.length];\n if (target.width > 30) target.width -= 1;\n }\n }\n\n calculatedCols.forEach(({ globalColIndex, width }) => {\n this.#colResizer?.setColumnWidth(globalColIndex, width, 'body');\n });\n }\n } else {\n this.removeAttribute('auto-fit-col');\n }\n\n this.querySelector('nine-table-hscrollbar')?.refresh();\n }\n\n generateTemplate = ($table, index) => {\n\n this.#index = index;\n\n this.#source = {\n table: TableCompiler.compile($table),\n tbody: {\n tr: $table.querySelectorAll(\"tbody tr\"),\n }\n };\n\n this.querySelector(`.ng-container-body`).appendChild(this.#source.table);\n\n this.#template.height = this.#template.length = 0;\n this.#template.heights = [];\n this.querySelectorAll(`.ng-container-body tbody.body tr`).forEach(($tr) => {\n this.#template.height += $tr.offsetHeight || 0;\n this.#template.heights.push($tr.offsetHeight || 0);\n });\n this.#template.length = this.#template.heights.length;\n\n if (this.#index === 0) {\n const minRows = parseInt(this.#host.getAttribute('display-min-rows'), 10);\n const maxRows = parseInt(this.#host.getAttribute('display-max-rows'), 10);\n\n const h = (this.querySelector(\"nine-table-toolbar\")?.offsetHeight || 0) +\n (this.querySelector(\"nine-table-footer\")?.offsetHeight || 0) +\n (this.querySelector(\"thead\")?.offsetHeight || 0) +\n (this.querySelector(\"tfoot\")?.offsetHeight || 0) +\n (this.querySelector(\"tbody.head\")?.offsetHeight || 0);\n\n if (this.#host.getAttribute('auto-height') === \"true\" || !isNaN(minRows) || !isNaN(maxRows)) {\n this.#host.setAttribute('scroll-bar', \"none\");\n }\n\n if (!isNaN(minRows)) {\n this.#host.style.minHeight = h + (this.#template.height * minRows) + \"px\";\n }\n\n if (!isNaN(maxRows)) {\n this.#host.style.maxHeight = h + (this.#template.height * maxRows) + \"px\";\n }\n }\n\n this.querySelectorAll((\"tbody.body tr\")).forEach(($tr) => {\n $tr.style.display = \"none\";\n })\n\n this.querySelector(`.ng-container-body table`).remove();\n };\n\n generate = () => {\n\n this.#renderSplitContainers();\n\n this.#updateContainerWidths();\n\n this.#syncHeaderAndFooterHeights();\n\n this.#initRowHoverEvent();\n\n ['left', 'body', 'right'].forEach(type => {\n const prefix = `.ng-container-${type}`;\n this.#elements[type] = {\n thead: this.querySelector(`${prefix} thead`),\n tbody: {\n head: this.querySelector(`${prefix} tbody.head`),\n body: this.querySelector(`${prefix} tbody.body`),\n foot: this.querySelector(`${prefix} tbody.foot`),\n },\n tfoot: this.querySelector(`${prefix} tfoot`),\n };\n });\n\n this.#rowManager.initialize();\n\n if (this.isAutoFitCol) {\n this.autoFit(true);\n } else {\n this.querySelector('nine-table-hscrollbar').refresh();\n }\n\n this.#grouping.initialize();\n\n this.loaded = true;\n };\n\n\n #updateContainerWidths = () => {\n\n ['left', 'right', 'body'].forEach(type => {\n const containers = this.querySelectorAll(`.ng-container-${type}`);\n if (containers.length === 0) return;\n\n const firstTable = containers[0].querySelector('table');\n if (!firstTable) return;\n\n let width = 0;\n firstTable.querySelectorAll('col').forEach(col => {\n const w = parseInt(col.getAttribute('width'), 10);\n if (!isNaN(w)) width += w;\n });\n\n containers.forEach(container => {\n const tables = container.querySelectorAll('table');\n if (type === 'body') {\n container.style.flex = `1`;\n } else {\n container.style.flex = `0 0 ${width}px`;\n container.style.width = `${width}px`;\n container.style.minWidth = `${width}px`;\n container.style.maxWidth = `${width}px`;\n }\n });\n });\n };\n\n #renderSplitContainers = () => {\n const colTypes = [\n { selector: '.ng-container-left', type: 'left' },\n { selector: '.ng-container-body', type: null },\n { selector: '.ng-container-right', type: 'right' }\n ];\n\n colTypes.forEach(({ selector, type }) => {\n this.querySelector(`.ng-sheet-body ${selector}`).appendChild(this.#createSplitTable(type));\n });\n };\n\n #createSplitTable = (targetFixedType) => {\n\n const $tbl = this.#source.table.cloneNode(true);\n\n if (targetFixedType === 'left') {\n $tbl.querySelectorAll(\"col, th, td\").forEach($el => {\n if ($el.getAttribute(\"fixed\") !== \"left\") $el.remove();\n });\n } else if (targetFixedType === 'right') {\n $tbl.querySelectorAll(\"col, th, td\").forEach($el => {\n if ($el.getAttribute(\"fixed\") !== \"right\") $el.remove();\n });\n } else {\n $tbl.querySelectorAll(\"[fixed=left], [fixed=right]\").forEach($el => {\n $el.remove();\n });\n }\n\n return $tbl;\n };\n\n getRowHeight = () => {\n return this.#rowManager.getRowHeight();\n };\n\n getViewHeight = () => {\n\n const viewHeight = this.#elements.content.offsetHeight || 0;\n\n const fixedHeight = (this.#elements.body.thead?.offsetHeight || 0) +\n (this.#elements.body.tfoot?.offsetHeight || 0) +\n (this.#elements.body.tbody.head.offsetHeight || 0);\n\n return viewHeight - fixedHeight;\n };\n\n isLastRow = () => {\n\n const sheet = this.querySelector('.ng-sheet-body');\n const tbody = this.querySelector(\".ng-container-body tbody.body\");\n\n const offsetHeight = (this.#elements.body.tfoot?.offsetHeight || 0);\n\n const sheetBottom = sheet.getBoundingClientRect().bottom;\n const tbodyBottom = tbody.getBoundingClientRect().bottom;\n\n return (sheetBottom - offsetHeight) >= tbodyBottom;\n };\n\n scrollToX = (scrollLeft) => {\n const bodyContainer = this.querySelector('.ng-sheet-body .ng-container-body');\n if (bodyContainer) bodyContainer.scrollLeft = scrollLeft;\n };\n\n scrollToY = (scrollTop) => {\n const bodyViewport = this.querySelector('.ng-sheet-body');\n if (bodyViewport) bodyViewport.scrollTop = scrollTop;\n };\n\n #init = () => {\n\n this.#render();\n\n this.#cellSelection = new CellSelection(this);\n this.#cellNavigation = new CellNavigation(this);\n this.#colResizer = new ColResizer(this);\n this.#colMover = new ColMover(this);\n this.#colFix = new ColFixManager(this);\n\n this.#view = new SheetView(this);\n this.#filtering = new Filtering(this);\n this.#grouping = new GroupingManager(this);\n\n if (!this.#isSimple) {\n this.#sorting = new Sorting(this);\n }\n\n this.#elements.mainBody.addEventListener('scroll', () => {\n this.querySelector(\"nine-table-hscrollbar\").refresh();\n });\n };\n\n\n\n #render = () => {\n\n this.innerHTML = `\n <div class=\"ng-sheet-body\">\n <div class=\"ng-sheet-body-content\">\n <div class=\"ng-container-left\"></div>\n <div class=\"ng-container-body\">\n \n </div>\n <div class=\"ng-container-right\"></div>\n </div>\n <div class=\"ng-virtual-height-holder\"></div>\n </div>\n\n <div class=\"nodata-overlay\">Data Not Found</div>\n\n <nine-table-vscrollbar></nine-table-vscrollbar>\n <nine-table-hscrollbar></nine-table-hscrollbar>\n <div class=\"scroll-edge\"></div>\n \n <nine-table-col-resizer-panel></nine-table-col-resizer-panel>\n \n <div class=\"ng-col-mover-grip\"></div>\n <div class=\"ng-col-mover-indi\"></div>\n `;\n\n this.#elements = {\n mainBody: this.querySelector('.ng-sheet-body .ng-container-body'),\n hscrollbar: this.querySelector('nine-table-hscrollbar'),\n vscrollbar: this.querySelector('nine-table-vscrollbar'),\n content: this.querySelector('.ng-sheet-body .ng-sheet-body-content'),\n scrollHolder: this.querySelector('.ng-sheet-body .ng-virtual-height-holder'),\n }\n };\n\n #syncHeaderAndFooterHeights = () => {\n\n const leftTable = this.querySelector('.ng-container-left table');\n const bodyTable = this.querySelector('.ng-container-body table');\n const rightTable = this.querySelector('.ng-container-right table');\n\n const leftHeaderRows = Array.from(leftTable.querySelectorAll('thead tr:not(.col-indicator-rowgroup)'));\n const bodyHeaderRows = Array.from(bodyTable.querySelectorAll('thead tr:not(.col-indicator-rowgroup)'));\n const rightHeaderRows = Array.from(rightTable.querySelectorAll('thead tr:not(.col-indicator-rowgroup)'));\n\n this.#applyMaxHeights(leftHeaderRows, bodyHeaderRows, rightHeaderRows);\n\n const leftFooterRows = Array.from(leftTable.querySelectorAll('tfoot tr'));\n const bodyFooterRows = Array.from(bodyTable.querySelectorAll('tfoot tr'));\n const rightFooterRows = Array.from(rightTable.querySelectorAll('tfoot tr'));\n\n this.#applyMaxHeights(leftFooterRows, bodyFooterRows, rightFooterRows);\n };\n\n #applyMaxHeights = (leftRows, bodyRows, rightRows) => {\n\n setTimeout(() => {\n const maxRows = Math.max(leftRows.length, bodyRows.length, rightRows.length);\n\n for (let i = 0; i < maxRows; i++) {\n\n const heights = [\n leftRows[i]?.getBoundingClientRect().height || 0,\n bodyRows[i]?.getBoundingClientRect().height || 0,\n rightRows[i]?.getBoundingClientRect().height || 0\n ];\n const maxHeight = Math.max(...heights);\n\n if (maxHeight > 0) {\n if (leftRows[i]) leftRows[i].style.height = `${maxHeight}px`;\n if (bodyRows[i]) bodyRows[i].style.height = `${maxHeight}px`;\n if (rightRows[i]) rightRows[i].style.height = `${maxHeight}px`;\n }\n }\n });\n };\n\n #initRowHoverEvent = () => {\n const bodyViewport = this.querySelector('.ng-sheet-body');\n if (!bodyViewport) return;\n\n let activeRowIndex = null;\n\n bodyViewport.addEventListener('mouseover', (e) => {\n const tr = e.target.closest('tr');\n if (!tr || !tr.dataset.row && tr.dataset.row !== '0') return;\n\n const rowIndex = tr.dataset.row;\n if (activeRowIndex === rowIndex) return;\n activeRowIndex = rowIndex;\n\n bodyViewport.querySelectorAll(`tr[data-row=\"${rowIndex}\"]`).forEach($tr => {\n $tr.classList.add('hover');\n });\n });\n\n bodyViewport.addEventListener('mouseout', (e) => {\n const tr = e.target.closest('tr');\n if (!tr) return;\n\n const relatedTarget = e.relatedTarget;\n if (tr.contains(relatedTarget)) return;\n\n bodyViewport.querySelectorAll('tr.hover').forEach($tr => {\n $tr.classList.remove('hover');\n });\n activeRowIndex = null;\n });\n }\n\n #bindApiMethods = () => {\n //const apis = [this.#sheetAPI, this.#dataAPI];\n const apis = [this.#api];\n\n apis.forEach(api => {\n // api ์ธ์คํด์ค(this)์ ์ง์ ์ ์ธ๋ ์์ฑ๋ค๊ณผ ํ๋กํ ํ์
์์ฑ์ ๋ชจ๋ ๊ฐ์ ธ์ด\n // Reflect.ownKeys๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ณผ์ด๋ ์จ๊ฒจ์ง ํ๋กํผํฐ๊น์ง ์์ ํ๊ฒ ํ์ ๊ฐ๋ฅํฉ๋๋ค.\n const keys = new Set([\n ...Reflect.ownKeys(api),\n ...Reflect.ownKeys(Object.getPrototypeOf(api))\n ]);\n\n keys.forEach(key => {\n // constructor๋ ๋ด๋ถ ํ๋ผ์ด๋น ๋ฉค๋ฒ(#)๋ ์ ์ธ\n if (key === 'constructor' || String(key).startsWith('#')) return;\n\n const target = api[key];\n\n if (typeof target === 'function') {\n if (!this[key]) {\n //trace.log(`[Binding Function] ${key}`);\n this[key] = (...args) => target.apply(api, args);\n }\n } else if (target !== null && typeof target === 'object') {\n\n if (!this[key]) {\n //trace.log(`[Binding Object Namespace] ${key}`);\n this[key] = target; // ๊ฐ์ฒด ๋ค์์คํ์ด์ค(์: row) ํต์งธ๋ก ์ฐ๊ฒฐ\n }\n }\n });\n });\n }\n\n disconnectedCallback() {\n this.#colResizer?.destroy();\n this.#colMover?.destroy();\n this.innerHTML = '';\n }\n}\n\nif (!customElements.get('nine-table-sheet')) {\n customElements.define('nine-table-sheet', NineTableSheet);\n}","import { trace } from \"@nopeer\";\nimport '@/layout/nine-table-sheets.js';\nimport '@/layout/nine-table-sheets-footer.js';\nimport '@/layout/nine-table-toolbar.js';\nimport { NineTableSheet } from \"@/layout/nine-table-sheet.js\";\nimport {PreCompiler} from \"@/layout/core/PreCompiler.js\";\nimport {NINE_TABLE} from \"@\";\n\nexport class LayoutManager {\n #host;\n\n constructor(owner) {\n this.#host = owner;\n this.#init();\n }\n\n #init = () => {\n this.#render();\n this.#initEvent();\n }\n\n set loading(val) {\n if (!!val) {\n this.#host.classList.add(\"loading\");\n } else {\n this.#host.classList.remove(\"loading\");\n }\n }\n\n\n\n #render = () => {\n\n const rawElements = Array.from(this.#host.children);\n const rawTables = rawElements.filter(el => (el.tagName.toUpperCase() === 'TABLE') );\n const sheetCount = rawTables.length;\n\n const sheetsHtml = rawTables.map((tbl, idx) => {\n const className = idx === 0 ? 'active' : '';\n const sheetId = tbl.id || `sheet${idx + 1}`;\n\n const sheetTag = `<nine-table-sheet class=\"${className}\" data-index=\"${idx}\" data-sheet-id=\"${sheetId}\" id=\"${sheetId}\"></nine-table-sheet>`;\n const splitterTag = idx < sheetCount - 1 ? `<nine-splitter class=\"h\" data-split-index=\"${idx}\"></nine-splitter>` : '';\n return sheetTag + splitterTag;\n }).join('');\n\n const cssImports = [\n `@import \"https://cdn.jsdelivr.net/npm/@ninebone/datagrid@${__APP_VERSION__}/dist/css/nine-table.css\";`,\n ];\n\n if (nine[\"nine-table\"] && nine[\"nine-table\"].cssFile) {\n cssImports.push(`@import \"${nine[\"nine-table\"].cssFile}\";`);\n }\n\n this.#host.shadowRoot.innerHTML = `\n <style>\n ${cssImports.join('\\n')}\n ${this.#host.provider.style.value}\n </style>\n \n <nine-table-toolbar></nine-table-toolbar>\n\n <nine-table-body>\n <nine-table-summary></nine-table-summary>\n <div class=\"ng-loading-bar\"></div>\n <nine-table-sheets>\n <nine-table-sheets-body>\n ${sheetsHtml}\n </nine-table-sheets-body>\n <nine-table-sheets-footer></nine-table-sheets-footer>\n </nine-table-sheets>\n <nine-table-analysis></nine-table-analysis>\n </nine-table-body>\n <nine-table-footer></nine-table-footer>\n `;\n\n rawTables.forEach($el => {\n PreCompiler.initializeTable(this.#host, $el);\n })\n\n this.#host.shadowRoot.querySelectorAll('nine-table-sheet').forEach(($sheet, idx) => {\n $sheet.classList.add('active');\n $sheet.generateTemplate(rawTables[idx], idx);\n });\n\n this.#host.shadowRoot.querySelectorAll('nine-table-sheet').forEach(($sheet) => {\n\n setTimeout(() => {\n $sheet.generate();\n if (this.#isAutoHeight) this.#applyAutoHeight();\n });\n });\n\n setTimeout(() => {\n this.#host.data.clear();\n });\n };\n\n #initEvent = () => {\n\n this.#host.addEventListener(NINE_TABLE.EVENT.ROW_ADDED, () => {\n if (this.#isAutoHeight) this.#applyAutoHeight();\n });\n\n this.#host.addEventListener(NINE_TABLE.EVENT.ROW_REMOVED, () => {\n if (this.#isAutoHeight) this.#applyAutoHeight();\n });\n\n let lastHeight = 0; // ์ง์ ๋์ด๋ฅผ ๊ธฐ์ตํ ๋ณ์\n\n new ResizeObserver((entries) => {\n for (let entry of entries) {\n if (entry.target.tagName === \"NINE-TABLE\") {\n const currentHeight = entry.contentRect.height;\n\n if (currentHeight !== lastHeight) {\n lastHeight = currentHeight;\n if (this.#isAutoHeight) {\n this.#applyAutoHeight();\n }\n }\n }\n }\n }).observe(this.#host);\n };\n\n #applyAutoHeight = () => {\n this.#host.shadowRoot.querySelectorAll('nine-table-sheet').forEach(($sheet) => {\n if ($sheet.index === 0) {\n trace.log($sheet, $sheet.template.height, $sheet.view.count());\n\n const fixedHeight = ($sheet.querySelector(\"thead\")?.offsetHeight || 0) +\n ($sheet.querySelector(\"tfoot\")?.offsetHeight || 0) +\n ($sheet.querySelector(\"tbody.head\")?.offsetHeight || 0);\n const basicHeight = this.#host.offsetHeight - $sheet.offsetHeight + fixedHeight;\n\n const h = Math.min($sheet.template.height * $sheet.view.count(), window.innerHeight * 0.8);\n\n this.#host.style.height = basicHeight + (h) + \"px\";\n }\n });\n };\n\n get #isAutoHeight() {\n return this.#host.getAttribute('auto-height') === 'true';\n }\n}","import { trace } from \"@nopeer\";\n\nexport class ExprEngine {\n #host;\n #fields;\n #exprCache = new Map(); // ๐ก ํตํฉ๋ ๋จ์ผ ์บ์๋ก ๋ชจ๋ ์ปดํ์ผ๋ ํจ์ ๊ด๋ฆฌ\n\n constructor(host) {\n this.#host = host;\n this.#fields = host.fields.get();\n }\n\n rewriteExpr(expr) {\n\n if (!expr || !this.#fields.length) return expr;\n\n return expr.replace(/data\\.([a-zA-Z_$][\\w$]*)/g, (match, fieldName) => {\n const idx = this.#fields.indexOf(fieldName);\n return idx >= 0 ? `rowItem.v[${idx}]` : match;\n });\n }\n\n precompile(expr) {\n if (!expr) return expr;\n return this.rewriteExpr(expr);\n }\n\n evaluate(expr, rowItem, row = 0) {\n\n if (expr === undefined || expr === null) return \"\";\n\n try {\n const trimmedExpr = String(expr).trim();\n const compiledExpr = this.rewriteExpr(trimmedExpr);\n\n if (compiledExpr.includes(\"provider.\") || compiledExpr.includes(\"host.\") || compiledExpr.includes(\"data.\") || compiledExpr.includes(\"rowItem.v\") || compiledExpr.includes(\"(\")) {\n\n let evalFn = this.#exprCache.get(compiledExpr);\n\n if (!evalFn) {\n evalFn = new Function('rowItem', 'row', 'host', `\n const data = rowItem;\n const provider = host;\n\n if (!data && !host) return \"\";\n return ${compiledExpr};\n `);\n\n this.#exprCache.set(compiledExpr, evalFn);\n }\n\n return evalFn(rowItem, row, this.#host);\n }\n\n return compiledExpr;\n } catch (e) {\n /**\n if (expr.includes(\"getCommonCode\")) {\n console.trace(\"ExprEngine evaluation error:\", e);\n } */\n return expr;\n }\n }\n}","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\n\nexport class DataAPI {\n\n #host;\n\n constructor(host) {\n this.#host = host;\n }\n\n provider = {\n // ์คํ์ผ ๋ฐ์ดํฐ๋ฅผ provider ๊ฐ์ฒด ๋ด๋ถ์์ ์ง์ ๊ด๋ฆฌ (์ผ๋ฐ ๋ฉ์๋ ์ถ์ฝํ ์ฌ์ฉ)\n style: {\n value: '',\n },\n add: (providerObj) => {\n if (!providerObj || typeof providerObj !== 'object') return;\n\n const { style, ...methods } = providerObj;\n\n if (style && typeof style === 'string') {\n this.provider.style.value = style;\n }\n\n if (Object.keys(methods).length > 0) {\n setTimeout(() => {\n Object.entries(methods).forEach(([name, fn]) => {\n if (typeof fn === 'function') {\n this.#host[name] = fn;\n }\n });\n\n this.#host.rerenderer();\n });\n }\n },\n }\n\n}","export class NineTableAPI {\n #host;\n\n constructor(host) {\n this.#host = host;\n\n // ๊ด๋ฆฌํ ๋ค์์คํ์ด์ค๋ค์ ๋ฐฐ์ด๋ก ์ ์\n const namespaces = [\"row\"]; // ๋์ค์ \"col\", \"cell\" ๋ฑ๋ง ์ถ๊ฐํ๋ฉด ๋!\n\n namespaces.forEach(ns => {\n this[ns] = new Proxy({}, {\n get: (target, prop) => {\n const $sheet = this.#getActiveSheet();\n if (!$sheet || !$sheet[ns]) return undefined;\n\n const targetMethod = $sheet[ns][prop];\n\n if (typeof targetMethod === 'function') {\n return (...args) => targetMethod.apply($sheet[ns], args);\n }\n return targetMethod;\n }\n });\n });\n }\n\n getActiveSheets() {\n return this.#host.shadow.querySelectorAll('nine-table-sheet.active');\n }\n\n #getActiveSheet() {\n const arr = this.getActiveSheets();\n return arr.length > 0 ? arr[0] : null;\n }\n}","import { trace } from \"@nopeer\";\nimport { ngDataManager } from '@/data/ngDataManager.js';\nimport { fields } from \"@/data/Fields.js\";\nimport { LayoutManager } from '@/layout/core/LayoutManager.js';\nimport { ExprEngine } from \"@/core/ExprEngine.js\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\nimport { DataAPI } from '../api/DataAPI.js';\nimport { NineTableAPI } from '../api/NineTableAPI.js';\n\nexport default class NineTable extends HTMLElement {\n #shadowRoot;\n #dataManager;\n #layoutManager;\n #dataApi;\n #sheetApi;\n #templateCnt = 0;\n\n constructor() {\n super();\n\n if ([\"NINE-TABLE\"].includes(this.tagName)) {\n trace.log(\"Welcome nine-table\", __APP_VERSION__);\n }\n\n this.#shadowRoot = this.attachShadow({ mode: 'open' });\n this.#dataManager = new ngDataManager(this);\n\n this.#dataApi = new DataAPI(this);\n this.#sheetApi = new NineTableAPI(this);\n\n this.#bindApiMethods();\n }\n\n connectedCallback() {\n setTimeout(() => {\n this.#templateCnt = this.querySelectorAll(\"table\")?.length;\n\n this.fields = new fields(this);\n this.exprEngine = new ExprEngine(this);\n\n this.#bindDynamicSetters();\n\n this.#layoutManager = new LayoutManager(this);\n\n this.#dispatchLoad();\n });\n }\n\n disconnectedCallback() {\n //trace.log('NineTable disconnected.');\n }\n\n #dispatchLoad = () => {\n\n let checkCount = 0;\n const maxChecks = 50; // ์ต๋ 5์ด ๋๊ธฐ (100ms * 50)\n\n const checkTimer = setInterval(() => {\n checkCount++;\n\n const sheets = this.shadow.querySelectorAll('nine-table-sheet');\n\n if (checkCount >= maxChecks) {\n clearInterval(checkTimer);\n }\n\n if (sheets.length >= this.#templateCnt) {\n let loadSheetCnt = 0;\n sheets.forEach($sheet => {\n if ($sheet.loaded) loadSheetCnt++;\n });\n\n if (loadSheetCnt >= this.#templateCnt) {\n clearInterval(checkTimer);\n this.loaded = true;\n this.dispatchEvent(new CustomEvent(NINE_TABLE.EVENT.LOAD, { bubbles: true, detail: { target: this } }));\n }\n }\n }, 100);\n }\n\n // ๐ฏ ๊ณตํต ๋ฐ์ดํฐ & API ์ ๊ทผ์\n get shadow() { return this.#shadowRoot; }\n get dataManager() { return this.#dataManager; }\n get data() { return this.#dataManager.data; }\n //get row() { return this.#dataManager.row; }\n\n\n\n\n\n setData(records) {\n this.#dataManager.data.set(records);\n this.refresh();\n }\n\n refresh() {\n this.activeSheet?.invalidate();\n }\n\n\n set loading(val) {\n if (this.#layoutManager) this.#layoutManager.loading = val;\n }\n\n rerenderer() {\n\n this.activeSheet?.querySelectorAll(\"tbody.body th,tbody.body td\").forEach(($cell) => {\n const customComp = Array.from($cell.children).find($el => {\n return $el.tagName.toLowerCase().startsWith('cell-') && typeof $el.rerenderer === 'function'\n });\n\n customComp?.rerenderer();\n })\n }\n\n sheet = (idOrIndex) => {\n if (idOrIndex === null || idOrIndex < 0) return this.activeSheet;\n const sheets = Array.from(this.shadow.querySelectorAll('nine-table-sheet'));\n\n if (typeof idOrIndex === 'number') return sheets[idOrIndex] || null;\n if (typeof idOrIndex === 'string') {\n return this.shadow.querySelector(`nine-table-sheet#${idOrIndex}, nine-table-sheet[data-sheet-id=\"${idOrIndex}\"]`) || null;\n }\n return sheets[0] || null;\n }\n\n get sheets() {\n return Array.from(this.shadow.querySelectorAll('nine-table-sheet'));\n }\n\n get activeSheet() {\n return this.shadow.querySelector('nine-table-sheet.active') || null;\n }\n\n #bindDynamicSetters() {\n const extractedMethodNames = new Set();\n\n this.querySelectorAll('[data-source]').forEach(el => {\n const dataSource = el.getAttribute('data-source');\n if (!dataSource) return;\n\n const matches = dataSource.matchAll(/(?:host\\.)?([a-zA-Z0-9_$]+)\\s*\\(/g);\n for (const match of matches) {\n const name = match[1];\n if (name && name !== 'host') {\n extractedMethodNames.add(name);\n }\n }\n });\n\n extractedMethodNames.forEach(methodName => {\n let internalValue = null;\n\n Object.defineProperty(this, methodName, {\n set: (newValue) => {\n internalValue = newValue;\n\n this.rerenderer();\n },\n get: () => internalValue,\n configurable: true,\n enumerable: true\n });\n });\n }\n\n execute = (fn) => {\n setTimeout(() => {\n this.loading = true;\n setTimeout(() => {\n try {\n fn.call(this);\n } finally {\n this.loading = false;\n }\n });\n });\n }\n\n #bindApiMethods() {\n\n const apis = [this.#dataApi, this.#sheetApi];\n\n apis.forEach(api => {\n // api ์ธ์คํด์ค(this)์ ์ง์ ์ ์ธ๋ ์์ฑ๋ค๊ณผ ํ๋กํ ํ์
์์ฑ์ ๋ชจ๋ ๊ฐ์ ธ์ด\n // Reflect.ownKeys๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ณผ์ด๋ ์จ๊ฒจ์ง ํ๋กํผํฐ๊น์ง ์์ ํ๊ฒ ํ์ ๊ฐ๋ฅํฉ๋๋ค.\n const keys = new Set([\n ...Reflect.ownKeys(api),\n ...Reflect.ownKeys(Object.getPrototypeOf(api))\n ]);\n\n keys.forEach(key => {\n // constructor๋ ๋ด๋ถ ํ๋ผ์ด๋น ๋ฉค๋ฒ(#)๋ ์ ์ธ\n if (key === 'constructor' || String(key).startsWith('#')) return;\n\n const target = api[key];\n\n if (typeof target === 'function') {\n if (!this[key]) {\n //trace.log(`[Binding Function] ${key}`);\n this[key] = (...args) => target.apply(api, args);\n }\n } else if (target !== null && typeof target === 'object') {\n if (!this[key]) {\n //trace.log(`[Binding Object Namespace] ${key}`, target);\n this[key] = target; // ๊ฐ์ฒด ๋ค์์คํ์ด์ค(์: row) ํต์งธ๋ก ์ฐ๊ฒฐ\n }\n }\n });\n });\n }\n}\n\nif (!customElements.get('nine-table')) {\n customElements.define('nine-table', NineTable);\n}\n\nif (!customElements.get('nine-table-simple')) {\n customElements.define('nine-table-simple', class extends NineTable {\n connectedCallback() {\n this.setAttribute('theme', 'simple');\n\n super.connectedCallback();\n }\n });\n}","export class BasicCellElement extends HTMLElement {\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tapplyBaseStyle() {\n\t}\n\n\tconnectedCallback() {\n\t}\n}","import { trace } from \"@nopeer\";\nimport { BasicCellElement } from './BasicCellElement.js';\n\nconst exprCache = new Map();\n\nexport class CellElement extends BasicCellElement {\n\t#host;\n\t#sheet;\n\t#tr;\n\t#cell;\n\t#attr;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tget host() { return this.#host; }\n\tget sheet() { return this.#sheet; }\n\tget cell() { return this.#cell; }\n\tget tr() { return this.#tr; }\n\tget attr() { return this.#attr; }\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\n\t\tthis.#host = this.getRootNode().host;\n\n\t\tthis.#cell = this.closest(\"th,td\");\n\t\tthis.#tr = this.#cell.closest(\"tr\");\n\t\tthis.#sheet = this.#tr.closest(\"nine-table-sheet\");\n\n\t\tthis.#cell.classList.add(this.tagName);\n\n\t\tthis.#attr = {};\n\t\tfor (let i = 0; i < this.#cell.attributes.length; i++) {\n\t\t\tconst name = this.#cell.attributes[i].name;\n\t\t\tif (![\"text-align\",\"class\",\"cell-type\",\"data-bind\",\"data-expr\",\"data-col\",\"tabindex\"].includes(name)) {\n\t\t\t\tthis.#attr[name] = this.#cell.attributes[i].value;\n\t\t\t\t//this.setAttribute(name, this.#cell.attributes[i].value);\n\t\t\t}\n\t\t}\n\n\t\tif (!this.#cell) return;\n\n\n\t\tconst root = this.shadowRoot || this;\n\n\t\t// ๐ฏ ๋ฒํผ ์ด๋ฒคํธ ์ฐ๊ฒฐ\n\t\troot.querySelectorAll(\"button, ng-expand-button\").forEach(button => {\n\t\t\tbutton.addEventListener(\"click\", () => {\n\t\t\t\tlet fn = this.getAttribute(\"onbuttonclick\") || this.getAttribute(\"onButtonClick\") || this.#cell?.getAttribute(\"onbuttonclick\") || this.#cell?.getAttribute(\"onButtonClick\");\n\n\t\t\t\tconst rowData = this.data; // Proxy Lazy ์ ๊ทผ\n\t\t\t\tconst curRow = parseInt(this.#cell.dataset.row, 10);\n\n\t\t\t\tif (fn && this.#host) {\n\t\t\t\t\tfn = fn.replace(\"()\", \"\");\n\t\t\t\t\tconst match = fn.match(/^(\\w+)\\s*\\(/);\n\t\t\t\t\tconst methodName = match?.[1] || fn;\n\n\t\t\t\t\tif (typeof this.#host[methodName] === 'function') {\n\t\t\t\t\t\tthis.#host[methodName].call(this.#host, rowData, curRow, this.#cell);\n\t\t\t\t\t} else if (typeof this.#host.exprFunction === 'function') {\n\t\t\t\t\t\tthis.#host.exprFunction(fn).call(this, rowData, curRow);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t/**\n\t\t\t\tthis.#host?.dispatchEvent(new CustomEvent(ninegrid.EVENT.BUTTON_CLICK, {\n\t\t\t\t\tdetail: { target: this.#cell, data: rowData, currow: curRow },\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true\n\t\t\t\t})); */\n\t\t\t});\n\t\t});\n\n\t\t// ๐ฏ ๋งํฌ ์ด๋ฒคํธ ์ฐ๊ฒฐ\n\t\tconst renderer = root.querySelector(\".renderer\");\n\t\tif (renderer && this.getAttribute(\"link\") === \"true\") {\n\t\t\trenderer.classList.add(\"link\");\n\n\t\t\trenderer.addEventListener(\"click\", () => {\n\t\t\t\tlet fn = this.getAttribute(\"onlinkclick\") || this.getAttribute(\"onLinkClick\");\n\n\t\t\t\tconst rowData = this.data;\n\t\t\t\tconst curRow = parseInt(this.#cell.dataset.row, 10);\n\n\t\t\t\tif (fn && this.#host) {\n\t\t\t\t\tfn = fn.replace(\"()\", \"\");\n\t\t\t\t\tconst match = fn.match(/^(\\w+)\\s*\\(/);\n\t\t\t\t\tconst methodName = match?.[1] || fn;\n\n\t\t\t\t\tif (typeof this.#host[methodName] === 'function') {\n\t\t\t\t\t\tthis.#host[methodName].call(this.#host, rowData, curRow, this.#cell);\n\t\t\t\t\t} else if (typeof this.#host.exprFunction === 'function') {\n\t\t\t\t\t\tthis.#host.exprFunction(fn).call(this, rowData, curRow);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.#host?.dispatchEvent(new CustomEvent(ninegrid.EVENT.LINK_CLICK, {\n\t\t\t\t\tdetail: { target: this.#cell, data: rowData, currow: curRow },\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true\n\t\t\t\t}));\n\t\t\t});\n\t\t}\n\t}\n\n\tget data() {\n\t\tconst rawRecord = this.#tr?.data;\n\t\tif (!rawRecord) return null;\n\t\tif (!rawRecord.v) return rawRecord;\n\n\t\tconst host = this.#host;\n\n\t\treturn new Proxy(rawRecord, {\n\t\t\tget(target, prop) {\n\t\t\t\tif (prop === '__ng') return target.__ng;\n\t\t\t\tif (prop === 'v') return target.v;\n\n\t\t\t\tconst idx = host?.fields?.indexOf?.(prop) ?? -1;\n\t\t\t\treturn idx >= 0 ? target.v[idx] : target[prop];\n\t\t\t}\n\t\t});\n\t}\n\n\tget value() {\n\t\tif (!this.#cell || !this.#tr?.data) return \"\";\n\n\t\tconst bindKey = this.#cell.dataset?.bind;\n\t\tif (!bindKey) return \"\";\n\n\t\tconst rawRecord = this.#tr.data;\n\n\t\tif (rawRecord.v && Array.isArray(rawRecord.v)) {\n\t\t\tconst colIdx = this.#host.fields.get().indexOf(bindKey) ?? -1;\n\t\t\treturn colIdx >= 0 ? (rawRecord.v[colIdx] ?? \"\") : \"\";\n\t\t}\n\n\t\treturn rawRecord[bindKey] ?? \"\";\n\t}\n\n\tset value(v) {\n\t\tif (!this.#cell || !this.#host?.data) return;\n\n\t\tconst row = parseInt(this.#tr.dataset.row, 10);\n\t\tconst bindKey = this.#cell.dataset.bind;\n\t\tif (isNaN(row) || !bindKey) return;\n\n\t\tthis.#host.data.setValue(row, bindKey, v);\n\t}\n\n\tget row() {\n\t\treturn parseInt(this.#cell?.dataset?.row, 10);\n\t}\n\tget index() {\n\t\treturn parseInt(this.#cell?.dataset?.index, 10);\n\t}\n\n\tisValid() {\n\t\treturn this.#cell.classList.contains(\"invalid\") ? false : true;\n\t}\n\n\tisInvalid() {\n\t\treturn !this.isValid();\n\t}\n\n\tgetDisplayText = (defaultValue = \"\") => {\n\n\t\tif (!this.#cell || !this.#cell.closest(\"tbody\")) return defaultValue;\n\n\t\tconst rawRecord = this.#tr.data;\n\n\t\tif (!rawRecord) return defaultValue;\n\n\t\tconst expr = this.#cell.dataset.expr;\n\t\tconst bindKey = this.#cell.dataset.bind;\n\t\tconst row = parseInt(this.#cell.dataset.row, 10);\n\n\t\tif (expr) {\n\t\t\ttry {\n\t\t\t\tif (this.#tr.getAttribute(\"grouping\") === \"true\") {\n\n\t\t\t\t\treturn this.getGroupExprValue(expr, this.#tr.data, row, this.#cell);\n\t\t\t\t} else {\n\t\t\t\t\treturn this.#host.exprEngine.evaluate(expr, this.#tr.data, row);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\treturn defaultValue;\n\t\t\t}\n\t\t}\n\n\t\tif (bindKey) {\n\t\t\tconst val = this.value;\n\t\t\treturn val !== null && val !== undefined ? val : defaultValue;\n\t\t}\n\n\t\treturn defaultValue;\n\t};\n\n\n\n\trefresh() {\n\n\t\tif (!this.#cell || !this.#tr) return;\n\n\t\tconst val = this.value;\n\n\t\tthis.#cell.classList.remove(\"invalid\");\n\n\t\t[\"color\",\"background\",\"background-color\",\"visible\",\"enable\",\"validator\"].forEach(v => {\n\n\t\t\tconst expr = this.#attr[v];\n\t\t\tif (expr) {\n\t\t\t\tconst result = this.#host.exprEngine.evaluate(expr, this.#tr.data, parseInt(this.#cell.dataset.row, 10));\n\n\t\t\t\tif (v === \"validator\") {\n\t\t\t\t\tif (!result) {\n\t\t\t\t\t\tthis.#cell.classList.add(\"invalid\");\n\t\t\t\t\t}\n\t\t\t\t} else if (v === \"visible\") {\n\t\t\t\t\tthis.style[\"display\"] = result ? \"\" : \"none\";\n\t\t\t\t} else if (v === \"enable\") {\n\t\t\t\t\tthis.querySelectorAll(\"input, button, textarea, select\").forEach($el => {\n\t\t\t\t\t\t$el.disabled = !result;\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!!result) {\n\t\t\t\t\t\tthis.#cell.removeAttribute(\"disabled\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.#cell.setAttribute(\"disabled\", \"true\");\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.#cell.style[v] = result;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn val;\n\t}\n\n\tgetExprValue(expr, data, row) {\n\t\tif (!this.#host || !this.#host.exprEngine || expr === undefined || expr === null || expr === \"\") return expr;\n\n\t\treturn this.#host.exprEngine.evaluate(expr, data, row);\n\t}\n\n\tgetGroupExprValue = (expr, groupRecord, row, cell) => {\n\t\tif (!expr) return \"\";\n\n\t\ttry {\n\t\t\trow = parseInt(row, 10);\n\t\t\tconst cleanExpr = expr.replace(\"()\", \"\").trim();\n\n\t\t\tif (this.#host && typeof this.#host[cleanExpr] === 'function') {\n\t\t\t\treturn this.#host[cleanExpr].call(this, groupRecord, row, cell);\n\t\t\t}\n\n\t\t\tconst match = cleanExpr.match(/^(\\w+)\\s*\\(\\s*([\\w\\-]*)\\s*\\)/);\n\t\t\tif (match) {\n\t\t\t\tconst indices = groupRecord[GROUP_IDX.CHILDREN];\n\t\t\t\tconst allRecords = this.#host?.data?.getArray ? this.#host.data.getArray() : [];\n\t\t\t\tconst childRecords = indices ? indices.map(idx => allRecords[idx]).filter(Boolean) : [];\n\n\t\t\t\tconst [, funcName, field] = match;\n\t\t\t\tconst host = this.#host;\n\n\t\t\t\tswitch (funcName.toLowerCase()) {\n\t\t\t\t\tcase 'count':\n\t\t\t\t\t\treturn childRecords.length;\n\n\t\t\t\t\tcase 'sum': {\n\t\t\t\t\t\tconst colIdx = host?.fields?.indexOf?.(field) ?? -1;\n\t\t\t\t\t\treturn childRecords.reduce((acc, record) => {\n\t\t\t\t\t\t\tconst val = colIdx >= 0 ? record.v?.[colIdx] : record[field];\n\t\t\t\t\t\t\treturn acc + (Number(val) || 0);\n\t\t\t\t\t\t}, 0);\n\t\t\t\t\t}\n\n\t\t\t\t\tcase 'avg': {\n\t\t\t\t\t\tif (childRecords.length === 0) return 0;\n\t\t\t\t\t\tconst colIdx = host?.fields?.indexOf?.(field) ?? -1;\n\t\t\t\t\t\tconst sum = childRecords.reduce((acc, record) => {\n\t\t\t\t\t\t\tconst val = colIdx >= 0 ? record.v?.[colIdx] : record[field];\n\t\t\t\t\t\t\treturn acc + (Number(val) || 0);\n\t\t\t\t\t\t}, 0);\n\t\t\t\t\t\treturn sum / childRecords.length;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// 3. ํธ์คํธ์ exprFunction ํ์ฉ\n\t\t\tif (this.#host && typeof this.#host.exprFunction === 'function') {\n\t\t\t\treturn this.#host.exprFunction(expr).call(this, groupRecord, row, this.#host.data);\n\t\t\t}\n\n\t\t\tif (expr.includes(\"data.\") || expr.includes(\"childRecords\") || expr.includes(\"groupRecord\")) {\n\t\t\t\tlet evalFn = exprCache.get(\"grp_\" + expr);\n\t\t\t\tif (!evalFn) {\n\t\t\t\t\tevalFn = new Function('groupRecord', 'row', 'cell', 'host', `\n const indices = groupRecord[3]; // GROUP_IDX.CHILDREN = 3\n const allRecords = host?.data?.getArray ? host.data.getArray() : [];\n \n let childRecords = [];\n if (Array.isArray(indices)) {\n // indices๊ฐ ์ซ์ ์ธ๋ฑ์ค ๋ฐฐ์ด์ธ์ง, rowid ๋ฌธ์์ด ๋ฐฐ์ด์ธ์ง ํ๋ณํ์ฌ ์์ ํ๊ฒ ์ถ์ถ\n childRecords = indices.map(idx => {\n if (typeof idx === 'number') {\n return allRecords[idx];\n } else {\n // rowid ๋ฑ ๋ฌธ์์ด ์๋ณ์์ธ ๊ฒฝ์ฐ ์ ์ฒด ๋ฐฐ์ด์์ ์ฐพ๊ฑฐ๋ dataManager ํ์ฉ\n return allRecords.find(r => r?.__ng?.rowid === idx || r?.m?._?.[0] === idx);\n }\n }).filter(Boolean);\n }\n \n // ๋ง์ฝ ์์์ ๋ชป ์ฐพ์๋๋ฐ host.grouping์ ์ธ ์ ์๋ค๋ฉด ๋งค๋์ ์์ ์๋\n if (childRecords.length === 0 && host?.grouping?.getChildrenRecords && groupRecord[0]) {\n childRecords = host.grouping.getChildrenRecords(groupRecord[0]);\n }\n\n const data = childRecords; // data.length ๋ฑ์ ์ธ ์ ์๋๋ก ํธํ\n return ${expr};\n `);\n\t\t\t\t\texprCache.set(\"grp_\" + expr, evalFn);\n\t\t\t\t}\n\t\t\t\treturn evalFn(groupRecord, row, cell, this.#host);\n\t\t\t}\n\n\t\t\treturn expr;\n\t\t} catch (e) {\n\t\t\tconsole.error(\"Group expr evaluation error:\", expr, e);\n\t\t\treturn expr;\n\t\t}\n\t};\n}\n\nexport class EditableCellElement extends CellElement {\n\n\tget host() { return super.host; }\n\tget sheet() { return super.sheet; }\n\tget cell() { return super.cell; }\n\tget tr() { return super.tr; }\n\tget attr() { return super.attr; }\n\n\tgetExprValue(expr, data, row, cell) {\n\t\treturn super.getExprValue(expr, data, row, cell);\n\t}\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\t}\n\n\trefresh() {\n\t\treturn super.refresh();\n\t}\n\n\tgetExprValue = (expr, data, row, cell) => {\n\t\treturn super.getExprValue(expr, data, row, cell);\n\t}\n\n\tisValid = () => {\n\t\treturn super.isValid();\n\t}\n\n\tisInvalid = () => {\n\t\treturn super.isInvalid();\n\t}\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellInputText extends EditableCellElement\n{\n\t#target;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\t\n\tconnectedCallback() {\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"input\");\n\n\t\tthis.#initEvent();\n\t};\n\n\trefresh = () => {\n\t\tconst v = super.refresh();\n\t\tthis.#target.value = v;\n\t};\n\n\t#initEvent = () => {\n\t\tthis.#target.addEventListener(\"input\", e => {\n\t\t\tif (this.#maxbyte) {\n\t\t\t\tconst maxByteNum = Number(this.#maxbyte);\n\t\t\t\tconst currentBytes = nine.getByteLength(e.target.value);\n\n\t\t\t\tif (currentBytes > maxByteNum) {\n\t\t\t\t\te.target.value = nine.cut(e.target.value, maxByteNum);\n\t\t\t\t\tthis.value = e.target.value;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tthis.#target.addEventListener(\"change\", (event) => {\n\t\t\tthis.value = event.target.value;\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\t};\n\n\t#renderer = () => {\n\n\t\tthis.innerHTML = `\n\t\t\t<input type=\"text\" ondragstart=\"return false;\">\n\t\t`;\n\t};\n\n\tget #maxbyte() {\n\t\treturn this.cell.getAttribute(\"maxbyte\") || this.cell.getAttribute(\"max-byte\");\n\t}\n}\n\nif (!customElements.get('cell-input')) {\n\tcustomElements.define(\"cell-input\", CellInputText);\n}\n","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellInputNumber extends EditableCellElement\n{\n\t#target;\n\n\tconstructor () {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"input\");\n\n\t\tthis.#initEvent();\n\n\n\t};\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <input type=\"text\" ondragstart=\"return false;\">\n `;\n\t};\n\n\t#initEvent = () => {\n\t\tthis.#target.addEventListener(\"keydown\", this.#onKeyDown);\n\n\t\tthis.#target.addEventListener(\"input\", (event) => {\n\t\t\tthis.value = event.target.value;\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\n\t\tthis.#target.addEventListener(\"change\", (event) => {\n\t\t\tthis.value = event.target.value;\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\t};\n\n\trefresh = () => {\n\t\tconst v = super.refresh();\n\n\t\tthis.#target.value = v;//v !== undefined && v !== null ? v : \"\";\n\n\t\tif (this.isValid()) {\n\t\t\tthis.#validate();\n\t\t}\n\t};\n\n\t#validate = () => {\n\n\t\tconst v = this.#target.value;\n\n\t\tif (v !== \"\" && v !== null && v !== undefined) {\n\t\t\tconst num = Number(v);\n\n\t\t\tif (isNaN(num) || (this.#max && num > Number(this.#max)) || (this.#min && num < Number(this.#min))) {\n\t\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t\t}\n\t\t\telse if (this.#scale) {\n\t\t\t\tconst str = String(v);\n\t\t\t\tconst idx = str.indexOf('.');\n\t\t\t\tif (idx >= 0 && str.substring(idx + 1).length > Number(this.#scale)) {\n\t\t\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t#onKeyDown = e => {\n\n\t\tif ([\"Escape\", \"Enter\", \"Tab\", \"Home\", \"End\", \"ArrowLeft\", \"ArrowRight\", \"PageUp\", \"PageDown\", \"Backspace\", \"Delete\"].includes(e.code)) return;\n\n\t\tconst target = e.target;\n\t\tconst value = target.value;\n\t\tconst selectionStart = target.selectionStart;\n\t\tconst key = e.key;\n\n\t\tif (key === \"-\") {\n\t\t\tif (value.includes(\"-\") || selectionStart !== 0) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (key === \".\") {\n\t\t\tconst scale = Number(this.#scale);\n\n\t\t\tif (isNaN(scale) || scale <= 0 || value.includes(\".\")) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tlet validKey = [];\n\t\tif (this.#scale && Number(this.#scale) > 0) validKey.push(\".\");\n\t\tif (this.#min || Number(this.#min) > 0) validKey.push(\"-\");\n\n\t\tconst isNumKey = (e.keyCode >= 48 && e.keyCode <= 57) || (e.keyCode >= 96 && e.keyCode <= 105);\n\n\t\tif (!isNumKey && !validKey.includes(e.key)) {\n\t\t\te.preventDefault();\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.#scale && isNumKey && e.target.selectionStart == e.target.selectionEnd) {\n\t\t\tconst s = e.target.value;\n\t\t\tconst idx = s.indexOf(\".\");\n\t\t\tif (idx >= 0 && e.target.selectionStart > idx) {\n\t\t\t\tconst decimalPart = s.substr(idx + 1);\n\t\t\t\tif (decimalPart.length >= Number(this.#scale)) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this.#maxbyte && nine.getByteLength(e.target.value) >= Number(this.#maxbyte) && e.target.selectionStart == e.target.selectionEnd) {\n\t\t\te.preventDefault();\n\t\t}\n\t}\n\n\tget #min() {\n\t\treturn this.cell.getAttribute(\"min\") || \"\";\n\t}\n\n\tget #max() {\n\t\treturn this.cell.getAttribute(\"max\") || \"\";\n\t}\n\n\tget #scale() {\n\t\treturn this.cell.getAttribute(\"scale\") || \"\";\n\t}\n\n\tget #maxbyte() {\n\t\treturn this.cell.getAttribute(\"maxbyte\") || this.cell.getAttribute(\"max-byte\");\n\t}\n}\n\nif (!customElements.get('cell-input-number')) {\n\tcustomElements.define(\"cell-input-number\", CellInputNumber);\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellInputColor extends EditableCellElement\n{\n\t#target;\n\t#btn;\n\t#dataSource;\n\n\tconstructor () {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"input[type=color]\");\n\t\tthis.#btn = this.querySelector(\"button\");\n\n\t\t//this.#rendererColor();\n\n\t\tthis.#initEvent();\n\t};\n\n\t#initEvent = () => {\n\t\tthis.#btn.addEventListener(\"click\", () => {\n\t\t\tthis.#target.click();\n\t\t});\n\n\t\tthis.#target.addEventListener(\"input\", (event) => {\n\t\t\tconst val = event.target.value;\n\t\t\tthis.value = val;\n\t\t\tthis.#validate(val);\n\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\n\t\tthis.#target.addEventListener(\"change\", (event) => {\n\t\t\tconst val = event.target.value;\n\t\t\tthis.value = val;\n\t\t\tthis.#validate(val);\n\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <input type=\"color\" ondragstart=\"return false;\">\n <button tabindex=\"-1\" type=\"button\"></button>\n `;\n\t};\n\n\trerenderer = () => {\n\t\tthis.refresh();\n\t};\n\n\t#rendererColor = () => {\n\n\t\tconst dataSource = this.cell.getAttribute(\"data-source\");\n\t\tif (!dataSource) return;\n\n\t\tthis.#dataSource = super.getExprValue(dataSource, this.tr.data, this.tr.dataset.row);\n\n\t\tthis.querySelector(\"datalist\")?.remove();\n\n\t\tif (this.#dataSource && Array.isArray(this.#dataSource)) {\n\t\t\tconst datalistId = `color-list-${Math.random().toString(36).substr(2, 9)}`;\n\n\t\t\tconst datalist = document.createElement('datalist');\n\t\t\tdatalist.id = datalistId;\n\n\t\t\tconst fragment = document.createDocumentFragment();\n\n\t\t\tthis.#dataSource.forEach(v => {\n\t\t\t\tif (v.value) {\n\t\t\t\t\tconst option = document.createElement('option');\n\t\t\t\t\toption.value = v.value;\n\t\t\t\t\tfragment.appendChild(option);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tdatalist.appendChild(fragment);\n\t\t\tthis.appendChild(datalist);\n\n\t\t\tthis.#target.setAttribute(\"list\", datalistId);\n\t\t}\n\t};\n\n\trefresh = () => {\n\t\tif (!this.tr.data) return;\n\n\t\tconst v = super.refresh();\n\n\t\tthis.#rendererColor();\n\n\t\tthis.#target.value = v !== undefined && v !== null && v !== \"\" ? v : \"#ffffff\";\n\n\t\tif (this.isValid()) {\n\t\t\tthis.#validate();\n\t\t}\n\t};\n\n\t#validate = () => {\n\n\t\tconst v = this.#target.value;\n\n\t\tif (v !== \"\" && v !== null && v !== undefined) {\n\t\t\tif (!this.#isValidColor(v)) {\n\t\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t\t}\n\t\t\telse if (this.#dataSource && Array.isArray(this.#dataSource) && this.#dataSource.length > 0) {\n\t\t\t\tconst exists = this.#dataSource.some(item => {\n\t\t\t\t\tconst itemCode = item.value !== undefined ? item.value : (item.code !== undefined ? item.code : '');\n\t\t\t\t\treturn itemCode.toLowerCase() === v.toLowerCase();\n\t\t\t\t});\n\n\t\t\t\tif (!exists) {\n\t\t\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t#isValidColor = (v) => {\n\t\tif (typeof v !== \"string\" || v.length != 7 || !v.startsWith(\"#\")) return false;\n\n\t\tvar r = parseInt(v.substr(1, 2), 16);\n\t\tvar g = parseInt(v.substr(3, 2), 16);\n\t\tvar b = parseInt(v.substr(5, 2), 16);\n\n\t\tif (isNaN(r) || isNaN(g) || isNaN(b)) return false;\n\t\tif (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) return false;\n\n\t\treturn true;\n\t}\n}\n\nif (!customElements.get('cell-input-color')) {\n\tcustomElements.define(\"cell-input-color\", CellInputColor);\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellInputDate extends EditableCellElement\n{\n\t#target;\n\t#type;\n\n\tconstructor () {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"input\");\n\n\t\tthis.#target.addEventListener(\"input\", (event) => {\n\t\t\tconst val = event.target.value;\n\t\t\tthis.value = val;\n\t\t\tthis.#target.classList.toggle(\"has-value\", !!val); // ๐ก ์ค์๊ฐ ๋ฐ์\n\t\t\tthis.#validate(val);\n\n\t\t\tsuper.sheet.rowManager.refresh(true);\n\t\t});\n\n\t\tthis.#target.addEventListener(\"change\", (event) => {\n\t\t\tconst val = event.target.value;\n\t\t\tthis.value = val;\n\t\t\tthis.#validate(val);\n\n\t\t\tsuper.sheet.rowManager.refresh(true);\n\t\t});\n\t};\n\n\t#renderer = () => {\n\n\t\tthis.#type = this.cell.getAttribute(\"date-type\") || \"date\";\n\t\tif (![\"date\",\"datetime-local\",\"time\",\"week\",\"month\"].includes(this.#type)) {\n\t\t\tthrow `invalid type : ${this.#type}`;\n\t\t}\n\n\t\tlet attr = [];\n\t\tfor (let i = 0; i < this.cell.attributes.length; i++) {\n\t\t\tif ([\"value\", \"max\", \"min\", \"step\"].includes(this.cell.attributes[i].name)) {\n\t\t\t\tattr.push(`${this.cell.attributes[i].name}=\"${this.cell.attributes[i].value}\"`);\n\t\t\t}\n\t\t}\n\n\t\tthis.innerHTML = `\n <input\n type=\"${this.#type}\"\n data-placeholder=\"${this.cell.getAttribute('placeholder') || 'Select'}\"\n ${attr.join(\" \")}\n required\n />\n `;\n\t};\n\n\trefresh = () => {\n\n\t\tconst v = super.refresh();\n\n\t\tlet formattedVal = v;\n\t\tif (formattedVal) {\n\n\t\t\tswitch (this.#type) {\n\t\t\t\tcase \"date\":\n\t\t\t\t\tformattedVal = formattedVal.substr(0, 10);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"datetime-local\":\n\t\t\t\t\tformattedVal = formattedVal.substr(0, 16);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"time\":\n\t\t\t\t\tvar d = new Date(v);\n\t\t\t\t\tif (d != \"Invalid Date\" && !isNaN(d)) {\n\t\t\t\t\t\tformattedVal = (\"00\" + d.getHours()).slice(-2) + \":\" + (\"00\" + d.getMinutes()).slice(-2);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"month\":\n\t\t\t\t\tvar d = new Date(v);\n\t\t\t\t\tif (d != \"Invalid Date\" && !isNaN(d)) {\n\t\t\t\t\t\tformattedVal = (\"0000\" + d.getFullYear()).slice(-4) + \"-\" + (\"00\" + (d.getMonth() + 1)).slice(-2);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tthis.#target.value = formattedVal || \"\";\n\t\tthis.#target.classList.toggle(\"has-value\", !!formattedVal); // ๐ก ๊ฐ์ด ์์ผ๋ฉด ํด๋์ค ์ถ๊ฐ\n\n\t\tif (this.isValid()) {\n\t\t\tthis.#validate(formattedVal);\n\t\t}\n\t};\n\n\t#validate = (val) => {\n\n\t\tif (val !== \"\" && val !== null && val !== undefined) {\n\t\t\tlet isValid = this.#isValidDate(val);\n\n\t\t\tif (isValid) {\n\t\t\t\tif (this.#min && val < this.#min) isValid = false;\n\t\t\t\tif (this.#max && val > this.#max) isValid = false;\n\t\t\t}\n\n\t\t\tif (!isValid) {\n\t\t\t\tsuper.cell.classList.add(\"invalid\");\n\t\t\t}\n\t\t}\n\t};\n\n\t#isValidDate = (v) => {\n\n\t\tif (typeof v !== \"string\") return false;\n\n\t\tlet isValid = true;\n\n\t\tswitch (this.#type) {\n\t\t\tcase \"date\":\n\t\t\tcase \"datetime-local\":\n\t\t\t\tconst year = Number(v.substr(0, 4));\n\t\t\t\tconst month = Number(v.substr(5, 2));\n\t\t\t\tconst day = Number(v.substr(8, 2));\n\n\t\t\t\tif (isNaN(year) || isNaN(month) || isNaN(day)) {\n\t\t\t\t\tisValid = false;\n\t\t\t\t} else if (month < 1 || month > 12 || day < 1 || day > 31) {\n\t\t\t\t\tisValid = false;\n\t\t\t\t} else if ([4, 6, 9, 11].includes(month) && day == 31) {\n\t\t\t\t\tisValid = false;\n\t\t\t\t} else if (month == 2) {\n\t\t\t\t\tlet isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));\n\t\t\t\t\tif (day > 29 || (day == 29 && !isleap)) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (isValid) {\n\t\t\tswitch (this.#type) {\n\t\t\t\tcase \"datetime-local\":\n\t\t\t\t\tvar t = v.substr(10, 1);\n\t\t\t\t\tvar hour = Number(v.substr(11, 2));\n\t\t\t\t\tvar min = Number(v.substr(14, 2));\n\n\t\t\t\t\tif (t != \"T\") {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (isNaN(hour) || isNaN(min)) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (hour < 0 || hour > 23 || min < 0 || min > 59) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"month\":\n\t\t\t\t\tvar year = Number(v.substr(0, 4));\n\t\t\t\t\tvar month = Number(v.substr(5, 2));\n\n\t\t\t\t\tif (isNaN(year) || isNaN(month)) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (month < 1 || month > 12) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"week\":\n\t\t\t\t\tvar year = Number(v.substr(0, 4));\n\t\t\t\t\tvar w = v.substr(5, 1);\n\t\t\t\t\tvar week = Number(v.substr(6, 2));\n\n\t\t\t\t\tif (w != \"W\") {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (isNaN(year) || isNaN(week)) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (week <= 0 || week > 53) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn isValid;\n\t}\n\n\tget #min() {\n\t\treturn this.cell.getAttribute(\"min\");\n\t}\n\n\tget #max() {\n\t\treturn this.cell.getAttribute(\"max\");\n\t}\n\n\tget #step() {\n\t\treturn this.cell.getAttribute(\"step\");\n\t}\n}\n\nif (!customElements.get('cell-input-date')) {\n\tcustomElements.define(\"cell-input-date\", CellInputDate);\n}","import { EditableCellElement } from \"./core/CellElement.js\";\nimport {trace} from \"@nopeer\";\n\nclass CellCheckbox extends EditableCellElement {\n #target;\n #label;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n super.connectedCallback();\n\n this.#renderer();\n\n this.#target = this.querySelector(\"input\");\n this.#label = this.querySelector(\"span\");\n\n this.#initEvent();\n }\n\n get dataSource() {\n return [\n { value: this.trueValue, text: this.#trueText },\n { value: this.falseValue, text: this.#falseText }\n ];\n }\n\n #initEvent = () => {\n if (this.closest(\"thead\")) {\n this.#target.addEventListener(\"change\", (e) => {\n super.sheet.querySelector(`tbody.body [data-col=\"${super.cell.dataset.col}\"] cell-checkbox`)?.selectAll(e.target.checked);\n });\n }\n\n this.#target.addEventListener(\"change\", (event) => {\n if (!this.closest(\"tbody\")) return;\n\n if (this.#isRadio) {\n this.selectAll(false);\n this.value = this.trueValue;\n }\n else {\n this.value = event.target.checked ? this.trueValue : this.falseValue;\n }\n\n this.sheet.rowManager.refresh(true);\n });\n };\n\n #renderer = () => {\n\n const trueValue = this.trueValue;//this.cell.getAttribute(\"true-value\") || false;\n //const selectedBorderColor = this.getAttribute(\"selected-border-color\") || \"dimgray\";\n\n const originalContent = this.cell.getAttribute(\"content\") || \"\";\n const childHtml = this.#isRadio ? `<input type=\"radio\" value=\"${trueValue}\" />` : `<label><input type=\"checkbox\" /><span>${originalContent}</span></label>`;\n\n this.innerHTML = `\n ${childHtml}\n `;\n }\n\n refresh = () => {\n const val = super.refresh();\n\n this.#target.checked = (val === this.trueValue);\n\n if (this.isValid()) {\n this.#validate(val);\n }\n\n const displayText = (val === this.trueValue) ? this.#trueText : ((val === this.falseValue) ? this.#falseText : val);\n\n if (this.#label) {\n this.#label.textContent = displayText;\n }\n };\n\n #validate = (val) => {\n\n this.cell.classList.remove(\"invalid\");\n\n if (val !== \"\" && val !== null && val !== undefined) {\n if (val !== this.trueValue && val !== this.falseValue) {\n this.cell.classList.add(\"invalid\");\n }\n }\n };\n\n selectAll = (v) => {\n if (this.closest(\"thead\")) return; // ํค๋ ์์ ์ ์ ์ธ\n\n const data = this.host.data.getArray();\n const colIndex = this.host.fields.indexOf(this.cell.dataset.bind);\n\n if (colIndex < 0) return;\n\n for (let i = 0; i < data.length; i++) {\n if (this.#enable && super.getExprValue(this.#enable, data[i], i, this.cell) === false) continue;\n if (this.#readonly && super.getExprValue(this.#readonly, data[i], i, this.cell) === true) continue;\n if (this.#visible && super.getExprValue(this.#visible, data[i], i, this.cell) === false) continue;\n\n data[i].v[colIndex] = v ? this.trueValue : this.falseValue;\n }\n\n super.sheet.invalidate();\n };\n\n get trueValue() {\n return this.cell.getAttribute(\"true-value\") || \"Y\";\n }\n get falseValue() {\n return this.cell.getAttribute(\"false-value\")|| \"N\";\n }\n get #trueText() {\n return this.cell.getAttribute(\"true-text\") || \"\";\n }\n get #falseText() {\n return this.cell.getAttribute(\"false-text\") || \"\";\n }\n get #isRadio() {\n return this.cell.getAttribute(\"is-radio\") || false;\n }\n get #enable() {\n return this.cell.getAttribute(\"enable\") || false;\n }\n get #readonly() {\n return this.cell.getAttribute(\"readonly\") || false;\n }\n get #visible() {\n return this.cell.getAttribute(\"visible\") || false;\n }\n}\n\nif (!customElements.get('cell-checkbox')) {\n customElements.define(\"cell-checkbox\", CellCheckbox);\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellRadio extends EditableCellElement {\n\t#target;\n\t#radioList = [];\n\t#dataSource = [];\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#rendererRadio();\n\n\t\tthis.#initEvent();\n\t}\n\n\t#initEvent = () => {\n\n\t\tthis.cell.addEventListener(\"keydown\", e => {\n\n\t\t\tif (this.cell.hasAttribute(\"readonly\") || this.cell.classList.contains(\"readonly\")) return;\n\t\t\tif (this.cell.getAttribute(\"disabled\") === \"true\") return;\n\n\t\t\tif (e.code === \"Space\") {\n\t\t\t\te.preventDefault();\n\n\t\t\t\tlet matchIndex = -1;\n\n\t\t\t\tthis.#radioList.forEach(($el,index) => {\n\t\t\t\t\tif (this.value === $el.getAttribute(\"value\")) {\n\t\t\t\t\t\tmatchIndex = index;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tmatchIndex = (matchIndex === this.#radioList.length - 1) ? 0 : (matchIndex >= 0 ? matchIndex + 1 : 0);\n\t\t\t\tthis.value = this.#radioList[matchIndex].getAttribute(\"value\");\n\n\t\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t\t}\n\t\t});\n\t};\n\n\t#rendererRadio = () => {\n\n\t\tif (!this.host) return;\n\n\t\tconst dataSource = this.cell.getAttribute(\"data-source\");\n\t\tif (!dataSource) return;\n\n\t\tthis.#dataSource = super.getExprValue(dataSource, this.tr.data, this.tr.dataset.row);\n\n\t\tthis.#target.replaceChildren();\n\n\t\tif (this.#dataSource && Array.isArray(this.#dataSource)) {\n\n\t\t\tconst fragment = document.createDocumentFragment();\n\n\t\t\tthis.#dataSource.forEach(v => {\n\t\t\t\tconst codeVal = v[this.#keyName] !== undefined ? v[this.#keyName] : '';\n\t\t\t\tconst nameVal = v[this.#valueName] !== undefined ? v[this.#valueName] : '';\n\n\t\t\t\tconst label = document.createElement('label');\n\n\t\t\t\tconst input = document.createElement('input');\n\t\t\t\tinput.type = 'radio';\n\t\t\t\tinput.value = codeVal;\n\n\t\t\t\tconst span = document.createElement('span');\n\t\t\t\tspan.textContent = nameVal;\n\n\t\t\t\tlabel.appendChild(input);\n\t\t\t\tlabel.appendChild(span);\n\t\t\t\tfragment.appendChild(label);\n\t\t\t});\n\n\t\t\tthis.#target.appendChild(fragment);\n\n\n\t\t\tthis.#radioList = Array.from(this.querySelectorAll(\"input\"));\n\n\n\n\t\t\tthis.#radioList.forEach($el => {\n\t\t\t\t$el.addEventListener(\"change\", (e) => {\n\t\t\t\t\tthis.value = e.target.value;\n\t\t\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t};\n\n\t#renderer = () => {\n\n\t\tthis.innerHTML = `\n\t\t\t<div></div>\n `;\n\n\t\tthis.#target = this.querySelector(\"div\");\n\t};\n\n\trerenderer = () => {\n\t\tthis.#rendererRadio();\n\t\tthis.refresh();\n\t};\n\n\trefresh = () => {\n\n\t\tconst v = super.refresh();\n\n\t\tthis.#radioList.forEach($el => {\n\t\t\t$el.checked = (v === $el.value);\n\t\t});\n\n\t\tif (this.isValid()) {\n\t\t\tthis.#validate();\n\t\t}\n\t};\n\n\t#validate = () => {\n\n\t\tif (this.value === null || this.value === undefined || this.value === \"\" || !Array.isArray(this.#dataSource)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst idx = this.#dataSource.findIndex(m => this.value === m[this.#keyName]);\n\t\tif (idx < 0) {\n\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t}\n\t};\n\n\tget dataSource() {\n\t\treturn this.#dataSource;\n\t}\n\n\tget #keyName() {\n\t\treturn this.cell.getAttribute(\"key-name\") || \"k\";\n\t}\n\n\tget #valueName() {\n\t\treturn this.cell.getAttribute(\"value-name\") || \"v\";\n\t}\n}\n\nif (!customElements.get('cell-radio')) {\n\tcustomElements.define(\"cell-radio\", CellRadio);\n}","import { trace } from \"@nopeer\";\n\nexport class CellComboPanel extends HTMLElement {\n\t#parent;\n\t#keyName;\n\t#valueName;\n\t#isOpen = false;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tthis.#renderer();\n\t\tthis.#initEvents();\n\t}\n\n\t#initData = (dataSource, keyName, valueName, multi, separator) => {\n\t\tconst grd = this.querySelector(\"nine-table-simple\");\n\t\tif (!grd || !dataSource || dataSource.length === 0) return;\n\n\t\tconst itemsAttr = this.#parent.getAttribute(\"items\");\n\t\tlet fieldKeys = [];\n\n\t\tif (itemsAttr) {\n\t\t\tfieldKeys = itemsAttr.split(\",\").map(s => s.trim());\n\t\t} else {\n\t\t\tfieldKeys = [valueName].filter(Boolean);\n\t\t}\n\n\t\tconst activeColumnCount = fieldKeys.length;\n\n\t\tgrd.shadowRoot.querySelector(\".ng-container-left\").style.display = multi ? '' : 'none';\n\n\t\tgrd.shadowRoot.querySelectorAll('table colgroup col, tbody td').forEach(($el, idx) => {\n\n\t\t\tconst col = parseInt($el.dataset.col, 10);\n\t\t\tif (col >= 2) {\n\t\t\t\t$el.style.display = (col - 2 >= activeColumnCount) ? 'none' : '';\n\t\t\t}\n\t\t});\n\n\t\tconst formattedData = dataSource.map(item => {\n\t\t\tconst row = {\n\t\t\t\tCHK: \"N\",\n\t\t\t\tk: keyName && item[keyName] !== undefined ? item[keyName] : (item[0] !== undefined ? item[0] : \"\")\n\t\t\t};\n\n\t\t\tfieldKeys.forEach((key, idx) => {\n\t\t\t\trow[`tmp${idx + 1}`] = item[key] !== undefined ? item[key] : (item[idx] !== undefined ? item[idx] : \"\");\n\t\t\t});\n\t\t\treturn row;\n\t\t});\n\n\t\tgrd.data.set(formattedData);\n\n\t\tif (multi && this.#parent.value) {\n\t\t\tconst selectedKeys = String(this.#parent.value).split(separator || \",\");\n\t\t\tgrd.data.getValidData().forEach(m => {\n\t\t\t\tif (selectedKeys.includes(String(m.v[1]))) {\n\t\t\t\t\tm.v[0] = \"Y\";\n\t\t\t\t}\n\t\t\t});\n\t\t\tgrd.refreshData();\n\t\t}\n\t};\n\n\topen = (parent, dataSource, keyName, valueName, multi, separator) => {\n\t\tthis.#parent = parent;\n\t\tthis.#keyName = keyName;\n\t\tthis.#valueName = valueName;\n\t\tthis.#isOpen = true;\n\n\t\tthis.classList.add(\"active\");\n\n\t\tconst grd = this.querySelector(\"nine-table-simple\");\n\t\tif (!grd || !dataSource) return;\n\n\t\tthis.querySelector(\".search-input\").value = \"\";\n\t\tthis.querySelector(\"#chkAll\").checked = true;\n\n\t\tif (dataSource.length > 10) {\n\t\t\tthis.classList.add(\"expand\");\n\t\t} else {\n\t\t\tthis.classList.remove(\"expand\");\n\t\t}\n\n\t\tif (multi) {\n\t\t\tthis.classList.add(\"multi\");\n\t\t} else {\n\t\t\tthis.classList.remove(\"multi\");\n\t\t}\n\n\t\tconst sheet = parent.closest(\"nine-table-sheet\");\n\t\tconst btnEl = parent.querySelector(\".btn1\");\n\t\tif (!btnEl || !sheet) return;\n\n\t\tconst btnRect = btnEl.getBoundingClientRect();\n\t\tconst sheetRect = sheet.getBoundingClientRect();\n\n\t\tlet left = btnRect.left - sheetRect.left;\n\t\tlet top = btnRect.bottom - sheetRect.top + 2;\n\n\t\tconst panelWidth = this.offsetWidth || 250;\n\t\tconst panelHeight = this.offsetHeight || 250;\n\t\tif (left + panelWidth > sheetRect.width) {\n\t\t\tleft = Math.max(0, sheetRect.width - panelWidth - 5);\n\t\t}\n\n\t\tif (left < 0) {\n\t\t\tleft = 5;\n\t\t}\n\n\t\tif (top + panelHeight > sheetRect.height) {\n\t\t\tconst upwardTop = (btnRect.top - sheetRect.top) - panelHeight - 2;\n\t\t\tif (upwardTop >= 0) {\n\t\t\t\ttop = upwardTop;\n\t\t\t} else {\n\t\t\t\ttop = Math.max(0, sheetRect.height - panelHeight - 5);\n\t\t\t}\n\t\t}\n\n\t\tthis.style.left = `${left}px`;\n\t\tthis.style.top = `${top}px`;\n\n\t\tsetTimeout(() => {\n\n\t\t\tthis.#initData(dataSource, keyName, valueName, multi, separator);\n\n\t\t\tconst viewContainer = grd.shadowRoot.querySelector(\".ng-container-body table tbody.body\");\n\n\t\t\tif (!viewContainer.__hasClickEvent) {\n\n\t\t\t\tviewContainer.addEventListener(\"mousedown\", (e) => {\n\n\t\t\t\t\tconst tr = e.target.closest(\"tr\");\n\t\t\t\t\tif (!tr) return;\n\n\t\t\t\t\tif (!multi) {\n\t\t\t\t\t\tthis.#onClickRow(e);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tviewContainer.__hasClickEvent = true;\n\t\t\t}\n\t\t}, 100);\n\t}\n\n\tclose = () => {\n\t\tthis.classList.remove(\"active\");\n\t\tthis.#isOpen = false;\n\t\tif (this.#parent && this.#parent.cell) {\n\t\t\tthis.#parent.cell.focus();\n\t\t}\n\t}\n\n\t#onClickRow = (e) => {\n\n\t\tconst sheet = e.target.closest(\"nine-table-sheet\");\n\t\tconst tr = e.target.closest(\"tr\");\n\n\t\tconst rowIndex = parseInt(tr.dataset.row, 10);\n\t\tconst record = sheet.view.get(rowIndex);\n\n\t\tthis.#parent.value = record.k;\n\n\t\tthis.#parent.sheet.rowManager.refresh(true);\n\n\t\tthis.close();\n\t}\n\n\t#onOk = () => {\n\t\tconst grd = this.querySelector(\"nine-table-simple\");\n\t\tconst data = grd.data.getValidData();\n\n\t\tconst selectedKeys = [];\n\t\tdata.forEach(o => {\n\t\t\tif (o.v[0] === \"Y\") {\n\t\t\t\tselectedKeys.push(o.v[1]);\n\t\t\t}\n\t\t});\n\n\t\tthis.#parent.value = selectedKeys.join(this.#parent.getAttribute(\"multi-separator\") || \",\");\n\t\tthis.#parent.sheet.rowManager.refresh(true);\n\n\t\tthis.close();\n\t}\n\n\t#onSelectAll = (e) => {\n\t\tconst grd = this.querySelector(\"nine-table-simple\");\n\t\tconst isChecked = e.target.checked ? \"Y\" : \"N\";\n\t\tgrd.data.getValidData().forEach(m => { m.v[0] = isChecked; });\n\t\tgrd.refreshData();\n\t}\n\n\t#onInput = (e) => {\n\t\tconst keyword = e.target.value.toLowerCase();\n\t\tconst grd = this.querySelector(\"nine-table-simple\");\n\n\t\tgrd.data.getValidDataNF().forEach(m => {\n\t\t\tconst match = Object.values(m.v).some(val =>\n\t\t\t\tval !== null && val !== undefined && String(val).toLowerCase().includes(keyword)\n\t\t\t);\n\t\t\tm.__ng.filtered = !match;\n\t\t});\n\n\t\tgrd.data.resetRecords();\n\t\tgrd.dataManager.viewRecords.reset();\n\t}\n\n\tget isOpen() {\n\t\treturn this.#isOpen;\n\t}\n\n\tget targetCell() {\n\t\treturn this.#parent;\n\t}\n\n\t#initEvents = () => {\n\t\tthis.querySelector(\".search-input\").addEventListener(\"input\", this.#onInput);\n\t\tthis.querySelector(\"#btnOk\").addEventListener(\"click\", this.#onOk);\n\t\tthis.querySelector(\"#chkAll\").addEventListener(\"change\", this.#onSelectAll);\n\n\t\tdocument.addEventListener(\"mousedown\", (e) => {\n\t\t\tconst path = e.composedPath ? e.composedPath() : [];\n\n\t\t\tif (path.includes(this)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.close();\n\t\t});\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <div class=\"head\">\n <input type=\"text\" class=\"search-input\" placeholder=\"Search...\" />\n </div>\n \n <nine-table-simple class=\"combo-list\" theme=\"simple\">\n <table auto-fit-col=\"true\">\n <colgroup>\n <col width=\"30\" fixed=\"left\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"0\" />\n </colgroup>\n <tbody>\n <tr>\n <td cell-type=\"checkbox\" data-bind=\"CHK\"></td>\n <td data-bind=\"tmp1\" />\n <td data-bind=\"tmp2\" />\n <td data-bind=\"tmp3\" />\n <td data-bind=\"tmp4\" />\n <td data-bind=\"tmp5\" />\n <td data-bind=\"tmp6\" />\n <td data-bind=\"tmp7\" />\n <td data-bind=\"tmp8\" />\n <td data-bind=\"tmp9\" />\n <td data-bind=\"tmp10\" />\n <td data-bind=\"k\" />\n </tr>\n </tbody>\n </table>\n </nine-table-simple>\n \n <div class=\"footer\">\n <div>\n <input id=\"chkAll\" type=\"checkbox\" checked>\n <label for=\"chkAll\">Select All</label>\n </div>\n <button id=\"btnOk\">OK</button>\n </div>\n `;\n\t};\n}\n\nif (!customElements.get('cell-combo-panel')) {\n\tcustomElements.define(\"cell-combo-panel\", CellComboPanel);\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\nimport \"./cell-combo-panel.js\";\n\nexport class CellCombo extends EditableCellElement {\n\t#targetBtn;\n\t#dataSource = [];\n\t#keyName;\n\t#valueName;\n\t#multi;\n\t#multiSeparator;\n\t#panel;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tthis.#renderer();\n\t\tsuper.connectedCallback();\n\n\t\tthis.#keyName = super.cell.getAttribute(\"key-name\") || \"k\";\n\t\tthis.#valueName = super.cell.getAttribute(\"value-name\") || \"v\";\n\t\tthis.#multi = super.cell.getAttribute('multi') === \"true\";\n\t\tthis.#multiSeparator = super.cell.getAttribute(\"multi-separator\") || \",\";\n\n\t\tthis.#initData();\n\t\tthis.#initEvent();\n\t}\n\n\trerenderer = () => {\n\t\tthis.#initData();\n\t\tthis.refresh();\n\t};\n\n\t#initData = () => {\n\t\tif (!super.sheet || !super.cell) return;\n\n\t\tconst dataSource = super.cell?.getAttribute(\"data-source\");\n\t\tif (!dataSource) return;\n\n\t\tthis.#dataSource = super.getExprValue(dataSource, super.tr.data, super.tr.dataset.row);\n\t}\n\n\t#initEvent = () => {\n\t\tthis.querySelectorAll(\"button\").forEach(btn => {\n\t\t\tbtn.addEventListener(\"click\", (e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t\tthis.#togglePanel();\n\t\t\t});\n\t\t});\n\t}\n\n\t#togglePanel = () => {\n\n\t\tif (!this.#panel) {\n\t\t\tthis.#panel = super.sheet.querySelector(\"cell-combo-panel\");\n\t\t\tif (!this.#panel) {\n\t\t\t\tthis.#panel = document.createElement(\"cell-combo-panel\");\n\t\t\t\tsuper.sheet.appendChild(this.#panel);\n\t\t\t}\n\t\t}\n\n\t\tif (this.#panel.isOpen && this.#panel.targetCell === this) {\n\t\t\tthis.#panel.close();\n\t\t} else {\n\t\t\tthis.#panel.open(this, this.#dataSource, this.#keyName, this.#valueName, this.#multi, this.#multiSeparator);\n\t\t}\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <button class=\"btn1\" type=\"button\" tabindex=\"-1\">Select</button>\n <button class=\"btn2\" type=\"button\" tabindex=\"-1\"></button>\n `;\n\n\t\tthis.#targetBtn = this.querySelector(\".btn1\");\n\t};\n\n\trefresh = () => {\n\t\tconst v = super.refresh();\n\t\tif (!this.#targetBtn) return v;\n\n\t\tthis.#targetBtn.textContent = this.#getDisplayText() || \"Select\";\n\t\tthis.#validateInput();\n\n\t\treturn v;\n\t};\n\n\t#getDisplayText = () => {\n\t\tif (!this.value || !Array.isArray(this.#dataSource)) return \"\";\n\n\t\tif (this.#multi) {\n\t\t\tconst keys = String(this.value).split(this.#multiSeparator);\n\t\t\treturn this.#dataSource\n\t\t\t\t.filter(m => keys.includes(String(m[this.#keyName])))\n\t\t\t\t.map(m => m[this.#valueName])\n\t\t\t\t.join(this.#multiSeparator);\n\t\t} else {\n\t\t\tconst found = this.#dataSource.find(m => String(m[this.#keyName]) === String(this.value));\n\t\t\treturn found ? found[this.#valueName] : this.value;\n\t\t}\n\t}\n\n\t#validateInput = () => {\n\t\tif (!super.cell) return;\n\t\tsuper.cell.classList.remove(\"invalid\");\n\n\t\tif (this.value === null || this.value === undefined || this.value === \"\" || !Array.isArray(this.#dataSource)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst list = this.#multi ? String(this.value).split(this.#multiSeparator) : [this.value];\n\t\tfor (const v of list) {\n\t\t\tconst idx = this.#dataSource.findIndex(m => String(v) === String(m[this.#keyName]));\n\t\t\tif (idx < 0) {\n\t\t\t\tsuper.cell.classList.add(\"invalid\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t};\n\n\tget dataSource() {\n\t\treturn this.#dataSource;\n\t}\n}\n\nif (!customElements.get('cell-combo')) {\n\tcustomElements.define(\"cell-combo\", CellCombo);\n}","import { trace } from \"@nopeer\";\nimport { CellElement } from \"./core/CellElement.js\";\n\nclass CellRenderer extends CellElement {\n\t#target;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"span\");\n\t}\n\n\trefresh = () => {\n\n\t\tsuper.refresh();\n\n\t\tif (this.cell.getAttribute(\"html\") === \"true\") {\n\t\t\tthis.#target.innerHTML = this.getDisplayText();\n\t\t} else {\n\t\t\tthis.#target.textContent = this.getDisplayText();\n\t\t}\n\t};\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <span class=\"wrapper\"></span>\n `;\n\t};\n}\n\nif (!customElements.get(\"cell-renderer\")) {\n\tcustomElements.define(\"cell-renderer\", CellRenderer);\n}","import { CellElement } from \"./core/CellElement.js\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\nimport { trace } from \"@nopeer\";\n\nexport class CellButton extends CellElement {\n\t#target;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tthis.#renderer();\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#target = this.querySelector(\"button\");\n\n\t\tthis.#target.removeEventListener(\"click\", this.#cellButtonClick);\n\t\tthis.#target.addEventListener(\"click\", this.#cellButtonClick);\n\t}\n\n\t#cellButtonClick = e => {\n\t\te.stopPropagation();\n\n\t\tconst rowid = parseInt(this.cell.dataset.row, 10);\n\n\t\tconst customEvent = new CustomEvent(NINE_TABLE.EVENT.CELL_BUTTON_CLICK, {\n\t\t\tbubbles: true,\n\t\t\tcomposed: true,\n\t\t\tdetail: {\n\t\t\t\toriginalEvent: e,\n\t\t\t\tcell: this.cell,\n\t\t\t\trow: rowid,\n\t\t\t\tcol: parseInt(this.cell.dataset.col, 10),\n\t\t\t\tbind: this.dataset.bind,\n\t\t\t\tdata: this.host.data.get(rowid),\n\t\t\t\tvalue: this.value,\n\t\t\t}\n\t\t});\n\n\t\tthis.dispatchEvent(customEvent);\n\t};\n\n\trefresh = () => {\n\t\tconst rawValue = super.refresh ? super.refresh() : this.value;\n\t\t//let displayValue = this.getDisplayText(rawValue);\n\t\tthis.#target.innerHTML = this.getDisplayText(rawValue);\n\t};\n\n\t#renderer = () => {\n\n\t\tconst buttonText = \"...\";//this.getAttribute(\"text\") || super.attr[\"text\"] || \"\";\n\n\t\tthis.innerHTML = `\n <button class=\"button\">${buttonText}</button>\n `;\n\t};\n}\n\nif (!customElements.get('cell-button')) {\n\tcustomElements.define(\"cell-button\", CellButton);\n}","import { trace } from \"@nopeer\";\nimport { CellElement } from \"./core/CellElement.js\";\nimport {NINE_TABLE} from \"@\";\n\nclass CellRowIndicator extends CellElement {\n\t#mainTarget;\n\t#subTarget;\n\t#statusTarget;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tthis.#renderer();\n\t\tsuper.connectedCallback();\n\n\t\tif (this.cell) {\n\t\t\tthis.cell.removeAttribute(\"tabindex\");\n\t\t\tthis.cell.dataset.bind = \"rowState\";\n\t\t}\n\n\t\tthis.#mainTarget = this.querySelector(\".ng-row-main\");\n\t\tthis.#subTarget = this.querySelector(\".ng-row-sub\");\n\t\tthis.#statusTarget = this.querySelector(\".row-status\");\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n\t\t\t<span class=\"ng-row-main\"></span>\n <span class=\"ng-row-sub\"></span>\n <span class=\"row-status\"></span>\n `;\n\t}\n\n\trefresh = () => {\n\t\tif (!this.cell || !this.tr) return;\n\n\t\tthis.classList.remove(\"is-insert\", \"is-update\", \"is-delete\");\n\n\t\tconst row = this.row;\n\t\tif (isNaN(row)) return;\n\n\t\tconst rawRecord = this.tr.data;\n\n\t\tif (rawRecord) {\n\t\t\tswitch (rawRecord.m._[NINE_TABLE.META.INDEX.ROW_STATE]) {\n\t\t\t\tcase NINE_TABLE.ROW_STATE.INSERT:\n\t\t\t\t\tthis.classList.add(\"is-insert\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase NINE_TABLE.ROW_STATE.UPDATE:\n\t\t\t\t\tthis.classList.add(\"is-update\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase NINE_TABLE.ROW_STATE.DELETE:\n\t\t\t\t\tthis.classList.add(\"is-delete\");\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tconst displayNum = this.index + 1;\n\t\tconst formattedNum = displayNum.toLocaleString();\n\n\t\tif (displayNum >= 10000) {\n\n\t\t\tconst splitIndex = formattedNum.length - 4;\n\t\t\tconst prefixPart = formattedNum.substring(0, splitIndex + 1);\n\t\t\tconst suffixPart = formattedNum.substring(splitIndex + 1);\n\n\t\t\tthis.#mainTarget.innerHTML = `\n \t<span class=\"ng-row-prefix\">${prefixPart}</span>\n \t<span class=\"ng-row-suffix\">${suffixPart}</span>\n \t<div class=\"row-status\"></div>\n \t`;\n\t\t} else {\n\t\t\tthis.#mainTarget.innerHTML = `${formattedNum}`;\n\t\t}\n\n\t\tconst isSorted = this.sheet.querySelector(\"thead .asc,thead .desc\") ? true : false;\n\t\tconst isFitered = this.sheet.querySelector(\"thead nine-table-filter-button.filtered\") ? true : false;\n\n\t\tthis.#subTarget.innerHTML = row;\n\t\tthis.#subTarget.style.display = (isSorted || isFitered) ? \"\" : \"none\";\n\t};\n}\n\nif (!customElements.get('cell-row-indicator')) {\n\tcustomElements.define(\"cell-row-indicator\", CellRowIndicator);\n}","// ui/col/col-expand.js\nimport { COLLAPSED_WIDTH } from \"@/layout/core/TableCompiler.js\";\n\nexport class ColExpand extends HTMLElement {\n #sheet;\n #cell;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#cell = this.closest('th, td');\n this.#sheet = this.closest('nine-table-sheet');\n\n if (this.#cell) {\n this.#cell.style.position = 'relative';\n }\n\n const isCollapsed =\n this.getAttribute('collapsed') === 'true' ||\n this.#cell?.getAttribute('collapsed') === 'true';\n\n if (isCollapsed) {\n requestAnimationFrame(() => {\n this.collapse(true);\n });\n } else {\n this.classList.remove('collapsed');\n this.classList.add('expand');\n }\n\n this.removeEventListener('click', this.#onClick);\n this.addEventListener('click', this.#onClick);\n }\n\n #onClick = (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (this.classList.contains('expand')) {\n this.collapse();\n } else {\n this.expand();\n }\n };\n\n expand = () => {\n if (!this.#sheet?.colResizer || !this.#cell) return;\n const colIndex = parseInt(this.#cell.dataset.col, 10);\n const colSpan = this.#cell.colSpan || 1;\n\n this.classList.remove('collapsed');\n this.classList.add('expand');\n this.#cell.setAttribute('collapsed', 'false');\n this.#cell.style.color = '';\n\n const targetWidth = parseInt(this.#cell.dataset.expandWidth, 10) || 100;\n\n if (colSpan === 1) {\n this.#sheet.colResizer.setColumnWidth(colIndex, targetWidth);\n } else {\n const singleWidth = Math.max(30, Math.floor(targetWidth / colSpan));\n for (let i = 0; i < colSpan; i++) {\n this.#sheet.colResizer.setColumnWidth(colIndex + i, singleWidth);\n }\n }\n\n requestAnimationFrame(() => {\n if (typeof this.#sheet.refreshLayout === 'function') {\n this.#sheet.refreshLayout();\n }\n });\n };\n\n collapse = (isInitialInit = false) => {\n if (!this.#sheet?.colResizer || !this.#cell) return;\n const colIndex = parseInt(this.#cell.dataset.col, 10);\n const colSpan = this.#cell.colSpan || 1;\n\n if (this.classList.contains('expand')) {\n const col = this.#sheet.querySelector(`colgroup col[data-col=\"${colIndex}\"]`);\n const currentW = col ? parseInt(col.getAttribute('width'), 10) : 0;\n if (currentW > COLLAPSED_WIDTH) {\n this.#cell.dataset.expandWidth = String(currentW * colSpan);\n }\n }\n\n this.classList.remove('expand');\n this.classList.add('collapsed');\n this.#cell.setAttribute('collapsed', 'true');\n this.#cell.style.color = 'transparent';\n\n if (colSpan === 1) {\n this.#sheet.colResizer.setColumnWidth(colIndex, COLLAPSED_WIDTH);\n } else {\n const splitWidth = Math.max(10, Math.floor(COLLAPSED_WIDTH / colSpan));\n for (let i = 0; i < colSpan; i++) {\n this.#sheet.colResizer.setColumnWidth(colIndex + i, splitWidth);\n }\n }\n\n requestAnimationFrame(() => {\n if (typeof this.#sheet.refreshLayout === 'function') {\n this.#sheet.refreshLayout();\n }\n });\n };\n\n disconnectedCallback() {\n this.removeEventListener('click', this.#onClick);\n }\n}\n\nif (!customElements.get('nine-table-col-expand')) {\n customElements.define('nine-table-col-expand', ColExpand);\n}","import { trace } from \"@nopeer\";\nimport { ColFixManager } from \"@/col/ColFixManager.js\";\n\nexport class ContextMenu extends HTMLElement {\n #tableHost;\n #panel;\n\n connectedCallback() {\n const root = this.getRootNode();\n this.#tableHost = root instanceof ShadowRoot ? root.host : (this.closest('nine-table') || root.host);\n\n if (!this.#tableHost) {\n this.#tableHost = this.parentElement?.closest('nine-table') || this.assignedSlot?.closest('nine-table');\n }\n\n if (!this.#tableHost) return;\n }\n\n #onContextMenu = (e) => {\n const path = e.composedPath ? e.composedPath() : [];\n const targetCell = path.find(el => el.tagName === 'TH' || el.tagName === 'TD');\n\n if (!targetCell) return;\n\n const targetTable = path.find(el => el.tagName === 'TABLE') || targetCell.closest('table');\n\n e.preventDefault();\n e.stopPropagation();\n\n this.openMenu(e.clientX, e.clientY, targetCell, targetTable);\n };\n\n #getTargetSheet(targetCell) {\n return targetCell?.closest('nine-table-sheet') || this.#tableHost.activeSheet || this.#tableHost;\n }\n\n #getFixManager(targetCell) {\n const sheet = this.#getTargetSheet(targetCell);\n if (!sheet) return null;\n\n if (!sheet.colFix) {\n sheet.colFix = new ColFixManager(sheet);\n }\n return sheet.colFix;\n }\n\n #parseCustomMenuItems(containerElement, activeTable) {\n const items = [];\n const activeTableId = activeTable?.id;\n const allUls = Array.from(containerElement.querySelectorAll(':scope > ul'));\n\n allUls.forEach(rootUl => {\n const targetTableAttr = rootUl.getAttribute('target-table');\n\n if (!targetTableAttr || (activeTableId && targetTableAttr === activeTableId)) {\n const parsedList = this.#traverseUl(rootUl);\n items.push(...parsedList);\n }\n });\n\n return items;\n }\n\n #traverseUl(ulEl) {\n const list = [];\n Array.from(ulEl.children).forEach(child => {\n const tagName = child.tagName.toLowerCase();\n\n if (tagName === 'hr' || child.classList.contains('separator')) {\n list.push({ type: 'separator' });\n return;\n }\n\n if (tagName === 'li') {\n let name = '';\n const spanEl = child.querySelector(':scope > span');\n if (spanEl) {\n name = spanEl.textContent.trim();\n } else {\n name = Array.from(child.childNodes)\n .filter(n => n.nodeType === Node.TEXT_NODE)\n .map(n => n.textContent.trim())\n .join('');\n }\n\n const subUl = child.querySelector(':scope > ul');\n const item = {\n menuId: child.id || name,\n name: name,\n className: child.className || '',\n disabled: child.hasAttribute('disabled') || child.getAttribute('disabled') === 'true',\n isCustom: true\n };\n\n if (subUl) {\n item.items = this.#traverseUl(subUl);\n }\n\n list.push(item);\n }\n });\n return list;\n }\n\n #buildMenuItems(activeTable, isHeaderCell, targetCell) {\n const useDefault = this.getAttribute('use-default-menu') !== 'false';\n let rawItems = [];\n\n const customItems = this.#parseCustomMenuItems(this, activeTable);\n if (customItems.length > 0) {\n rawItems.push(...customItems);\n }\n\n const fixManager = this.#getFixManager(targetCell);\n const currentFixState = fixManager?.getFixState(targetCell, activeTable) ?? 'none';\n const isFixable = isHeaderCell && (fixManager?.canFixColumn(targetCell, activeTable) ?? false);\n\n let fixMenuItem = null;\n if (currentFixState === 'left' || currentFixState === 'right') {\n fixMenuItem = {\n menuId: 'unfix-column',\n name: 'Unfix Column',\n className: 'ng-menu-unfix-col',\n disabled: !isHeaderCell\n };\n } else {\n fixMenuItem = {\n menuId: 'fix-column',\n name: 'Fix Column',\n className: 'ng-menu-fix-col',\n disabled: !isFixable\n };\n }\n\n if (useDefault) {\n rawItems.push(\n { type: 'separator' },\n {\n menuId: 'sort',\n name: 'Sort',\n className: 'ng-menu-sort',\n disabled: !isHeaderCell\n },\n fixMenuItem,\n { type: 'separator' },\n { menuId: 'filtering', name: 'Filtering', className: 'ng-menu-filtering' },\n { menuId: 'maximize', name: 'Maximize', className: 'maximize' },\n {\n menuId: 'export',\n name: 'Export',\n className: 'export',\n items: [\n { menuId: 'export-excel', name: 'Excel', className: 'export-excel' },\n { menuId: 'export-pdf', name: 'PDF', className: 'export-pdf', disabled: true }\n ]\n },\n {\n menuId: 'properties',\n name: 'Options',\n className: 'options',\n items: [\n { menuId: 'show-title-bar', name: 'Title Bar Show/Hide', className: 'show-title-bar' },\n { menuId: 'show-status-bar', name: 'Status Bar Show/Hide', className: 'show-status-bar' },\n { menuId: 'auto-fit-col', name: 'Auto Fit Columns', className: 'auto-fit-col' }\n ]\n }\n );\n }\n\n const cleanedItems = [];\n rawItems.forEach((item) => {\n if (item.type === 'separator') {\n if (cleanedItems.length === 0 || cleanedItems[cleanedItems.length - 1].type === 'separator') {\n return;\n }\n }\n cleanedItems.push(item);\n });\n\n if (cleanedItems.length > 0 && cleanedItems[cleanedItems.length - 1].type === 'separator') {\n cleanedItems.pop();\n }\n\n return cleanedItems;\n }\n\n openMenu(x, y, targetCell, targetTable) {\n const targetParent = this.#tableHost.shadowRoot || this.#tableHost;\n\n if (!this.#panel) {\n this.#panel = document.createElement('nine-table-menu-panel');\n targetParent.appendChild(this.#panel);\n }\n\n const isHeaderCell = !!targetCell.closest('thead');\n const menuItems = this.#buildMenuItems(targetTable, isHeaderCell, targetCell);\n\n this.#panel.render(menuItems, (e) => this.#handleMenuClick(e, targetCell, targetTable));\n\n const targetSheet = this.#getTargetSheet(targetCell);\n this.#syncMenuStates(targetSheet);\n\n this.#panel.openAt(x, y);\n }\n\n #syncMenuStates(targetSheet) {\n if (!this.#panel || !targetSheet) return;\n\n const isFiltering = targetSheet.filtering?.isFiltering?.() || false;\n this.#panel.toggleItemState('filtering', 'on', isFiltering);\n\n const autoFit = this.#tableHost.getAttribute('auto-fit-col') === 'true';\n this.#panel.toggleItemState('auto-fit-col', 'on', autoFit);\n\n const showTitle = this.#tableHost.getAttribute('show-title-bar') === 'true';\n this.#panel.toggleItemState('show-title-bar', 'on', showTitle);\n }\n\n #handleMenuClick(e, targetCell, targetTable) {\n const menuId = e.menuId;\n\n const customEvent = new CustomEvent('menu-click', {\n detail: { menuId, targetCell, targetTable, originalEvent: e },\n bubbles: true,\n composed: true\n });\n this.dispatchEvent(customEvent);\n\n const baseCol = parseInt(targetCell.dataset.col, 10);\n const targetSheet = this.#getTargetSheet(targetCell);\n\n switch (menuId) {\n case 'fix-column':\n case 'unfix-column':\n const fixManager = this.#getFixManager(targetCell);\n fixManager?.executeFixToggle(menuId, targetCell);\n break;\n\n case 'sort':\n if (!isNaN(baseCol)) {\n targetSheet.sorting?.handleSortFromMenu?.(baseCol, targetCell);\n }\n break;\n\n case 'filtering':\n targetSheet?.filtering?.toggle();\n break;\n\n case 'auto-fit-col':\n this.#tableHost.setAttribute('auto-fit-col', this.#tableHost.getAttribute('auto-fit-col') === 'true' ? 'false' : 'true');\n break;\n\n case 'show-title-bar':\n this.#tableHost.setAttribute('show-title-bar', this.#tableHost.getAttribute('show-title-bar') === 'true' ? 'false' : 'true');\n break;\n }\n\n this.#panel.close();\n }\n\n disconnectedCallback() {\n this.#tableHost?.removeEventListener('contextmenu', this.#onContextMenu);\n }\n}\n\nif (!customElements.get('nine-table-menu')) {\n customElements.define('nine-table-menu', ContextMenu);\n}","// ui/menu/nine-table-menu-panel.js\n\nexport class MenuPanel extends HTMLElement {\n #onCallback;\n #closeHandler = null;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n\n this.style.position = 'fixed';\n this.style.display = 'none';\n this.style.zIndex = '99999';\n\n this.innerHTML = `\n <div class=\"menu-wrapper\">\n <ul class=\"menu-container\"></ul>\n </div>\n `;\n }\n\n render(items, callback) {\n this.#onCallback = callback;\n const container = this.querySelector('.menu-container');\n if (!container) return;\n\n container.innerHTML = '';\n\n this.#appendItems(container, items);\n this.#bindClickEvents();\n }\n\n openAt(x, y, targetCell = null) {\n this.style.display = 'block';\n\n if (targetCell) {\n const cellRect = targetCell.getBoundingClientRect();\n const cellRightX = cellRect.right;\n\n requestAnimationFrame(() => {\n const wrapper = this.querySelector('.menu-wrapper');\n if (!wrapper) return;\n const panelWidth = wrapper.getBoundingClientRect().width;\n\n let calculatedLeft = cellRightX - panelWidth;\n\n if (calculatedLeft < 0) {\n calculatedLeft = cellRect.left;\n }\n\n const panelHeight = wrapper.getBoundingClientRect().height;\n let calculatedTop = y;\n if (y + panelHeight > window.innerHeight) {\n calculatedTop = y - panelHeight;\n }\n\n this.style.left = `${calculatedLeft}px`;\n this.style.top = `${calculatedTop}px`;\n });\n } else {\n this.style.left = `${x}px`;\n this.style.top = `${y}px`;\n\n requestAnimationFrame(() => {\n const wrapper = this.querySelector('.menu-wrapper');\n if (!wrapper) return;\n const rect = wrapper.getBoundingClientRect();\n\n if (x + rect.width > window.innerWidth) {\n this.style.left = `${x - rect.width}px`;\n }\n if (y + rect.height > window.innerHeight) {\n this.style.top = `${y - rect.height}px`;\n }\n });\n }\n\n if (this.#closeHandler) {\n window.removeEventListener('pointerdown', this.#closeHandler);\n }\n\n this.#closeHandler = (e) => {\n const path = e.composedPath ? e.composedPath() : [];\n if (!path.includes(this) && !this.contains(e.target)) {\n this.close();\n }\n };\n\n setTimeout(() => {\n window.addEventListener('pointerdown', this.#closeHandler);\n }, 0);\n }\n\n close() {\n this.style.display = 'none';\n if (this.#closeHandler) {\n window.removeEventListener('pointerdown', this.#closeHandler);\n this.#closeHandler = null;\n }\n }\n\n toggleItemState(menuId, className, condition) {\n const li = this.querySelector(`li[menu-id=\"${menuId}\"]`);\n if (li) {\n condition ? li.classList.add(className) : li.classList.remove(className);\n }\n }\n\n #appendItems(parentUl, items) {\n items.forEach(item => {\n if (item.type === 'separator') {\n const sep = document.createElement('li');\n sep.className = 'ng-menu-separator';\n parentUl.appendChild(sep);\n return;\n }\n\n const li = document.createElement('li');\n li.setAttribute('menu-id', item.menuId);\n li.className = `${item.className || ''} ${item.items ? 'submenu' : ''} ${item.disabled ? 'disabled' : ''}`.trim();\n\n const span = document.createElement('span');\n span.textContent = item.name;\n li.appendChild(span);\n\n if (item.items && item.items.length > 0) {\n const subUl = document.createElement('ul');\n subUl.className = 'ng-menu-sublist';\n this.#appendItems(subUl, item.items);\n li.appendChild(subUl);\n }\n\n parentUl.appendChild(li);\n });\n }\n\n #bindClickEvents() {\n this.querySelectorAll('li[menu-id]').forEach(li => {\n li.addEventListener('click', (e) => {\n e.stopPropagation();\n if (li.classList.contains('disabled')) return;\n\n const menuId = li.getAttribute('menu-id');\n this.#onCallback?.({ menuId, target: li });\n this.close();\n });\n });\n }\n\n disconnectedCallback() {\n this.close();\n }\n}\n\nif (!customElements.get('nine-table-menu-panel')) {\n customElements.define('nine-table-menu-panel', MenuPanel);\n}"],"mappings":"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"}
|