@ninebone/table 0.0.74 → 0.0.76
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/dist/nine-table.js +165 -442
- package/dist/nine-table.js.map +1 -1
- package/dist/nine-table.umd.js +11 -71
- package/dist/nine-table.umd.js.map +1 -1
- package/package.json +1 -1
package/dist/nine-table.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nine-table.js","sources":["../src/external/NoPeer.js","../src/ui/nine-table-vscrollbar.js","../src/ui/nine-table-hscrollbar.js","../src/ui/nine-table-sheet.js","../src/ui/nine-table-sheets.js","../src/ui/LayoutManager.js","../src/core/nine-table.js"],"sourcesContent":["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();","\nimport { trace } from \"@nopeer\";\n\nclass NineTableVScrollBar extends HTMLElement {\n #owner;\n #dragging;\n #elements;\n #interval1;\n #interval2;\n #firstThumbMove;\n #prevY = 0;\n\n constructor() {\n super();\n //this.applyBaseStyle();\n }\n\n connectedCallback() {\n // 호스트 엘리먼트(nine-table-sheet) 참조\n this.#owner = this.getRootNode().host;\n if (!this.#owner) return;\n\n this.shadowRoot.innerHTML = `\n <button class='ng-scroll-top' disabled><div class='ng-scroll-icon'></div></button>\n <div class='ng-scroll-track'> <div class='ng-scroll-thumb'></div> </div>\n <button class='ng-scroll-bottom'><div class='ng-scroll-icon'></div></button>\n `;\n\n super.connectedCallback();\n\n this.#elements = {\n track : this.shadowRoot.querySelector(\".ng-scroll-track\"),\n thumb : this.shadowRoot.querySelector(\".ng-scroll-thumb\"),\n top : this.shadowRoot.querySelector(\".ng-scroll-top\"),\n bottom : this.shadowRoot.querySelector(\".ng-scroll-bottom\"),\n };\n\n this.#init();\n }\n\n refresh = () => {\n if (!this.#owner) return;\n\n const body = this.#owner.querySelector(\".ng-container-body\");\n if (!body) return;\n\n const thumb = $(this.#elements.thumb, this.shadowRoot);\n const thead = body.querySelector(\"table > thead\");\n\n const currRow = this.#owner.getRowCount ? 0 : 0; // 데이터 연동 시점 확장 포인트\n const trackHeight = $(this.#elements.track).height();\n const thumbHeight = $(this.#elements.thumb).height();\n\n // 높이 및 표시 여부 산출\n const totalRows = this.#owner.getRowCount ? this.#owner.getRowCount() : 0;\n if (totalRows <= 10) {\n $(this).hide();\n return;\n } else {\n $(this).show();\n }\n\n const theadHeight = thead ? thead.getBoundingClientRect().height : 0;\n const h = Math.max(Math.min(trackHeight * (body.clientHeight - theadHeight) / (32 * totalRows), trackHeight), 16);\n\n thumb[0].dataset.height = h;\n thumb.css({ \"height\": h });\n\n const totalHeight = trackHeight - this.#getThumbHeight();\n if (totalHeight <= 0) return;\n\n // 위치(Top) 산출\n let y = 0;\n const maxScrollTop = body.scrollHeight - body.clientHeight;\n if (maxScrollTop > 0) {\n y = parseInt((body.scrollTop / maxScrollTop) * totalHeight, 10);\n if (y > trackHeight - thumbHeight) y = trackHeight - thumbHeight;\n if (y < 0) y = 0;\n }\n\n this.#elements.thumb.style.top = y + 'px';\n\n // 버튼 활성/비활성 처리\n this.#elements.top.disabled = body.scrollTop <= 0;\n this.#elements.bottom.disabled = body.scrollTop >= maxScrollTop;\n };\n\n delayScroll = (pos, delay1, delay2, callback) => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n\n const body = this.#owner.querySelector(\".ng-container-body\");\n if (body) body.scrollTop += pos * 32;\n\n this.#interval1 = setInterval(() => {\n clearInterval(this.#interval1);\n\n this.#interval2 = setInterval(() => {\n if (body) {\n body.scrollTop += pos * 32;\n if (callback) callback.call();\n }\n }, delay2);\n }, delay1);\n };\n\n stopScroll = () => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n };\n\n #init = () => {\n const delayScrollAction = (pos) => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n\n const body = this.#owner.querySelector(\".ng-container-body\");\n if (body) body.scrollTop += pos * 32;\n\n this.#interval1 = setInterval(() => {\n clearInterval(this.#interval1);\n\n this.#interval2 = setInterval(() => {\n if (body) body.scrollTop += pos * 32;\n }, 10);\n }, 500);\n };\n\n $(this.#elements.top).on(\"mousedown\", e => { if (e.buttons != 1 || e.altKey || e.ctrlKey || e.shiftKey) return; delayScrollAction(-1); });\n $(this.#elements.bottom).on(\"mousedown\", e => { if (e.buttons != 1 || e.altKey || e.ctrlKey || e.shiftKey) return; delayScrollAction(1); });\n\n $(this.#elements.top).on(\"touchstart\", e => { delayScrollAction(-1); });\n $(this.#elements.bottom).on(\"touchstart\", e => { delayScrollAction(1); });\n\n const clearTimer = () => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n };\n\n this.#elements.top.ontouchend =\n this.#elements.bottom.ontouchend =\n this.#elements.track.ontouchend =\n this.#elements.top.onmouseup =\n this.#elements.top.onmouseleave =\n this.#elements.bottom.onmouseup =\n this.#elements.bottom.onmouseleave =\n this.#elements.track.onmouseup =\n this.#elements.track.onmouseleave = clearTimer;\n\n $(this.#elements.track).on(\"mousedown\", this.#track_onMouseDown);\n $(this.#elements.track).on(\"touchstart\", this.#track_onTouchStart);\n\n $(this.#elements.thumb).on(\"mousedown\", this.#thumb_onMouseDown);\n $(this.#elements.thumb).on(\"touchstart\", this.#thumb_onTouchStart);\n\n document.addEventListener('mouseup', e => {\n if (this.#dragging) {\n this.#dragging = false;\n }\n document.removeEventListener('mousemove', this.#thumb_onMouseMove);\n });\n\n document.addEventListener('touchend', e => {\n this.#dragging = false;\n document.removeEventListener('touchmove', this.#thumb_onTouchMove);\n });\n };\n\n #track_onTouchStart = e => {\n var rect = e.target.getBoundingClientRect();\n e.clientX = e.targetTouches[0].clientX;\n e.clientY = e.targetTouches[0].clientY;\n e.buttons = 1;\n this.#track_onMouseDown(e);\n }\n\n #track_onMouseDown = e => {\n if (this.#dragging) return;\n if (e.buttons != 1 || e.altKey || e.ctrlKey || e.shiftKey) return;\n e.preventDefault();\n\n var thumbBound = this.#elements.thumb.getBoundingClientRect();\n const body = this.#owner.querySelector(\".ng-container-body\");\n if (!body) return;\n\n const scrollStep = body.clientHeight;\n const pos = (e.clientY > thumbBound.y) ? scrollStep : -scrollStep;\n body.scrollTop += pos;\n\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n\n this.#interval1 = setInterval(() => {\n clearInterval(this.#interval1);\n\n this.#interval2 = setInterval(() => {\n var thumbBound = this.#elements.thumb.getBoundingClientRect();\n if (e.clientY > thumbBound.y && e.clientY < thumbBound.y + thumbBound.height) {\n clearInterval(this.#interval2);\n } else {\n body.scrollTop += (e.clientY > thumbBound.y) ? scrollStep : -scrollStep;\n }\n }, 10);\n }, 500);\n };\n\n #thumb_onTouchStart = e => {\n e.clientX = e.targetTouches[0].clientX;\n e.clientY = e.targetTouches[0].clientY;\n e.buttons = 1;\n this.#thumb_onMouseDown(e);\n document.addEventListener('touchmove', this.#thumb_onTouchMove);\n };\n\n #thumb_onTouchMove = e => {\n e.clientX = e.targetTouches[0].clientX;\n e.clientY = e.targetTouches[0].clientY;\n e.buttons = 1;\n this.#thumb_onMouseMove(e);\n };\n\n #thumb_onMouseDown = e => {\n this.#prevY = e.clientY;\n this.#dragging = true;\n this.shiftY = e.offsetY + this.#elements.track.getBoundingClientRect().y;\n\n this.trackHeight = $(this.#elements.track).height();\n this.thumbHeight = $(this.#elements.thumb).height();\n\n this.#firstThumbMove = true;\n document.addEventListener('mousemove', this.#thumb_onMouseMove);\n };\n\n #thumb_onMouseMove = (e) => {\n if (!this.#dragging) return;\n e.preventDefault();\n\n const trackHeight = this.trackHeight;\n const thumbHeight = this.#getThumbHeight();\n\n var y = e.clientY - this.shiftY;\n if (y < 0) y = 0;\n if (y + thumbHeight > trackHeight) y = parseInt(trackHeight - thumbHeight);\n\n this.#elements.thumb.style.top = y + 'px';\n\n const body = this.#owner.querySelector(\".ng-container-body\");\n if (!body) return;\n\n const maxScrollTop = body.scrollHeight - body.clientHeight;\n const scrollableTrack = trackHeight - thumbHeight;\n\n if (scrollableTrack > 0 && maxScrollTop > 0) {\n body.scrollTop = (y / scrollableTrack) * maxScrollTop;\n }\n };\n\n #getThumbHeight = () => {\n return parseInt(this.#elements.thumb.dataset.height || 30, 10);\n };\n}\n\nif (!customElements.get('nine-table-vscrollbar')) {\n customElements.define(\"nine-table-vscrollbar\", NineTableVScrollBar);\n}","import { trace } from \"@nopeer\";\n\nclass NineTableHScrollBar extends HTMLElement {\n #owner;\n #dragging;\n #elements;\n #interval1;\n #interval2;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#owner = this.getRootNode().host;\n if (!this.#owner) return;\n\n this.innerHTML = `\n <style>\n nine-table-hscrollbar {\n display: flex;\n flex-direction: row;\n width: 100%;\n height: 100%;\n background: #f9fafb;\n box-sizing: border-box;\n user-select: none;\n }\n nine-table-hscrollbar button {\n width: 16px;\n height: 100%;\n background: #f3f4f6;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n }\n nine-table-hscrollbar button:disabled {\n opacity: 0.4;\n cursor: default;\n }\n nine-table-hscrollbar .ng-scroll-icon {\n width: 6px;\n height: 6px;\n border-top: 2px solid #6b7280;\n border-right: 2px solid #6b7280;\n }\n nine-table-hscrollbar .ng-scroll-left .ng-scroll-icon { transform: rotate(-135deg); }\n nine-table-hscrollbar .ng-scroll-right .ng-scroll-icon { transform: rotate(45deg); }\n nine-table-hscrollbar .ng-scroll-track {\n flex: 1;\n height: 100%;\n position: relative;\n background: #f3f4f6;\n overflow: hidden;\n }\n nine-table-hscrollbar .ng-scroll-thumb {\n position: absolute;\n top: 2px;\n bottom: 2px;\n background: #d1d5db;\n border-radius: 4px;\n cursor: pointer;\n }\n nine-table-hscrollbar .ng-scroll-thumb:hover {\n background: #9ca3af;\n }\n </style>\n <button class='ng-scroll-left' disabled><div class='ng-scroll-icon'></div></button>\n <div class='ng-scroll-track'><div class='ng-scroll-thumb'></div></div>\n <button class='ng-scroll-right'><div class='ng-scroll-icon'></div></button>\n `;\n\n this.#elements = {\n container : this.#owner.querySelector(\".ng-container-body\"),\n track : this.querySelector(\".ng-scroll-track\"),\n thumb : this.querySelector(\".ng-scroll-thumb\"),\n left : this.querySelector(\".ng-scroll-left\"),\n right : this.querySelector(\".ng-scroll-right\"),\n };\n\n this.#init();\n setTimeout(() => this.refresh(), 0);\n }\n\n refresh = () => {\n if (!this.#owner) return;\n\n const body = this.#owner.querySelector(\".ng-container-body\");\n if (!body) return;\n\n const table = body.querySelector(\"table\");\n if (!table) return;\n\n const track = $(this.#elements.track, this);\n const thumb = $(this.#elements.thumb, this);\n\n const bottomContainer = this.#owner.querySelector(\".ng-container-bottom\");\n if (body.clientWidth !== 0 && table.scrollWidth > body.clientWidth) {\n $(bottomContainer).show();\n } else {\n $(bottomContainer).hide();\n return;\n }\n\n const trackWidth = track.width();\n if (trackWidth <= 0) return;\n\n const thumbWidth = Math.max(Math.min(trackWidth * (body.clientWidth / table.scrollWidth), trackWidth), 20);\n thumb.width(thumbWidth);\n\n const maxScrollLeft = table.scrollWidth - body.clientWidth;\n const maxThumbLeft = trackWidth - thumbWidth;\n\n let l = 0;\n if (maxScrollLeft > 0) {\n l = parseInt((body.scrollLeft / maxScrollLeft) * maxThumbLeft, 10);\n }\n if (l < 0) l = 0;\n if (l > maxThumbLeft) l = maxThumbLeft;\n\n thumb.css({ left: l });\n\n this.#elements.left.disabled = (body.scrollLeft <= 0);\n this.#elements.right.disabled = (body.scrollLeft >= maxScrollLeft);\n };\n\n #thumbMoveTo = (x) => {\n if (!this.#elements) return;\n\n const body = this.#owner.querySelector(\".ng-container-body\");\n const table = body.querySelector(\"table\");\n if (!table) return;\n\n const trackBound = this.#elements.track.getBoundingClientRect();\n const thumbBound = this.#elements.thumb.getBoundingClientRect();\n\n let targetX = x;\n if (targetX < 0) targetX = 0;\n if (targetX + thumbBound.width > trackBound.width) targetX = trackBound.width - thumbBound.width;\n targetX = parseInt(targetX, 10);\n\n this.#elements.thumb.style.left = targetX + 'px';\n\n const maxScrollLeft = table.scrollWidth - body.clientWidth;\n const maxThumbLeft = trackBound.width - thumbBound.width;\n\n if (maxThumbLeft > 0 && maxScrollLeft > 0) {\n body.scrollLeft = (targetX / maxThumbLeft) * maxScrollLeft;\n }\n\n this.#elements.left.disabled = targetX <= 0;\n this.#elements.right.disabled = targetX >= maxThumbLeft;\n\n return (targetX > 0 && targetX < maxThumbLeft);\n };\n\n #init = () => {\n const body = this.#owner.querySelector(\".ng-container-body\");\n\n if (body) {\n body.addEventListener('scroll', () => {\n this.refresh();\n });\n }\n\n const delayScroll = (pos) => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n\n const trackBound = this.#elements.track.getBoundingClientRect();\n const thumbBound = this.#elements.thumb.getBoundingClientRect();\n\n this.#thumbMoveTo((thumbBound.x - trackBound.x) + pos);\n\n this.#interval1 = setInterval(() => {\n clearInterval(this.#interval1);\n\n this.#interval2 = setInterval(() => {\n const tBound = this.#elements.track.getBoundingClientRect();\n const thBound = this.#elements.thumb.getBoundingClientRect();\n if (!this.#thumbMoveTo((thBound.x - tBound.x) + pos)) {\n clearInterval(this.#interval2);\n }\n }, 10);\n }, 500);\n };\n\n const clearTimer = () => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n };\n\n this.#elements.left.ontouchend =\n this.#elements.right.ontouchend =\n this.#elements.track.ontouchend =\n this.#elements.left.onmouseup =\n this.#elements.left.onmouseleave =\n this.#elements.right.onmouseup =\n this.#elements.right.onmouseleave =\n this.#elements.track.onmouseup =\n this.#elements.track.onmouseleave = clearTimer;\n\n $(this.#elements.left).on(\"mousedown\", e => { if (e.buttons != 1) return; delayScroll(-10); });\n $(this.#elements.right).on(\"mousedown\", e => { if (e.buttons != 1) return; delayScroll(10); });\n\n $(this.#elements.left).on(\"touchstart\", e => { delayScroll(-10); });\n $(this.#elements.right).on(\"touchstart\", e => { delayScroll(10); });\n\n $(this.#elements.track).on(\"mousedown\", e => {\n if (e.buttons != 1) return;\n e.preventDefault();\n const trackRect = this.#elements.track.getBoundingClientRect();\n const thumbWidth = this.#elements.thumb.getBoundingClientRect().width;\n this.#thumbMoveTo(e.clientX - trackRect.left - (thumbWidth / 2));\n });\n\n $(this.#elements.thumb).on(\"mousedown\", e => {\n this.#dragging = true;\n this.shiftX = e.clientX - this.#elements.thumb.getBoundingClientRect().left;\n document.addEventListener('mousemove', this.#thumb_onMouseMove);\n });\n\n document.addEventListener('mouseup', () => {\n this.#dragging = false;\n clearTimer();\n document.removeEventListener('mousemove', this.#thumb_onMouseMove);\n });\n };\n\n #thumb_onMouseMove = e => {\n if (!this.#dragging) return;\n const trackRect = this.#elements.track.getBoundingClientRect();\n this.#thumbMoveTo(e.clientX - trackRect.left - this.shiftX);\n };\n}\n\nif (!customElements.get('nine-table-hscrollbar')) {\n customElements.define(\"nine-table-hscrollbar\", NineTableHScrollBar);\n}","import { trace } from \"@nopeer\";\nimport './nine-table-vscrollbar.js';\nimport './nine-table-hscrollbar.js';\n\nexport class NineTableSheet extends HTMLElement {\n #tableElement = null;\n static SCROLLBAR_SIZE = 16;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#render();\n };\n\n init = (tableEl) => {\n if (!tableEl) return;\n\n const initializeTable = (tbl) => {\n\n const ensureColgroup = (tbl) => {\n if (tbl.querySelector('colgroup')) return;\n\n const firstRow = tbl.querySelector('tbody tr') || tbl.querySelector('tr');\n const colCount = firstRow ? firstRow.querySelectorAll('th, td').length : 1;\n\n const colgroup = document.createElement('colgroup');\n const defaultWidth = Math.max(Math.floor((tbl.clientWidth || 600) / colCount), 100);\n\n for (let i = 0; i < colCount; i++) {\n const col = document.createElement('col');\n col.setAttribute('width', defaultWidth);\n colgroup.appendChild(col);\n }\n tbl.prepend(colgroup);\n };\n\n const 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 ensureColgroup(tbl);\n ensureThead(tbl);\n\n tbl.classList.add('nine-table-element');\n return tbl;\n };\n\n const clonedTable = tableEl.cloneNode(true);\n this.#tableElement = initializeTable(clonedTable);\n this.#tableElement.style.display = 'table';\n\n const leftContainer = this.querySelector('.ng-container-left');\n const bodyContainer = this.querySelector('.ng-container-body');\n const rightContainer = this.querySelector('.ng-container-right');\n\n const filterTableByFixed = (sourceTable, targetFixedType, isBody = false) => {\n const tbl = sourceTable.cloneNode(true);\n const cols = Array.from(tbl.querySelectorAll('colgroup col'));\n const targetIndices = [];\n\n cols.forEach((col, idx) => {\n const fixedAttr = col.getAttribute('fixed');\n const isMatch = isBody ? (!fixedAttr || fixedAttr === '') : (fixedAttr === targetFixedType);\n if (!isMatch) {\n targetIndices.push(idx);\n }\n });\n\n targetIndices.reverse().forEach(idx => {\n if (cols[idx]) cols[idx].remove();\n tbl.querySelectorAll('tr').forEach(tr => {\n const cells = tr.querySelectorAll('th, td');\n if (cells[idx]) cells[idx].remove();\n });\n });\n\n return tbl;\n };\n\n // 1. 메인 바디 영역\n if (bodyContainer) {\n const bodyTable = filterTableByFixed(this.#tableElement, null, true);\n bodyContainer.innerHTML = '';\n bodyContainer.appendChild(bodyTable);\n }\n\n // 2. 좌측 고정 영역\n if (leftContainer) {\n const leftTable = filterTableByFixed(this.#tableElement, 'left', false);\n\n let leftWidth = 0;\n leftTable.querySelectorAll('col').forEach(col => {\n const w = parseInt(col.getAttribute('width'), 10);\n if (!isNaN(w)) leftWidth += w;\n });\n\n leftContainer.innerHTML = '';\n leftContainer.appendChild(leftTable);\n\n const activeLeftWidth = leftWidth > 0 ? leftWidth : 0;\n leftContainer.style.flex = `0 0 ${activeLeftWidth}px`;\n leftContainer.style.width = `${activeLeftWidth}px`;\n }\n\n // 3. 우측 고정 영역\n if (rightContainer) {\n const rightTable = filterTableByFixed(this.#tableElement, 'right', false);\n\n let rightWidth = 0;\n rightTable.querySelectorAll('col').forEach(col => {\n const w = parseInt(col.getAttribute('width'), 10);\n if (!isNaN(w)) rightWidth += w;\n });\n\n rightContainer.innerHTML = '';\n rightContainer.appendChild(rightTable);\n\n const activeRightWidth = rightWidth > 0 ? rightWidth : 0;\n rightContainer.style.flex = `0 0 ${activeRightWidth}px`;\n rightContainer.style.width = `${activeRightWidth}px`;\n }\n\n // 데이터 건수 기반 세로 스크롤 제어 정책 반영\n if (bodyContainer) {\n const rowCount = this.getRowCount();\n bodyContainer.style.overflowY = rowCount > 10 ? 'auto' : 'hidden';\n\n bodyContainer.addEventListener('scroll', () => {\n const scrollLeft = bodyContainer.scrollLeft;\n\n // 좌우 고정 영역은 가로 스크롤 시 밀려나지 않도록 위치 보정 또는\n // 하단 스크롤바 썸(Thumb) 위치 동기화 호출\n const hScrollbar = this.querySelector('nine-table-hscrollbar');\n if (hScrollbar && typeof hScrollbar.syncThumb === 'function') {\n hScrollbar.syncThumb(scrollLeft);\n }\n });\n }\n\n trace.log(`NineTableSheet 3-split initialized with rows: ${this.getRowCount()}`);\n };\n\n getRowCount = () => {\n if (!this.#tableElement) return 0;\n return this.#tableElement.querySelectorAll('tbody tr').length;\n };\n\n // 🎯 외부 스크롤바 및 컨트롤러 연동용 메서드\n scrollToX = (scrollLeft) => {\n const bodyContainer = this.querySelector('.ng-container-body');\n if (bodyContainer) bodyContainer.scrollLeft = scrollLeft;\n };\n\n scrollToY = (scrollTop) => {\n const bodyContainer = this.querySelector('.ng-container-body');\n if (bodyContainer) bodyContainer.scrollTop = scrollTop;\n };\n\n #render = () => {\n const sbSize = NineTableSheet.SCROLLBAR_SIZE;\n\n this.innerHTML = `\n <style>\n nine-table-sheet {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n position: relative;\n box-sizing: border-box;\n background: #ffffff;\n overflow: hidden;\n }\n \n nine-table-sheet .ng-container-top {\n display: flex;\n flex-direction: row;\n flex: 1 1 auto;\n width: 100%;\n height: calc(100% - ${sbSize}px);\n overflow: hidden;\n position: relative;\n }\n \n nine-table-sheet .ng-container-left {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n background: #ffffff;\n border-right: 1px solid #e5e7eb;\n flex-shrink: 0;\n }\n \n nine-table-sheet .ng-container-body {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow-x: auto;\n overflow-y: auto;\n background: #ffffff;\n position: relative;\n }\n \n nine-table-sheet .ng-container-right {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n background: #ffffff;\n border-left: 1px solid #e5e7eb;\n flex-shrink: 0;\n }\n \n nine-table-sheet .ng-container-bottom {\n display: flex;\n flex-direction: row;\n height: ${sbSize}px;\n min-height: ${sbSize}px;\n flex-shrink: 0;\n background: #f9fafb;\n border-top: 1px solid #e5e7eb;\n }\n \n nine-table-sheet nine-table-hscrollbar {\n flex: 1;\n height: 100%;\n overflow: hidden;\n display: block;\n }\n \n nine-table-sheet .ng-scroll-edge {\n width: ${sbSize}px;\n min-width: ${sbSize}px;\n height: 100%;\n flex-shrink: 0;\n background: #f3f4f6;\n }\n \n nine-table-sheet table {\n border-collapse: collapse;\n width: 100%;\n table-layout: fixed;\n }\n \n nine-table-sheet th, nine-table-sheet td {\n box-sizing: border-box;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n padding: 6px 8px;\n border: 1px solid #e5e7eb;\n font-size: 12px;\n color: #111827;\n }\n \n nine-table-sheet th {\n background-color: #f9fafb;\n font-weight: 600;\n text-align: left;\n }\n </style>\n \n <div class='ng-container-top'>\n <div class='ng-container-left'></div>\n <div class='ng-container-body'></div>\n <div class='ng-container-right'></div>\n <nine-table-vscrollbar></nine-table-vscrollbar>\n </div>\n <div class='ng-container-bottom'>\n <nine-table-hscrollbar></nine-table-hscrollbar>\n <div class='ng-scroll-edge'></div>\n </div>\n `;\n };\n\n disconnectedCallback() {\n this.innerHTML = '';\n trace.log('NineTableSheet destroyed.');\n };\n}\n\nif (!customElements.get('nine-table-sheet')) {\n customElements.define('nine-table-sheet', NineTableSheet);\n}","import './nine-table-sheet.js';\n\nexport class NineTableSheets extends HTMLElement {\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#init();\n };\n\n #init = () => {\n const tabBar = this.querySelector('.nine-tab-bar');\n if (!tabBar) return;\n\n tabBar.addEventListener('click', (e) => {\n const tabItem = e.target.closest('.nine-tab-item');\n if (!tabItem) return;\n\n const isMultiSelect = e.ctrlKey || e.metaKey || e.shiftKey;\n const index = parseInt(tabItem.dataset.index, 10);\n this.switchSheet(index, isMultiSelect);\n });\n\n this.switchSheet(0, false);\n };\n\n switchSheet = (index, isMultiSelect = false) => {\n\n const updateSplitters = () => {\n const body = this.querySelector('nine-table-sheets-body');\n const splitters = body.querySelectorAll('nine-splitter');\n splitters.forEach(splitter => {\n const splitIndex = parseInt(splitter.dataset.splitIndex, 10);\n const leftSheet = body.querySelector(`nine-table-sheet[data-index=\"${splitIndex - 1}\"]`);\n const rightSheet = body.querySelector(`nine-table-sheet[data-index=\"${splitIndex}\"]`);\n\n if (leftSheet && rightSheet && leftSheet.classList.contains('active') && rightSheet.classList.contains('active')) {\n splitter.classList.add('active');\n } else {\n splitter.classList.remove('active');\n }\n });\n };\n\n const tabBar = this.querySelector('.nine-tab-bar');\n const body = this.querySelector('nine-table-sheets-body');\n const tabItems = tabBar.querySelectorAll('.nine-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.classList.toggle('active', idx === index);\n const sheet = body.querySelector(`nine-table-sheet[data-index=\"${idx}\"]`);\n if (sheet) sheet.style.flex = '';\n });\n sheetElements.forEach((sheet, idx) => {\n sheet.classList.toggle('active', idx === index);\n });\n } else {\n const clickedTab = tabItems[index];\n const activeTabs = tabBar.querySelectorAll('.nine-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 = Array.from(body.querySelectorAll('nine-table-sheet.active'));\n if (activeSheets.length > 1) {\n const initialBasis = (1 / activeSheets.length);\n activeSheets.forEach(sheet => {\n if (!sheet.style.flex || sheet.style.flex === '1 1 100%') {\n sheet.style.flex = `${initialBasis} ${initialBasis} 0px`;\n }\n });\n } else {\n activeSheets.forEach(sheet => {\n sheet.style.flex = '1 1 100%';\n });\n }\n\n updateSplitters();\n\n const activeSheet = body.querySelector(`nine-table-sheet.active`);\n if (activeSheet && typeof activeSheet.getRowCount === 'function') {\n const rowCountEl = this.querySelector('#row-count');\n if (rowCountEl) {\n rowCountEl.textContent = activeSheet.getRowCount().toLocaleString();\n }\n }\n };\n\n\n}\n\nif (!customElements.get('nine-table-sheets')) {\n customElements.define('nine-table-sheets', NineTableSheets);\n}","/**\n * [LayoutManager 높이 설정(Height Configuration) 사용 예제]\n *\n * 1. 부모 영역 채우기 (Fluid / 100% Fill) - 기본값\n * - 컴포넌트가 부모 컨테이너의 남은 공간을 가득 채우고 내부 영역에서 스크롤을 처리합니다.\n * - 사용법: <nine-table> 또는 호스트 엘리먼트에 별도 속성을 주지 않으면 적용됩니다.\n *\n * 2. 콘텐츠 밀착형 / 데이터 건수 기반 동적 높이 (Auto-Height)\n * - 데이터 행 개수에 맞춰 컴포넌트 전체 높이가 유연하게 늘어납니다.\n * - 사용법: <nine-table auto-height=\"true\"> 또는 호스트 엘리먼트에 auto-height=\"true\" 속성을 지정합니다.\n *\n * 3. 픽셀 고정 높이 (Fixed Pixel)\n * - 부모 크기에 상관없이 개발자가 지정한 고정 크기를 엄격하게 유지합니다.\n * - 사용법: <nine-table style=\"height: 400px;\"> 처럼 인라인 스타일로 높이를 직접 제어합니다.\n */\n\nimport './nine-table-sheets.js';\n\nexport class LayoutManager {\n #root;\n #resizeObserver = null;\n\n constructor(shadowRoot) {\n this.#root = shadowRoot;\n this.#render();\n this.#observeResize();\n }\n\n #observeResize = () => {\n const hostEl = this.#root.host;\n if (!hostEl) return;\n\n this.#resizeObserver = new ResizeObserver((entries) => {\n for (let entry of entries) {\n const isAutoHeight = hostEl.getAttribute('auto-height') === 'true';\n if (isAutoHeight) {\n this.#applyAutoHeight(hostEl);\n }\n }\n });\n\n this.#resizeObserver.observe(hostEl);\n };\n\n #applyAutoHeight = (hostEl) => {\n const activeSheet = hostEl.shadowRoot?.querySelector('nine-table-sheet.active');\n if (!activeSheet) return;\n\n const rowCount = activeSheet.getRowCount?.() || 0;\n\n // 1. 속성으로 maxRows를 받되, 없으면 기본값 10 설정\n const maxRows = parseInt(hostEl.getAttribute('max-display-row'), 10) || 10;\n const targetRows = Math.min(rowCount, maxRows);\n\n // 2. 실제 렌더링된 행(tr) 높이를 동적으로 측정 (없으면 기본 32px 폴백)\n const sampleRow = activeSheet.querySelector('tbody tr') || activeSheet.querySelector('tr');\n const rowHeight = sampleRow ? sampleRow.getBoundingClientRect().height : 32;\n\n // 3. 헤더 및 푸터/탭 영역의 실제 높이를 DOM에서 동적 측정\n const headerEl = this.#root.querySelector('nine-table-header');\n const footerEl = this.#root.querySelector('nine-table-sheets-footer');\n const headerHeight = headerEl ? headerEl.getBoundingClientRect().height : 40;\n const footerHeight = footerEl ? footerEl.getBoundingClientRect().height : 32;\n const extraPadding = 16; // 미세 여백\n\n const headerFooterHeight = headerHeight + footerHeight + extraPadding;\n const calculatedHeight = (targetRows * rowHeight) + headerFooterHeight;\n\n hostEl.style.height = `${calculatedHeight}px`;\n hostEl.style.maxHeight = `${(maxRows * rowHeight) + headerFooterHeight}px`;\n\n const sheetsBody = this.#root.querySelector('nine-table-sheets-body');\n if (sheetsBody) {\n sheetsBody.style.overflowY = rowCount > maxRows ? 'auto' : 'hidden';\n }\n };\n\n #render = () => {\n const hostEl = this.#root.host;\n const rawElements = Array.from(hostEl.children);\n const rawTables = rawElements.filter(el => el.tagName === 'TABLE');\n const isAutoHeight = hostEl.getAttribute('auto-height') === 'true';\n\n const sheetsHtml = rawTables.map((_, idx) => {\n const className = idx === 0 ? 'active' : '';\n return `<nine-table-sheet class=\"${className}\" data-index=\"${idx}\"></nine-table-sheet>`;\n }).join('');\n\n const tabsHtml = rawTables.map((_, idx) => {\n const className = idx === 0 ? 'active' : '';\n return `<div class=\"nine-tab-item ${className}\" data-index=\"${idx}\">Sheet ${idx + 1}</div>`;\n }).join('');\n\n this.#root.innerHTML = `\n <style>\n :host { \n display: flex; \n flex-direction: column; \n position: relative; \n overflow: hidden; \n height: ${isAutoHeight ? 'auto' : '100%'}; \n background: #fff; \n }\n nine-table-header { height: 40px; display: block; flex-shrink: 0; border-bottom: 1px solid #e5e7eb; background: #fff; }\n nine-table-body { display: flex; flex-direction: row; flex: 1; overflow: hidden; position: relative; }\n nine-table-summary { display: none; width: 250px; flex-shrink: 0; border-right: 1px solid #e5e7eb; }\n nine-splitter:not([data-split-index]) { width: 4px; background: #e5e7eb; cursor: col-resize; flex-shrink: 0; }\n nine-table-analysis { display: none; }\n nine-table-footer { display: none; }\n\n nine-table-sheets {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n position: relative;\n background: #fff;\n }\n nine-table-sheets-body {\n flex: 1;\n overflow: auto;\n position: relative;\n display: flex;\n flex-direction: row;\n }\n nine-table-sheet {\n display: none !important;\n height: 100%;\n overflow: auto;\n flex: 1 1 100%;\n }\n nine-table-sheet.active {\n display: block !important;\n }\n nine-table-sheets-footer {\n display: flex;\n height: 32px;\n background: #f3f4f6;\n border-top: 1px solid #e5e7eb;\n align-items: center;\n justify-content: space-between;\n padding: 0 8px;\n flex-shrink: 0;\n }\n nine-table-sheets .nine-tab-bar {\n display: flex;\n align-items: center;\n gap: 2px;\n overflow-x: auto;\n flex: 1;\n height: 100%;\n }\n nine-table-sheets .nine-tab-item {\n padding: 4px 12px;\n cursor: pointer;\n font-size: 12px;\n color: #4b5563;\n background: #e5e7eb;\n border: 1px solid #d1d5db;\n border-top: none;\n border-radius: 0 0 3px 3px;\n user-select: none;\n }\n nine-table-sheets .nine-tab-item.active {\n background: #ffffff;\n color: #111827;\n font-weight: 600;\n border-bottom: 2px solid #2563eb;\n }\n nine-table-sheets .sheets-counter {\n font-size: 12px;\n color: #6b7280;\n padding-left: 12px;\n flex-shrink: 0;\n }\n </style>\n \n <nine-table-header></nine-table-header>\n <nine-table-body>\n <nine-table-summary></nine-table-summary>\n <nine-table-sheets>\n <nine-table-sheets-body>${sheetsHtml}</nine-table-sheets-body>\n <nine-table-sheets-footer>\n <div class=\"nine-tab-bar\">${tabsHtml}</div>\n <div class=\"sheets-counter\">Total : <span id=\"row-count\">0</span></div>\n </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 const $sheetElements = this.#root.querySelectorAll('nine-table-sheet');\n\n $sheetElements?.forEach(($el, idx) => {\n if (rawTables[idx]) {\n setTimeout(() => {\n $el.init(rawTables[idx]);\n if (isAutoHeight) {\n this.#applyAutoHeight(hostEl);\n }\n });\n }\n });\n };\n}","import {trace} from \"@nopeer\";\nimport { LayoutManager } from '../ui/LayoutManager.js';\n\nexport default class NineTable extends HTMLElement {\n #created = false;\n\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n\n connectedCallback() {\n if (this.#created) return;\n\n // shadowRoot 하나만 넘겨서 내부에서 레이아웃 및 테이블 수집 처리\n this.layoutManager = new LayoutManager(this.shadowRoot);\n //this.layoutManager.render();\n\n this.#created = true;\n trace.log('NineTable connected.');\n\n this.dispatchEvent(new CustomEvent('load', { bubbles: true, detail: { target: this } }));\n }\n\n disconnectedCallback() {\n trace.log('NineTable disconnected.');\n }\n}\n\nif (!customElements.get('nine-table')) {\n customElements.define('nine-table', NineTable);\n}"],"names":["_Trace","traceOrigin","__name","Trace","trace","_NineTableVScrollBar","__privateAdd","_owner","_dragging","_elements","_interval1","_interval2","_firstThumbMove","_prevY","__publicField","__privateGet","body","thumb","thead","trackHeight","thumbHeight","totalRows","theadHeight","h","totalHeight","_getThumbHeight","y","maxScrollTop","pos","delay1","delay2","callback","__privateSet","_init","delayScrollAction","e","clearTimer","_track_onMouseDown","_track_onTouchStart","_thumb_onMouseDown","_thumb_onTouchStart","_thumb_onMouseMove","_thumb_onTouchMove","thumbBound","scrollStep","scrollableTrack","NineTableVScrollBar","_NineTableHScrollBar","table","track","bottomContainer","trackWidth","thumbWidth","maxScrollLeft","maxThumbLeft","l","_thumbMoveTo","x","trackBound","targetX","delayScroll","tBound","thBound","trackRect","NineTableHScrollBar","_NineTableSheet","_tableElement","tableEl","initializeTable","tbl","ensureColgroup","firstRow","colCount","colgroup","defaultWidth","i","col","ensureThead","clonedTable","leftContainer","bodyContainer","rightContainer","filterTableByFixed","sourceTable","targetFixedType","isBody","cols","targetIndices","idx","fixedAttr","tr","cells","bodyTable","leftTable","leftWidth","w","activeLeftWidth","rightTable","rightWidth","activeRightWidth","rowCount","scrollLeft","hScrollbar","scrollTop","_render","sbSize","NineTableSheet","_NineTableSheets","tabBar","tabItem","isMultiSelect","index","updateSplitters","splitter","splitIndex","leftSheet","rightSheet","tabItems","sheetElements","tab","sheet","clickedTab","activeTabs","targetSheet","activeSheets","initialBasis","activeSheet","rowCountEl","NineTableSheets","_LayoutManager","shadowRoot","_root","_resizeObserver","_observeResize","hostEl","entries","entry","_applyAutoHeight","_a","_b","maxRows","targetRows","sampleRow","rowHeight","headerEl","footerEl","headerHeight","footerHeight","headerFooterHeight","calculatedHeight","sheetsBody","rawTables","el","isAutoHeight","sheetsHtml","_","tabsHtml","$sheetElements","$el","LayoutManager","_NineTable","_created","NineTable"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"nine-table.js","sources":["../src/external/NoPeer.js","../src/ui/nine-table-sheet.js","../src/ui/nine-table-sheets.js","../src/ui/LayoutManager.js","../src/core/nine-table.js"],"sourcesContent":["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();","import { trace } from \"@nopeer\";\n//import './nine-table-vscrollbar.js';\n//import './nine-table-hscrollbar.js';\n\nexport class NineTableSheet extends HTMLElement {\n #tableElement = null;\n static SCROLLBAR_SIZE = 16;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#render();\n };\n\n init = (tableEl) => {\n if (!tableEl) return;\n\n const initializeTable = (tbl) => {\n\n const ensureColgroup = (tbl) => {\n if (tbl.querySelector('colgroup')) return;\n\n const firstRow = tbl.querySelector('tbody tr') || tbl.querySelector('tr');\n const colCount = firstRow ? firstRow.querySelectorAll('th, td').length : 1;\n\n const colgroup = document.createElement('colgroup');\n const defaultWidth = Math.max(Math.floor((tbl.clientWidth || 600) / colCount), 100);\n\n for (let i = 0; i < colCount; i++) {\n const col = document.createElement('col');\n col.setAttribute('width', defaultWidth);\n colgroup.appendChild(col);\n }\n tbl.prepend(colgroup);\n };\n\n const 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 ensureColgroup(tbl);\n ensureThead(tbl);\n\n tbl.classList.add('nine-table-element');\n return tbl;\n };\n\n const clonedTable = tableEl.cloneNode(true);\n this.#tableElement = initializeTable(clonedTable);\n this.#tableElement.style.display = 'table';\n\n const leftContainer = this.querySelector('.ng-container-left');\n const bodyContainer = this.querySelector('.ng-container-body');\n const rightContainer = this.querySelector('.ng-container-right');\n\n const filterTableByFixed = (sourceTable, targetFixedType, isBody = false) => {\n const tbl = sourceTable.cloneNode(true);\n const cols = Array.from(tbl.querySelectorAll('colgroup col'));\n const targetIndices = [];\n\n cols.forEach((col, idx) => {\n const fixedAttr = col.getAttribute('fixed');\n const isMatch = isBody ? (!fixedAttr || fixedAttr === '') : (fixedAttr === targetFixedType);\n if (!isMatch) {\n targetIndices.push(idx);\n }\n });\n\n targetIndices.reverse().forEach(idx => {\n if (cols[idx]) cols[idx].remove();\n tbl.querySelectorAll('tr').forEach(tr => {\n const cells = tr.querySelectorAll('th, td');\n if (cells[idx]) cells[idx].remove();\n });\n });\n\n return tbl;\n };\n\n // 1. 메인 바디 영역\n if (bodyContainer) {\n const bodyTable = filterTableByFixed(this.#tableElement, null, true);\n bodyContainer.innerHTML = '';\n bodyContainer.appendChild(bodyTable);\n }\n\n // 2. 좌측 고정 영역\n if (leftContainer) {\n const leftTable = filterTableByFixed(this.#tableElement, 'left', false);\n\n let leftWidth = 0;\n leftTable.querySelectorAll('col').forEach(col => {\n const w = parseInt(col.getAttribute('width'), 10);\n if (!isNaN(w)) leftWidth += w;\n });\n\n leftContainer.innerHTML = '';\n leftContainer.appendChild(leftTable);\n\n const activeLeftWidth = leftWidth > 0 ? leftWidth : 0;\n leftContainer.style.flex = `0 0 ${activeLeftWidth}px`;\n leftContainer.style.width = `${activeLeftWidth}px`;\n }\n\n // 3. 우측 고정 영역\n if (rightContainer) {\n const rightTable = filterTableByFixed(this.#tableElement, 'right', false);\n\n let rightWidth = 0;\n rightTable.querySelectorAll('col').forEach(col => {\n const w = parseInt(col.getAttribute('width'), 10);\n if (!isNaN(w)) rightWidth += w;\n });\n\n rightContainer.innerHTML = '';\n rightContainer.appendChild(rightTable);\n\n const activeRightWidth = rightWidth > 0 ? rightWidth : 0;\n rightContainer.style.flex = `0 0 ${activeRightWidth}px`;\n rightContainer.style.width = `${activeRightWidth}px`;\n }\n\n // 데이터 건수 기반 세로 스크롤 제어 정책 반영\n if (bodyContainer) {\n const rowCount = this.getRowCount();\n bodyContainer.style.overflowY = rowCount > 10 ? 'auto' : 'hidden';\n\n bodyContainer.addEventListener('scroll', () => {\n const scrollLeft = bodyContainer.scrollLeft;\n\n // 좌우 고정 영역은 가로 스크롤 시 밀려나지 않도록 위치 보정 또는\n // 하단 스크롤바 썸(Thumb) 위치 동기화 호출\n const hScrollbar = this.querySelector('nine-table-hscrollbar');\n if (hScrollbar && typeof hScrollbar.syncThumb === 'function') {\n hScrollbar.syncThumb(scrollLeft);\n }\n });\n }\n\n trace.log(`NineTableSheet 3-split initialized with rows: ${this.getRowCount()}`);\n };\n\n getRowCount = () => {\n if (!this.#tableElement) return 0;\n return this.#tableElement.querySelectorAll('tbody tr').length;\n };\n\n // 🎯 외부 스크롤바 및 컨트롤러 연동용 메서드\n scrollToX = (scrollLeft) => {\n const bodyContainer = this.querySelector('.ng-container-body');\n if (bodyContainer) bodyContainer.scrollLeft = scrollLeft;\n };\n\n scrollToY = (scrollTop) => {\n const bodyContainer = this.querySelector('.ng-container-body');\n if (bodyContainer) bodyContainer.scrollTop = scrollTop;\n };\n\n #render = () => {\n const sbSize = NineTableSheet.SCROLLBAR_SIZE;\n\n this.innerHTML = `\n <style>\n nine-table-sheet {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n position: relative;\n box-sizing: border-box;\n background: #ffffff;\n overflow: hidden;\n }\n \n nine-table-sheet .ng-container-top {\n display: flex;\n flex-direction: row;\n flex: 1 1 auto;\n width: 100%;\n height: calc(100% - ${sbSize}px);\n overflow: hidden;\n position: relative;\n }\n \n nine-table-sheet .ng-container-left {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n background: #ffffff;\n border-right: 1px solid #e5e7eb;\n flex-shrink: 0;\n }\n \n nine-table-sheet .ng-container-body {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow-x: auto;\n overflow-y: auto;\n background: #ffffff;\n position: relative;\n }\n \n nine-table-sheet .ng-container-right {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n background: #ffffff;\n border-left: 1px solid #e5e7eb;\n flex-shrink: 0;\n }\n \n nine-table-sheet .ng-container-bottom {\n display: flex;\n flex-direction: row;\n height: ${sbSize}px;\n min-height: ${sbSize}px;\n flex-shrink: 0;\n background: #f9fafb;\n border-top: 1px solid #e5e7eb;\n }\n \n nine-table-sheet nine-table-hscrollbar {\n flex: 1;\n height: 100%;\n overflow: hidden;\n display: block;\n }\n \n nine-table-sheet .ng-scroll-edge {\n width: ${sbSize}px;\n min-width: ${sbSize}px;\n height: 100%;\n flex-shrink: 0;\n background: #f3f4f6;\n }\n \n nine-table-sheet table {\n border-collapse: collapse;\n width: 100%;\n table-layout: fixed;\n }\n \n nine-table-sheet th, nine-table-sheet td {\n box-sizing: border-box;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n padding: 6px 8px;\n border: 1px solid #e5e7eb;\n font-size: 12px;\n color: #111827;\n }\n \n nine-table-sheet th {\n background-color: #f9fafb;\n font-weight: 600;\n text-align: left;\n }\n </style>\n \n <div class='ng-container-top'>\n <div class='ng-container-left'></div>\n <div class='ng-container-body'></div>\n <div class='ng-container-right'></div>\n <nine-table-vscrollbar></nine-table-vscrollbar>\n </div>\n <div class='ng-container-bottom'>\n <nine-table-hscrollbar></nine-table-hscrollbar>\n <div class='ng-scroll-edge'></div>\n </div>\n `;\n };\n\n disconnectedCallback() {\n this.innerHTML = '';\n trace.log('NineTableSheet destroyed.');\n };\n}\n\nif (!customElements.get('nine-table-sheet')) {\n customElements.define('nine-table-sheet', NineTableSheet);\n}","import './nine-table-sheet.js';\n\nexport class NineTableSheets extends HTMLElement {\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#init();\n };\n\n #init = () => {\n const tabBar = this.querySelector('.nine-tab-bar');\n if (!tabBar) return;\n\n tabBar.addEventListener('click', (e) => {\n const tabItem = e.target.closest('.nine-tab-item');\n if (!tabItem) return;\n\n const isMultiSelect = e.ctrlKey || e.metaKey || e.shiftKey;\n const index = parseInt(tabItem.dataset.index, 10);\n this.switchSheet(index, isMultiSelect);\n });\n\n this.switchSheet(0, false);\n };\n\n switchSheet = (index, isMultiSelect = false) => {\n\n const updateSplitters = () => {\n const body = this.querySelector('nine-table-sheets-body');\n const splitters = body.querySelectorAll('nine-splitter');\n splitters.forEach(splitter => {\n const splitIndex = parseInt(splitter.dataset.splitIndex, 10);\n const leftSheet = body.querySelector(`nine-table-sheet[data-index=\"${splitIndex - 1}\"]`);\n const rightSheet = body.querySelector(`nine-table-sheet[data-index=\"${splitIndex}\"]`);\n\n if (leftSheet && rightSheet && leftSheet.classList.contains('active') && rightSheet.classList.contains('active')) {\n splitter.classList.add('active');\n } else {\n splitter.classList.remove('active');\n }\n });\n };\n\n const tabBar = this.querySelector('.nine-tab-bar');\n const body = this.querySelector('nine-table-sheets-body');\n const tabItems = tabBar.querySelectorAll('.nine-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.classList.toggle('active', idx === index);\n const sheet = body.querySelector(`nine-table-sheet[data-index=\"${idx}\"]`);\n if (sheet) sheet.style.flex = '';\n });\n sheetElements.forEach((sheet, idx) => {\n sheet.classList.toggle('active', idx === index);\n });\n } else {\n const clickedTab = tabItems[index];\n const activeTabs = tabBar.querySelectorAll('.nine-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 = Array.from(body.querySelectorAll('nine-table-sheet.active'));\n if (activeSheets.length > 1) {\n const initialBasis = (1 / activeSheets.length);\n activeSheets.forEach(sheet => {\n if (!sheet.style.flex || sheet.style.flex === '1 1 100%') {\n sheet.style.flex = `${initialBasis} ${initialBasis} 0px`;\n }\n });\n } else {\n activeSheets.forEach(sheet => {\n sheet.style.flex = '1 1 100%';\n });\n }\n\n updateSplitters();\n\n const activeSheet = body.querySelector(`nine-table-sheet.active`);\n if (activeSheet && typeof activeSheet.getRowCount === 'function') {\n const rowCountEl = this.querySelector('#row-count');\n if (rowCountEl) {\n rowCountEl.textContent = activeSheet.getRowCount().toLocaleString();\n }\n }\n };\n\n\n}\n\nif (!customElements.get('nine-table-sheets')) {\n customElements.define('nine-table-sheets', NineTableSheets);\n}","/**\n * [LayoutManager 높이 설정(Height Configuration) 사용 예제]\n *\n * 1. 부모 영역 채우기 (Fluid / 100% Fill) - 기본값\n * - 컴포넌트가 부모 컨테이너의 남은 공간을 가득 채우고 내부 영역에서 스크롤을 처리합니다.\n * - 사용법: <nine-table> 또는 호스트 엘리먼트에 별도 속성을 주지 않으면 적용됩니다.\n *\n * 2. 콘텐츠 밀착형 / 데이터 건수 기반 동적 높이 (Auto-Height)\n * - 데이터 행 개수에 맞춰 컴포넌트 전체 높이가 유연하게 늘어납니다.\n * - 사용법: <nine-table auto-height=\"true\"> 또는 호스트 엘리먼트에 auto-height=\"true\" 속성을 지정합니다.\n *\n * 3. 픽셀 고정 높이 (Fixed Pixel)\n * - 부모 크기에 상관없이 개발자가 지정한 고정 크기를 엄격하게 유지합니다.\n * - 사용법: <nine-table style=\"height: 400px;\"> 처럼 인라인 스타일로 높이를 직접 제어합니다.\n */\n\nimport './nine-table-sheets.js';\n\nexport class LayoutManager {\n #root;\n #resizeObserver = null;\n\n constructor(shadowRoot) {\n this.#root = shadowRoot;\n this.#render();\n this.#observeResize();\n }\n\n #observeResize = () => {\n const hostEl = this.#root.host;\n if (!hostEl) return;\n\n this.#resizeObserver = new ResizeObserver((entries) => {\n for (let entry of entries) {\n const isAutoHeight = hostEl.getAttribute('auto-height') === 'true';\n if (isAutoHeight) {\n this.#applyAutoHeight(hostEl);\n }\n }\n });\n\n this.#resizeObserver.observe(hostEl);\n };\n\n #applyAutoHeight = (hostEl) => {\n const activeSheet = hostEl.shadowRoot?.querySelector('nine-table-sheet.active');\n if (!activeSheet) return;\n\n const rowCount = activeSheet.getRowCount?.() || 0;\n\n // 1. 속성으로 maxRows를 받되, 없으면 기본값 10 설정\n const maxRows = parseInt(hostEl.getAttribute('max-display-row'), 10) || 10;\n const targetRows = Math.min(rowCount, maxRows);\n\n // 2. 실제 렌더링된 행(tr) 높이를 동적으로 측정 (없으면 기본 32px 폴백)\n const sampleRow = activeSheet.querySelector('tbody tr') || activeSheet.querySelector('tr');\n const rowHeight = sampleRow ? sampleRow.getBoundingClientRect().height : 32;\n\n // 3. 헤더 및 푸터/탭 영역의 실제 높이를 DOM에서 동적 측정\n const headerEl = this.#root.querySelector('nine-table-header');\n const footerEl = this.#root.querySelector('nine-table-sheets-footer');\n const headerHeight = headerEl ? headerEl.getBoundingClientRect().height : 40;\n const footerHeight = footerEl ? footerEl.getBoundingClientRect().height : 32;\n const extraPadding = 16; // 미세 여백\n\n const headerFooterHeight = headerHeight + footerHeight + extraPadding;\n const calculatedHeight = (targetRows * rowHeight) + headerFooterHeight;\n\n hostEl.style.height = `${calculatedHeight}px`;\n hostEl.style.maxHeight = `${(maxRows * rowHeight) + headerFooterHeight}px`;\n\n const sheetsBody = this.#root.querySelector('nine-table-sheets-body');\n if (sheetsBody) {\n sheetsBody.style.overflowY = rowCount > maxRows ? 'auto' : 'hidden';\n }\n };\n\n #render = () => {\n const hostEl = this.#root.host;\n const rawElements = Array.from(hostEl.children);\n const rawTables = rawElements.filter(el => el.tagName === 'TABLE');\n const isAutoHeight = hostEl.getAttribute('auto-height') === 'true';\n\n const sheetsHtml = rawTables.map((_, idx) => {\n const className = idx === 0 ? 'active' : '';\n return `<nine-table-sheet class=\"${className}\" data-index=\"${idx}\"></nine-table-sheet>`;\n }).join('');\n\n const tabsHtml = rawTables.map((_, idx) => {\n const className = idx === 0 ? 'active' : '';\n return `<div class=\"nine-tab-item ${className}\" data-index=\"${idx}\">Sheet ${idx + 1}</div>`;\n }).join('');\n\n this.#root.innerHTML = `\n <style>\n :host { \n display: flex; \n flex-direction: column; \n position: relative; \n overflow: hidden; \n height: ${isAutoHeight ? 'auto' : '100%'}; \n background: #fff; \n }\n nine-table-header { height: 40px; display: block; flex-shrink: 0; border-bottom: 1px solid #e5e7eb; background: #fff; }\n nine-table-body { display: flex; flex-direction: row; flex: 1; overflow: hidden; position: relative; }\n nine-table-summary { display: none; width: 250px; flex-shrink: 0; border-right: 1px solid #e5e7eb; }\n nine-splitter:not([data-split-index]) { width: 4px; background: #e5e7eb; cursor: col-resize; flex-shrink: 0; }\n nine-table-analysis { display: none; }\n nine-table-footer { display: none; }\n\n nine-table-sheets {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n position: relative;\n background: #fff;\n }\n nine-table-sheets-body {\n flex: 1;\n overflow: auto;\n position: relative;\n display: flex;\n flex-direction: row;\n }\n nine-table-sheet {\n display: none !important;\n height: 100%;\n overflow: auto;\n flex: 1 1 100%;\n }\n nine-table-sheet.active {\n display: block !important;\n }\n nine-table-sheets-footer {\n display: flex;\n height: 32px;\n background: #f3f4f6;\n border-top: 1px solid #e5e7eb;\n align-items: center;\n justify-content: space-between;\n padding: 0 8px;\n flex-shrink: 0;\n }\n nine-table-sheets .nine-tab-bar {\n display: flex;\n align-items: center;\n gap: 2px;\n overflow-x: auto;\n flex: 1;\n height: 100%;\n }\n nine-table-sheets .nine-tab-item {\n padding: 4px 12px;\n cursor: pointer;\n font-size: 12px;\n color: #4b5563;\n background: #e5e7eb;\n border: 1px solid #d1d5db;\n border-top: none;\n border-radius: 0 0 3px 3px;\n user-select: none;\n }\n nine-table-sheets .nine-tab-item.active {\n background: #ffffff;\n color: #111827;\n font-weight: 600;\n border-bottom: 2px solid #2563eb;\n }\n nine-table-sheets .sheets-counter {\n font-size: 12px;\n color: #6b7280;\n padding-left: 12px;\n flex-shrink: 0;\n }\n </style>\n \n <nine-table-header></nine-table-header>\n <nine-table-body>\n <nine-table-summary></nine-table-summary>\n <nine-table-sheets>\n <nine-table-sheets-body>${sheetsHtml}</nine-table-sheets-body>\n <nine-table-sheets-footer>\n <div class=\"nine-tab-bar\">${tabsHtml}</div>\n <div class=\"sheets-counter\">Total : <span id=\"row-count\">0</span></div>\n </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 const $sheetElements = this.#root.querySelectorAll('nine-table-sheet');\n\n $sheetElements?.forEach(($el, idx) => {\n if (rawTables[idx]) {\n setTimeout(() => {\n $el.init(rawTables[idx]);\n if (isAutoHeight) {\n this.#applyAutoHeight(hostEl);\n }\n });\n }\n });\n };\n}","import {trace} from \"@nopeer\";\nimport { LayoutManager } from '../ui/LayoutManager.js';\n\nexport default class NineTable extends HTMLElement {\n #created = false;\n\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n\n connectedCallback() {\n if (this.#created) return;\n\n // shadowRoot 하나만 넘겨서 내부에서 레이아웃 및 테이블 수집 처리\n this.layoutManager = new LayoutManager(this.shadowRoot);\n //this.layoutManager.render();\n\n this.#created = true;\n trace.log('NineTable connected.');\n\n this.dispatchEvent(new CustomEvent('load', { bubbles: true, detail: { target: this } }));\n }\n\n disconnectedCallback() {\n trace.log('NineTable disconnected.');\n }\n}\n\nif (!customElements.get('nine-table')) {\n customElements.define('nine-table', NineTable);\n}"],"names":["_Trace","traceOrigin","__name","Trace","trace","_NineTableSheet","__privateAdd","_tableElement","__publicField","tableEl","initializeTable","tbl","ensureColgroup","firstRow","colCount","colgroup","defaultWidth","i","col","ensureThead","thead","clonedTable","__privateSet","__privateGet","leftContainer","bodyContainer","rightContainer","filterTableByFixed","sourceTable","targetFixedType","isBody","cols","targetIndices","idx","fixedAttr","tr","cells","bodyTable","leftTable","leftWidth","w","activeLeftWidth","rightTable","rightWidth","activeRightWidth","rowCount","scrollLeft","hScrollbar","scrollTop","_render","sbSize","NineTableSheet","_NineTableSheets","_init","tabBar","e","tabItem","isMultiSelect","index","updateSplitters","body","splitter","splitIndex","leftSheet","rightSheet","tabItems","sheetElements","tab","sheet","clickedTab","activeTabs","targetSheet","activeSheets","initialBasis","activeSheet","rowCountEl","NineTableSheets","_LayoutManager","shadowRoot","_root","_resizeObserver","_observeResize","hostEl","entries","entry","_applyAutoHeight","_a","_b","maxRows","targetRows","sampleRow","rowHeight","headerEl","footerEl","headerHeight","footerHeight","headerFooterHeight","calculatedHeight","sheetsBody","rawTables","el","isAutoHeight","sheetsHtml","_","tabsHtml","$sheetElements","$el","LayoutManager","_NineTable","_created","NineTable"],"mappings":"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"}
|
package/dist/nine-table.umd.js
CHANGED
|
@@ -1,64 +1,4 @@
|
|
|
1
|
-
(function(
|
|
2
|
-
<button class='ng-scroll-top' disabled><div class='ng-scroll-icon'></div></button>
|
|
3
|
-
<div class='ng-scroll-track'> <div class='ng-scroll-thumb'></div> </div>
|
|
4
|
-
<button class='ng-scroll-bottom'><div class='ng-scroll-icon'></div></button>
|
|
5
|
-
`,super.connectedCallback(),v(this,d,{track:this.shadowRoot.querySelector(".ng-scroll-track"),thumb:this.shadowRoot.querySelector(".ng-scroll-thumb"),top:this.shadowRoot.querySelector(".ng-scroll-top"),bottom:this.shadowRoot.querySelector(".ng-scroll-bottom")}),t(this,Q).call(this))}};k=new WeakMap,M=new WeakMap,d=new WeakMap,q=new WeakMap,T=new WeakMap,G=new WeakMap,J=new WeakMap,Q=new WeakMap,V=new WeakMap,N=new WeakMap,tt=new WeakMap,j=new WeakMap,D=new WeakMap,X=new WeakMap,O=new WeakMap,a(ut,"NineTableVScrollBar");let z=ut;customElements.get("nine-table-vscrollbar")||customElements.define("nine-table-vscrollbar",z);const bt=class bt extends HTMLElement{constructor(){super();b(this,R);b(this,K);b(this,h);b(this,B);b(this,Y);H(this,"refresh",a(()=>{if(!t(this,R))return;const e=t(this,R).querySelector(".ng-container-body");if(!e)return;const i=e.querySelector("table");if(!i)return;const o=$(t(this,h).track,this),n=$(t(this,h).thumb,this),c=t(this,R).querySelector(".ng-container-bottom");if(e.clientWidth!==0&&i.scrollWidth>e.clientWidth)$(c).show();else{$(c).hide();return}const s=o.width();if(s<=0)return;const y=Math.max(Math.min(s*(e.clientWidth/i.scrollWidth),s),20);n.width(y);const l=i.scrollWidth-e.clientWidth,p=s-y;let r=0;l>0&&(r=parseInt(e.scrollLeft/l*p,10)),r<0&&(r=0),r>p&&(r=p),n.css({left:r}),t(this,h).left.disabled=e.scrollLeft<=0,t(this,h).right.disabled=e.scrollLeft>=l},"refresh"));b(this,W,a(e=>{if(!t(this,h))return;const i=t(this,R).querySelector(".ng-container-body"),o=i.querySelector("table");if(!o)return;const n=t(this,h).track.getBoundingClientRect(),c=t(this,h).thumb.getBoundingClientRect();let s=e;s<0&&(s=0),s+c.width>n.width&&(s=n.width-c.width),s=parseInt(s,10),t(this,h).thumb.style.left=s+"px";const y=o.scrollWidth-i.clientWidth,l=n.width-c.width;return l>0&&y>0&&(i.scrollLeft=s/l*y),t(this,h).left.disabled=s<=0,t(this,h).right.disabled=s>=l,s>0&&s<l},"#thumbMoveTo"));b(this,et,a(()=>{const e=t(this,R).querySelector(".ng-container-body");e&&e.addEventListener("scroll",()=>{this.refresh()});const i=a(n=>{clearInterval(t(this,B)),clearInterval(t(this,Y));const c=t(this,h).track.getBoundingClientRect(),s=t(this,h).thumb.getBoundingClientRect();t(this,W).call(this,s.x-c.x+n),v(this,B,setInterval(()=>{clearInterval(t(this,B)),v(this,Y,setInterval(()=>{const y=t(this,h).track.getBoundingClientRect(),l=t(this,h).thumb.getBoundingClientRect();t(this,W).call(this,l.x-y.x+n)||clearInterval(t(this,Y))},10))},500))},"delayScroll"),o=a(()=>{clearInterval(t(this,B)),clearInterval(t(this,Y))},"clearTimer");t(this,h).left.ontouchend=t(this,h).right.ontouchend=t(this,h).track.ontouchend=t(this,h).left.onmouseup=t(this,h).left.onmouseleave=t(this,h).right.onmouseup=t(this,h).right.onmouseleave=t(this,h).track.onmouseup=t(this,h).track.onmouseleave=o,$(t(this,h).left).on("mousedown",n=>{n.buttons==1&&i(-10)}),$(t(this,h).right).on("mousedown",n=>{n.buttons==1&&i(10)}),$(t(this,h).left).on("touchstart",n=>{i(-10)}),$(t(this,h).right).on("touchstart",n=>{i(10)}),$(t(this,h).track).on("mousedown",n=>{if(n.buttons!=1)return;n.preventDefault();const c=t(this,h).track.getBoundingClientRect(),s=t(this,h).thumb.getBoundingClientRect().width;t(this,W).call(this,n.clientX-c.left-s/2)}),$(t(this,h).thumb).on("mousedown",n=>{v(this,K,!0),this.shiftX=n.clientX-t(this,h).thumb.getBoundingClientRect().left,document.addEventListener("mousemove",t(this,F))}),document.addEventListener("mouseup",()=>{v(this,K,!1),o(),document.removeEventListener("mousemove",t(this,F))})},"#init"));b(this,F,a(e=>{if(!t(this,K))return;const i=t(this,h).track.getBoundingClientRect();t(this,W).call(this,e.clientX-i.left-this.shiftX)},"#thumb_onMouseMove"))}connectedCallback(){v(this,R,this.getRootNode().host),t(this,R)&&(this.innerHTML=`
|
|
6
|
-
<style>
|
|
7
|
-
nine-table-hscrollbar {
|
|
8
|
-
display: flex;
|
|
9
|
-
flex-direction: row;
|
|
10
|
-
width: 100%;
|
|
11
|
-
height: 100%;
|
|
12
|
-
background: #f9fafb;
|
|
13
|
-
box-sizing: border-box;
|
|
14
|
-
user-select: none;
|
|
15
|
-
}
|
|
16
|
-
nine-table-hscrollbar button {
|
|
17
|
-
width: 16px;
|
|
18
|
-
height: 100%;
|
|
19
|
-
background: #f3f4f6;
|
|
20
|
-
border: none;
|
|
21
|
-
cursor: pointer;
|
|
22
|
-
display: flex;
|
|
23
|
-
align-items: center;
|
|
24
|
-
justify-content: center;
|
|
25
|
-
padding: 0;
|
|
26
|
-
}
|
|
27
|
-
nine-table-hscrollbar button:disabled {
|
|
28
|
-
opacity: 0.4;
|
|
29
|
-
cursor: default;
|
|
30
|
-
}
|
|
31
|
-
nine-table-hscrollbar .ng-scroll-icon {
|
|
32
|
-
width: 6px;
|
|
33
|
-
height: 6px;
|
|
34
|
-
border-top: 2px solid #6b7280;
|
|
35
|
-
border-right: 2px solid #6b7280;
|
|
36
|
-
}
|
|
37
|
-
nine-table-hscrollbar .ng-scroll-left .ng-scroll-icon { transform: rotate(-135deg); }
|
|
38
|
-
nine-table-hscrollbar .ng-scroll-right .ng-scroll-icon { transform: rotate(45deg); }
|
|
39
|
-
nine-table-hscrollbar .ng-scroll-track {
|
|
40
|
-
flex: 1;
|
|
41
|
-
height: 100%;
|
|
42
|
-
position: relative;
|
|
43
|
-
background: #f3f4f6;
|
|
44
|
-
overflow: hidden;
|
|
45
|
-
}
|
|
46
|
-
nine-table-hscrollbar .ng-scroll-thumb {
|
|
47
|
-
position: absolute;
|
|
48
|
-
top: 2px;
|
|
49
|
-
bottom: 2px;
|
|
50
|
-
background: #d1d5db;
|
|
51
|
-
border-radius: 4px;
|
|
52
|
-
cursor: pointer;
|
|
53
|
-
}
|
|
54
|
-
nine-table-hscrollbar .ng-scroll-thumb:hover {
|
|
55
|
-
background: #9ca3af;
|
|
56
|
-
}
|
|
57
|
-
</style>
|
|
58
|
-
<button class='ng-scroll-left' disabled><div class='ng-scroll-icon'></div></button>
|
|
59
|
-
<div class='ng-scroll-track'><div class='ng-scroll-thumb'></div></div>
|
|
60
|
-
<button class='ng-scroll-right'><div class='ng-scroll-icon'></div></button>
|
|
61
|
-
`,v(this,h,{container:t(this,R).querySelector(".ng-container-body"),track:this.querySelector(".ng-scroll-track"),thumb:this.querySelector(".ng-scroll-thumb"),left:this.querySelector(".ng-scroll-left"),right:this.querySelector(".ng-scroll-right")}),t(this,et).call(this),setTimeout(()=>this.refresh(),0))}};R=new WeakMap,K=new WeakMap,h=new WeakMap,B=new WeakMap,Y=new WeakMap,W=new WeakMap,et=new WeakMap,F=new WeakMap,a(bt,"NineTableHScrollBar");let lt=bt;customElements.get("nine-table-hscrollbar")||customElements.define("nine-table-hscrollbar",lt);const P=class P extends HTMLElement{constructor(){super();b(this,A,null);H(this,"init",a(e=>{if(!e)return;const i=a(l=>{const p=a(u=>{if(u.querySelector("colgroup"))return;const g=u.querySelector("tbody tr")||u.querySelector("tr"),C=g?g.querySelectorAll("th, td").length:1,S=document.createElement("colgroup"),I=Math.max(Math.floor((u.clientWidth||600)/C),100);for(let L=0;L<C;L++){const pt=document.createElement("col");pt.setAttribute("width",I),S.appendChild(pt)}u.prepend(S)},"ensureColgroup"),r=a(u=>{if(u.querySelector("thead"))return;const g=document.createElement("thead"),C=u.querySelector("colgroup");C?C.after(g):u.prepend(g)},"ensureThead");return p(l),r(l),l.classList.add("nine-table-element"),l},"initializeTable"),o=e.cloneNode(!0);v(this,A,i(o)),t(this,A).style.display="table";const n=this.querySelector(".ng-container-left"),c=this.querySelector(".ng-container-body"),s=this.querySelector(".ng-container-right"),y=a((l,p,r=!1)=>{const u=l.cloneNode(!0),g=Array.from(u.querySelectorAll("colgroup col")),C=[];return g.forEach((S,I)=>{const L=S.getAttribute("fixed");(r?!L||L==="":L===p)||C.push(I)}),C.reverse().forEach(S=>{g[S]&&g[S].remove(),u.querySelectorAll("tr").forEach(I=>{const L=I.querySelectorAll("th, td");L[S]&&L[S].remove()})}),u},"filterTableByFixed");if(c){const l=y(t(this,A),null,!0);c.innerHTML="",c.appendChild(l)}if(n){const l=y(t(this,A),"left",!1);let p=0;l.querySelectorAll("col").forEach(u=>{const g=parseInt(u.getAttribute("width"),10);isNaN(g)||(p+=g)}),n.innerHTML="",n.appendChild(l);const r=p>0?p:0;n.style.flex=`0 0 ${r}px`,n.style.width=`${r}px`}if(s){const l=y(t(this,A),"right",!1);let p=0;l.querySelectorAll("col").forEach(u=>{const g=parseInt(u.getAttribute("width"),10);isNaN(g)||(p+=g)}),s.innerHTML="",s.appendChild(l);const r=p>0?p:0;s.style.flex=`0 0 ${r}px`,s.style.width=`${r}px`}if(c){const l=this.getRowCount();c.style.overflowY=l>10?"auto":"hidden",c.addEventListener("scroll",()=>{const p=c.scrollLeft,r=this.querySelector("nine-table-hscrollbar");r&&typeof r.syncThumb=="function"&&r.syncThumb(p)})}x.log(`NineTableSheet 3-split initialized with rows: ${this.getRowCount()}`)},"init"));H(this,"getRowCount",a(()=>t(this,A)?t(this,A).querySelectorAll("tbody tr").length:0,"getRowCount"));H(this,"scrollToX",a(e=>{const i=this.querySelector(".ng-container-body");i&&(i.scrollLeft=e)},"scrollToX"));H(this,"scrollToY",a(e=>{const i=this.querySelector(".ng-container-body");i&&(i.scrollTop=e)},"scrollToY"));b(this,nt,a(()=>{const e=P.SCROLLBAR_SIZE;this.innerHTML=`
|
|
1
|
+
(function(l,i){typeof exports=="object"&&typeof module<"u"?i(require("@ninebone/util")):typeof define=="function"&&define.amd?define(["@ninebone/util"],i):(l=typeof globalThis<"u"?globalThis:l||self,i(l.NineboneUtil))})(this,function(l){"use strict";var P=Object.defineProperty;var Z=l=>{throw TypeError(l)};var X=(l,i,h)=>i in l?P(l,i,{enumerable:!0,configurable:!0,writable:!0,value:h}):l[i]=h;var d=(l,i)=>P(l,"name",{value:i,configurable:!0});var k=(l,i,h)=>X(l,typeof i!="symbol"?i+"":i,h),U=(l,i,h)=>i.has(l)||Z("Cannot "+h);var a=(l,i,h)=>(U(l,i,"read from private field"),h?h.call(l):i.get(l)),E=(l,i,h)=>i.has(l)?Z("Cannot add the same private member more than once"):i instanceof WeakSet?i.add(l):i.set(l,h),R=(l,i,h,C)=>(U(l,i,"write to private field"),C?C.call(l,h):i.set(l,h),h);var q,H,M,w,L,z,$,I,T;const j=class j extends l.trace.constructor{constructor(){super(),this.init("nine-table","green")}};d(j,"Trace");let i=j;const h=new i,A=class A extends HTMLElement{constructor(){super();E(this,q,null);k(this,"init",d(n=>{if(!n)return;const r=d(e=>{const c=d(o=>{if(o.querySelector("colgroup"))return;const s=o.querySelector("tbody tr")||o.querySelector("tr"),m=s?s.querySelectorAll("th, td").length:1,p=document.createElement("colgroup"),S=Math.max(Math.floor((o.clientWidth||600)/m),100);for(let v=0;v<m;v++){const F=document.createElement("col");F.setAttribute("width",S),p.appendChild(F)}o.prepend(p)},"ensureColgroup"),t=d(o=>{if(o.querySelector("thead"))return;const s=document.createElement("thead"),m=o.querySelector("colgroup");m?m.after(s):o.prepend(s)},"ensureThead");return c(e),t(e),e.classList.add("nine-table-element"),e},"initializeTable"),g=n.cloneNode(!0);R(this,q,r(g)),a(this,q).style.display="table";const y=this.querySelector(".ng-container-left"),f=this.querySelector(".ng-container-body"),u=this.querySelector(".ng-container-right"),x=d((e,c,t=!1)=>{const o=e.cloneNode(!0),s=Array.from(o.querySelectorAll("colgroup col")),m=[];return s.forEach((p,S)=>{const v=p.getAttribute("fixed");(t?!v||v==="":v===c)||m.push(S)}),m.reverse().forEach(p=>{s[p]&&s[p].remove(),o.querySelectorAll("tr").forEach(S=>{const v=S.querySelectorAll("th, td");v[p]&&v[p].remove()})}),o},"filterTableByFixed");if(f){const e=x(a(this,q),null,!0);f.innerHTML="",f.appendChild(e)}if(y){const e=x(a(this,q),"left",!1);let c=0;e.querySelectorAll("col").forEach(o=>{const s=parseInt(o.getAttribute("width"),10);isNaN(s)||(c+=s)}),y.innerHTML="",y.appendChild(e);const t=c>0?c:0;y.style.flex=`0 0 ${t}px`,y.style.width=`${t}px`}if(u){const e=x(a(this,q),"right",!1);let c=0;e.querySelectorAll("col").forEach(o=>{const s=parseInt(o.getAttribute("width"),10);isNaN(s)||(c+=s)}),u.innerHTML="",u.appendChild(e);const t=c>0?c:0;u.style.flex=`0 0 ${t}px`,u.style.width=`${t}px`}if(f){const e=this.getRowCount();f.style.overflowY=e>10?"auto":"hidden",f.addEventListener("scroll",()=>{const c=f.scrollLeft,t=this.querySelector("nine-table-hscrollbar");t&&typeof t.syncThumb=="function"&&t.syncThumb(c)})}h.log(`NineTableSheet 3-split initialized with rows: ${this.getRowCount()}`)},"init"));k(this,"getRowCount",d(()=>a(this,q)?a(this,q).querySelectorAll("tbody tr").length:0,"getRowCount"));k(this,"scrollToX",d(n=>{const r=this.querySelector(".ng-container-body");r&&(r.scrollLeft=n)},"scrollToX"));k(this,"scrollToY",d(n=>{const r=this.querySelector(".ng-container-body");r&&(r.scrollTop=n)},"scrollToY"));E(this,H,d(()=>{const n=A.SCROLLBAR_SIZE;this.innerHTML=`
|
|
62
2
|
<style>
|
|
63
3
|
nine-table-sheet {
|
|
64
4
|
display: flex;
|
|
@@ -76,7 +16,7 @@
|
|
|
76
16
|
flex-direction: row;
|
|
77
17
|
flex: 1 1 auto;
|
|
78
18
|
width: 100%;
|
|
79
|
-
height: calc(100% - ${
|
|
19
|
+
height: calc(100% - ${n}px);
|
|
80
20
|
overflow: hidden;
|
|
81
21
|
position: relative;
|
|
82
22
|
}
|
|
@@ -112,8 +52,8 @@
|
|
|
112
52
|
nine-table-sheet .ng-container-bottom {
|
|
113
53
|
display: flex;
|
|
114
54
|
flex-direction: row;
|
|
115
|
-
height: ${
|
|
116
|
-
min-height: ${
|
|
55
|
+
height: ${n}px;
|
|
56
|
+
min-height: ${n}px;
|
|
117
57
|
flex-shrink: 0;
|
|
118
58
|
background: #f9fafb;
|
|
119
59
|
border-top: 1px solid #e5e7eb;
|
|
@@ -127,8 +67,8 @@
|
|
|
127
67
|
}
|
|
128
68
|
|
|
129
69
|
nine-table-sheet .ng-scroll-edge {
|
|
130
|
-
width: ${
|
|
131
|
-
min-width: ${
|
|
70
|
+
width: ${n}px;
|
|
71
|
+
min-width: ${n}px;
|
|
132
72
|
height: 100%;
|
|
133
73
|
flex-shrink: 0;
|
|
134
74
|
background: #f3f4f6;
|
|
@@ -168,14 +108,14 @@
|
|
|
168
108
|
<nine-table-hscrollbar></nine-table-hscrollbar>
|
|
169
109
|
<div class='ng-scroll-edge'></div>
|
|
170
110
|
</div>
|
|
171
|
-
`},"#render"))}connectedCallback(){
|
|
111
|
+
`},"#render"))}connectedCallback(){a(this,H).call(this)}disconnectedCallback(){this.innerHTML="",h.log("NineTableSheet destroyed.")}};q=new WeakMap,H=new WeakMap,d(A,"NineTableSheet"),k(A,"SCROLLBAR_SIZE",16);let C=A;customElements.get("nine-table-sheet")||customElements.define("nine-table-sheet",C);const O=class O extends HTMLElement{constructor(){super();E(this,M,d(()=>{const n=this.querySelector(".nine-tab-bar");n&&(n.addEventListener("click",r=>{const g=r.target.closest(".nine-tab-item");if(!g)return;const y=r.ctrlKey||r.metaKey||r.shiftKey,f=parseInt(g.dataset.index,10);this.switchSheet(f,y)}),this.switchSheet(0,!1))},"#init"));k(this,"switchSheet",d((n,r=!1)=>{const g=d(()=>{const t=this.querySelector("nine-table-sheets-body");t.querySelectorAll("nine-splitter").forEach(s=>{const m=parseInt(s.dataset.splitIndex,10),p=t.querySelector(`nine-table-sheet[data-index="${m-1}"]`),S=t.querySelector(`nine-table-sheet[data-index="${m}"]`);p&&S&&p.classList.contains("active")&&S.classList.contains("active")?s.classList.add("active"):s.classList.remove("active")})},"updateSplitters"),y=this.querySelector(".nine-tab-bar"),f=this.querySelector("nine-table-sheets-body"),u=y.querySelectorAll(".nine-tab-item"),x=f.querySelectorAll("nine-table-sheet");if(!u[n])return;if(!r)u.forEach((t,o)=>{t.classList.toggle("active",o===n);const s=f.querySelector(`nine-table-sheet[data-index="${o}"]`);s&&(s.style.flex="")}),x.forEach((t,o)=>{t.classList.toggle("active",o===n)});else{const t=u[n],o=y.querySelectorAll(".nine-tab-item.active");if(t.classList.contains("active")&&o.length<=1)return;t.classList.toggle("active");const s=f.querySelector(`nine-table-sheet[data-index="${n}"]`);s&&(s.classList.toggle("active"),s.classList.contains("active")||(s.style.flex=""))}const e=Array.from(f.querySelectorAll("nine-table-sheet.active"));if(e.length>1){const t=1/e.length;e.forEach(o=>{(!o.style.flex||o.style.flex==="1 1 100%")&&(o.style.flex=`${t} ${t} 0px`)})}else e.forEach(t=>{t.style.flex="1 1 100%"});g();const c=f.querySelector("nine-table-sheet.active");if(c&&typeof c.getRowCount=="function"){const t=this.querySelector("#row-count");t&&(t.textContent=c.getRowCount().toLocaleString())}},"switchSheet"))}connectedCallback(){a(this,M).call(this)}};M=new WeakMap,d(O,"NineTableSheets");let B=O;customElements.get("nine-table-sheets")||customElements.define("nine-table-sheets",B);const K=class K{constructor(b){E(this,w);E(this,L,null);E(this,z,d(()=>{const b=a(this,w).host;b&&(R(this,L,new ResizeObserver(n=>{for(let r of n)b.getAttribute("auto-height")==="true"&&a(this,$).call(this,b)})),a(this,L).observe(b))},"#observeResize"));E(this,$,d(b=>{var S,v;const n=(S=b.shadowRoot)==null?void 0:S.querySelector("nine-table-sheet.active");if(!n)return;const r=((v=n.getRowCount)==null?void 0:v.call(n))||0,g=parseInt(b.getAttribute("max-display-row"),10)||10,y=Math.min(r,g),f=n.querySelector("tbody tr")||n.querySelector("tr"),u=f?f.getBoundingClientRect().height:32,x=a(this,w).querySelector("nine-table-header"),e=a(this,w).querySelector("nine-table-sheets-footer"),c=x?x.getBoundingClientRect().height:40,t=e?e.getBoundingClientRect().height:32,s=c+t+16,m=y*u+s;b.style.height=`${m}px`,b.style.maxHeight=`${g*u+s}px`;const p=a(this,w).querySelector("nine-table-sheets-body");p&&(p.style.overflowY=r>g?"auto":"hidden")},"#applyAutoHeight"));E(this,I,d(()=>{const b=a(this,w).host,r=Array.from(b.children).filter(x=>x.tagName==="TABLE"),g=b.getAttribute("auto-height")==="true",y=r.map((x,e)=>`<nine-table-sheet class="${e===0?"active":""}" data-index="${e}"></nine-table-sheet>`).join(""),f=r.map((x,e)=>`<div class="nine-tab-item ${e===0?"active":""}" data-index="${e}">Sheet ${e+1}</div>`).join("");a(this,w).innerHTML=`
|
|
172
112
|
<style>
|
|
173
113
|
:host {
|
|
174
114
|
display: flex;
|
|
175
115
|
flex-direction: column;
|
|
176
116
|
position: relative;
|
|
177
117
|
overflow: hidden;
|
|
178
|
-
height: ${
|
|
118
|
+
height: ${g?"auto":"100%"};
|
|
179
119
|
background: #fff;
|
|
180
120
|
}
|
|
181
121
|
nine-table-header { height: 40px; display: block; flex-shrink: 0; border-bottom: 1px solid #e5e7eb; background: #fff; }
|
|
@@ -256,14 +196,14 @@
|
|
|
256
196
|
<nine-table-body>
|
|
257
197
|
<nine-table-summary></nine-table-summary>
|
|
258
198
|
<nine-table-sheets>
|
|
259
|
-
<nine-table-sheets-body>${
|
|
199
|
+
<nine-table-sheets-body>${y}</nine-table-sheets-body>
|
|
260
200
|
<nine-table-sheets-footer>
|
|
261
|
-
<div class="nine-tab-bar">${
|
|
201
|
+
<div class="nine-tab-bar">${f}</div>
|
|
262
202
|
<div class="sheets-counter">Total : <span id="row-count">0</span></div>
|
|
263
203
|
</nine-table-sheets-footer>
|
|
264
204
|
</nine-table-sheets>
|
|
265
205
|
<nine-table-analysis></nine-table-analysis>
|
|
266
206
|
</nine-table-body>
|
|
267
207
|
<nine-table-footer></nine-table-footer>
|
|
268
|
-
`;const
|
|
208
|
+
`;const u=a(this,w).querySelectorAll("nine-table-sheet");u==null||u.forEach((x,e)=>{r[e]&&setTimeout(()=>{x.init(r[e]),g&&a(this,$).call(this,b)})})},"#render"));R(this,w,b),a(this,I).call(this),a(this,z).call(this)}};w=new WeakMap,L=new WeakMap,z=new WeakMap,$=new WeakMap,I=new WeakMap,d(K,"LayoutManager");let N=K;const Y=class Y extends HTMLElement{constructor(){super();E(this,T,!1);this.attachShadow({mode:"open"})}connectedCallback(){a(this,T)||(this.layoutManager=new N(this.shadowRoot),R(this,T,!0),h.log("NineTable connected."),this.dispatchEvent(new CustomEvent("load",{bubbles:!0,detail:{target:this}})))}disconnectedCallback(){h.log("NineTable disconnected.")}};T=new WeakMap,d(Y,"NineTable");let W=Y;customElements.get("nine-table")||customElements.define("nine-table",W)});
|
|
269
209
|
//# sourceMappingURL=nine-table.umd.js.map
|